Index: include/llvm/MC/MCContext.h =================================================================== --- include/llvm/MC/MCContext.h +++ include/llvm/MC/MCContext.h @@ -502,11 +502,8 @@ /// 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 Index: include/llvm/MC/MCDwarf.h =================================================================== --- include/llvm/MC/MCDwarf.h +++ include/llvm/MC/MCDwarf.h @@ -301,8 +301,6 @@ FileNumber)); } - void RemapDwarfDirs(MCContext &Context); - void setRootFile(StringRef Directory, StringRef FileName, MD5::MD5Result *Checksum, Optional Source) { Header.CompilationDir = Directory; Index: lib/MC/MCContext.cpp =================================================================== --- lib/MC/MCContext.cpp +++ lib/MC/MCContext.cpp @@ -540,19 +540,26 @@ 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::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); + } + }; -void MCContext::RemapCompilationDir() { + // Remap compilation directory. std::string CompDir = CompilationDir.str(); RemapDebugPath(&CompDir); CompilationDir = CompDir; + + // Remap MCDwarfDirs in all compilation units. + for (auto &CUIDTablePair : MCDwarfLineTablesCUMap) + for (auto &Dir : CUIDTablePair.second.getMCDwarfDirs()) + RemapDebugPath(&Dir); } //===----------------------------------------------------------------------===// Index: lib/MC/MCDwarf.cpp =================================================================== --- lib/MC/MCDwarf.cpp +++ lib/MC/MCDwarf.cpp @@ -251,9 +251,7 @@ // 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 @@ 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) { Index: lib/MC/MCObjectStreamer.cpp =================================================================== --- lib/MC/MCObjectStreamer.cpp +++ lib/MC/MCObjectStreamer.cpp @@ -661,8 +661,7 @@ } 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()) Index: test/MC/ELF/debug-prefix-map.s =================================================================== --- test/MC/ELF/debug-prefix-map.s +++ 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 @@ // 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")