session: stabilize split debuginfo on linux
Stabilize the `-Csplit-debuginfo` flag... - ...on Linux for all values of the flag. Split DWARF has been implemented for a few months, hasn't had any bug reports and has had some promising benchmarking for incremental debug build performance. - ..on other platforms for the default value. It doesn't make any sense that `-Csplit-debuginfo=packed` is unstable on Windows MSVC when that's the default behaviour, but keep the other values unstable. Signed-off-by: David Wood <david.wood@huawei.com>
This commit is contained in:
parent
8556e6620e
commit
cf2c492ef8
14 changed files with 183 additions and 59 deletions
|
@ -1,6 +1,6 @@
|
|||
use std::{borrow::Cow, env};
|
||||
|
||||
use crate::spec::{cvs, FramePointer, SplitDebuginfo, TargetOptions};
|
||||
use crate::spec::{cvs, DebuginfoKind, FramePointer, SplitDebuginfo, TargetOptions};
|
||||
use crate::spec::{LinkArgs, LinkerFlavor, LldFlavor};
|
||||
|
||||
fn pre_link_args(os: &'static str, arch: &'static str, abi: &'static str) -> LinkArgs {
|
||||
|
@ -76,9 +76,15 @@ pub fn opts(os: &'static str, arch: &'static str, abi: &'static str) -> TargetOp
|
|||
eh_frame_header: false,
|
||||
lld_flavor: LldFlavor::Ld64,
|
||||
|
||||
debuginfo_kind: DebuginfoKind::DwarfDsym,
|
||||
// The historical default for macOS targets is to run `dsymutil` which
|
||||
// generates a packed version of debuginfo split from the main file.
|
||||
split_debuginfo: SplitDebuginfo::Packed,
|
||||
supported_split_debuginfo: Cow::Borrowed(&[
|
||||
SplitDebuginfo::Packed,
|
||||
SplitDebuginfo::Unpacked,
|
||||
SplitDebuginfo::Off,
|
||||
]),
|
||||
|
||||
// This environment variable is pretty magical but is intended for
|
||||
// producing deterministic builds. This was first discovered to be used
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use crate::spec::{cvs, RelroLevel, TargetOptions};
|
||||
use crate::spec::{cvs, RelroLevel, SplitDebuginfo, TargetOptions};
|
||||
use std::borrow::Cow;
|
||||
|
||||
pub fn opts() -> TargetOptions {
|
||||
TargetOptions {
|
||||
|
@ -10,6 +11,11 @@ pub fn opts() -> TargetOptions {
|
|||
relro_level: RelroLevel::Full,
|
||||
has_thread_local: true,
|
||||
crt_static_respected: true,
|
||||
supported_split_debuginfo: Cow::Borrowed(&[
|
||||
SplitDebuginfo::Packed,
|
||||
SplitDebuginfo::Unpacked,
|
||||
SplitDebuginfo::Off,
|
||||
]),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -468,7 +468,57 @@ impl fmt::Display for LinkOutputKind {
|
|||
|
||||
pub type LinkArgs = BTreeMap<LinkerFlavor, Vec<StaticCow<str>>>;
|
||||
|
||||
#[derive(Clone, Copy, Hash, Debug, PartialEq, Eq)]
|
||||
/// Which kind of debuginfo does the target use?
|
||||
///
|
||||
/// Useful in determining whether a target supports Split DWARF (a target with
|
||||
/// `DebuginfoKind::Dwarf` and supporting `SplitDebuginfo::Unpacked` for example).
|
||||
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
|
||||
pub enum DebuginfoKind {
|
||||
/// DWARF debuginfo (such as that used on `x86_64_unknown_linux_gnu`).
|
||||
#[default]
|
||||
Dwarf,
|
||||
/// DWARF debuginfo in dSYM files (such as on Apple platforms).
|
||||
DwarfDsym,
|
||||
/// Program database files (such as on Windows).
|
||||
Pdb,
|
||||
}
|
||||
|
||||
impl DebuginfoKind {
|
||||
fn as_str(&self) -> &'static str {
|
||||
match self {
|
||||
DebuginfoKind::Dwarf => "dwarf",
|
||||
DebuginfoKind::DwarfDsym => "dwarf-dsym",
|
||||
DebuginfoKind::Pdb => "pdb",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStr for DebuginfoKind {
|
||||
type Err = ();
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, ()> {
|
||||
Ok(match s {
|
||||
"dwarf" => DebuginfoKind::Dwarf,
|
||||
"dwarf-dsym" => DebuginfoKind::DwarfDsym,
|
||||
"pdb" => DebuginfoKind::Pdb,
|
||||
_ => return Err(()),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ToJson for DebuginfoKind {
|
||||
fn to_json(&self) -> Json {
|
||||
self.as_str().to_json()
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for DebuginfoKind {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.write_str(self.as_str())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
|
||||
pub enum SplitDebuginfo {
|
||||
/// Split debug-information is disabled, meaning that on supported platforms
|
||||
/// you can find all debug information in the executable itself. This is
|
||||
|
@ -476,7 +526,8 @@ pub enum SplitDebuginfo {
|
|||
///
|
||||
/// * Windows - not supported
|
||||
/// * macOS - don't run `dsymutil`
|
||||
/// * ELF - `.dwarf_*` sections
|
||||
/// * ELF - `.debug_*` sections
|
||||
#[default]
|
||||
Off,
|
||||
|
||||
/// Split debug-information can be found in a "packed" location separate
|
||||
|
@ -484,7 +535,7 @@ pub enum SplitDebuginfo {
|
|||
///
|
||||
/// * Windows - `*.pdb`
|
||||
/// * macOS - `*.dSYM` (run `dsymutil`)
|
||||
/// * ELF - `*.dwp` (run `rust-llvm-dwp`)
|
||||
/// * ELF - `*.dwp` (run `thorin`)
|
||||
Packed,
|
||||
|
||||
/// Split debug-information can be found in individual object files on the
|
||||
|
@ -509,7 +560,7 @@ impl SplitDebuginfo {
|
|||
impl FromStr for SplitDebuginfo {
|
||||
type Err = ();
|
||||
|
||||
fn from_str(s: &str) -> Result<SplitDebuginfo, ()> {
|
||||
fn from_str(s: &str) -> Result<Self, ()> {
|
||||
Ok(match s {
|
||||
"off" => SplitDebuginfo::Off,
|
||||
"unpacked" => SplitDebuginfo::Unpacked,
|
||||
|
@ -1435,9 +1486,13 @@ pub struct TargetOptions {
|
|||
/// thumb and arm interworking.
|
||||
pub has_thumb_interworking: bool,
|
||||
|
||||
/// Which kind of debuginfo is used by this target?
|
||||
pub debuginfo_kind: DebuginfoKind,
|
||||
/// How to handle split debug information, if at all. Specifying `None` has
|
||||
/// target-specific meaning.
|
||||
pub split_debuginfo: SplitDebuginfo,
|
||||
/// Which kinds of split debuginfo are supported by the target?
|
||||
pub supported_split_debuginfo: StaticCow<[SplitDebuginfo]>,
|
||||
|
||||
/// The sanitizers supported by this target
|
||||
///
|
||||
|
@ -1595,7 +1650,10 @@ impl Default for TargetOptions {
|
|||
use_ctors_section: false,
|
||||
eh_frame_header: true,
|
||||
has_thumb_interworking: false,
|
||||
split_debuginfo: SplitDebuginfo::Off,
|
||||
debuginfo_kind: Default::default(),
|
||||
split_debuginfo: Default::default(),
|
||||
// `Off` is supported by default, but targets can remove this manually, e.g. Windows.
|
||||
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
|
||||
supported_sanitizers: SanitizerSet::empty(),
|
||||
default_adjusted_cabi: None,
|
||||
c_enum_min_bits: 32,
|
||||
|
@ -1868,6 +1926,19 @@ impl Target {
|
|||
Some(Ok(()))
|
||||
})).unwrap_or(Ok(()))
|
||||
} );
|
||||
($key_name:ident, DebuginfoKind) => ( {
|
||||
let name = (stringify!($key_name)).replace("_", "-");
|
||||
obj.remove(&name).and_then(|o| o.as_str().and_then(|s| {
|
||||
match s.parse::<DebuginfoKind>() {
|
||||
Ok(level) => base.$key_name = level,
|
||||
_ => return Some(Err(
|
||||
format!("'{s}' is not a valid value for debuginfo-kind. Use 'dwarf', \
|
||||
'dwarf-dsym' or 'pdb'.")
|
||||
)),
|
||||
}
|
||||
Some(Ok(()))
|
||||
})).unwrap_or(Ok(()))
|
||||
} );
|
||||
($key_name:ident, SplitDebuginfo) => ( {
|
||||
let name = (stringify!($key_name)).replace("_", "-");
|
||||
obj.remove(&name).and_then(|o| o.as_str().and_then(|s| {
|
||||
|
@ -1904,6 +1975,25 @@ impl Target {
|
|||
}
|
||||
}
|
||||
} );
|
||||
($key_name:ident, falliable_list) => ( {
|
||||
let name = (stringify!($key_name)).replace("_", "-");
|
||||
obj.remove(&name).and_then(|j| {
|
||||
if let Some(v) = j.as_array() {
|
||||
match v.iter().map(|a| FromStr::from_str(a.as_str().unwrap())).collect() {
|
||||
Ok(l) => { base.$key_name = l },
|
||||
// FIXME: `falliable_list` can't re-use the `key!` macro for list
|
||||
// elements and the error messages from that macro, so it has a bad
|
||||
// generic message instead
|
||||
Err(_) => return Some(Err(
|
||||
format!("`{:?}` is not a valid value for `{}`", j, name)
|
||||
)),
|
||||
}
|
||||
} else {
|
||||
incorrect_type.push(name)
|
||||
}
|
||||
Some(Ok(()))
|
||||
}).unwrap_or(Ok(()))
|
||||
} );
|
||||
($key_name:ident, optional) => ( {
|
||||
let name = (stringify!($key_name)).replace("_", "-");
|
||||
if let Some(o) = obj.remove(&name) {
|
||||
|
@ -2190,7 +2280,9 @@ impl Target {
|
|||
key!(use_ctors_section, bool);
|
||||
key!(eh_frame_header, bool);
|
||||
key!(has_thumb_interworking, bool);
|
||||
key!(debuginfo_kind, DebuginfoKind)?;
|
||||
key!(split_debuginfo, SplitDebuginfo)?;
|
||||
key!(supported_split_debuginfo, falliable_list)?;
|
||||
key!(supported_sanitizers, SanitizerSet)?;
|
||||
key!(default_adjusted_cabi, Option<Abi>)?;
|
||||
key!(c_enum_min_bits, u64);
|
||||
|
@ -2434,7 +2526,9 @@ impl ToJson for Target {
|
|||
target_option_val!(use_ctors_section);
|
||||
target_option_val!(eh_frame_header);
|
||||
target_option_val!(has_thumb_interworking);
|
||||
target_option_val!(debuginfo_kind);
|
||||
target_option_val!(split_debuginfo);
|
||||
target_option_val!(supported_split_debuginfo);
|
||||
target_option_val!(supported_sanitizers);
|
||||
target_option_val!(c_enum_min_bits);
|
||||
target_option_val!(generate_arange_section);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use crate::spec::{LinkerFlavor, LldFlavor, SplitDebuginfo, TargetOptions};
|
||||
use std::borrow::Cow;
|
||||
|
||||
pub fn opts() -> TargetOptions {
|
||||
// Suppress the verbose logo and authorship debugging output, which would needlessly
|
||||
|
@ -18,6 +19,7 @@ pub fn opts() -> TargetOptions {
|
|||
// Currently this is the only supported method of debuginfo on MSVC
|
||||
// where `*.pdb` files show up next to the final artifact.
|
||||
split_debuginfo: SplitDebuginfo::Packed,
|
||||
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Packed]),
|
||||
|
||||
..Default::default()
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use crate::spec::crt_objects::{self, LinkSelfContainedDefault};
|
||||
use crate::spec::{cvs, LinkerFlavor, TargetOptions};
|
||||
use crate::spec::{cvs, DebuginfoKind, LinkerFlavor, SplitDebuginfo, TargetOptions};
|
||||
use std::borrow::Cow;
|
||||
|
||||
pub fn opts() -> TargetOptions {
|
||||
let mut pre_link_args = TargetOptions::link_args(
|
||||
|
@ -86,6 +87,10 @@ pub fn opts() -> TargetOptions {
|
|||
emit_debug_gdb_scripts: false,
|
||||
requires_uwtable: true,
|
||||
eh_frame_header: false,
|
||||
// FIXME(davidtwco): Support Split DWARF on Windows GNU - may require LLVM changes to
|
||||
// output DWO, despite using DWARF, doesn't use ELF..
|
||||
debuginfo_kind: DebuginfoKind::Pdb,
|
||||
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use crate::spec::{cvs, TargetOptions};
|
||||
use crate::spec::{cvs, DebuginfoKind, TargetOptions};
|
||||
|
||||
pub fn opts() -> TargetOptions {
|
||||
let base = super::msvc_base::opts();
|
||||
|
@ -28,6 +28,7 @@ pub fn opts() -> TargetOptions {
|
|||
// not ever be possible for us to pass this flag.
|
||||
no_default_libraries: false,
|
||||
has_thread_local: true,
|
||||
debuginfo_kind: DebuginfoKind::Pdb,
|
||||
|
||||
..base
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue