[DWARF] Fix mixing assembler -g with DWARF .file directives.

We were effectively overriding an explicit '.file' directive with info
for the assembler source.  That shouldn't happen.

Fixes PR36636.

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

llvm-svn: 327073
This commit is contained in:
Paul Robinson 2018-03-08 22:39:47 +00:00
parent fe25df29a1
commit 25bc112f74
2 changed files with 30 additions and 15 deletions

View File

@ -311,6 +311,11 @@ private:
}
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 @@ const AsmToken &AsmParser::Lex() {
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 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) {
SmallVector<AsmRewrite, 4> 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 AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) {
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 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
// 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 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
// 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 @@ bool AsmParser::parseDirectiveFile(SMLoc DirectiveLoc) {
}
// 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<unsigned> FileNumOrErr = getStreamer().tryEmitDwarfFileDirective(
FileNumber, Directory, Filename, CKMem, Source);
if (!FileNumOrErr)
return Error(DirectiveLoc, toString(FileNumOrErr.takeError()));
FileNumber = FileNumOrErr.get();
}
getContext().setGenDwarfForAssembly(false);
Expected<unsigned> FileNumOrErr = getStreamer().tryEmitDwarfFileDirective(
FileNumber, Directory, Filename, CKMem, Source);
if (!FileNumOrErr)
return Error(DirectiveLoc, toString(FileNumOrErr.takeError()));
FileNumber = FileNumOrErr.get();
}
return false;

View File

@ -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,