diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h | 5 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCDwarf.h | 50 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp | 19 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/MC/MCContext.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 16 | ||||
-rw-r--r-- | llvm/test/MC/ARM/dwarf-asm-multiple-sections.s | 16 | ||||
-rw-r--r-- | llvm/test/MC/ELF/debug-mixed-md5.ll | 3 | ||||
-rw-r--r-- | llvm/test/MC/ELF/dwarf-file0.s | 6 | ||||
-rw-r--r-- | llvm/test/tools/llvm-objdump/Inputs/embedded-source | bin | 9936 -> 9528 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-objdump/X86/function-sections-line-numbers.s | 9 |
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 Binary files differindex 072b5a90c5c..8274a6619ed 100644 --- a/llvm/test/tools/llvm-objdump/Inputs/embedded-source +++ b/llvm/test/tools/llvm-objdump/Inputs/embedded-source 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 |