From: Daniel Dunbar Date: Thu, 25 Jun 2009 22:44:51 +0000 (+0000) Subject: MC: Parse .org directives. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c238b584de26d7ee717dbd951a7656033fb6bc05;p=oota-llvm.git MC: Parse .org directives. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74218 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/MC/AsmParser/directive_org.s b/test/MC/AsmParser/directive_org.s new file mode 100644 index 00000000000..ac50f635e6b --- /dev/null +++ b/test/MC/AsmParser/directive_org.s @@ -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 diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index 25955187dab..2b697a66ad2 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -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; +} diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h index 4b51ab17ac2..da256c275ca 100644 --- a/tools/llvm-mc/AsmParser.h +++ b/tools/llvm-mc/AsmParser.h @@ -63,6 +63,7 @@ private: bool ParseDirectiveFill(); // ".fill" bool ParseDirectiveSpace(); // ".space" bool ParseDirectiveSet(); // ".set" + bool ParseDirectiveOrg(); // ".org" };