summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/DarwinTargetAsmInfo.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-07-26 00:51:36 +0000
committerChris Lattner <sabre@nondot.org>2009-07-26 00:51:36 +0000
commit5b42b45fb93c26b0c8bc6d3ea946a8bc4a4d9092 (patch)
treef6d3e68fc4eda4940db755fc72073ed777adac5d /llvm/lib/Target/DarwinTargetAsmInfo.cpp
parent26ce308bbf6697a7ca748456a75ee653ef0aa44d (diff)
downloadbcm5719-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.cpp36
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);
OpenPOWER on IntegriCloud