Index: llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp =================================================================== --- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -477,6 +477,11 @@ return K; } +static bool hasPrefix(StringRef SectionName, StringRef Prefix) { + return SectionName.consume_front(Prefix) && + (SectionName.empty() || SectionName[0] == '.'); +} + 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. @@ -484,13 +489,13 @@ if (Name.startswith(".note")) return ELF::SHT_NOTE; - if (Name == ".init_array") + if (hasPrefix(Name, ".init_array")) return ELF::SHT_INIT_ARRAY; - if (Name == ".fini_array") + if (hasPrefix(Name, ".fini_array")) return ELF::SHT_FINI_ARRAY; - if (Name == ".preinit_array") + if (hasPrefix(Name, ".preinit_array")) return ELF::SHT_PREINIT_ARRAY; if (K.isBSS() || K.isThreadBSS()) Index: llvm/test/CodeGen/X86/attribute-sections.ll =================================================================== --- llvm/test/CodeGen/X86/attribute-sections.ll +++ llvm/test/CodeGen/X86/attribute-sections.ll @@ -1,18 +1,36 @@ -; RUN: llc < %s -mtriple=i386-unknown-linux-gnu | FileCheck %s -check-prefix=LINUX +; RUN: llc < %s -mtriple=i386-unknown-linux-gnu | FileCheck %s declare i32 @foo() -@G0 = global i32 ()* @foo, section ".init_array" -; LINUX: .section .init_array,"aw" -; LINUX: .globl G0 +@init_array1 = global i32 ()* @foo, section ".init_array" +@init_array2 = global i32 ()* @foo, section ".init_array.00001" +@init_array3 = global i32 ()* @foo, section ".init_arrayfoo" -@G1 = global i32 ()* @foo, section ".fini_array" +; CHECK: .section .init_array,"aw",@init_array +; CHECK: .globl init_array1 +; CHECK: .section .init_array.00001,"aw",@init_array +; CHECK: .globl init_array2 +; CHECK: .section .init_arrayfoo,"aw",@progbits +; CHECK: .globl init_array3 -; LINUX: .section .fini_array,"aw" -; LINUX: .globl G1 +@fini_array1 = global i32 ()* @foo, section ".fini_array" +@fini_array2 = global i32 ()* @foo, section ".fini_array.00001" +@fini_array3 = global i32 ()* @foo, section ".fini_arrayfoo" -@G2 = global i32 ()* @foo, section ".preinit_array" +; CHECK: .section .fini_array,"aw",@fini_array +; CHECK: .globl fini_array1 +; CHECK: .section .fini_array.00001,"aw",@fini_array +; CHECK: .globl fini_array2 +; CHECK: .section .fini_arrayfoo,"aw",@progbits +; CHECK: .globl fini_array3 -; LINUX: .section .preinit_array,"aw" -; LINUX: .globl G2 +@preinit_array1 = global i32 ()* @foo, section ".preinit_array" +@preinit_array2 = global i32 ()* @foo, section ".preinit_array.00001" +@preinit_array3 = global i32 ()* @foo, section ".preinit_arrayfoo" +; CHECK: .section .preinit_array,"aw",@preinit_array +; CHECK: .globl preinit_array1 +; CHECK: .section .preinit_array.00001,"aw",@preinit_array +; CHECK: .globl preinit_array2 +; CHECK: .section .preinit_arrayfoo,"aw",@progbits +; CHECK: .globl preinit_array3