diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2017-11-25 11:13:58 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2017-11-30 07:17:53 -0800 |
| commit | 855f6d1483e023cea3b7988db294ed9767e15359 (patch) | |
| tree | 1677a936b547ab7201cc9a7c6b3f45feeca37483 /src/libstd/sys_common | |
| parent | 7df4683cc06acac3b0081eed23128a05c0b83f44 (diff) | |
| download | rust-855f6d1483e023cea3b7988db294ed9767e15359.tar.gz rust-855f6d1483e023cea3b7988db294ed9767e15359.zip | |
rustc: Prepare to enable ThinLTO by default
This commit prepares to enable ThinLTO and multiple codegen units in release mode by default. We've still got a debuginfo bug or two to sort out before actually turning it on by default.
Diffstat (limited to 'src/libstd/sys_common')
| -rw-r--r-- | src/libstd/sys_common/backtrace.rs | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index 9f0214f5f05..b5cf6d7d34f 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -252,8 +252,26 @@ fn output_fileline(w: &mut Write, // Note that this demangler isn't quite as fancy as it could be. We have lots // of other information in our symbols like hashes, version, type information, // etc. Additionally, this doesn't handle glue symbols at all. -pub fn demangle(writer: &mut Write, s: &str, format: PrintFormat) -> io::Result<()> { - // First validate the symbol. If it doesn't look like anything we're +pub fn demangle(writer: &mut Write, mut s: &str, format: PrintFormat) -> io::Result<()> { + // During ThinLTO LLVM may import and rename internal symbols, so strip out + // those endings first as they're one of the last manglings applied to + // symbol names. + let llvm = ".llvm."; + if let Some(i) = s.find(llvm) { + let candidate = &s[i + llvm.len()..]; + let all_hex = candidate.chars().all(|c| { + match c { + 'A' ... 'F' | '0' ... '9' => true, + _ => false, + } + }); + + if all_hex { + s = &s[..i]; + } + } + + // Validate the symbol. If it doesn't look like anything we're // expecting, we just print it literally. Note that we must handle non-rust // symbols because we could have any function in the backtrace. let mut valid = true; |
