mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-19 19:31:50 +00:00
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
This commit is contained in:
parent
7a01e95915
commit
76c4d7696c
@ -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;
|
||||
}
|
||||
};
|
||||
|
26
test/MC/AsmParser/labels.s
Normal file
26
test/MC/AsmParser/labels.s
Normal file
@ -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
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user