diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-26 00:51:36 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-26 00:51:36 +0000 |
commit | 5b42b45fb93c26b0c8bc6d3ea946a8bc4a4d9092 (patch) | |
tree | f6d3e68fc4eda4940db755fc72073ed777adac5d /llvm/lib/Target/DarwinTargetAsmInfo.cpp | |
parent | 26ce308bbf6697a7ca748456a75ee653ef0aa44d (diff) | |
download | bcm5719-llvm-5b42b45fb93c26b0c8bc6d3ea946a8bc4a4d9092.tar.gz bcm5719-llvm-5b42b45fb93c26b0c8bc6d3ea946a8bc4a4d9092.zip |
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.
llvm-svn: 77104
Diffstat (limited to 'llvm/lib/Target/DarwinTargetAsmInfo.cpp')
-rw-r--r-- | llvm/lib/Target/DarwinTargetAsmInfo.cpp | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/llvm/lib/Target/DarwinTargetAsmInfo.cpp b/llvm/lib/Target/DarwinTargetAsmInfo.cpp index 38cdc2e8b86..6be9aa0285b 100644 --- a/llvm/lib/Target/DarwinTargetAsmInfo.cpp +++ b/llvm/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<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); |