diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 3715a6585ac..10ce48158ae 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -224,6 +224,7 @@ public: class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { const MCSection *CStringSection; + const MCSection *UStringSection; const MCSection *TextCoalSection; const MCSection *ConstTextCoalSection; const MCSection *ConstDataCoalSection; diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 730d32f5429..7489883998d 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -593,11 +593,13 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, SectionKind::getDataRel()); CStringSection = getOrCreateSection("\t.cstring", true, - SectionKind::getMergeable1ByteCString()); + SectionKind::getMergeable1ByteCString()); + UStringSection = getOrCreateSection("__TEXT,__ustring", false, + SectionKind::getMergeable2ByteCString()); FourByteConstantSection = getOrCreateSection("\t.literal4\n", true, - SectionKind::getMergeableConst4()); + SectionKind::getMergeableConst4()); EightByteConstantSection = getOrCreateSection("\t.literal8\n", true, - SectionKind::getMergeableConst8()); + SectionKind::getMergeableConst8()); // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back // to using it in -static mode. @@ -704,18 +706,15 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, } // FIXME: Alignment check should be handled by section classifier. - if (Kind.isMergeable1ByteCString()) { - Constant *C = cast(GV)->getInitializer(); - const Type *Ty = cast(C->getType())->getElementType(); - const TargetData &TD = *TM.getTargetData(); - unsigned Size = TD.getTypeAllocSize(Ty); - if (Size) { - unsigned Align = TD.getPreferredAlignment(cast(GV)); - if (Align <= 32) + if (Kind.isMergeable1ByteCString() || + Kind.isMergeable2ByteCString()) { + if (TM.getTargetData()->getPreferredAlignment( + cast(GV)) < 32) { + if (Kind.isMergeable1ByteCString()) return CStringSection; + assert(Kind.isMergeable2ByteCString()); + return UStringSection; } - - return ReadOnlySection; } if (Kind.isMergeableConst()) { @@ -725,11 +724,10 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, return EightByteConstantSection; if (Kind.isMergeableConst16() && SixteenByteConstantSection) return SixteenByteConstantSection; - return ReadOnlySection; // .const } - - // FIXME: ROData -> const in -static mode that is relocatable but they happen - // by the static linker. Why not mergeable? + + // Otherwise, if it is readonly, but not something we can specially optimize, + // just drop it in .const. if (Kind.isReadOnly()) return ReadOnlySection; diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index 4f4c4bcf1c7..7d39a020952 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -101,7 +101,7 @@ @G8 = constant [4 x i16] [ i16 1, i16 2, i16 3, i16 0 ] -; DARWIN: .const +; DARWIN: .section __TEXT,__ustring ; DARWIN: .globl _G8 ; DARWIN: _G8: @@ -111,7 +111,7 @@ @G9 = constant [4 x i32] [ i32 1, i32 2, i32 3, i32 0 ] -; ARWIN: .const [[ already in const section]] +; DARWIN: .const ; DARWIN: .globl _G9 ; DARWIN: _G9: