[llvm-commits] [llvm] r82926 - in /llvm/trunk/tools/llvm-mc: AsmParser.cpp AsmParser.h

Chris Lattner sabre at nondot.org
Sun Sep 27 14:16:53 PDT 2009


Author: lattner
Date: Sun Sep 27 16:16:52 2009
New Revision: 82926

URL: http://llvm.org/viewvc/llvm-project?rev=82926&view=rev
Log:
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.


Modified:
    llvm/trunk/tools/llvm-mc/AsmParser.cpp
    llvm/trunk/tools/llvm-mc/AsmParser.h

Modified: llvm/trunk/tools/llvm-mc/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/AsmParser.cpp?rev=82926&r1=82925&r2=82926&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-mc/AsmParser.cpp (original)
+++ llvm/trunk/tools/llvm-mc/AsmParser.cpp Sun Sep 27 16:16:52 2009
@@ -32,6 +32,18 @@
 // 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 @@
     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 @@
 
 /// 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 @@
 
 /// 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 @@
 
 /// 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");
 

Modified: llvm/trunk/tools/llvm-mc/AsmParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/AsmParser.h?rev=82926&r1=82925&r2=82926&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-mc/AsmParser.h (original)
+++ llvm/trunk/tools/llvm-mc/AsmParser.h Sun Sep 27 16:16:52 2009
@@ -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 @@
   // 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 @@
   /// {
 
   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 @@
   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.





More information about the llvm-commits mailing list