Index: llvm/lib/MC/MCParser/AsmParser.cpp =================================================================== --- llvm/lib/MC/MCParser/AsmParser.cpp +++ llvm/lib/MC/MCParser/AsmParser.cpp @@ -3348,17 +3348,17 @@ } } - // In case there is a -g option as well as debug info from directive .file, - // we turn off the -g option, directly use the existing debug info instead. - // Also reset any implicit ".file 0" for the assembler source. - if (Ctx.getGenDwarfForAssembly()) { - Ctx.getMCDwarfLineTable(0).resetRootFile(); - Ctx.setGenDwarfForAssembly(false); - } - if (FileNumber == -1) getStreamer().EmitFileDirective(Filename); else { + // In case there is a -g option as well as debug info from directive .file, + // we turn off the -g option, directly use the existing debug info instead. + // Also reset any implicit ".file 0" for the assembler source. + if (Ctx.getGenDwarfForAssembly()) { + Ctx.getMCDwarfLineTable(0).resetRootFile(); + Ctx.setGenDwarfForAssembly(false); + } + MD5::MD5Result *CKMem = nullptr; if (HasMD5) { CKMem = (MD5::MD5Result *)Ctx.allocate(sizeof(MD5::MD5Result), 1); Index: llvm/test/MC/AsmParser/directive_file-3.s =================================================================== --- /dev/null +++ llvm/test/MC/AsmParser/directive_file-3.s @@ -0,0 +1,24 @@ +// RUN: llvm-mc -g -triple i386-unknown-unknown %s | FileCheck -check-prefix=CHECK-DEFAULT %s +// RUN: llvm-mc -g -triple i386-unknown-unknown %s -filetype=obj | obj2yaml | FileCheck -check-prefix=CHECK-DEBUG %s + +// Test for Bug 38695 +// This testcase has a single function and a .file directive +// without the [file-num] argument. When compiled with -g, +// this testcase will not report error, and generate new +// debug info. + + .file "hello" +.text + +f1: + nop +.size f1, .-f1 + +// CHECK-DEFAULT: .file "hello" + +// CHECK-DEBUG: Sections: +// CHECK-DEBUG: - Name: .text +// CHECK-DEBUG: - Name: .debug_info +// CHECK-DEBUG: - Name: .rel.debug_info +// CHECK-DEBUG: Info: .debug_info +// CHECK-DEBUG: Symbols: