From c238b584de26d7ee717dbd951a7656033fb6bc05 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 25 Jun 2009 22:44:51 +0000 Subject: [PATCH] MC: Parse .org directives. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74218 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/MC/AsmParser/directive_org.s | 11 +++++++++++ tools/llvm-mc/AsmParser.cpp | 31 ++++++++++++++++++++++++++++++- tools/llvm-mc/AsmParser.h | 1 + 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 test/MC/AsmParser/directive_org.s 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" };