diff options
-rw-r--r-- | lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 12 | ||||
-rw-r--r-- | test/CodeGen/X86/global-sections.ll | 22 |
2 files changed, 25 insertions, 9 deletions
diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 8f113d7916..e41fbfc6d3 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -770,12 +770,18 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler &Mang, const TargetMachine &TM) const { // If we have -ffunction-sections then we should emit the global value to a // uniqued section specifically for it. - // TODO: Implement -fdata-sections. - bool EmitUniquedSection = Kind.isText() && TM.getFunctionSections(); + bool EmitUniquedSection; + if (Kind.isText()) + EmitUniquedSection = TM.getFunctionSections(); + else + EmitUniquedSection = TM.getDataSections(); // 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) { + // Section names depend on the name of the symbol which is not feasible if the + // symbol has private linkage. + if ((GV->isWeakForLinker() || EmitUniquedSection) && + !GV->hasPrivateLinkage()) { const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); unsigned Characteristics = getCOFFSectionFlags(Kind); diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index c768c303c8..5ad504719f 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -3,8 +3,14 @@ ; RUN: llc < %s -mtriple=i386-apple-darwin10 -relocation-model=static | FileCheck %s -check-prefix=DARWIN-STATIC ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s -check-prefix=DARWIN64 ; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -fdata-sections | FileCheck %s -check-prefix=LINUX-SECTIONS -; RUN: llc < %s -mtriple=i686-pc-win32 -ffunction-sections | FileCheck %s -check-prefix=WIN32-SECTIONS +; RUN: llc < %s -mtriple=i686-pc-win32 -fdata-sections -ffunction-sections | FileCheck %s -check-prefix=WIN32-SECTIONS +define void @F1() { + ret void +} + +; WIN32-SECTIONS: .section .text,"xr",one_only,_F1 +; WIN32-SECTIONS: .globl _F1 ; int G1; @G1 = common global i32 0 @@ -42,6 +48,9 @@ ; LINUX-SECTIONS: .section .rodata.G3,"a",@progbits ; LINUX-SECTIONS: .globl G3 +; WIN32-SECTIONS: .section .rdata,"r",one_only,_G3 +; WIN32-SECTIONS: .globl _G3 + ; _Complex long long const G4 = 34; @G4 = unnamed_addr constant {i64,i64} { i64 34, i64 0 } @@ -118,6 +127,9 @@ ; LINUX-SECTIONS: .section .rodata.G7,"aMS",@progbits,1 ; LINUX-SECTIONS: .globl G7 +; WIN32-SECTIONS: .section .rdata,"r",one_only,_G7 +; WIN32-SECTIONS: .globl _G7 + @G8 = unnamed_addr constant [4 x i16] [ i16 1, i16 2, i16 3, i16 0 ] @@ -178,9 +190,7 @@ ; LINUX-SECTIONS: .asciz "foo" ; LINUX-SECTIONS: .size .LG14, 4 -define void @G15() { - ret void -} +; WIN32-SECTIONS: .section .rdata,"r" +; WIN32-SECTIONS: L_G14: +; WIN32-SECTIONS: .asciz "foo" -; WIN32-SECTIONS: .section .text,"xr",one_only,_G15 -; WIN32-SECTIONS: .globl _G15 |