MC: Parse .org directives.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74218 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2009-06-25 22:44:51 +00:00
parent 208622db8a
commit c238b584de
3 changed files with 42 additions and 1 deletions

View File

@ -0,0 +1,11 @@
# RUN: llvm-mc %s > %t
# RUN: grep -A 2 TEST0 %t > %t2
# RUN: grep ".org 1, 0" %t2 | count 1
TEST0:
.org 1
# RUN: grep -A 2 TEST1 %t > %t2
# RUN: grep ".org 1, 3" %t2 | count 1
TEST1:
.org 1, 3

View File

@ -324,6 +324,8 @@ bool AsmParser::ParseStatement() {
return ParseDirectiveValue(8);
if (!strcmp(IDVal, ".fill"))
return ParseDirectiveFill();
if (!strcmp(IDVal, ".org"))
return ParseDirectiveOrg();
if (!strcmp(IDVal, ".space"))
return ParseDirectiveSpace();
@ -332,7 +334,6 @@ bool AsmParser::ParseStatement() {
return false;
}
MCInst Inst;
if (ParseX86InstOperands(Inst))
return true;
@ -558,3 +559,31 @@ bool AsmParser::ParseDirectiveFill() {
return false;
}
/// ParseDirectiveOrg
/// ::= .org expression [ , expression ]
bool AsmParser::ParseDirectiveOrg() {
int64_t Offset;
if (ParseExpression(Offset))
return true;
// Parse optional fill expression.
int64_t FillExpr = 0;
if (Lexer.isNot(asmtok::EndOfStatement)) {
if (Lexer.isNot(asmtok::Comma))
return TokError("unexpected token in '.org' directive");
Lexer.Lex();
if (ParseExpression(FillExpr))
return true;
if (Lexer.isNot(asmtok::EndOfStatement))
return TokError("unexpected token in '.org' directive");
}
Lexer.Lex();
Out.EmitValueToOffset(MCValue::get(Offset), FillExpr);
return false;
}

View File

@ -63,6 +63,7 @@ private:
bool ParseDirectiveFill(); // ".fill"
bool ParseDirectiveSpace(); // ".space"
bool ParseDirectiveSet(); // ".set"
bool ParseDirectiveOrg(); // ".org"
};