-const Section*
-DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
- SectionKind::Kind Kind = SectionKindForGlobal(GV);
- bool isWeak = GV->isWeakForLinker();
- bool isNonStatic = (DTM->getRelocationModel() != Reloc::Static);
-
- switch (Kind) {
- case SectionKind::Text:
- if (isWeak)
- return TextCoalSection;
- else
- return getTextSection_();
- case SectionKind::Data:
- case SectionKind::ThreadData:
- case SectionKind::BSS:
- case SectionKind::ThreadBSS:
- if (cast<GlobalVariable>(GV)->isConstant())
- return (isWeak ? ConstDataCoalSection : ConstDataSection);
- else
- return (isWeak ? DataCoalSection : getDataSection_());
- case SectionKind::ROData:
- return (isWeak ? ConstDataCoalSection :
- (isNonStatic ? ConstDataSection : getReadOnlySection_()));
- case SectionKind::RODataMergeStr:
- return (isWeak ?
- ConstDataCoalSection :
- MergeableStringSection(cast<GlobalVariable>(GV)));
- case SectionKind::RODataMergeConst:
- return (isWeak ?
- ConstDataCoalSection:
- MergeableConstSection(cast<GlobalVariable>(GV)));
- default:
- assert(0 && "Unsuported section kind for global");
- }
-
- // FIXME: Do we have any extra special weird cases?
-}
-
-const Section*
-DarwinTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const {
- const TargetData *TD = DTM->getTargetData();
- Constant *C = cast<GlobalVariable>(GV)->getInitializer();
- const Type *Type = cast<ConstantArray>(C)->getType()->getElementType();
-
- unsigned Size = TD->getABITypeSize(Type);
- if (Size) {
- const TargetData *TD = DTM->getTargetData();
- unsigned Align = TD->getPreferredAlignment(GV);
- if (Align <= 32)
- return getCStringSection_();
- }
-
- return getReadOnlySection_();
-}
-
-const Section*
-DarwinTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const {
- Constant *C = cast<GlobalVariable>(GV)->getInitializer();
-
- return MergeableConstSection(C->getType());
-}
-
-inline const Section*
-DarwinTargetAsmInfo::MergeableConstSection(const Type *Ty) const {
- const TargetData *TD = DTM->getTargetData();
-
- unsigned Size = TD->getABITypeSize(Ty);
- if (Size == 4)
- return FourByteConstantSection_;
- else if (Size == 8)
- return EightByteConstantSection_;
- else if (Size == 16 && SixteenByteConstantSection_)
- return SixteenByteConstantSection_;
-
- return getReadOnlySection_();
-}
-
-const Section*
-DarwinTargetAsmInfo::SelectSectionForMachineConst(const Type *Ty) const {
- const Section* S = MergeableConstSection(Ty);
-
- // Handle weird special case, when compiling PIC stuff.
- if (S == getReadOnlySection_() &&
- DTM->getRelocationModel() != Reloc::Static)
- return ConstDataSection;
-
- return S;
-}
-
-std::string
-DarwinTargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV,
- SectionKind::Kind kind) const {
- assert(0 && "Darwin does not use unique sections");
- return "";
-}