aboutsummaryrefslogtreecommitdiff
path: root/tools/llvm-mc/AsmParser.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-06-25 21:56:11 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-06-25 21:56:11 +0000
commit8f780cd7896407f743de7538166ff9d40d752086 (patch)
tree754d486c28381babd3895f5719531ef58577bcbd /tools/llvm-mc/AsmParser.cpp
parent5f04d1e522e9f412e716310559b9324564119e45 (diff)
MC: Parse .set and assignments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74208 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-mc/AsmParser.cpp')
-rw-r--r--tools/llvm-mc/AsmParser.cpp53
1 files changed, 51 insertions, 2 deletions
diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp
index d9e14458fd..25955187da 100644
--- a/tools/llvm-mc/AsmParser.cpp
+++ b/tools/llvm-mc/AsmParser.cpp
@@ -182,7 +182,8 @@ bool AsmParser::ParseStatement() {
const char *IDVal = Lexer.getCurStrVal();
// Consume the identifier, see what is after it.
- if (Lexer.Lex() == asmtok::Colon) {
+ switch (Lexer.Lex()) {
+ case asmtok::Colon:
// identifier ':' -> Label.
Lexer.Lex();
@@ -192,6 +193,15 @@ bool AsmParser::ParseStatement() {
Out.EmitLabel(Ctx.GetOrCreateSymbol(IDVal));
return ParseStatement();
+
+ case asmtok::Equal:
+ // identifier '=' ... -> assignment statement
+ Lexer.Lex();
+
+ return ParseAssignment(IDVal, false);
+
+ default: // Normal instruction or directive.
+ break;
}
// Otherwise, we have a normal instruction or directive.
@@ -209,7 +219,8 @@ bool AsmParser::ParseStatement() {
if (!strcmp(IDVal, ".static_const"))
return ParseDirectiveSectionSwitch("__TEXT,__static_const");
if (!strcmp(IDVal, ".cstring"))
- return ParseDirectiveSectionSwitch("__TEXT,__cstring","cstring_literals");
+ return ParseDirectiveSectionSwitch("__TEXT,__cstring",
+ "cstring_literals");
if (!strcmp(IDVal, ".literal4"))
return ParseDirectiveSectionSwitch("__TEXT,__literal4", "4byte_literals");
if (!strcmp(IDVal, ".literal8"))
@@ -291,6 +302,10 @@ bool AsmParser::ParseStatement() {
if (!strcmp(IDVal, ".objc_selector_strs"))
return ParseDirectiveSectionSwitch("__OBJC,__selector_strs");
+ // Assembler features
+ if (!strcmp(IDVal, ".set"))
+ return ParseDirectiveSet();
+
// Data directives
if (!strcmp(IDVal, ".ascii"))
@@ -336,6 +351,40 @@ bool AsmParser::ParseStatement() {
return false;
}
+bool AsmParser::ParseAssignment(const char *Name, bool IsDotSet) {
+ int64_t Value;
+ if (ParseExpression(Value))
+ return true;
+
+ if (Lexer.isNot(asmtok::EndOfStatement))
+ return TokError("unexpected token in assignment");
+
+ // Eat the end of statement marker.
+ Lexer.Lex();
+
+ // Get the symbol for this name.
+ // FIXME: Handle '.'.
+ MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name);
+ Out.EmitAssignment(Sym, MCValue::get(Value), IsDotSet);
+
+ return false;
+}
+
+/// ParseDirectiveSet:
+/// ::= .set identifier ',' expression
+bool AsmParser::ParseDirectiveSet() {
+ if (Lexer.isNot(asmtok::Identifier))
+ return TokError("expected identifier after '.set' directive");
+
+ const char *Name = Lexer.getCurStrVal();
+
+ if (Lexer.Lex() != asmtok::Comma)
+ return TokError("unexpected token in '.set'");
+ Lexer.Lex();
+
+ return ParseAssignment(Name, true);
+}
+
/// ParseDirectiveSection:
/// ::= .section identifier (',' identifier)*
/// FIXME: This should actually parse out the segment, section, attributes and