diff options
-rw-r--r-- | lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 13 | ||||
-rw-r--r-- | test/CodeGen/X86/global-sections.ll | 8 |
2 files changed, 17 insertions, 4 deletions
diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index a2f4810cb6..8f113d7916 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -768,18 +768,23 @@ static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) { const MCSection *TargetLoweringObjectFileCOFF:: 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(); // 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()) { + if (GV->isWeakForLinker() || EmitUniquedSection) { const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); unsigned Characteristics = getCOFFSectionFlags(Kind); Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; MCSymbol *Sym = TM.getSymbol(GV, Mang); - return getContext().getCOFFSection(Name, Characteristics, - Kind, Sym->getName(), - COFF::IMAGE_COMDAT_SELECT_ANY); + return getContext().getCOFFSection( + Name, Characteristics, Kind, Sym->getName(), + GV->isWeakForLinker() ? COFF::IMAGE_COMDAT_SELECT_ANY + : COFF::IMAGE_COMDAT_SELECT_NODUPLICATES); } if (Kind.isText()) diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index c031821f9a..c768c303c8 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -3,6 +3,7 @@ ; 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 ; int G1; @@ -176,3 +177,10 @@ ; LINUX-SECTIONS: .LG14: ; LINUX-SECTIONS: .asciz "foo" ; LINUX-SECTIONS: .size .LG14, 4 + +define void @G15() { + ret void +} + +; WIN32-SECTIONS: .section .text,"xr",one_only,_G15 +; WIN32-SECTIONS: .globl _G15 |