[llvm] r202573 - Add support for parsing sun-style section flags in ELFAsmParser.

Venkatraman Govindaraju venkatra at cs.wisc.edu
Fri Feb 28 22:21:00 PST 2014


Author: venkatra
Date: Sat Mar  1 00:21:00 2014
New Revision: 202573

URL: http://llvm.org/viewvc/llvm-project?rev=202573&view=rev
Log:
Add support for parsing sun-style section flags in ELFAsmParser.

Modified:
    llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp
    llvm/trunk/test/MC/Sparc/sparc-pic.s

Modified: llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp?rev=202573&r1=202572&r2=202573&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp Sat Mar  1 00:21:00 2014
@@ -151,6 +151,7 @@ public:
 private:
   bool ParseSectionName(StringRef &SectionName);
   bool ParseSectionArguments(bool IsPush);
+  unsigned parseSunStyleSectionFlags();
 };
 
 }
@@ -322,6 +323,36 @@ static unsigned parseSectionFlags(String
   return flags;
 }
 
+unsigned ELFAsmParser::parseSunStyleSectionFlags() {
+  unsigned flags = 0;
+  while (getLexer().is(AsmToken::Hash)) {
+    Lex(); // Eat the #.
+
+    if (!getLexer().is(AsmToken::Identifier))
+      return -1U;
+
+    StringRef flagId = getTok().getIdentifier();
+    if (flagId == "alloc")
+      flags |= ELF::SHF_ALLOC;
+    else if (flagId == "execinstr")
+      flags |= ELF::SHF_EXECINSTR;
+    else if (flagId == "write")
+      flags |= ELF::SHF_WRITE;
+    else if (flagId == "tls")
+      flags |= ELF::SHF_TLS;
+    else
+      return -1U;
+
+    Lex(); // Eat the flag.
+
+    if (!getLexer().is(AsmToken::Comma))
+        break;
+    Lex(); // Eat the comma.
+  }
+  return flags;
+}
+
+
 bool ELFAsmParser::ParseDirectivePushSection(StringRef s, SMLoc loc) {
   getStreamer().PushSection();
 
@@ -374,14 +405,20 @@ bool ELFAsmParser::ParseSectionArguments
         goto EndStmt;
       Lex();
     }
-   
-    if (getLexer().isNot(AsmToken::String))
-      return TokError("expected string in directive");
 
-    StringRef FlagsStr = getTok().getStringContents();
-    Lex();
+    unsigned extraFlags;
+
+    if (getLexer().isNot(AsmToken::String)) {
+      if (!getContext().getAsmInfo()->usesSunStyleELFSectionSwitchSyntax()
+          || getLexer().isNot(AsmToken::Hash))
+        return TokError("expected string in directive");
+      extraFlags = parseSunStyleSectionFlags();
+    } else {
+      StringRef FlagsStr = getTok().getStringContents();
+      Lex();
+      extraFlags = parseSectionFlags(FlagsStr, &UseLastGroup);
+    }
 
-    unsigned extraFlags = parseSectionFlags(FlagsStr, &UseLastGroup);
     if (extraFlags == -1U)
       return TokError("unknown flag");
     Flags |= extraFlags;

Modified: llvm/trunk/test/MC/Sparc/sparc-pic.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Sparc/sparc-pic.s?rev=202573&r1=202572&r2=202573&view=diff
==============================================================================
--- llvm/trunk/test/MC/Sparc/sparc-pic.s (original)
+++ llvm/trunk/test/MC/Sparc/sparc-pic.s Sat Mar  1 00:21:00 2014
@@ -40,7 +40,7 @@ foo:
         .cfi_endproc
 
         .type   AGlobalVar, at object      ! @AGlobalVar
-        .section        .bss
+        .section        .bss,#alloc,#write
         .globl  AGlobalVar
         .align  8
 AGlobalVar:





More information about the llvm-commits mailing list