]> granicus.if.org Git - llvm/commitdiff
Allow ELF section flags to be specified numerically
authorPrakhar Bahuguna <prakhar.bahuguna@arm.com>
Thu, 15 Dec 2016 07:59:15 +0000 (07:59 +0000)
committerPrakhar Bahuguna <prakhar.bahuguna@arm.com>
Thu, 15 Dec 2016 07:59:15 +0000 (07:59 +0000)
Summary:
GAS already allows flags for sections to be specified directly as a
numeric value. This functionality is particularly useful for setting
processor or application-specific values that may not be directly
supported or understood by LLVM. This patch allows LLVM to use numeric
section flag values verbatim if specified by the assembly file.

Reviewers: grosbach, rafael, t.p.northover, rengolin

Subscribers: llvm-commits

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

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

lib/MC/MCParser/ELFAsmParser.cpp
test/MC/ELF/section-numeric-flag.s [new file with mode: 0644]

index 8bfb475635cb02ce48a90c94741a48e56b27e467..8d7ba0d03362c06955b3fc255ff1c574053db04a 100644 (file)
@@ -264,6 +264,10 @@ bool ELFAsmParser::ParseSectionName(StringRef &SectionName) {
 static unsigned parseSectionFlags(StringRef flagsStr, bool *UseLastGroup) {
   unsigned flags = 0;
 
+  // If a valid numerical value is set for the section flag, use it verbatim
+  if (!flagsStr.getAsInteger(0, flags))
+    return flags;
+
   for (char i : flagsStr) {
     switch (i) {
     case 'a':
diff --git a/test/MC/ELF/section-numeric-flag.s b/test/MC/ELF/section-numeric-flag.s
new file mode 100644 (file)
index 0000000..583c9b3
--- /dev/null
@@ -0,0 +1,37 @@
+// RUN: llvm-mc -filetype=obj %s -o - \
+// RUN: | llvm-readobj -s -t | FileCheck %s
+
+        .section .text,    "0x806", %progbits, unique, 0
+        .section .comment, "0x21"
+
+
+// CHECK:      Section {
+// CHECK:        Name: .text (1)
+// CHECK-NEXT:   Type: SHT_PROGBITS (0x1)
+// CHECK-NEXT:   Flags [ (0x6)
+// CHECK-NEXT:     SHF_ALLOC (0x2)
+// CHECK-NEXT:     SHF_EXECINSTR (0x4)
+// CHECK-NEXT:   ]
+// CHECK:        Size: 0
+// CHECK:      }
+
+// CHECK:      Section {
+// CHECK:        Name: .text (1)
+// CHECK-NEXT:   Type: SHT_PROGBITS (0x1)
+// CHECK-NEXT:   Flags [ (0x806)
+// CHECK-NEXT:     SHF_ALLOC (0x2)
+// CHECK-NEXT:     SHF_COMPRESSED (0x800)
+// CHECK-NEXT:     SHF_EXECINSTR (0x4)
+// CHECK-NEXT:   ]
+// CHECK:        Size: 0
+// CHECK:      }
+
+// CHECK:      Section {
+// CHECK:        Name: .comment (7)
+// CHECK-NEXT:   Type: SHT_PROGBITS (0x1)
+// CHECK-NEXT:   Flags [ (0x21)
+// CHECK-NEXT:     SHF_STRINGS (0x20)
+// CHECK-NEXT:     SHF_WRITE (0x1)
+// CHECK-NEXT:   ]
+// CHECK:        Size: 0
+// CHECK:      }