Skip to content

Commit

Permalink
[DWARFv5] llvm-mc -dwarf-version does not imply -g.
Browse files Browse the repository at this point in the history
Don't provide the assembler source as the "root file" unless the user
asked to have debug info for the assembler source (with -g).

If the source doesn't provide an explicit ".file 0" then (a) use the
compilation directory as directory #0, and (b) use the file brson#1 info
for file #0 also.

Differential Revision: https://reviews.llvm.org/D48055

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334512 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
pogo59 committed Jun 12, 2018
1 parent 97c0962 commit e369b9d
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 34 deletions.
4 changes: 2 additions & 2 deletions include/llvm/MC/MCDwarf.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,8 @@ struct MCDwarfLineTableHeader {

private:
void emitV2FileDirTables(MCStreamer *MCOS) const;
void emitV5FileDirTables(MCStreamer *MCOS,
Optional<MCDwarfLineStr> &LineStr) const;
void emitV5FileDirTables(MCStreamer *MCOS, Optional<MCDwarfLineStr> &LineStr,
StringRef CtxCompilationDir) const;
};

class MCDwarfDwoLineTable {
Expand Down
21 changes: 14 additions & 7 deletions lib/MC/MCDwarf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,8 @@ static void emitOneV5FileEntry(MCStreamer *MCOS, const MCDwarfFile &DwarfFile,
}

void MCDwarfLineTableHeader::emitV5FileDirTables(
MCStreamer *MCOS, Optional<MCDwarfLineStr> &LineStr) const {
MCStreamer *MCOS, Optional<MCDwarfLineStr> &LineStr,
StringRef CtxCompilationDir) const {
// The directory format, which is just a list of the directory paths. In a
// non-split object, these are references to .debug_line_str; in a split
// object, they are inline strings.
Expand All @@ -387,14 +388,17 @@ void MCDwarfLineTableHeader::emitV5FileDirTables(
MCOS->EmitULEB128IntValue(LineStr ? dwarf::DW_FORM_line_strp
: dwarf::DW_FORM_string);
MCOS->EmitULEB128IntValue(MCDwarfDirs.size() + 1);
// Try not to emit an empty compilation directory.
const StringRef &CompDir =
CompilationDir.empty() ? CtxCompilationDir : CompilationDir;
if (LineStr) {
// Record path strings, emit references here.
LineStr->emitRef(MCOS, CompilationDir);
LineStr->emitRef(MCOS, CompDir);
for (auto &Dir : MCDwarfDirs)
LineStr->emitRef(MCOS, Dir);
} else {
// The list of directory paths. CompilationDir comes first.
MCOS->EmitBytes(CompilationDir);
// The list of directory paths. Compilation directory comes first.
MCOS->EmitBytes(CompDir);
MCOS->EmitBytes(StringRef("\0", 1));
for (auto &Dir : MCDwarfDirs) {
MCOS->EmitBytes(Dir); // The DirectoryName, and...
Expand Down Expand Up @@ -426,9 +430,12 @@ void MCDwarfLineTableHeader::emitV5FileDirTables(
: dwarf::DW_FORM_string);
}
// Then the counted list of files. The root file is file #0, then emit the
// files as provide by .file directives.
// files as provide by .file directives. To accommodate assembler source
// written for DWARF v4 but trying to emit v5, if we didn't see a root file
// explicitly, replicate file #1.
MCOS->EmitULEB128IntValue(MCDwarfFiles.size());
emitOneV5FileEntry(MCOS, RootFile, HasMD5, HasSource, LineStr);
emitOneV5FileEntry(MCOS, RootFile.Name.empty() ? MCDwarfFiles[1] : RootFile,
HasMD5, HasSource, LineStr);
for (unsigned i = 1; i < MCDwarfFiles.size(); ++i)
emitOneV5FileEntry(MCOS, MCDwarfFiles[i], HasMD5, HasSource, LineStr);
}
Expand Down Expand Up @@ -501,7 +508,7 @@ MCDwarfLineTableHeader::Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params,
// Put out the directory and file tables. The formats vary depending on
// the version.
if (LineTableVersion >= 5)
emitV5FileDirTables(MCOS, LineStr);
emitV5FileDirTables(MCOS, LineStr, context.getCompilationDir());
else
emitV2FileDirTables(MCOS);

Expand Down
16 changes: 7 additions & 9 deletions test/MC/ELF/debug-file-options.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@
# CHECK: include_directories[ 2] = .debug_line_str[0x[[DIR2:[0-9a-f]+]]] = "dir2"
# CHECK-NOT: include_directories
# CHECK: file_names[ 0]:
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
# CHECK-NEXT: dir_index: 0
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "foo"
# CHECK-NEXT: dir_index: 1
# CHECK-NEXT: md5_checksum:
# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC:[0-9a-f]+]]] = ""
# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC:[0-9a-f]+]]] = "void foo() {}"
# CHECK: file_names[ 1]:
# CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0]]] = "foo"
# CHECK-NEXT: dir_index: 1
# CHECK-NEXT: md5_checksum: ee87e05688663173cd6043a3a15bba6e
# CHECK-NEXT: source: .debug_line_str[0x[[FILE1SRC:[0-9a-f]+]]] = "void foo() {}"
# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC]]] = "void foo() {}"
# CHECK: file_names[ 2]:
# CHECK-NEXT: name: .debug_line_str[0x[[FILE2:[0-9a-f]+]]] = "bar"
# CHECK-NEXT: dir_index: 2
Expand All @@ -35,9 +35,7 @@
# CHECK-NEXT: 0x[[DIR0]]: "{{.+}}"
# CHECK-NEXT: 0x[[DIR1]]: "dir1"
# CHECK-NEXT: 0x[[DIR2]]: "dir2"
# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
# CHECK-NEXT: 0x[[FILE0SRC]]: ""
# CHECK-NEXT: 0x[[FILE1]]: "foo"
# CHECK-NEXT: 0x[[FILE1SRC]]: "void foo() {}"
# CHECK-NEXT: 0x[[FILE0]]: "foo"
# CHECK-NEXT: 0x[[FILE0SRC]]: "void foo() {}"
# CHECK-NEXT: 0x[[FILE2]]: "bar"
# CHECK-NEXT: 0x[[FILE2SRC]]: "void bar() {}"
9 changes: 4 additions & 5 deletions test/MC/ELF/debug-md5.s
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
# CHECK: include_directories[ 2] = .debug_line_str[0x[[DIR2:[0-9a-f]+]]] = "dir2"
# CHECK-NOT: include_directories
# CHECK: file_names[ 0]:
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
# CHECK-NEXT: dir_index: 0
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "foo"
# CHECK-NEXT: dir_index: 1
# CHECK: file_names[ 1]:
# CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0]]] = "foo"
# CHECK-NEXT: dir_index: 1
# CHECK-NEXT: md5_checksum: 00112233445566778899aabbccddeeff
# CHECK: file_names[ 2]:
Expand All @@ -29,6 +29,5 @@
# CHECK-NEXT: 0x[[DIR0]]: "/tmp"
# CHECK-NEXT: 0x[[DIR1]]: "dir1"
# CHECK-NEXT: 0x[[DIR2]]: "dir2"
# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
# CHECK-NEXT: 0x[[FILE1]]: "foo"
# CHECK-NEXT: 0x[[FILE0]]: "foo"
# CHECK-NEXT: 0x[[FILE2]]: "bar"
16 changes: 7 additions & 9 deletions test/MC/ELF/debug-source.s
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@
# CHECK: include_directories[ 2] = .debug_line_str[0x[[DIR2:[0-9a-f]+]]] = "dir2"
# CHECK-NOT: include_directories
# CHECK: file_names[ 0]:
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
# CHECK-NEXT: dir_index: 0
# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC:[0-9a-f]+]]] = ""
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "foo"
# CHECK-NEXT: dir_index: 1
# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC:[0-9a-f]+]]] = "void foo() {}"
# CHECK: file_names[ 1]:
# CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
# CHECK-NEXT: name: .debug_line_str[0x[[FILE0]]] = "foo"
# CHECK-NEXT: dir_index: 1
# CHECK-NEXT: source: .debug_line_str[0x[[FILE1SRC:[0-9a-f]+]]] = "void foo() {}"
# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC]]] = "void foo() {}"
# CHECK: file_names[ 2]:
# CHECK-NEXT: name: .debug_line_str[0x[[FILE2:[0-9a-f]+]]] = "bar"
# CHECK-NEXT: dir_index: 2
Expand All @@ -30,9 +30,7 @@
# CHECK-NEXT: 0x[[DIR0]]: "{{.+}}"
# CHECK-NEXT: 0x[[DIR1]]: "dir1"
# CHECK-NEXT: 0x[[DIR2]]: "dir2"
# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
# CHECK-NEXT: 0x[[FILE0SRC]]: ""
# CHECK-NEXT: 0x[[FILE1]]: "foo"
# CHECK-NEXT: 0x[[FILE1SRC]]: "void foo() {}"
# CHECK-NEXT: 0x[[FILE0]]: "foo"
# CHECK-NEXT: 0x[[FILE0SRC]]: "void foo() {}"
# CHECK-NEXT: 0x[[FILE2]]: "bar"
# CHECK-NEXT: 0x[[FILE2SRC]]: "void bar()\n{\n}"
2 changes: 1 addition & 1 deletion test/MC/ELF/dwarf-file0.s
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
.file 0 "root.cpp"
.file 1 "header.h"
.file 2 "root.cpp"
# CHECK-5: include_directories[ 0] = ""
# CHECK-5: include_directories[ 0] = "{{.+}}"
# CHECK-4-NOT: include_directories
# CHECK-4-NOT: file_names[ 0]
# CHECK-5: file_names[ 0]:
Expand Down
2 changes: 1 addition & 1 deletion tools/llvm-mc/llvm-mc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ int main(int argc, char **argv) {
}
if (!MainFileName.empty())
Ctx.setMainFileName(MainFileName);
if (DwarfVersion >= 5) {
if (GenDwarfForAssembly && DwarfVersion >= 5) {
// DWARF v5 needs the root file as well as the compilation directory.
// If we find a '.file 0' directive that will supersede these values.
MD5 Hash;
Expand Down

0 comments on commit e369b9d

Please sign in to comment.