mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-05 18:28:29 +00:00
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:
parent
c69485e34d
commit
9a023f70b4
@ -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;
|
||||
}
|
||||
|
||||
|
@ -52,6 +52,10 @@ private:
|
||||
bool ParseX86InstOperands(MCInst &Inst);
|
||||
bool ParseX86Operand(X86Operand &Op);
|
||||
bool ParseX86MemOperand(X86Operand &Op);
|
||||
|
||||
// Directive Parsing.
|
||||
bool ParseDirectiveSection();
|
||||
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
Loading…
Reference in New Issue
Block a user