Parse and remember discriminators in .loc line. I try to output them with

another patch.
This lets us parse a bit more of the gcc 4.5 output.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118975 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2010-11-13 03:18:27 +00:00
parent 7247c079f7
commit c50a0fd7cb
5 changed files with 25 additions and 6 deletions

View File

@ -186,12 +186,14 @@ namespace llvm {
/// is assembled an entry in the line number table with this information and /// is assembled an entry in the line number table with this information and
/// the address of the instruction will be created. /// the address of the instruction will be created.
void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column, void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column,
unsigned Flags, unsigned Isa) { unsigned Flags, unsigned Isa,
unsigned Discriminator) {
CurrentDwarfLoc.setFileNum(FileNum); CurrentDwarfLoc.setFileNum(FileNum);
CurrentDwarfLoc.setLine(Line); CurrentDwarfLoc.setLine(Line);
CurrentDwarfLoc.setColumn(Column); CurrentDwarfLoc.setColumn(Column);
CurrentDwarfLoc.setFlags(Flags); CurrentDwarfLoc.setFlags(Flags);
CurrentDwarfLoc.setIsa(Isa); CurrentDwarfLoc.setIsa(Isa);
CurrentDwarfLoc.setDiscriminator(Discriminator);
DwarfLocSeen = true; DwarfLocSeen = true;
} }
void ClearDwarfLocSeen() { DwarfLocSeen = false; } void ClearDwarfLocSeen() { DwarfLocSeen = false; }

View File

@ -83,6 +83,8 @@ namespace llvm {
unsigned Flags; unsigned Flags;
// Isa // Isa
unsigned Isa; unsigned Isa;
// Discriminator
unsigned Discriminator;
// Flag that indicates the initial value of the is_stmt_start flag. // Flag that indicates the initial value of the is_stmt_start flag.
#define DWARF2_LINE_DEFAULT_IS_STMT 1 #define DWARF2_LINE_DEFAULT_IS_STMT 1
@ -96,8 +98,9 @@ namespace llvm {
friend class MCContext; friend class MCContext;
friend class MCLineEntry; friend class MCLineEntry;
MCDwarfLoc(unsigned fileNum, unsigned line, unsigned column, unsigned flags, MCDwarfLoc(unsigned fileNum, unsigned line, unsigned column, unsigned flags,
unsigned isa) unsigned isa, unsigned discriminator)
: FileNum(fileNum), Line(line), Column(column), Flags(flags), Isa(isa) {} : FileNum(fileNum), Line(line), Column(column), Flags(flags), Isa(isa),
Discriminator(discriminator) {}
// Allow the default copy constructor and assignment operator to be used // Allow the default copy constructor and assignment operator to be used
// for an MCDwarfLoc object. // for an MCDwarfLoc object.
@ -118,6 +121,9 @@ namespace llvm {
/// getIsa - Get the Isa of this MCDwarfLoc. /// getIsa - Get the Isa of this MCDwarfLoc.
unsigned getIsa() { return Isa; } unsigned getIsa() { return Isa; }
/// getDiscriminator - Get the Discriminator of this MCDwarfLoc.
unsigned getDiscriminator() { return Discriminator; }
/// setFileNum - Set the FileNum of this MCDwarfLoc. /// setFileNum - Set the FileNum of this MCDwarfLoc.
void setFileNum(unsigned fileNum) { FileNum = fileNum; } void setFileNum(unsigned fileNum) { FileNum = fileNum; }
@ -132,6 +138,11 @@ namespace llvm {
/// setIsa - Set the Isa of this MCDwarfLoc. /// setIsa - Set the Isa of this MCDwarfLoc.
void setIsa(unsigned isa) { Isa = isa; } void setIsa(unsigned isa) { Isa = isa; }
/// setDiscriminator - Set the Discriminator of this MCDwarfLoc.
void setDiscriminator(unsigned discriminator) {
Discriminator = discriminator;
}
}; };
/// MCLineEntry - Instances of this class represent the line information for /// MCLineEntry - Instances of this class represent the line information for

View File

@ -25,7 +25,7 @@ typedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
MCContext::MCContext(const MCAsmInfo &mai) : MAI(mai), NextUniqueID(0), MCContext::MCContext(const MCAsmInfo &mai) : MAI(mai), NextUniqueID(0),
CurrentDwarfLoc(0,0,0,0,0) { CurrentDwarfLoc(0,0,0,0,0,0) {
MachOUniquingMap = 0; MachOUniquingMap = 0;
ELFUniquingMap = 0; ELFUniquingMap = 0;
COFFUniquingMap = 0; COFFUniquingMap = 0;

View File

@ -2019,6 +2019,7 @@ bool GenericAsmParser::ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc) {
unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0; unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
unsigned Isa = 0; unsigned Isa = 0;
int64_t Discriminator = 0;
if (getLexer().isNot(AsmToken::EndOfStatement)) { if (getLexer().isNot(AsmToken::EndOfStatement)) {
for (;;) { for (;;) {
if (getLexer().is(AsmToken::EndOfStatement)) if (getLexer().is(AsmToken::EndOfStatement))
@ -2070,6 +2071,10 @@ bool GenericAsmParser::ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc) {
return Error(Loc, "isa number not a constant value"); return Error(Loc, "isa number not a constant value");
} }
} }
else if (Name == "discriminator") {
if (getParser().ParseAbsoluteExpression(Discriminator))
return true;
}
else { else {
return Error(Loc, "unknown sub-directive in '.loc' directive"); return Error(Loc, "unknown sub-directive in '.loc' directive");
} }
@ -2079,7 +2084,8 @@ bool GenericAsmParser::ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc) {
} }
} }
getContext().setCurrentDwarfLoc(FileNumber, LineNumber, ColumnPos, Flags,Isa); getContext().setCurrentDwarfLoc(FileNumber, LineNumber, ColumnPos, Flags,
Isa, Discriminator);
return false; return false;
} }

View File

@ -5,4 +5,4 @@
.loc 1 .loc 1
.loc 1 2 .loc 1 2
.loc 1 2 3 .loc 1 2 3
.loc 1 2 discriminator 1