From: Chris Lattner Date: Wed, 24 Jun 2009 04:43:34 +0000 (+0000) Subject: add support for parsing and emitting .section directives. We can now parse X-Git-Tag: android-x86-6.0-r1~1003^2~19645 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9a023f70b4dc8fe456e074ac1402000fe02bb331;p=android-x86%2Fexternal-llvm.git add support for parsing and emitting .section directives. We can now parse things like: .section __TEXT,__cstring,cstring_literals git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74058 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index ca0b9338415..37cb4aecf8c 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -196,6 +196,10 @@ bool AsmParser::ParseStatement() { // Otherwise, we have a normal instruction or directive. if (IDVal[0] == '.') { + if (!strcmp(IDVal, ".section")) + return ParseDirectiveSection(); + + Lexer.PrintMessage(IDLoc, "warning: ignoring directive for now"); EatToEndOfStatement(); return false; @@ -207,7 +211,7 @@ bool AsmParser::ParseStatement() { return true; if (Lexer.isNot(asmtok::EndOfStatement)) - return TokError("unexpected token in operand list"); + return TokError("unexpected token in argument list"); // Eat the end of statement marker. Lexer.Lex(); @@ -219,3 +223,32 @@ bool AsmParser::ParseStatement() { // Skip to end of line for now. return false; } + +/// ParseDirectiveSection: +/// ::= .section identifier +bool AsmParser::ParseDirectiveSection() { + if (Lexer.isNot(asmtok::Identifier)) + return TokError("expected identifier after '.section' directive"); + + std::string Section = Lexer.getCurStrVal(); + Lexer.Lex(); + + // Accept a comma separated list of modifiers. + while (Lexer.is(asmtok::Comma)) { + Lexer.Lex(); + + if (Lexer.isNot(asmtok::Identifier)) + return TokError("expected identifier in '.section' directive"); + Section += ','; + Section += Lexer.getCurStrVal(); + Lexer.Lex(); + } + + if (Lexer.isNot(asmtok::EndOfStatement)) + return TokError("unexpected token in '.section' directive"); + Lexer.Lex(); + + Out.SwitchSection(Ctx.GetSection(Section.c_str())); + return false; +} + diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h index 95154485cda..9e432e861f8 100644 --- a/tools/llvm-mc/AsmParser.h +++ b/tools/llvm-mc/AsmParser.h @@ -52,6 +52,10 @@ private: bool ParseX86InstOperands(MCInst &Inst); bool ParseX86Operand(X86Operand &Op); bool ParseX86MemOperand(X86Operand &Op); + + // Directive Parsing. + bool ParseDirectiveSection(); + }; } // end namespace llvm