OSDN Git Service

add support for parsing and emitting .section directives. We can now parse
authorChris Lattner <sabre@nondot.org>
Wed, 24 Jun 2009 04:43:34 +0000 (04:43 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 24 Jun 2009 04:43:34 +0000 (04:43 +0000)
things like:
.section __TEXT,__cstring,cstring_literals

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74058 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-mc/AsmParser.cpp
tools/llvm-mc/AsmParser.h

index ca0b933..37cb4ae 100644 (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;
+}
+
index 9515448..9e432e8 100644 (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