mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
enhance codegen to put 16-bit character strings into the
__TEXT,__ustring section on darwin. llvm-svn: 78068
This commit is contained in:
parent
ec75250455
commit
8f9a2d3c85
@ -224,6 +224,7 @@ public:
|
||||
|
||||
class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
|
||||
const MCSection *CStringSection;
|
||||
const MCSection *UStringSection;
|
||||
const MCSection *TextCoalSection;
|
||||
const MCSection *ConstTextCoalSection;
|
||||
const MCSection *ConstDataCoalSection;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user