Skip to content

Commit

Permalink
[DWARFv5] Allow ".loc 0" to refer to the root file.
Browse files Browse the repository at this point in the history
DWARF v5 explicitly represents file #0 in the line table.  Prior
versions did not, so ".loc 0" is still an error in those cases.

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

llvm-svn: 335350
  • Loading branch information
pogo59 committed Jun 22, 2018
1 parent 1e56450 commit 11539b0
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 4 deletions.
3 changes: 3 additions & 0 deletions llvm/include/llvm/MC/MCDwarf.h
Original file line number Diff line number Diff line change
Expand Up @@ -314,10 +314,13 @@ class MCDwarfLineTable {

void resetRootFile() {
assert(Header.MCDwarfFiles.empty());
Header.RootFile.Name.clear();
Header.resetMD5Usage();
Header.HasSource = false;
}

bool hasRootFile() const { return !Header.RootFile.Name.empty(); }

// Report whether MD5 usage has been consistent (all-or-none).
bool isMD5UsageConsistent() const { return Header.isMD5UsageConsistent(); }

Expand Down
8 changes: 5 additions & 3 deletions llvm/lib/MC/MCContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -556,11 +556,13 @@ Expected<unsigned> MCContext::getDwarfFile(StringRef Directory,
/// isValidDwarfFileNumber - takes a dwarf file number and returns true if it
/// currently is assigned and false otherwise.
bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) {
const SmallVectorImpl<MCDwarfFile> &MCDwarfFiles = getMCDwarfFiles(CUID);
if (FileNumber == 0 || FileNumber >= MCDwarfFiles.size())
const MCDwarfLineTable &LineTable = getMCDwarfLineTable(CUID);
if (FileNumber == 0)
return getDwarfVersion() >= 5 && LineTable.hasRootFile();
if (FileNumber >= LineTable.getMCDwarfFiles().size())
return false;

return !MCDwarfFiles[FileNumber].Name.empty();
return !LineTable.getMCDwarfFiles()[FileNumber].Name.empty();
}

/// Remove empty sections from SectionStartEndSyms, to avoid generating
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/MC/MCParser/AsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3412,7 +3412,7 @@ bool AsmParser::parseDirectiveLoc() {
int64_t FileNumber = 0, LineNumber = 0;
SMLoc Loc = getTok().getLoc();
if (parseIntToken(FileNumber, "unexpected token in '.loc' directive") ||
check(FileNumber < 1, Loc,
check(FileNumber < 1 && Ctx.getDwarfVersion() < 5, Loc,
"file number less than one in '.loc' directive") ||
check(!getContext().isValidDwarfFileNumber(FileNumber), Loc,
"unassigned file number in '.loc' directive"))
Expand Down
26 changes: 26 additions & 0 deletions llvm/test/MC/ELF/dwarf-loc0.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# RUN: llvm-mc -dwarf-version 5 %s -filetype=obj -o - | llvm-dwarfdump -debug-line - | FileCheck %s
# RUN: not llvm-mc -dwarf-version 4 %s -filetype=asm -o - 2>&1 | FileCheck %s -check-prefix=ERR
# REQUIRES: default_triple
# Darwin line table is stuck on DWARF v2.
# XFAIL: darwin
# Show that ".loc 0" works in DWARF v5, gets an error for earlier versions.
.file 0 "root.cpp"
.file 1 "header.h"
.loc 0 10 0
nop
.loc 1 20 0
nop

# CHECK: file_names[ 0]:
# CHECK-NEXT: name: "root.cpp"
# CHECK: file_names[ 1]:
# CHECK-NEXT: name: "header.h"
# CHECK: Address Line Column File
# CHECK-NEXT: -------
# CHECK-NEXT: 0x{{0+}}0 10 0 0
# CHECK-NEXT: 0x{{0+}}1 20 0 1
# CHECK-NEXT: 0x{{0+}}2 20 0 1 {{.*}} end_sequence

# ERR: file number less than one in '.loc' directive
# ERR-NEXT: .loc 0 10 0
# ERR-NEXT: ^

0 comments on commit 11539b0

Please sign in to comment.