From: Chris Lattner Date: Sun, 26 Jul 2009 00:51:36 +0000 (+0000) Subject: simplify DarwinTargetAsmInfo::SelectSectionForGlobal a bit X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=e3577da6d969c7411736b5fcfe27ba355dd2d806;p=oota-llvm.git simplify DarwinTargetAsmInfo::SelectSectionForGlobal a bit and make it more aggressive, we now put: const int G2 __attribute__((weak)) = 42; into the text (readonly) segment like gcc, previously we put it into the data (readwrite) segment. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77104 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp index 38cdc2e8b86..6be9aa0285b 100644 --- a/lib/Target/DarwinTargetAsmInfo.cpp +++ b/lib/Target/DarwinTargetAsmInfo.cpp @@ -127,37 +127,41 @@ bool DarwinTargetAsmInfo::emitUsedDirectiveFor(const GlobalValue* GV, const Section* DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind) const { + assert(!Kind.isTLS() && "Darwin doesn't support TLS"); + // FIXME: Use sectionflags:linkonce instead of isWeakForLinker() here. bool isWeak = GV->isWeakForLinker(); bool isNonStatic = TM.getRelocationModel() != Reloc::Static; + if (Kind.isCode()) + return isWeak ? TextCoalSection : TextSection; + + // If this is weak/linkonce, put this in a coalescable section, either in text + // or data depending on if it is writable. + if (isWeak) { + if (Kind.isReadOnly()) + return ConstTextCoalSection; + return DataCoalSection; + } + + // FIXME: Alignment check should be handled by section classifier. + if (Kind.isMergableString()) + return MergeableStringSection(cast(GV)); + switch (Kind.getKind()) { - case SectionKind::ThreadData: - case SectionKind::ThreadBSS: - llvm_unreachable("Darwin doesn't support TLS"); - case SectionKind::Text: - if (isWeak) - return TextCoalSection; - return TextSection; case SectionKind::Data: case SectionKind::DataRelLocal: case SectionKind::DataRel: case SectionKind::BSS: if (cast(GV)->isConstant()) - return isWeak ? ConstDataCoalSection : ConstDataSection; - return isWeak ? DataCoalSection : DataSection; + return ConstDataSection; + return DataSection; case SectionKind::ROData: case SectionKind::DataRelRO: case SectionKind::DataRelROLocal: - return (isWeak ? ConstDataCoalSection : - (isNonStatic ? ConstDataSection : getReadOnlySection())); - case SectionKind::RODataMergeStr: - return (isWeak ? - ConstTextCoalSection : - MergeableStringSection(cast(GV))); + return isNonStatic ? ConstDataSection : getReadOnlySection(); case SectionKind::RODataMergeConst: { - if (isWeak) return ConstDataCoalSection; const Type *Ty = cast(GV)->getInitializer()->getType(); const TargetData *TD = TM.getTargetData(); return getSectionForMergableConstant(TD->getTypeAllocSize(Ty), 0); diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index 0b4ed3b3604..ab3c5922e75 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -1,8 +1,25 @@ ; RUN: llvm-as < %s | llc -mtriple=i386-unknown-linux-gnu | FileCheck %s -check-prefix=LINUX +; RUN: llvm-as < %s | llc -mtriple=i386-apple-darwin9.7 | FileCheck %s -check-prefix=DARWIN + +; int G1; @G1 = common global i32 0 ; LINUX: .type G1,@object ; LINUX: .section .gnu.linkonce.b.G1,"aw",@nobits ; LINUX: .comm G1,4,4 +; DARWIN: .comm _G1,4,2 + + + + +; const int G2 __attribute__((weak)) = 42; +@G2 = weak_odr constant i32 42 + + +; TODO: linux drops this into .rodata, we drop it into ".gnu.linkonce.r.G2" + +; DARWIN: .section __TEXT,__const_coal,coalesced +; DARWIN: _G2: +; DARWIN: .long 42