aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-09-27 21:16:52 +0000
committerChris Lattner <sabre@nondot.org>2009-09-27 21:16:52 +0000
commitebb89b418676e5790cb0f385bb6159dd234542ce (patch)
tree66ead7ba974b9ac8f3ecd4045da041299a85d5fa /tools
parente4172f48cc58bbad6a90325d14ce2497e1aa3c6c (diff)
downloadexternal_llvm-ebb89b418676e5790cb0f385bb6159dd234542ce.zip
external_llvm-ebb89b418676e5790cb0f385bb6159dd234542ce.tar.gz
external_llvm-ebb89b418676e5790cb0f385bb6159dd234542ce.tar.bz2
add a new DirectiveMap stringmap, which allows more efficient dispatching
to directive handlers and allows for easier extensibility. I only switched a few over for now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82926 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/llvm-mc/AsmParser.cpp32
-rw-r--r--tools/llvm-mc/AsmParser.h26
2 files changed, 35 insertions, 23 deletions
diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp
index 1f59e74..aae27f5 100644
--- a/tools/llvm-mc/AsmParser.cpp
+++ b/tools/llvm-mc/AsmParser.cpp
@@ -32,6 +32,18 @@ using namespace llvm;
// TargetLoweringObjectFile.
typedef StringMap<const MCSectionMachO*> 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 919d959..171dfcd 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<bool(AsmParser::*)(StringRef, SMLoc)> 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.