diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/MC/MCContext.h | 7 | ||||
| -rw-r--r-- | llvm/include/llvm/MC/MCDwarf.h | 2 | ||||
| -rw-r--r-- | llvm/lib/MC/MCContext.cpp | 29 | ||||
| -rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/MC/MCObjectStreamer.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/MC/ELF/debug-prefix-map.s | 8 |
6 files changed, 30 insertions, 28 deletions
diff --git a/llvm/include/llvm/MC/MCContext.h b/llvm/include/llvm/MC/MCContext.h index 6fa36d096e7..a712e2d95cb 100644 --- a/llvm/include/llvm/MC/MCContext.h +++ b/llvm/include/llvm/MC/MCContext.h @@ -502,11 +502,8 @@ namespace llvm { /// Add an entry to the debug prefix map. void addDebugPrefixMapEntry(const std::string &From, const std::string &To); - // Remaps the given path in-place as per the debug prefix map. - void RemapDebugPath(std::string *Path); - - // Remaps the compilation dir as per the debug prefix map. - void RemapCompilationDir(); + // Remaps all debug directory paths in-place as per the debug prefix map. + void RemapDebugPaths(); /// Get the main file name for use in error messages and debug /// info. This can be set to ensure we've got the correct file name diff --git a/llvm/include/llvm/MC/MCDwarf.h b/llvm/include/llvm/MC/MCDwarf.h index e091452e28c..785f42d2f9d 100644 --- a/llvm/include/llvm/MC/MCDwarf.h +++ b/llvm/include/llvm/MC/MCDwarf.h @@ -301,8 +301,6 @@ public: FileNumber)); } - void RemapDwarfDirs(MCContext &Context); - void setRootFile(StringRef Directory, StringRef FileName, MD5::MD5Result *Checksum, Optional<StringRef> Source) { Header.CompilationDir = Directory; diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp index b601ab24434..606da252689 100644 --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -540,19 +540,26 @@ void MCContext::addDebugPrefixMapEntry(const std::string &From, DebugPrefixMap.insert(std::make_pair(From, To)); } -void MCContext::RemapDebugPath(std::string *Path) { - for (const auto &Entry : DebugPrefixMap) - if (StringRef(*Path).startswith(Entry.first)) { - std::string RemappedPath = - (Twine(Entry.second) + Path->substr(Entry.first.size())).str(); - Path->swap(RemappedPath); - } -} - -void MCContext::RemapCompilationDir() { +void MCContext::RemapDebugPaths() { + const auto &DebugPrefixMap = this->DebugPrefixMap; + const auto RemapDebugPath = [&DebugPrefixMap](std::string &Path) { + for (const auto &Entry : DebugPrefixMap) + if (StringRef(Path).startswith(Entry.first)) { + std::string RemappedPath = + (Twine(Entry.second) + Path.substr(Entry.first.size())).str(); + Path.swap(RemappedPath); + } + }; + + // Remap compilation directory. std::string CompDir = CompilationDir.str(); - RemapDebugPath(&CompDir); + RemapDebugPath(CompDir); CompilationDir = CompDir; + + // Remap MCDwarfDirs in all compilation units. + for (auto &CUIDTablePair : MCDwarfLineTablesCUMap) + for (auto &Dir : CUIDTablePair.second.getMCDwarfDirs()) + RemapDebugPath(Dir); } //===----------------------------------------------------------------------===// diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index 1d33d9947be..6131fcd658b 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -251,9 +251,7 @@ void MCDwarfLineTable::Emit(MCObjectStreamer *MCOS, // Handle the rest of the Compile Units. for (const auto &CUIDTablePair : LineTables) { - auto &LineTable = context.getMCDwarfLineTable(CUIDTablePair.first); - LineTable.RemapDwarfDirs(MCOS->getContext()); - LineTable.EmitCU(MCOS, Params, LineStr); + CUIDTablePair.second.EmitCU(MCOS, Params, LineStr); } if (LineStr) @@ -634,11 +632,6 @@ MCDwarfLineTableHeader::tryGetFile(StringRef &Directory, return FileNumber; } -void MCDwarfLineTable::RemapDwarfDirs(MCContext &Context) { - for (auto &Dir : Header.MCDwarfDirs) - Context.RemapDebugPath(&Dir); -} - /// Utility function to emit the encoding to a streamer. void MCDwarfLineAddr::Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta) { diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index 9fab8d835f8..9d536883b98 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -661,8 +661,7 @@ void MCObjectStreamer::EmitFileDirective(StringRef Filename) { } void MCObjectStreamer::FinishImpl() { - // Remap the compilation directory before emitting. - getContext().RemapCompilationDir(); + getContext().RemapDebugPaths(); // If we are generating dwarf for assembly source files dump out the sections. if (getContext().getGenDwarfForAssembly()) diff --git a/llvm/test/MC/ELF/debug-prefix-map.s b/llvm/test/MC/ELF/debug-prefix-map.s index f81730418b0..06990b88eae 100644 --- a/llvm/test/MC/ELF/debug-prefix-map.s +++ b/llvm/test/MC/ELF/debug-prefix-map.s @@ -4,9 +4,13 @@ // RUN: llvm-mc -triple=x86_64-linux-unknown -g src.s -filetype=obj -o out.o // RUN: llvm-dwarfdump -v -debug-info out.o | FileCheck --check-prefix=NO_MAP %s + // RUN: llvm-mc -triple=x86_64-linux-unknown -g src.s -filetype=obj -o out.o -fdebug-prefix-map=%t.foo=src_root // RUN: llvm-dwarfdump -v -debug-info out.o | FileCheck --check-prefix=MAP --implicit-check-not ".foo" %s +// RUN: llvm-mc -triple=x86_64-linux-unknown -g %t.foo/src.s -filetype=obj -o out.o -fdebug-prefix-map=%t.foo=/src_root +// RUN: llvm-dwarfdump -v -debug-info out.o | FileCheck --check-prefix=MAP_ABS --implicit-check-not ".foo" %s + f: nop @@ -15,3 +19,7 @@ f: // MAP: DW_AT_name [DW_FORM_string] ("src.s") // MAP: DW_AT_comp_dir [DW_FORM_string] ("src_root") // MAP: DW_AT_decl_file [DW_FORM_data4] ("src_root{{(/|\\)}}src.s") + +// MAP_ABS: DW_AT_name [DW_FORM_string] ("{{/|\\}}src_root{{(/|\\)}}src.s") +// MAP_ABS: DW_AT_comp_dir [DW_FORM_string] ("{{/|\\}}src_root") +// MAP_ABS: DW_AT_decl_file [DW_FORM_data4] ("{{/|\\}}src_root{{(/|\\)}}src.s") |

