mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-24 20:30:06 +00:00
Fix to make sure that a comdat group gets generated correctly for a static member
of instantiated C++ templates. Patch by Kristof Beyls! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151250 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b2ad57a702
commit
1d2d5a0227
@ -188,6 +188,7 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
static const char *getSectionPrefixForGlobal(SectionKind Kind) {
|
||||
if (Kind.isText()) return ".text.";
|
||||
if (Kind.isReadOnly()) return ".rodata.";
|
||||
if (Kind.isBSS()) return ".bss.";
|
||||
|
||||
if (Kind.isThreadData()) return ".tdata.";
|
||||
if (Kind.isThreadBSS()) return ".tbss.";
|
||||
@ -216,7 +217,7 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
// If this global is linkonce/weak and the target handles this by emitting it
|
||||
// into a 'uniqued' section name, create and return the section now.
|
||||
if ((GV->isWeakForLinker() || EmitUniquedSection) &&
|
||||
!Kind.isCommon() && !Kind.isBSS()) {
|
||||
!Kind.isCommon()) {
|
||||
const char *Prefix;
|
||||
Prefix = getSectionPrefixForGlobal(Kind);
|
||||
|
||||
|
16
test/CodeGen/ARM/odr_comdat.ll
Normal file
16
test/CodeGen/ARM/odr_comdat.ll
Normal file
@ -0,0 +1,16 @@
|
||||
; RUN: llc < %s -mtriple=arm-linux-gnueabi | FileCheck %s -check-prefix=ARMGNUEABI
|
||||
|
||||
; Checking that a comdat group gets generated correctly for a static member
|
||||
; of instantiated C++ templates.
|
||||
; see http://sourcery.mentor.com/public/cxx-abi/abi.html#vague-itemplate
|
||||
; section 5.2.6 Instantiated templates
|
||||
; "Any static member data object is emitted in a COMDAT identified by its mangled
|
||||
; name, in any object file with a reference to its name symbol."
|
||||
|
||||
; Case 1: variable is not explicitly initialized, and ends up in a .bss section
|
||||
; ARMGNUEABI: .section .bss._ZN1CIiE1iE,"aGw",%nobits,_ZN1CIiE1iE,comdat
|
||||
@_ZN1CIiE1iE = weak_odr global i32 0, align 4
|
||||
|
||||
; Case 2: variable is explicitly initialized, and ends up in a .data section
|
||||
; ARMGNUEABI: .section .data._ZN1CIiE1jE,"aGw",%progbits,_ZN1CIiE1jE,comdat
|
||||
@_ZN1CIiE1jE = weak_odr global i32 12, align 4
|
16
test/CodeGen/X86/odr_comdat.ll
Normal file
16
test/CodeGen/X86/odr_comdat.ll
Normal file
@ -0,0 +1,16 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=X86LINUX
|
||||
|
||||
; Checking that a comdat group gets generated correctly for a static member
|
||||
; of instantiated C++ templates.
|
||||
; see http://sourcery.mentor.com/public/cxx-abi/abi.html#vague-itemplate
|
||||
; section 5.2.6 Instantiated templates
|
||||
; "Any static member data object is emitted in a COMDAT identified by its mangled
|
||||
; name, in any object file with a reference to its name symbol."
|
||||
|
||||
; Case 1: variable is not explicitly initialized, and ends up in a .bss section
|
||||
; X86LINUX: .section .bss._ZN1CIiE1iE,"aGw",@nobits,_ZN1CIiE1iE,comdat
|
||||
@_ZN1CIiE1iE = weak_odr global i32 0, align 4
|
||||
|
||||
; Case 2: variable is explicitly initialized, and ends up in a .data section
|
||||
; X86LINUX: .section .data._ZN1CIiE1jE,"aGw",@progbits,_ZN1CIiE1jE,comdat
|
||||
@_ZN1CIiE1jE = weak_odr global i32 12, align 4
|
Loading…
Reference in New Issue
Block a user