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
This commit is contained in:
Chris Lattner 2009-06-24 04:43:34 +00:00
parent c69485e34d
commit 9a023f70b4
2 changed files with 38 additions and 1 deletions

View File

@ -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;
}

View File

@ -52,6 +52,10 @@ private:
bool ParseX86InstOperands(MCInst &Inst);
bool ParseX86Operand(X86Operand &Op);
bool ParseX86MemOperand(X86Operand &Op);
// Directive Parsing.
bool ParseDirectiveSection();
};
} // end namespace llvm