diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-04 16:27:13 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-04 16:27:13 +0000 |
commit | ec409759e94cc395e4896ba6ade3fa77200c5cfd (patch) | |
tree | 3c6716c04a076c6d27d0cb82698c844703859ba0 /lib/Target/TargetLoweringObjectFile.cpp | |
parent | 7e88a50428377813606c66ac47111d9c3ea44feb (diff) |
enhance codegen to put 16-bit character strings into the
__TEXT,__ustring section on darwin.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78068 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/TargetLoweringObjectFile.cpp')
-rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 730d32f542..7489883998 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<GlobalVariable>(GV)->getInitializer(); - const Type *Ty = cast<ArrayType>(C->getType())->getElementType(); - const TargetData &TD = *TM.getTargetData(); - unsigned Size = TD.getTypeAllocSize(Ty); - if (Size) { - unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV)); - if (Align <= 32) + if (Kind.isMergeable1ByteCString() || + Kind.isMergeable2ByteCString()) { + if (TM.getTargetData()->getPreferredAlignment( + cast<GlobalVariable>(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; |