Index: llvm/trunk/lib/MC/MCParser/AsmParser.cpp =================================================================== --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp @@ -311,6 +311,11 @@ } static void DiagHandler(const SMDiagnostic &Diag, void *Context); + /// Should we emit DWARF describing this assembler source? (Returns false if + /// the source has .file directives, which means we don't want to generate + /// info describing the assembler source itself.) + bool enabledGenDwarfForAssembly(); + /// \brief Enter the specified file. This returns true on failure. bool enterIncludeFile(const std::string &Filename); @@ -824,6 +829,19 @@ return *tok; } +bool AsmParser::enabledGenDwarfForAssembly() { + // Check whether the user specified -g. + if (!getContext().getGenDwarfForAssembly()) + return false; + // If we haven't encountered any .file directives (which would imply that + // the assembler source was produced with debug info already) then emit one + // describing the assembler source file itself. + if (getContext().getGenDwarfFileNumber() == 0) + getContext().setGenDwarfFileNumber(getStreamer().EmitDwarfFileDirective( + 0, StringRef(), getContext().getMainFileName())); + return true; +} + bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) { // Create the initial section, if requested. if (!NoInitialTextSection) @@ -837,7 +855,9 @@ SmallVector AsmStrRewrites; // If we are generating dwarf for assembly source files save the initial text - // section and generate a .file directive. + // section. (Don't use enabledGenDwarfForAssembly() here, as we aren't + // emitting any actual debug info yet and haven't had a chance to parse any + // embedded .file directives.) if (getContext().getGenDwarfForAssembly()) { MCSection *Sec = getStreamer().getCurrentSectionOnly(); if (!Sec->getBeginSymbol()) { @@ -848,8 +868,6 @@ bool InsertResult = getContext().addGenDwarfSection(Sec); assert(InsertResult && ".text section should not have debug info yet"); (void)InsertResult; - getContext().setGenDwarfFileNumber(getStreamer().EmitDwarfFileDirective( - 0, StringRef(), getContext().getMainFileName())); } // While we have input, parse each statement. @@ -1784,7 +1802,7 @@ // If we are generating dwarf for assembly source files then gather the // info to make a dwarf label entry for this label if needed. - if (getContext().getGenDwarfForAssembly()) + if (enabledGenDwarfForAssembly()) MCGenDwarfLabelEntry::Make(Sym, &getStreamer(), getSourceManager(), IDLoc); @@ -2153,7 +2171,7 @@ // If we are generating dwarf for the current section then generate a .loc // directive for the instruction. - if (!ParseHadError && getContext().getGenDwarfForAssembly() && + if (!ParseHadError && enabledGenDwarfForAssembly() && getContext().getGenDwarfSectionSyms().count( getStreamer().getCurrentSectionOnly())) { unsigned Line; @@ -3336,15 +3354,12 @@ } // If there is -g option as well as debug info from directive file, // we turn off -g option, directly use the existing debug info instead. - if (getContext().getGenDwarfForAssembly()) - getContext().setGenDwarfForAssembly(false); - else { - Expected FileNumOrErr = getStreamer().tryEmitDwarfFileDirective( - FileNumber, Directory, Filename, CKMem, Source); - if (!FileNumOrErr) - return Error(DirectiveLoc, toString(FileNumOrErr.takeError())); - FileNumber = FileNumOrErr.get(); - } + getContext().setGenDwarfForAssembly(false); + Expected FileNumOrErr = getStreamer().tryEmitDwarfFileDirective( + FileNumber, Directory, Filename, CKMem, Source); + if (!FileNumOrErr) + return Error(DirectiveLoc, toString(FileNumOrErr.takeError())); + FileNumber = FileNumOrErr.get(); } return false; Index: llvm/trunk/test/MC/AsmParser/directive_file-2.s =================================================================== --- llvm/trunk/test/MC/AsmParser/directive_file-2.s +++ llvm/trunk/test/MC/AsmParser/directive_file-2.s @@ -1,4 +1,4 @@ -// RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s +// RUN: llvm-mc -g -triple i386-unknown-unknown %s | FileCheck %s // Test for Bug 11740 // This testcase has two directive files, // when compiled with -g, this testcase will not report error,