mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-18 19:28:16 +00:00
[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:
parent
fe25df29a1
commit
25bc112f74
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user