]> granicus.if.org Git - llvm/commitdiff
[mips] Implement the ".rdata" MIPS assembly directive.
authorSimon Dardis <simon.dardis@imgtec.com>
Thu, 22 Jun 2017 10:41:51 +0000 (10:41 +0000)
committerSimon Dardis <simon.dardis@imgtec.com>
Thu, 22 Jun 2017 10:41:51 +0000 (10:41 +0000)
Rather than creating a separate ".rdata" section distinct from the
customary ".rodata" in ELF, ".rdata" switches to the ".rodata" section.

This patch relands r305949 and r305950 with the correct commit message
and addresses nit raised during review.

Patch By: John Baldwin!

Differential Revision: https://reviews.llvm.org/D34452

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

lib/Target/Mips/AsmParser/MipsAsmParser.cpp
test/MC/Mips/mips-rdata.s [new file with mode: 0644]

index 694c201cbe8dce54471f4b84cb0d34fc9f9080aa..8a8cf562abe7ef6d34da6e073b0f90ce380fc302 100644 (file)
@@ -322,6 +322,7 @@ class MipsAsmParser : public MCTargetAsmParser {
   bool parseDirectiveSet();
   bool parseDirectiveOption();
   bool parseInsnDirective();
+  bool parseRSectionDirective(StringRef Section);
   bool parseSSectionDirective(StringRef Section, unsigned Type);
 
   bool parseSetAtDirective();
@@ -6952,6 +6953,23 @@ bool MipsAsmParser::parseInsnDirective() {
   return false;
 }
 
+/// parseRSectionDirective
+///  ::= .rdata
+bool MipsAsmParser::parseRSectionDirective(StringRef Section) {
+  // If this is not the end of the statement, report an error.
+  if (getLexer().isNot(AsmToken::EndOfStatement)) {
+    reportParseError("unexpected token, expected end of statement");
+    return false;
+  }
+
+  MCSection *ELFSection = getContext().getELFSection(
+      Section, ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
+  getParser().getStreamer().SwitchSection(ELFSection);
+
+  getParser().Lex(); // Eat EndOfStatement token.
+  return false;
+}
+
 /// parseSSectionDirective
 ///  ::= .sbss
 ///  ::= .sdata
@@ -7499,6 +7517,10 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
     parseInsnDirective();
     return false;
   }
+  if (IDVal == ".rdata") {
+    parseRSectionDirective(".rodata");
+    return false;
+  }
   if (IDVal == ".sbss") {
     parseSSectionDirective(IDVal, ELF::SHT_NOBITS);
     return false;
diff --git a/test/MC/Mips/mips-rdata.s b/test/MC/Mips/mips-rdata.s
new file mode 100644 (file)
index 0000000..89f9619
--- /dev/null
@@ -0,0 +1,13 @@
+# Check that .rdata sections have proper name, flags, and section types.
+
+# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o - \
+# RUN:   | llvm-readobj -s | FileCheck %s
+
+  .rdata
+  .word 0
+
+# CHECK:      Name: .rodata
+# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Flags [ (0x2)
+# CHECK-NEXT:   SHF_ALLOC
+# CHECK-NEXT: ]