From 0945d20cebdcc853057931505e5a3a01a21671ac Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 24 Jun 2009 04:43:34 +0000 Subject: [PATCH] add support for parsing and emitting .section directives. We can now parse things like: .section __TEXT,__cstring,cstring_literals llvm-svn: 74058 --- tools/llvm-mc/AsmParser.cpp | 35 ++++++++++++++++++++++++++++++++++- tools/llvm-mc/AsmParser.h | 4 ++++ 2 files changed, 38 insertions(+), 1 deletion(-) 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