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
This commit is contained in:
Chris Lattner 2009-07-26 00:51:36 +00:00
parent d601239833
commit e3577da6d9
2 changed files with 37 additions and 16 deletions

View File

@ -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<GlobalVariable>(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<GlobalVariable>(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<GlobalVariable>(GV)));
return isNonStatic ? ConstDataSection : getReadOnlySection();
case SectionKind::RODataMergeConst: {
if (isWeak) return ConstDataCoalSection;
const Type *Ty = cast<GlobalVariable>(GV)->getInitializer()->getType();
const TargetData *TD = TM.getTargetData();
return getSectionForMergableConstant(TD->getTypeAllocSize(Ty), 0);

View File

@ -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