summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/MC/MCContext.h7
-rw-r--r--llvm/include/llvm/MC/MCDwarf.h2
-rw-r--r--llvm/lib/MC/MCContext.cpp29
-rw-r--r--llvm/lib/MC/MCDwarf.cpp9
-rw-r--r--llvm/lib/MC/MCObjectStreamer.cpp3
-rw-r--r--llvm/test/MC/ELF/debug-prefix-map.s8
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")
OpenPOWER on IntegriCloud