Index: llvm/include/llvm/MC/MCDwarf.h =================================================================== --- llvm/include/llvm/MC/MCDwarf.h +++ llvm/include/llvm/MC/MCDwarf.h @@ -314,10 +314,13 @@ 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(); } Index: llvm/lib/MC/MCContext.cpp =================================================================== --- llvm/lib/MC/MCContext.cpp +++ llvm/lib/MC/MCContext.cpp @@ -556,11 +556,13 @@ /// 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 &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 Index: llvm/lib/MC/MCParser/AsmParser.cpp =================================================================== --- llvm/lib/MC/MCParser/AsmParser.cpp +++ llvm/lib/MC/MCParser/AsmParser.cpp @@ -3412,7 +3412,7 @@ 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")) Index: llvm/test/MC/ELF/dwarf-loc0.s =================================================================== --- /dev/null +++ llvm/test/MC/ELF/dwarf-loc0.s @@ -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 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: ^