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 ca0b933..37cb4ae 100644
--- a/tools/llvm-mc/AsmParser.cpp
+++ b/tools/llvm-mc/AsmParser.cpp
@@ -196,6 +196,10 @@
// 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 @@
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 @@
// 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;
+}
+