Skip to content

Commit

Permalink
Mark ELF sections whose name start with .note as note
Browse files Browse the repository at this point in the history
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
  • Loading branch information
petrhosek committed Sep 20, 2016
1 parent c736828 commit 1290355
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
5 changes: 5 additions & 0 deletions llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Expand Up @@ -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;
Expand Down
19 changes: 19 additions & 0 deletions llvm/test/CodeGen/X86/note-sections.ll
@@ -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

0 comments on commit 1290355

Please sign in to comment.