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
This commit is contained in:
Jonas Devlieghere 2018-07-11 12:30:35 +00:00
parent 7e64c1ee91
commit 26ddf274d7
6 changed files with 29 additions and 27 deletions

View File

@ -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

View File

@ -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;

View File

@ -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::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);
RemapDebugPath(CompDir);
CompilationDir = CompDir;
// Remap MCDwarfDirs in all compilation units.
for (auto &CUIDTablePair : MCDwarfLineTablesCUMap)
for (auto &Dir : CUIDTablePair.second.getMCDwarfDirs())
RemapDebugPath(Dir);
}
//===----------------------------------------------------------------------===//

View File

@ -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) {

View File

@ -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())

View File

@ -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")