llvm-mc: Support quoted identifiers.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 31 Jul 2009 21:55:09 +0000 (21:55 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 31 Jul 2009 21:55:09 +0000 (21:55 +0000)
 - Uses MCAsmToken::getIdentifier which returns the (sub)string representing the
   meaningfull contents a string or identifier token.

 - Directives aren't done yet.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77739 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAsmLexer.h
test/MC/AsmParser/labels.s [new file with mode: 0644]
tools/llvm-mc/AsmParser.cpp

index b1b4dd1155eff7d467d3ee063b1f349579b74e12..43bbfd2b4587796d06bca70b87641855f72fbc3b 100644 (file)
@@ -66,6 +66,22 @@ public:
 
   SMLoc getLoc() const;
 
+  /// getStringContents - Get the contents of a string token (without quotes).
+  StringRef getStringContents() const { 
+    assert(Kind == String && "This token isn't a string!");
+    return Str.slice(1, Str.size() - 1);
+  }
+
+  /// getIdentifier - Get the identifier string for the current token, which
+  /// should be an identifier or a string. This gets the portion of the string
+  /// which should be used as the identifier, e.g., it does not include the
+  /// quotes on strings.
+  StringRef getIdentifier() const {
+    if (Kind == Identifier)
+      return getString();
+    return getStringContents();
+  }
+
   /// getString - Get the string for the current token, this includes all
   /// characters (for example, the quotes on strings) in the token.
   ///
@@ -77,7 +93,7 @@ public:
   // also not generally what we want (it is nicer for recovery etc. to lex 123br
   // as a single token, then diagnose as an invalid number).
   int64_t getIntVal() const { 
-    assert(Kind == Integer && "This token isn't an integer");
+    assert(Kind == Integer && "This token isn't an integer!");
     return IntVal; 
   }
 };
diff --git a/test/MC/AsmParser/labels.s b/test/MC/AsmParser/labels.s
new file mode 100644 (file)
index 0000000..f429b3b
--- /dev/null
@@ -0,0 +1,26 @@
+// RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s
+
+        .data:
+// CHECK: a:
+a:
+        .long 0
+// CHECK: b:
+"b":
+        .long 0
+// FIXME(quoting): CHECK: a$b:
+"a$b":
+        .long 0
+
+        .text:
+foo:    
+// FIXME(quoting): CHECK: val:a$b
+        addl $24, "a$b"(%eax)    
+// FIXME(quoting): CHECK: val:a$b + 10
+        addl $24, ("a$b" + 10)(%eax)
+        
+// FIXME(quoting): CHECK: b$c = 10
+"b$c" = 10
+// FIXME(quoting): CHECK: val:10
+        addl "b$c", %eax
+        
+        
index 90a9a33593c814341f2221cdc7615e61b021dd79..15a7f336391c62cc8f34398bef2870f9f4b0fee9 100644 (file)
@@ -97,10 +97,11 @@ bool AsmParser::ParsePrimaryExpr(AsmExpr *&Res) {
       return true;
     Res = new AsmUnaryExpr(AsmUnaryExpr::LNot, Res);
     return false;
+  case AsmToken::String:
   case AsmToken::Identifier: {
     // This is a label, this should be parsed as part of an expression, to
     // handle things like LFOO+4.
-    MCSymbol *Sym = Ctx.GetOrCreateSymbol(Lexer.getTok().getString());
+    MCSymbol *Sym = Ctx.GetOrCreateSymbol(Lexer.getTok().getIdentifier());
 
     // If this is use of an undefined symbol then mark it external.
     if (!Sym->getSection() && !Ctx.GetSymbolValue(Sym))
@@ -112,7 +113,7 @@ bool AsmParser::ParsePrimaryExpr(AsmExpr *&Res) {
   }
   case AsmToken::Integer:
     Res = new AsmConstantExpr(Lexer.getTok().getIntVal());
-    Lexer.Lex(); // Eat identifier.
+    Lexer.Lex(); // Eat token.
     return false;
   case AsmToken::LParen:
     Lexer.Lex(); // Eat the '('.
@@ -309,6 +310,7 @@ bool AsmParser::ParseStatement() {
     Lexer.Lex();
     return false;
   case AsmToken::Identifier:
+  case AsmToken::String:
     break;
   // TODO: Recurse on local labels etc.
   }
@@ -316,7 +318,7 @@ bool AsmParser::ParseStatement() {
   // If we have an identifier, handle it as the key symbol.
   AsmToken ID = Lexer.getTok();
   SMLoc IDLoc = ID.getLoc();
-  StringRef IDVal = ID.getString();
+  StringRef IDVal = ID.getIdentifier();
   
   // Consume the identifier, see what is after it.
   switch (Lexer.Lex().getKind()) {
@@ -970,7 +972,7 @@ bool AsmParser::ParseDirectiveComm(bool IsLocal) {
   if (Lexer.isNot(AsmToken::Identifier))
     return TokError("expected identifier in directive");
   
-  // handle the identifier as the key symbol.
+  // Handle the identifier as the key symbol.
   SMLoc IDLoc = Lexer.getLoc();
   MCSymbol *Sym = Ctx.GetOrCreateSymbol(Lexer.getTok().getString());
   Lexer.Lex();
@@ -1172,7 +1174,7 @@ bool AsmParser::ParseDirectiveDarwinLsym() {
   if (Lexer.isNot(AsmToken::Identifier))
     return TokError("expected identifier in directive");
   
-  // handle the identifier as the key symbol.
+  // Handle the identifier as the key symbol.
   SMLoc IDLoc = Lexer.getLoc();
   MCSymbol *Sym = Ctx.GetOrCreateSymbol(Lexer.getTok().getString());
   Lexer.Lex();