From 5595aeb6b7eda6b96cb2fe882401213c4fc04c6f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 30 Aug 2018 10:25:07 -0700 Subject: [PATCH] Add rustc SHA to released DWARF debuginfo This commit updates the debuginfo that is encoded in all of our released artifacts by default. Currently it has paths like `/checkout/src/...` but these are a little inconsistent and have changed over time. This commit instead attempts to actually define the file paths in our debuginfo to be consistent between releases. All debuginfo paths are now intended to be `/rustc/$sha` where `$sha` is the git sha of the released compiler. Sub-paths are all paths into the git repo at that `$sha`. --- config.toml.example | 4 +++ src/bootstrap/bin/rustc.rs | 4 +++ src/bootstrap/builder.rs | 8 +++-- src/bootstrap/cc_detect.rs | 4 +-- src/bootstrap/compile.rs | 4 +-- src/bootstrap/config.rs | 3 ++ src/bootstrap/lib.rs | 32 ++++++++++++++++++- src/bootstrap/native.rs | 7 ++-- src/bootstrap/test.rs | 4 +-- src/ci/run.sh | 1 + src/libstd/build.rs | 4 +++ src/test/ui/consts/const-size_of-cycle.rs | 2 ++ .../ui/impl-trait/impl-generic-mismatch.rs | 3 ++ .../impl-trait/impl-generic-mismatch.stderr | 6 ++-- 14 files changed, 71 insertions(+), 15 deletions(-) diff --git a/config.toml.example b/config.toml.example index 35f69cd05b60..d569bede0e1a 100644 --- a/config.toml.example +++ b/config.toml.example @@ -373,6 +373,10 @@ # Whether to verify generated LLVM IR #verify-llvm-ir = false +# Map all debuginfo paths for libstd and crates to `/rust/$sha/$crate/...`, +# generally only set for releases +#remap-debuginfo = false + # ============================================================================= # Options for specific targets # diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index 7192cae8956e..f30f34acf5c6 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -263,6 +263,10 @@ fn main() { if env::var_os("RUSTC_FORCE_UNSTABLE").is_some() { cmd.arg("-Z").arg("force-unstable-if-unmarked"); } + + if let Ok(map) = env::var("RUSTC_DEBUGINFO_MAP") { + cmd.arg("--remap-path-prefix").arg(&map); + } } else { // Override linker if necessary. if let Ok(host_linker) = env::var("RUSTC_HOST_LINKER") { diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index 5c287f25e26b..2f7f3058b047 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -32,7 +32,7 @@ use test; use tool; use util::{add_lib_path, exe, libdir}; -use {Build, DocTests, Mode}; +use {Build, DocTests, Mode, GitRepo}; pub use Compiler; @@ -876,6 +876,10 @@ pub fn cargo( cargo.env("RUSTC_HOST_CRT_STATIC", x.to_string()); } + if let Some(map) = self.build.debuginfo_map(GitRepo::Rustc) { + cargo.env("RUSTC_DEBUGINFO_MAP", map); + } + // Enable usage of unstable features cargo.env("RUSTC_BOOTSTRAP", "1"); self.add_rust_test_threads(&mut cargo); @@ -964,7 +968,7 @@ pub fn cargo( let cc = ccacheify(&self.cc(target)); cargo.env(format!("CC_{}", target), &cc).env("CC", &cc); - let cflags = self.cflags(target).join(" "); + let cflags = self.cflags(target, GitRepo::Rustc).join(" "); cargo .env(format!("CFLAGS_{}", target), cflags.clone()) .env("CFLAGS", cflags.clone()); diff --git a/src/bootstrap/cc_detect.rs b/src/bootstrap/cc_detect.rs index 698903f128d4..d5da0cabec84 100644 --- a/src/bootstrap/cc_detect.rs +++ b/src/bootstrap/cc_detect.rs @@ -39,7 +39,7 @@ use build_helper::output; use cc; -use Build; +use {Build, GitRepo}; use config::Target; use cache::Interned; @@ -107,7 +107,7 @@ pub fn find(build: &mut Build) { build.cc.insert(target, compiler); build.verbose(&format!("CC_{} = {:?}", &target, build.cc(target))); - build.verbose(&format!("CFLAGS_{} = {:?}", &target, build.cflags(target))); + build.verbose(&format!("CFLAGS_{} = {:?}", &target, build.cflags(target, GitRepo::Rustc))); if let Some(ar) = ar { build.verbose(&format!("AR_{} = {:?}", &target, ar)); build.ar.insert(target, ar); diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index da0ccf5e1773..c0661a773e3a 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -30,7 +30,7 @@ use serde_json; use util::{exe, libdir, is_dylib, CiEnv}; -use {Compiler, Mode}; +use {Compiler, Mode, GitRepo}; use native; use tool; @@ -895,7 +895,7 @@ pub fn compiler_file(builder: &Builder, target: Interned, file: &str) -> PathBuf { let mut cmd = Command::new(compiler); - cmd.args(builder.cflags(target)); + cmd.args(builder.cflags(target, GitRepo::Rustc)); cmd.arg(format!("-print-file-name={}", file)); let out = output(&mut cmd); PathBuf::from(out.trim()) diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index bf4d39c4947e..872ff132a699 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -108,6 +108,7 @@ pub struct Config { pub rust_codegen_backends: Vec>, pub rust_codegen_backends_dir: String, pub rust_verify_llvm_ir: bool, + pub rust_remap_debuginfo: bool, pub build: Interned, pub hosts: Vec>, @@ -319,6 +320,7 @@ struct Rust { deny_warnings: Option, backtrace_on_ice: Option, verify_llvm_ir: Option, + remap_debuginfo: Option, } /// TOML representation of how each build target is configured. @@ -554,6 +556,7 @@ pub fn parse(args: &[String]) -> Config { set(&mut config.deny_warnings, rust.deny_warnings.or(flags.warnings)); set(&mut config.backtrace_on_ice, rust.backtrace_on_ice); set(&mut config.rust_verify_llvm_ir, rust.verify_llvm_ir); + set(&mut config.rust_remap_debuginfo, rust.remap_debuginfo); if let Some(ref backends) = rust.codegen_backends { config.rust_codegen_backends = backends.iter() diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 2725abdc3d95..ed6a5f94d0d9 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -237,6 +237,11 @@ pub enum DocTests { Only, } +pub enum GitRepo { + Rustc, + Llvm, +} + /// Global configuration for the build system. /// /// This structure transitively contains all configuration for the build system. @@ -738,6 +743,21 @@ fn jobs(&self) -> u32 { self.config.jobs.unwrap_or_else(|| num_cpus::get() as u32) } + fn debuginfo_map(&self, which: GitRepo) -> Option { + if !self.config.rust_remap_debuginfo { + return None + } + + let path = match which { + GitRepo::Rustc => { + let sha = self.rust_info.sha().expect("failed to find sha"); + format!("/rustc/{}", sha) + } + GitRepo::Llvm => format!("/rustc/llvm"), + }; + Some(format!("{}={}", self.src.display(), path)) + } + /// Returns the path to the C compiler for the target specified. fn cc(&self, target: Interned) -> &Path { self.cc[&target].path() @@ -745,7 +765,7 @@ fn cc(&self, target: Interned) -> &Path { /// Returns a list of flags to pass to the C compiler for the target /// specified. - fn cflags(&self, target: Interned) -> Vec { + fn cflags(&self, target: Interned, which: GitRepo) -> Vec { // Filter out -O and /O (the optimization flags) that we picked up from // cc-rs because the build scripts will determine that for themselves. let mut base = self.cc[&target].args().iter() @@ -767,6 +787,16 @@ fn cflags(&self, target: Interned) -> Vec { if &*target == "i686-pc-windows-gnu" { base.push("-fno-omit-frame-pointer".into()); } + + if let Some(map) = self.debuginfo_map(which) { + let cc = self.cc(target); + if cc.ends_with("clang") || cc.ends_with("gcc") { + base.push(format!("-fdebug-prefix-map={}", map).into()); + } else if cc.ends_with("clang-cl.exe") { + base.push("-Xclang".into()); + base.push(format!("-fdebug-prefix-map={}", map).into()); + } + } base } diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs index caf38d766f54..8b115b439ed0 100644 --- a/src/bootstrap/native.rs +++ b/src/bootstrap/native.rs @@ -33,6 +33,7 @@ use build_helper::up_to_date; use builder::{Builder, RunConfig, ShouldRun, Step}; use cache::Interned; +use GitRepo; #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct Llvm { @@ -369,8 +370,8 @@ fn configure_cmake(builder: &Builder, } cfg.build_arg("-j").build_arg(builder.jobs().to_string()); - cfg.define("CMAKE_C_FLAGS", builder.cflags(target).join(" ")); - let mut cxxflags = builder.cflags(target).join(" "); + cfg.define("CMAKE_C_FLAGS", builder.cflags(target, GitRepo::Llvm).join(" ")); + let mut cxxflags = builder.cflags(target, GitRepo::Llvm).join(" "); if building_dist_binaries { if builder.config.llvm_static_stdcpp && !target.contains("windows") { cxxflags.push_str(" -static-libstdc++"); @@ -676,7 +677,7 @@ fn run(self, builder: &Builder) { }; configure.arg(os); configure.env("CC", builder.cc(target)); - for flag in builder.cflags(target) { + for flag in builder.cflags(target, GitRepo::Rustc) { configure.arg(flag); } // There is no specific os target for android aarch64 or x86_64, diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index f762d9414cff..911e16423ccf 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -34,7 +34,7 @@ use toolstate::ToolState; use util::{self, dylib_path, dylib_path_var}; use Crate as CargoCrate; -use {DocTests, Mode}; +use {DocTests, Mode, GitRepo}; const ADB_TEST_DIR: &str = "/data/tmp/work"; @@ -1140,7 +1140,7 @@ fn run(self, builder: &Builder) { .arg("--cxx") .arg(builder.cxx(target).unwrap()) .arg("--cflags") - .arg(builder.cflags(target).join(" ")) + .arg(builder.cflags(target, GitRepo::Rustc).join(" ")) .arg("--llvm-components") .arg(llvm_components.trim()) .arg("--llvm-cxxflags") diff --git a/src/ci/run.sh b/src/ci/run.sh index 09a0cf3541d8..6a571bfad135 100755 --- a/src/ci/run.sh +++ b/src/ci/run.sh @@ -55,6 +55,7 @@ export RUST_RELEASE_CHANNEL=nightly if [ "$DEPLOY$DEPLOY_ALT" != "" ]; then RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --release-channel=$RUST_RELEASE_CHANNEL" RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --enable-llvm-static-stdcpp" + RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set rust.remap-debuginfo" if [ "$NO_LLVM_ASSERTIONS" = "1" ]; then RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --disable-llvm-assertions" diff --git a/src/libstd/build.rs b/src/libstd/build.rs index 016e7adb4c91..0831e29bdddb 100644 --- a/src/libstd/build.rs +++ b/src/libstd/build.rs @@ -97,6 +97,10 @@ fn build_libbacktrace(target: &str) -> Result<(), ()> { .file("../libbacktrace/sort.c") .file("../libbacktrace/state.c"); + let any_debug = env::var("RUSTC_DEBUGINFO").unwrap_or(String::new()) == "true" || + env::var("RUSTC_DEBUGINFO_LINES").unwrap_or(String::new()) == "true"; + build.debug(any_debug); + if target.contains("darwin") { build.file("../libbacktrace/macho.c"); } else if target.contains("windows") { diff --git a/src/test/ui/consts/const-size_of-cycle.rs b/src/test/ui/consts/const-size_of-cycle.rs index 04c054f8b6db..1ea7b973c465 100644 --- a/src/test/ui/consts/const-size_of-cycle.rs +++ b/src/test/ui/consts/const-size_of-cycle.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// ignore-musl +// ignore-x86 // error-pattern: cycle detected struct Foo { diff --git a/src/test/ui/impl-trait/impl-generic-mismatch.rs b/src/test/ui/impl-trait/impl-generic-mismatch.rs index d6707f590113..6cf8000f6ad2 100644 --- a/src/test/ui/impl-trait/impl-generic-mismatch.rs +++ b/src/test/ui/impl-trait/impl-generic-mismatch.rs @@ -8,6 +8,9 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// ignore-musl +// ignore-x86 + use std::fmt::Debug; trait Foo { diff --git a/src/test/ui/impl-trait/impl-generic-mismatch.stderr b/src/test/ui/impl-trait/impl-generic-mismatch.stderr index 7ad16b1f8f23..d777779a881e 100644 --- a/src/test/ui/impl-trait/impl-generic-mismatch.stderr +++ b/src/test/ui/impl-trait/impl-generic-mismatch.stderr @@ -1,5 +1,5 @@ error[E0643]: method `foo` has incompatible signature for trait - --> $DIR/impl-generic-mismatch.rs:18:12 + --> $DIR/impl-generic-mismatch.rs:21:12 | LL | fn foo(&self, _: &impl Debug); | ---------- declaration in trait here @@ -12,7 +12,7 @@ LL | fn foo(&self, _: &impl Debug) { } | -- ^^^^^^^^^^ error[E0643]: method `bar` has incompatible signature for trait - --> $DIR/impl-generic-mismatch.rs:27:23 + --> $DIR/impl-generic-mismatch.rs:30:23 | LL | fn bar(&self, _: &U); | - declaration in trait here @@ -25,7 +25,7 @@ LL | fn bar(&self, _: &U) { } | ^^^^^^^^^^ ^ error[E0643]: method `hash` has incompatible signature for trait - --> $DIR/impl-generic-mismatch.rs:38:33 + --> $DIR/impl-generic-mismatch.rs:41:33 | LL | fn hash(&self, hasher: &mut impl Hasher) {} | ^^^^^^^^^^^ expected generic parameter, found `impl Trait`