Index: llvm/lib/MC/MCParser/AsmParser.cpp =================================================================== --- llvm/lib/MC/MCParser/AsmParser.cpp +++ llvm/lib/MC/MCParser/AsmParser.cpp @@ -165,6 +165,9 @@ }; CppHashInfoTy CppHashInfo; + /// The filename from the first cpp hash file line comment, if any. + StringRef FirstCppHashFilename; + /// List of forward directional labels for diagnosis at the end. SmallVector, 4> DirLabels; @@ -849,6 +852,13 @@ // the assembler source was produced with debug info already) then emit one // describing the assembler source file itself. if (getContext().getGenDwarfFileNumber() == 0) { + // Use the first #line directive for this, if any. It's preprocessed, so + // there is no checksum, and of course no source directive. + if (!FirstCppHashFilename.empty()) + getContext().setMCLineTableRootFile(/*CUID=*/0, + getContext().getCompilationDir(), + FirstCppHashFilename, + /*Cksum=*/None, /*Source=*/None); const MCDwarfFile &RootFile = getContext().getMCDwarfLineTable(/*CUID=*/0).getRootFile(); getContext().setGenDwarfFileNumber(getStreamer().EmitDwarfFileDirective( @@ -2285,11 +2295,14 @@ // Get rid of the enclosing quotes. Filename = Filename.substr(1, Filename.size() - 2); - // Save the SMLoc, Filename and LineNumber for later use by diagnostics. + // Save the SMLoc, Filename and LineNumber for later use by diagnostics + // and possibly DWARF file info. CppHashInfo.Loc = L; CppHashInfo.Filename = Filename; CppHashInfo.LineNumber = LineNumber; CppHashInfo.Buf = CurBuffer; + if (FirstCppHashFilename.empty()) + FirstCppHashFilename = Filename; return false; } Index: llvm/test/MC/ELF/debug-hash-file.s =================================================================== --- /dev/null +++ llvm/test/MC/ELF/debug-hash-file.s @@ -0,0 +1,21 @@ +// RUN: llvm-mc -triple x86_64-unknown-linux-gnu -filetype obj -g -dwarf-version 4 -o %t %s +// RUN: llvm-dwarfdump -debug-info -debug-line %t | FileCheck %s + +// CHECK: DW_TAG_compile_unit +// CHECK-NOT: DW_TAG_ +// CHECK: DW_AT_name ("/MyTest/Inputs{{(/|\\)+}}other.S") +// CHECK: DW_TAG_label +// CHECK-NOT: DW_TAG_ +// CHECK: DW_AT_decl_file ("/MyTest/Inputs{{(/|\\)+}}other.S") + +// CHECK: include_directories[ 1] = "/MyTest/Inputs" +// CHECK: file_names[ 1]: +// CHECK-NEXT: name: "other.S" +// CHECK-NEXT: dir_index: 1 + +# 1 "/MyTest/Inputs/other.S" + +foo: + nop + nop + nop