summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2018-07-11 12:30:35 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2018-07-11 12:30:35 +0000
commit26ddf274d79e33d4440e1983aa2ceffd3addbc84 (patch)
tree2f60afef9323e93cf567c612e78bbe9e3a2c9e96 /llvm
parent7e64c1ee9123071d64cd019e3344ca7781fd8b3b (diff)
downloadbcm5719-llvm-26ddf274d79e33d4440e1983aa2ceffd3addbc84.tar.gz
bcm5719-llvm-26ddf274d79e33d4440e1983aa2ceffd3addbc84.zip
Use debug-prefix-map for AT_NAME
AT_NAME was being emitted before the directory paths were remapped. This ensures that all paths are remapped before anything is emitted. An additional test case has been added. Note that this only works if the replacement string is an absolute path. If not, then AT_decl_file believes the new path is a relative path, and joins that path with the compilation directory. I do not know of a good way to resolve this. Patch by: Siddhartha Bagaria (starsid) Differential revision: https://reviews.llvm.org/D49169 llvm-svn: 336793
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