diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index 1f59e743428..aae27f5d764 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -32,6 +32,18 @@ using namespace llvm; // TargetLoweringObjectFile. typedef StringMap MachOUniqueMapTy; +AsmParser::AsmParser(SourceMgr &_SM, MCContext &_Ctx, MCStreamer &_Out, + const MCAsmInfo &_MAI) + : Lexer(_SM, _MAI), Ctx(_Ctx), Out(_Out), TargetParser(0), + SectionUniquingMap(0) { + // Debugging directives. + AddDirectiveHandler(".file", &AsmParser::ParseDirectiveFile); + AddDirectiveHandler(".line", &AsmParser::ParseDirectiveLine); + AddDirectiveHandler(".loc", &AsmParser::ParseDirectiveLoc); +} + + + AsmParser::~AsmParser() { // If we have the MachO uniquing map, free it. delete (MachOUniqueMapTy*)SectionUniquingMap; @@ -672,15 +684,11 @@ bool AsmParser::ParseStatement() { if (IDVal == ".load") return ParseDirectiveDarwinDumpOrLoad(IDLoc, /*IsLoad=*/false); - // Debugging directives - - if (IDVal == ".file") - return ParseDirectiveFile(IDLoc); - if (IDVal == ".line") - return ParseDirectiveLine(IDLoc); - if (IDVal == ".loc") - return ParseDirectiveLoc(IDLoc); - + // Look up the handler in the handler table, + bool(AsmParser::*Handler)(StringRef, SMLoc) = DirectiveMap[IDVal]; + if (Handler) + return (this->*Handler)(IDVal, IDLoc); + // Target hook for parsing target specific directives. if (!getTargetParser().ParseDirective(ID)) return false; @@ -1587,7 +1595,7 @@ bool AsmParser::ParseDirectiveEndIf(SMLoc DirectiveLoc) { /// ParseDirectiveFile /// ::= .file [number] string -bool AsmParser::ParseDirectiveFile(SMLoc DirectiveLoc) { +bool AsmParser::ParseDirectiveFile(StringRef, SMLoc DirectiveLoc) { // FIXME: I'm not sure what this is. int64_t FileNumber = -1; if (Lexer.is(AsmToken::Integer)) { @@ -1614,7 +1622,7 @@ bool AsmParser::ParseDirectiveFile(SMLoc DirectiveLoc) { /// ParseDirectiveLine /// ::= .line [number] -bool AsmParser::ParseDirectiveLine(SMLoc DirectiveLoc) { +bool AsmParser::ParseDirectiveLine(StringRef, SMLoc DirectiveLoc) { if (Lexer.isNot(AsmToken::EndOfStatement)) { if (Lexer.isNot(AsmToken::Integer)) return TokError("unexpected token in '.line' directive"); @@ -1635,7 +1643,7 @@ bool AsmParser::ParseDirectiveLine(SMLoc DirectiveLoc) { /// ParseDirectiveLoc /// ::= .loc number [number [number]] -bool AsmParser::ParseDirectiveLoc(SMLoc DirectiveLoc) { +bool AsmParser::ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc) { if (Lexer.isNot(AsmToken::Integer)) return TokError("unexpected token in '.loc' directive"); diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h index 919d959d08d..171dfcd4aa9 100644 --- a/tools/llvm-mc/AsmParser.h +++ b/tools/llvm-mc/AsmParser.h @@ -21,6 +21,7 @@ #include "llvm/MC/MCSectionMachO.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCAsmInfo.h" +#include "llvm/ADT/StringMap.h" namespace llvm { class AsmCond; @@ -47,15 +48,23 @@ private: // is also used by TargetLoweringObjectFile. mutable void *SectionUniquingMap; + /// DirectiveMap - This is a table handlers for directives. Each handler is + /// invoked after the directive identifier is read and is responsible for + /// parsing and validating the rest of the directive. The handler is passed + /// in the directive name and the location of the directive keyword. + StringMap DirectiveMap; public: AsmParser(SourceMgr &_SM, MCContext &_Ctx, MCStreamer &_Out, - const MCAsmInfo &_MAI) - : Lexer(_SM, _MAI), Ctx(_Ctx), Out(_Out), TargetParser(0), - SectionUniquingMap(0) {} + const MCAsmInfo &_MAI); ~AsmParser(); bool Run(); + + void AddDirectiveHandler(StringRef Directive, + bool (AsmParser::*Handler)(StringRef, SMLoc)) { + DirectiveMap[Directive] = Handler; + } public: TargetAsmParser &getTargetParser() const { return *TargetParser; } void setTargetParser(TargetAsmParser &P) { TargetParser = &P; } @@ -64,19 +73,14 @@ public: /// { virtual MCAsmLexer &getLexer() { return Lexer; } - virtual MCContext &getContext() { return Ctx; } - virtual MCStreamer &getStreamer() { return Out; } virtual void Warning(SMLoc L, const Twine &Meg); - virtual bool Error(SMLoc L, const Twine &Msg); virtual bool ParseExpression(const MCExpr *&Res); - virtual bool ParseParenExpression(const MCExpr *&Res); - virtual bool ParseAbsoluteExpression(int64_t &Res); /// } @@ -145,9 +149,9 @@ private: bool ParseDirectiveElse(SMLoc DirectiveLoc); // ".else" bool ParseDirectiveEndIf(SMLoc DirectiveLoc); // .endif - bool ParseDirectiveFile(SMLoc DirectiveLoc); // ".file" - bool ParseDirectiveLine(SMLoc DirectiveLoc); // ".line" - bool ParseDirectiveLoc(SMLoc DirectiveLoc); // ".loc" + bool ParseDirectiveFile(StringRef, SMLoc DirectiveLoc); // ".file" + bool ParseDirectiveLine(StringRef, SMLoc DirectiveLoc); // ".line" + bool ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc); // ".loc" /// ParseEscapedString - Parse the current token as a string which may include /// escaped characters and return the string contents.