summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h5
-rw-r--r--llvm/include/llvm/MC/MCDwarf.h50
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp5
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp19
-rw-r--r--llvm/lib/MC/MCAsmStreamer.cpp3
-rw-r--r--llvm/lib/MC/MCContext.cpp5
-rw-r--r--llvm/lib/MC/MCDwarf.cpp16
-rw-r--r--llvm/test/MC/ARM/dwarf-asm-multiple-sections.s16
-rw-r--r--llvm/test/MC/ELF/debug-mixed-md5.ll3
-rw-r--r--llvm/test/MC/ELF/dwarf-file0.s6
-rw-r--r--llvm/test/tools/llvm-objdump/Inputs/embedded-sourcebin9936 -> 9528 bytes
-rw-r--r--llvm/test/tools/llvm-objdump/X86/function-sections-line-numbers.s9
12 files changed, 94 insertions, 43 deletions
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h
index 0fc34a8e7e4..1503a923ea4 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h
@@ -243,6 +243,9 @@ public:
bool hasFileAtIndex(uint64_t FileIndex) const;
/// Extracts filename by its index in filename table in prologue.
+ /// In Dwarf 4, the files are 1-indexed and the current compilation file
+ /// name is not represented in the list. In Dwarf 5, the files are
+ /// 0-indexed and the primary source file has the index 0.
/// Returns true on success.
bool getFileNameByIndex(uint64_t FileIndex, const char *CompDir,
DILineInfoSpecifier::FileLineInfoKind Kind,
@@ -275,6 +278,8 @@ public:
SequenceVector Sequences;
private:
+ const llvm::DWARFDebugLine::FileNameEntry &
+ getFileNameEntry(uint64_t Index) const;
uint32_t findRowInSeq(const DWARFDebugLine::Sequence &Seq,
object::SectionedAddress Address) const;
Optional<StringRef>
diff --git a/llvm/include/llvm/MC/MCDwarf.h b/llvm/include/llvm/MC/MCDwarf.h
index 63040cb194e..2a24347075a 100644
--- a/llvm/include/llvm/MC/MCDwarf.h
+++ b/llvm/include/llvm/MC/MCDwarf.h
@@ -41,11 +41,14 @@ class raw_ostream;
class SMLoc;
class SourceMgr;
-/// Instances of this class represent the name of the dwarf
-/// .file directive and its associated dwarf file number in the MC file,
-/// and MCDwarfFile's are created and uniqued by the MCContext class where
-/// the file number for each is its index into the vector of DwarfFiles (note
-/// index 0 is not used and not a valid dwarf file number).
+/// Instances of this class represent the name of the dwarf .file directive and
+/// its associated dwarf file number in the MC file. MCDwarfFile's are created
+/// and uniqued by the MCContext class. In Dwarf 4 file numbers start from 1;
+/// i.e. the entry with file number 1 is the first element in the vector of
+/// DwarfFiles and there is no MCDwarfFile with file number 0. In Dwarf 5 file
+/// numbers start from 0, with the MCDwarfFile with file number 0 being the
+/// primary source file, and file numbers correspond to their index in the
+/// vector.
struct MCDwarfFile {
// The base name of the file without its directory path.
std::string Name;
@@ -225,6 +228,7 @@ public:
Expected<unsigned> tryGetFile(StringRef &Directory, StringRef &FileName,
Optional<MD5::MD5Result> Checksum,
Optional<StringRef> Source,
+ uint16_t DwarfVersion,
unsigned FileNumber = 0);
std::pair<MCSymbol *, MCSymbol *>
Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params,
@@ -245,6 +249,18 @@ public:
return MCDwarfFiles.empty() || (HasAllMD5 == HasAnyMD5);
}
+ void setRootFile(StringRef Directory, StringRef FileName,
+ Optional<MD5::MD5Result> Checksum,
+ Optional<StringRef> Source) {
+ CompilationDir = Directory;
+ RootFile.Name = FileName;
+ RootFile.DirIndex = 0;
+ RootFile.Checksum = Checksum;
+ RootFile.Source = Source;
+ trackMD5Usage(Checksum.hasValue());
+ HasSource = Source.hasValue();
+ }
+
private:
void emitV2FileDirTables(MCStreamer *MCOS) const;
void emitV5FileDirTables(MCStreamer *MCOS, Optional<MCDwarfLineStr> &LineStr) const;
@@ -252,24 +268,23 @@ private:
class MCDwarfDwoLineTable {
MCDwarfLineTableHeader Header;
+ bool HasSplitLineTable = false;
public:
void maybeSetRootFile(StringRef Directory, StringRef FileName,
- Optional<MD5::MD5Result> Checksum, Optional<StringRef> Source) {
+ Optional<MD5::MD5Result> Checksum,
+ Optional<StringRef> Source) {
if (!Header.RootFile.Name.empty())
return;
- Header.CompilationDir = Directory;
- Header.RootFile.Name = FileName;
- Header.RootFile.DirIndex = 0;
- Header.RootFile.Checksum = Checksum;
- Header.RootFile.Source = Source;
- Header.trackMD5Usage(Checksum.hasValue());
- Header.HasSource = Source.hasValue();
+ Header.setRootFile(Directory, FileName, Checksum, Source);
}
unsigned getFile(StringRef Directory, StringRef FileName,
- Optional<MD5::MD5Result> Checksum, Optional<StringRef> Source) {
- return cantFail(Header.tryGetFile(Directory, FileName, Checksum, Source));
+ Optional<MD5::MD5Result> Checksum, uint16_t DwarfVersion,
+ Optional<StringRef> Source) {
+ HasSplitLineTable = true;
+ return cantFail(Header.tryGetFile(Directory, FileName, Checksum, Source,
+ DwarfVersion));
}
void Emit(MCStreamer &MCOS, MCDwarfLineTableParams Params,
@@ -291,12 +306,13 @@ public:
Expected<unsigned> tryGetFile(StringRef &Directory, StringRef &FileName,
Optional<MD5::MD5Result> Checksum,
Optional<StringRef> Source,
+ uint16_t DwarfVersion,
unsigned FileNumber = 0);
unsigned getFile(StringRef &Directory, StringRef &FileName,
Optional<MD5::MD5Result> Checksum, Optional<StringRef> Source,
- unsigned FileNumber = 0) {
+ uint16_t DwarfVersion, unsigned FileNumber = 0) {
return cantFail(tryGetFile(Directory, FileName, Checksum, Source,
- FileNumber));
+ DwarfVersion, FileNumber));
}
void setRootFile(StringRef Directory, StringRef FileName,
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
index eec10282f57..b14eadd2559 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
@@ -315,7 +315,9 @@ unsigned DwarfTypeUnit::getOrCreateSourceID(const DIFile *File) {
addSectionOffset(getUnitDie(), dwarf::DW_AT_stmt_list, 0);
}
return SplitLineTable->getFile(File->getDirectory(), File->getFilename(),
- getMD5AsBytes(File), File->getSource());
+ getMD5AsBytes(File),
+ Asm->OutContext.getDwarfVersion(),
+ File->getSource());
}
void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
@@ -397,7 +399,6 @@ void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, const DIFile *File) {
return;
unsigned FileID = getOrCreateSourceID(File);
- assert(FileID && "Invalid file id");
addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
}
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
index 47df83e6817..84e13adbef6 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
@@ -969,14 +969,29 @@ bool DWARFDebugLine::LineTable::lookupAddressRangeImpl(
}
bool DWARFDebugLine::LineTable::hasFileAtIndex(uint64_t FileIndex) const {
+ uint16_t DwarfVersion = Prologue.getVersion();
+ assert(DwarfVersion != 0 && "LineTable has no dwarf version information");
+ if (DwarfVersion >= 5)
+ return FileIndex < Prologue.FileNames.size();
return FileIndex != 0 && FileIndex <= Prologue.FileNames.size();
}
+const llvm::DWARFDebugLine::FileNameEntry &
+DWARFDebugLine::LineTable::getFileNameEntry(uint64_t Index) const {
+ uint16_t DwarfVersion = Prologue.getVersion();
+ assert(DwarfVersion != 0 && "LineTable has no dwarf version information");
+ // Unlike previous versions, in Dwarf 5 the file names is 0-indexed.
+ if (DwarfVersion >= 5)
+ return Prologue.FileNames[Index];
+ else
+ return Prologue.FileNames[Index - 1];
+}
+
Optional<StringRef> DWARFDebugLine::LineTable::getSourceByIndex(uint64_t FileIndex,
FileLineInfoKind Kind) const {
if (Kind == FileLineInfoKind::None || !hasFileAtIndex(FileIndex))
return None;
- const FileNameEntry &Entry = Prologue.FileNames[FileIndex - 1];
+ const FileNameEntry &Entry = getFileNameEntry(FileIndex);
if (Optional<const char *> source = Entry.Source.getAsCString())
return StringRef(*source);
return None;
@@ -996,7 +1011,7 @@ bool DWARFDebugLine::LineTable::getFileNameByIndex(uint64_t FileIndex,
std::string &Result) const {
if (Kind == FileLineInfoKind::None || !hasFileAtIndex(FileIndex))
return false;
- const FileNameEntry &Entry = Prologue.FileNames[FileIndex - 1];
+ const FileNameEntry &Entry = getFileNameEntry(FileIndex);
StringRef FileName = Entry.Name.getAsCString().getValue();
if (Kind != FileLineInfoKind::AbsoluteFilePath ||
isPathAbsoluteOnWindowsOrPosix(FileName)) {
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index ef5c4666d92..350502d633d 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -1190,7 +1190,8 @@ Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective(
MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
unsigned NumFiles = Table.getMCDwarfFiles().size();
Expected<unsigned> FileNoOrErr =
- Table.tryGetFile(Directory, Filename, Checksum, Source, FileNo);
+ Table.tryGetFile(Directory, Filename, Checksum, Source,
+ getContext().getDwarfVersion(), FileNo);
if (!FileNoOrErr)
return FileNoOrErr.takeError();
FileNo = FileNoOrErr.get();
diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp
index 4d16715c0ae..6ca7d3df19d 100644
--- a/llvm/lib/MC/MCContext.cpp
+++ b/llvm/lib/MC/MCContext.cpp
@@ -605,7 +605,8 @@ Expected<unsigned> MCContext::getDwarfFile(StringRef Directory,
Optional<StringRef> Source,
unsigned CUID) {
MCDwarfLineTable &Table = MCDwarfLineTablesCUMap[CUID];
- return Table.tryGetFile(Directory, FileName, Checksum, Source, FileNumber);
+ return Table.tryGetFile(Directory, FileName, Checksum, Source, DwarfVersion,
+ FileNumber);
}
/// isValidDwarfFileNumber - takes a dwarf file number and returns true if it
@@ -613,7 +614,7 @@ Expected<unsigned> MCContext::getDwarfFile(StringRef Directory,
bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) {
const MCDwarfLineTable &LineTable = getMCDwarfLineTable(CUID);
if (FileNumber == 0)
- return getDwarfVersion() >= 5 && LineTable.hasRootFile();
+ return getDwarfVersion() >= 5;
if (FileNumber >= LineTable.getMCDwarfFiles().size())
return false;
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index 262c520a06a..e8edf6ba1d4 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -259,7 +259,7 @@ void MCDwarfLineTable::Emit(MCObjectStreamer *MCOS,
void MCDwarfDwoLineTable::Emit(MCStreamer &MCOS, MCDwarfLineTableParams Params,
MCSection *Section) const {
- if (Header.MCDwarfFiles.empty())
+ if (!HasSplitLineTable)
return;
Optional<MCDwarfLineStr> NoLineStr(None);
MCOS.SwitchSection(Section);
@@ -538,8 +538,17 @@ Expected<unsigned> MCDwarfLineTable::tryGetFile(StringRef &Directory,
StringRef &FileName,
Optional<MD5::MD5Result> Checksum,
Optional<StringRef> Source,
+ uint16_t DwarfVersion,
unsigned FileNumber) {
- return Header.tryGetFile(Directory, FileName, Checksum, Source, FileNumber);
+ return Header.tryGetFile(Directory, FileName, Checksum, Source, DwarfVersion,
+ FileNumber);
+}
+
+bool isRootFile(const MCDwarfFile &RootFile, StringRef &Directory,
+ StringRef &FileName, Optional<MD5::MD5Result> Checksum) {
+ if (RootFile.Name.empty() || RootFile.Name != FileName.data())
+ return false;
+ return RootFile.Checksum == Checksum;
}
Expected<unsigned>
@@ -547,6 +556,7 @@ MCDwarfLineTableHeader::tryGetFile(StringRef &Directory,
StringRef &FileName,
Optional<MD5::MD5Result> Checksum,
Optional<StringRef> Source,
+ uint16_t DwarfVersion,
unsigned FileNumber) {
if (Directory == CompilationDir)
Directory = "";
@@ -561,6 +571,8 @@ MCDwarfLineTableHeader::tryGetFile(StringRef &Directory,
trackMD5Usage(Checksum.hasValue());
HasSource = (Source != None);
}
+ if (isRootFile(RootFile, Directory, FileName, Checksum) && DwarfVersion >= 5)
+ return 0;
if (FileNumber == 0) {
// File numbers start with 1 and/or after any file numbers
// allocated by inline-assembler .file directives.
diff --git a/llvm/test/MC/ARM/dwarf-asm-multiple-sections.s b/llvm/test/MC/ARM/dwarf-asm-multiple-sections.s
index cff8f000731..f995958d9f8 100644
--- a/llvm/test/MC/ARM/dwarf-asm-multiple-sections.s
+++ b/llvm/test/MC/ARM/dwarf-asm-multiple-sections.s
@@ -2,9 +2,9 @@
// RUN: llvm-dwarfdump -v %t | FileCheck -check-prefix DWARF -check-prefix DWARF45 %s
// RUN: llvm-dwarfdump --debug-line %t | FileCheck -check-prefix DWARF-DL -check-prefix DWARF-DL-5 -DDWVER=5 -DDWFILE=0 %s
// RUN: llvm-objdump -r %t | FileCheck -check-prefix RELOC -check-prefix RELOC5 %s
-// RUN: llvm-mc < %s -triple=armv7-linux-gnueabi -filetype=obj -o %t -g -fdebug-compilation-dir=/tmp
+// RUN: llvm-mc < %s -triple=armv7-linux-gnueabi -filetype=obj -o %t -g -dwarf-version 4 -fdebug-compilation-dir=/tmp
// RUN: llvm-dwarfdump -v %t | FileCheck -check-prefix DWARF -check-prefix DWARF45 %s
-// RUN: llvm-dwarfdump --debug-line %t | FileCheck -check-prefix DWARF-DL -DDWVER=4 -DDWFILE=1 %s
+// RUN: llvm-dwarfdump --debug-line %t | FileCheck -check-prefix DWARF-DL -check-prefix DWARF-DL-4 -DDWVER=4 -DDWFILE=1 %s
// RUN: llvm-objdump -r %t | FileCheck -check-prefix RELOC -check-prefix RELOC4 %s
// RUN: llvm-mc < %s -triple=armv7-linux-gnueabi -filetype=obj -o %t -g -dwarf-version 3 -fdebug-compilation-dir=/tmp
// RUN: llvm-dwarfdump -v %t | FileCheck -check-prefix DWARF -check-prefix DWARF3 %s
@@ -57,10 +57,14 @@ b:
// DWARF-DL-5: include_directories[ 0] = "/tmp"
// DWARF-DL: file_names[ [[DWFILE]]]:
// DWARF-DL: name: "{{(<stdin>|-)}}"
-// DWARF-DL: 0x0000000000000000 17 0 1 0 0 is_stmt
-// DWARF-DL-NEXT: 0x0000000000000004 17 0 1 0 0 is_stmt end_sequence
-// DWARF-DL-NEXT: 0x0000000000000000 21 0 1 0 0 is_stmt
-// DWARF-DL-NEXT: 0x0000000000000004 21 0 1 0 0 is_stmt end_sequence
+// DWARF-DL-5: 0x0000000000000000 17 0 0 0 0 is_stmt
+// DWARF-DL-5-NEXT: 0x0000000000000004 17 0 0 0 0 is_stmt end_sequence
+// DWARF-DL-5-NEXT: 0x0000000000000000 21 0 0 0 0 is_stmt
+// DWARF-DL-5-NEXT: 0x0000000000000004 21 0 0 0 0 is_stmt end_sequence
+// DWARF-DL-4: 0x0000000000000000 17 0 1 0 0 is_stmt
+// DWARF-DL-4-NEXT: 0x0000000000000004 17 0 1 0 0 is_stmt end_sequence
+// DWARF-DL-4-NEXT: 0x0000000000000000 21 0 1 0 0 is_stmt
+// DWARF-DL-4-NEXT: 0x0000000000000004 21 0 1 0 0 is_stmt end_sequence
// DWARF: .debug_ranges contents:
diff --git a/llvm/test/MC/ELF/debug-mixed-md5.ll b/llvm/test/MC/ELF/debug-mixed-md5.ll
index 2ec8141325f..d48e42c8d12 100644
--- a/llvm/test/MC/ELF/debug-mixed-md5.ll
+++ b/llvm/test/MC/ELF/debug-mixed-md5.ll
@@ -1,8 +1,7 @@
; RUN: %llc_dwarf -filetype=asm -dwarf-version=5 %s -o - | FileCheck %s -check-prefix=ASM
; RUN: %llc_dwarf -filetype=obj -dwarf-version=5 %s -o - | llvm-dwarfdump -debug-line - | FileCheck %s -check-prefix=OBJ
; ASM: .file 0 "{{.+}}" md5
-; ASM: .file 1 "{{.+}}" md5
-; ASM: .file 2 "t1.cpp"
+; ASM: .file 1 "t1.cpp"
; ASM-NOT: md5
; OBJ: file_names[ 0]:
; OBJ-NOT: md5
diff --git a/llvm/test/MC/ELF/dwarf-file0.s b/llvm/test/MC/ELF/dwarf-file0.s
index 1a3afb6875f..f98fdcc2b40 100644
--- a/llvm/test/MC/ELF/dwarf-file0.s
+++ b/llvm/test/MC/ELF/dwarf-file0.s
@@ -19,16 +19,14 @@
# CHECK: file_names[ 1]:
# CHECK-NEXT: name: "header.h"
# CHECK-NEXT: dir_index: 1
-# CHECK: file_names[ 2]:
-# CHECK-NEXT: name: "root.cpp"
+# CHECK-4: file_names[ 2]:
+# CHECK-4-NEXT: name: "root.cpp"
# CHECK-4-NEXT: dir_index: 2
-# CHECK-5-NEXT: dir_index: 0
# ASM-NOT: .file
# ASM-5: .file 0 "/test" "root.cpp"
# ASM: .file 1 "/include" "header.h"
# ASM-4: .file 2 "/test" "root.cpp"
-# ASM-5: .file 2 "root.cpp"
# ASM-NOT: .file
# WARN: file 0 not supported prior to DWARF-5
diff --git a/llvm/test/tools/llvm-objdump/Inputs/embedded-source b/llvm/test/tools/llvm-objdump/Inputs/embedded-source
index 072b5a90c5c..8274a6619ed 100644
--- a/llvm/test/tools/llvm-objdump/Inputs/embedded-source
+++ b/llvm/test/tools/llvm-objdump/Inputs/embedded-source
Binary files differ
diff --git a/llvm/test/tools/llvm-objdump/X86/function-sections-line-numbers.s b/llvm/test/tools/llvm-objdump/X86/function-sections-line-numbers.s
index b932a5d3f32..46607440cb9 100644
--- a/llvm/test/tools/llvm-objdump/X86/function-sections-line-numbers.s
+++ b/llvm/test/tools/llvm-objdump/X86/function-sections-line-numbers.s
@@ -30,8 +30,7 @@
_Z2f1v: # @_Z2f1v
.Lfunc_begin0:
.file 0 "/home/avl" "test.cpp" md5 0xefae234cc05b45384d782316d3a5d338
- .file 1 "test.cpp" md5 0xefae234cc05b45384d782316d3a5d338
- .loc 1 1 0 # test.cpp:1:0
+ .loc 0 1 0 # test.cpp:1:0
.cfi_startproc
# %bb.0: # %entry
pushq %rbp
@@ -40,7 +39,7 @@ _Z2f1v: # @_Z2f1v
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
.Ltmp0:
- .loc 1 1 12 prologue_end # test.cpp:1:12
+ .loc 0 1 12 prologue_end # test.cpp:1:12
popq %rbp
.cfi_def_cfa %rsp, 8
retq
@@ -55,7 +54,7 @@ _Z2f1v: # @_Z2f1v
.type _Z2f2v,@function
_Z2f2v: # @_Z2f2v
.Lfunc_begin1:
- .loc 1 2 0 # test.cpp:2:0
+ .loc 0 2 0 # test.cpp:2:0
.cfi_startproc
# %bb.0: # %entry
pushq %rbp
@@ -64,7 +63,7 @@ _Z2f2v: # @_Z2f2v
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
.Ltmp2:
- .loc 1 2 12 prologue_end # test.cpp:2:12
+ .loc 0 2 12 prologue_end # test.cpp:2:12
popq %rbp
.cfi_def_cfa %rsp, 8
retq
OpenPOWER on IntegriCloud