From 76c4d7696c1eb566d53467a76024c5fdadd448e4 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 31 Jul 2009 21:55:09 +0000 Subject: [PATCH] llvm-mc: Support quoted identifiers. - 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 | 18 +++++++++++++++++- test/MC/AsmParser/labels.s | 26 ++++++++++++++++++++++++++ tools/llvm-mc/AsmParser.cpp | 12 +++++++----- 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 test/MC/AsmParser/labels.s diff --git a/include/llvm/MC/MCAsmLexer.h b/include/llvm/MC/MCAsmLexer.h index b1b4dd1155e..43bbfd2b458 100644 --- a/include/llvm/MC/MCAsmLexer.h +++ b/include/llvm/MC/MCAsmLexer.h @@ -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 index 00000000000..f429b3bd25a --- /dev/null +++ b/test/MC/AsmParser/labels.s @@ -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 + + diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index 90a9a33593c..15a7f336391 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -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();