diff --git a/include/llvm/Target/DarwinTargetAsmInfo.h b/include/llvm/Target/DarwinTargetAsmInfo.h index afd0dd1b257..0ed9b387037 100644 --- a/include/llvm/Target/DarwinTargetAsmInfo.h +++ b/include/llvm/Target/DarwinTargetAsmInfo.h @@ -21,6 +21,7 @@ namespace llvm { class GlobalValue; class GlobalVariable; + class Type; struct DarwinTargetAsmInfo: public virtual TargetAsmInfo { const Section* TextCoalSection; @@ -33,7 +34,9 @@ namespace llvm { virtual std::string UniqueSectionForGlobal(const GlobalValue* GV, SectionKind::Kind kind) const; const Section* MergeableConstSection(const GlobalVariable *GV) const; + const Section* MergeableConstSection(const Type *Ty) const; const Section* MergeableStringSection(const GlobalVariable *GV) const; + const Section* SelectSectionForMachineConst(const Type *Ty) const; protected: const TargetMachine* DTM; }; diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp index 564d1a18357..749cb717943 100644 --- a/lib/Target/DarwinTargetAsmInfo.cpp +++ b/lib/Target/DarwinTargetAsmInfo.cpp @@ -107,10 +107,16 @@ DarwinTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const { const Section* DarwinTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const { - const TargetData *TD = DTM->getTargetData(); Constant *C = cast(GV)->getInitializer(); - unsigned Size = TD->getABITypeSize(C->getType()); + 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) @@ -121,6 +127,18 @@ DarwinTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const { 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 { diff --git a/lib/Target/ELFTargetAsmInfo.cpp b/lib/Target/ELFTargetAsmInfo.cpp index 3b89c3f1e2d..e6a40e7cec5 100644 --- a/lib/Target/ELFTargetAsmInfo.cpp +++ b/lib/Target/ELFTargetAsmInfo.cpp @@ -99,9 +99,7 @@ ELFTargetAsmInfo::SelectSectionForMachineConst(const Type *Ty) const { const Section* ELFTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const { Constant *C = cast(GV)->getInitializer(); - const Type *Ty = C->getType(); - - return MergeableConstSection(Ty); + return MergeableConstSection(C->getType()); } inline const Section*