aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/DebugInfo/DIContext.h7
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp15
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp47
3 files changed, 63 insertions, 6 deletions
diff --git a/llvm/include/llvm/DebugInfo/DIContext.h b/llvm/include/llvm/DebugInfo/DIContext.h
index fbebfe6..b32bb17 100644
--- a/llvm/include/llvm/DebugInfo/DIContext.h
+++ b/llvm/include/llvm/DebugInfo/DIContext.h
@@ -133,7 +133,12 @@ enum class DINameKind { None, ShortName, LinkageName };
/// Controls which fields of DILineInfo container should be filled
/// with data.
struct DILineInfoSpecifier {
- enum class FileLineInfoKind { None, Default, AbsoluteFilePath };
+ enum class FileLineInfoKind {
+ None,
+ Default,
+ RelativeFilePath,
+ AbsoluteFilePath
+ };
using FunctionNameKind = DINameKind;
FileLineInfoKind FLIKind;
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
index 4ede9ff..d3d2c58 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
@@ -1082,7 +1082,7 @@ bool DWARFDebugLine::Prologue::getFileNameByIndex(
if (!Name)
return false;
StringRef FileName = *Name;
- if (Kind != FileLineInfoKind::AbsoluteFilePath ||
+ if (Kind == FileLineInfoKind::Default ||
isPathAbsoluteOnWindowsOrPosix(FileName)) {
Result = std::string(FileName);
return true;
@@ -1099,12 +1099,17 @@ bool DWARFDebugLine::Prologue::getFileNameByIndex(
IncludeDir =
IncludeDirectories[Entry.DirIdx - 1].getAsCString().getValue();
}
- // We may still need to append compilation directory of compile unit.
- // We know that FileName is not absolute, the only way to have an
- // absolute path at this point would be if IncludeDir is absolute.
- if (!CompDir.empty() && !isPathAbsoluteOnWindowsOrPosix(IncludeDir))
+ // For absolute paths only, include the compilation directory of compile unit.
+ // We know that FileName is not absolute, the only way to have an absolute
+ // path at this point would be if IncludeDir is absolute.
+ if (Kind == FileLineInfoKind::AbsoluteFilePath && !CompDir.empty() &&
+ !isPathAbsoluteOnWindowsOrPosix(IncludeDir))
sys::path::append(FilePath, Style, CompDir);
+ assert((Kind == FileLineInfoKind::AbsoluteFilePath ||
+ Kind == FileLineInfoKind::RelativeFilePath) &&
+ "invalid FileLineInfo Kind");
+
// sys::path::append skips empty strings.
sys::path::append(FilePath, Style, IncludeDir, FileName);
Result = std::string(FilePath.str());
diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
index 5d03746..10a9f95 100644
--- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
+++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
@@ -917,4 +917,51 @@ TEST_F(DebugLineBasicFixture, ParserPrintsStandardOpcodesWhenRequested) {
EXPECT_TRUE(InOutput("0x0000003f: 0c DW_LNS_set_isa (66)\n")) << Output;
}
+TEST_F(DebugLineBasicFixture, PrintPathsProperly) {
+ if (!setupGenerator(5))
+ return;
+
+ LineTable &LT = Gen->addLineTable();
+ DWARFDebugLine::Prologue P = LT.createBasicPrologue();
+ P.IncludeDirectories.push_back(
+ DWARFFormValue::createFromPValue(DW_FORM_string, "b dir"));
+ P.FileNames.push_back(DWARFDebugLine::FileNameEntry());
+ P.FileNames.back().Name =
+ DWARFFormValue::createFromPValue(DW_FORM_string, "b file");
+ P.FileNames.back().DirIdx = 1;
+ P.PrologueLength += 14;
+ LT.setPrologue(P);
+ generate();
+
+ auto ExpectedLineTable = Line.getOrParseLineTable(LineData, 0, *Context,
+ nullptr, RecordRecoverable);
+ EXPECT_THAT_EXPECTED(ExpectedLineTable, Succeeded());
+ std::string Result;
+ // DWARF 5 stores the compilation directory in two places: the Compilation
+ // Unit and the directory table entry 0, and implementations are free to use
+ // one or the other. This copy serves as the one stored in the CU.
+ StringRef CompDir = "a dir";
+ EXPECT_FALSE(
+ (*ExpectedLineTable)
+ ->Prologue.getFileNameByIndex(
+ 1, CompDir, DILineInfoSpecifier::FileLineInfoKind::None, Result));
+ EXPECT_TRUE((*ExpectedLineTable)
+ ->Prologue.getFileNameByIndex(
+ 1, CompDir,
+ DILineInfoSpecifier::FileLineInfoKind::Default, Result));
+ EXPECT_STREQ(Result.c_str(), "b file");
+ EXPECT_TRUE((*ExpectedLineTable)
+ ->Prologue.getFileNameByIndex(
+ 1, CompDir,
+ DILineInfoSpecifier::FileLineInfoKind::RelativeFilePath,
+ Result));
+ EXPECT_STREQ(Result.c_str(), "b dir/b file");
+ EXPECT_TRUE((*ExpectedLineTable)
+ ->Prologue.getFileNameByIndex(
+ 1, CompDir,
+ DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
+ Result));
+ EXPECT_STREQ(Result.c_str(), "a dir/b dir/b file");
+}
+
} // end anonymous namespace