Improvements to .section parsing:
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 Oct 2010 21:33:33 +0000 (21:33 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 Oct 2010 21:33:33 +0000 (21:33 +0000)
* If we have a M or a G, reject sections without the type
* Only parse the flag specific arguments if we have M or G
* Parse the corresponding arguments for M and G

We ignore the G arguments and flag for now.

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

lib/MC/MCParser/ELFAsmParser.cpp
test/MC/ELF/section.s

index 83c562bf4a42edf3d808777a387860c91776de6f..62cf6c6e7a0f4d043db34f09ef9ac8822e8b9adb 100644 (file)
@@ -198,7 +198,7 @@ bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc) {
   if (ParseSectionName(SectionName))
     return TokError("expected identifier in directive");
 
-  std::string FlagsStr;
+  StringRef FlagsStr;
   StringRef TypeName;
   int64_t Size = 0;
   if (getLexer().is(AsmToken::Comma)) {
@@ -216,21 +216,47 @@ bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc) {
     else
       TypeStartToken = AsmToken::At;
 
-    if (getLexer().is(AsmToken::Comma)) {
+    bool Mergeable = FlagsStr.find('M') != StringRef::npos;
+    bool Group = FlagsStr.find('G') != StringRef::npos;
+
+    if (getLexer().isNot(AsmToken::Comma)) {
+      if (Mergeable)
+        return TokError("Mergeable section must specify the type");
+      if (Group)
+        return TokError("Group section must specify the type");
+    } else {
+      Lex();
+      if (getLexer().isNot(TypeStartToken))
+        return TokError("expected the type");
+
       Lex();
-      if (getLexer().is(TypeStartToken)) {
+      if (getParser().ParseIdentifier(TypeName))
+        return TokError("expected identifier in directive");
+
+      if (Mergeable) {
+        if (getLexer().isNot(AsmToken::Comma))
+          return TokError("expected the entry size");
         Lex();
-        if (getParser().ParseIdentifier(TypeName))
-          return TokError("expected identifier in directive");
+        if (getParser().ParseAbsoluteExpression(Size))
+          return true;
+        if (Size <= 0)
+          return TokError("entry size must be positive");
+      }
 
+      if (Group) {
+        if (getLexer().isNot(AsmToken::Comma))
+          return TokError("expected group name");
+        Lex();
+        StringRef GroupName;
+        if (getParser().ParseIdentifier(GroupName))
+          return true;
         if (getLexer().is(AsmToken::Comma)) {
           Lex();
-
-          if (getParser().ParseAbsoluteExpression(Size))
+          StringRef Linkage;
+          if (getParser().ParseIdentifier(Linkage))
             return true;
-
-          if (Size <= 0)
-            return TokError("section size must be positive");
+          if (Linkage != "comdat" && Linkage != ".gnu.linkonce")
+            return TokError("Linkage must be 'comdat' or '.gnu.linkonce'");
         }
       }
     }
@@ -275,6 +301,8 @@ bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc) {
     case 'd':
       Flags |= MCSectionELF::XCORE_SHF_DP_SECTION;
       break;
+    case 'G':
+      break;
     default:
       return TokError("unknown flag");
     }
index ea89a80f6ef1f600eac1d074001ab55ebfa25c58..9c7288036dfaf6c97cd97c290843ab408329ff6e 100644 (file)
@@ -37,3 +37,8 @@
 // CHECK-NEXT:  ('sh_info', 0x00000000)
 // CHECK-NEXT:  ('sh_addralign', 0x00000001)
 // CHECK-NEXT:  ('sh_entsize', 0x00000000)
+
+
+// Test that we can parse these
+.section        .text.foo,"axG",@progbits,foo,comdat
+.section        .text.bar,"axMG",@progbits,42,bar,.gnu.linkonce