Mark ELF sections whose name start with .note as note
authorPetr Hosek <phosek@chromium.org>
Tue, 20 Sep 2016 20:21:13 +0000 (20:21 +0000)
committerPetr Hosek <phosek@chromium.org>
Tue, 20 Sep 2016 20:21:13 +0000 (20:21 +0000)
Previously, such section would be marked as SHT_PROGBITS which
makes it impossible to use an initialized C variable declaration
to emit an (allocated) ELF note. The new behavior is also consistent
with ELF assembly parser.

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

llvm-svn: 282010

llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
llvm/test/CodeGen/X86/note-sections.ll [new file with mode: 0644]

index 218b45c..b8339ee 100644 (file)
@@ -151,6 +151,11 @@ getELFKindForNamedSection(StringRef Name, SectionKind K) {
 
 
 static unsigned getELFSectionType(StringRef Name, SectionKind K) {
+  // Use SHT_NOTE for section whose name starts with ".note" to allow
+  // emitting ELF notes from C variable declaration.
+  // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77609
+  if (Name.startswith(".note"))
+    return ELF::SHT_NOTE;
 
   if (Name == ".init_array")
     return ELF::SHT_INIT_ARRAY;
diff --git a/llvm/test/CodeGen/X86/note-sections.ll b/llvm/test/CodeGen/X86/note-sections.ll
new file mode 100644 (file)
index 0000000..d8a3d93
--- /dev/null
@@ -0,0 +1,19 @@
+; RUN: llc -mtriple x86_64-pc-linux < %s | FileCheck %s
+
+%struct.note = type { %struct.Elf32_Nhdr, [7 x i8], %struct.payload }
+%struct.Elf32_Nhdr = type { i32, i32, i32 }
+%struct.payload = type { i16 }
+
+@foonote = internal constant %struct.note { %struct.Elf32_Nhdr { i32 7, i32 2, i32 17 }, [7 x i8] c"foobar\00", %struct.payload { i16 23 } }, section ".note.foo", align 4
+
+; CHECK:               .section        .note.foo,"a",@note
+; CHECK-NEXT: .p2align 2
+; CHECK-NEXT: foonote:
+; CHECK-NEXT:  .long   7
+; CHECK-NEXT:  .long   2
+; CHECK-NEXT:  .long   17
+; CHECK-NEXT:  .asciz  "foobar"
+; CHECK-NEXT:  .zero   1
+; CHECK-NEXT:  .short  23
+; CHECK-NEXT:  .zero   2
+; CHECK-NEXT:  .size   foonote, 24