Add funny darwin section selection logic

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53307 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2008-07-09 13:23:57 +00:00
parent 01b0e24c25
commit 4039e680bc
2 changed files with 123 additions and 13 deletions

View File

@ -221,13 +221,114 @@ X86DarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
return DW_EH_PE_absptr;
}
std::string
X86DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
SectionKind::Kind Kind = SectionKindForGlobal(GV);
bool isWeak = GV->hasWeakLinkage() ||
GV->hasCommonLinkage() ||
GV->hasLinkOnceLinkage();
switch (Kind) {
case SectionKind::Text:
if (isWeak)
return ".section __TEXT,__textcoal_nt,coalesced,pure_instructions";
else
return getTextSection();
case SectionKind::Data:
case SectionKind::ThreadData:
case SectionKind::BSS:
case SectionKind::ThreadBSS:
if (cast<GlobalVariable>(GV)->isConstant()) {
if (isWeak)
return ".section __DATA,__const_coal,coalesced";
else
return ".const_data";
} else {
if (isWeak)
return ".section __DATA,__datacoal_nt,coalesced";
else
return getDataSection();
}
case SectionKind::ROData:
if (isWeak)
return ".section __DATA,__const_coal,coalesced";
else
return getReadOnlySection();
case SectionKind::RODataMergeStr:
return MergeableStringSection(cast<GlobalVariable>(GV));
case SectionKind::RODataMergeConst:
return MergeableConstSection(cast<GlobalVariable>(GV));
default:
assert(0 && "Unsuported section kind for global");
}
// FIXME: Do we have any extra special weird cases?
}
std::string
X86DarwinTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const {
unsigned Flags = SectionFlagsForGlobal(GV, GV->getSection().c_str());
unsigned Size = SectionFlags::getEntitySize(Flags);
if (Size) {
const TargetData *TD = X86TM->getTargetData();
unsigned Align = TD->getPreferredAlignment(GV);
if (Align <= 32)
return getCStringSection();
}
return getReadOnlySection();
}
std::string
X86DarwinTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const {
unsigned Flags = SectionFlagsForGlobal(GV, GV->getSection().c_str());
unsigned Size = SectionFlags::getEntitySize(Flags);
if (Size == 4)
return FourByteConstantSection;
else if (Size == 8)
return EightByteConstantSection;
else if (Size == 16 && X86TM->getSubtarget<X86Subtarget>().is64Bit())
return SixteenByteConstantSection;
return getReadOnlySection();
}
std::string
X86DarwinTargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV,
SectionKind::Kind kind) const {
if (kind == SectionKind::Text)
return "__TEXT,__textcoal_nt,coalesced,pure_instructions";
else
return "__DATA,__datacoal_nt,coalesced";
assert(0 && "Darwin does not use unique sections");
return "";
}
unsigned
X86DarwinTargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
const char* name) const {
unsigned Flags =
TargetAsmInfo::SectionFlagsForGlobal(GV,
GV->getSection().c_str());
// If there was decision to put stuff into mergeable section - calculate
// entity size
if (Flags & SectionFlags::Mergeable) {
const TargetData *TD = X86TM->getTargetData();
Constant *C = cast<GlobalVariable>(GV)->getInitializer();
const Type *Type;
if (Flags & SectionFlags::Strings) {
const ConstantArray *CVA = cast<ConstantArray>(C);
Type = CVA->getType()->getElementType();
} else
Type = C->getType();
unsigned Size = TD->getABITypeSize(Type);
if (Size > 16)
Size = 0;
Flags = SectionFlags::setEntitySize(Flags, Size);
}
return Flags;
}
X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM):
@ -365,10 +466,14 @@ X86ELFTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const {
unsigned Size = SectionFlags::getEntitySize(Flags);
// FIXME: string here is temporary, until stuff will fully land in.
if (Size)
return ".rodata.cst" + utostr(Size);
else
return getReadOnlySection();
if (Size == 4)
return FourByteConstantSection;
else if (Size == 8)
return EightByteConstantSection;
else if (Size == 16)
return SixteenByteConstantSection;
return getReadOnlySection();
}
std::string
@ -383,10 +488,10 @@ X86ELFTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const {
if (Align < Size)
Align = Size;
// FIXME: string here is temporary, until stuff will fully land in.
return ".rodata.str" + utostr(Size) + ',' + utostr(Align);
} else
return getReadOnlySection();
return getCStringSection() + utostr(Size) + ',' + utostr(Align);
}
return getReadOnlySection();
}
unsigned
@ -410,7 +515,7 @@ X86ELFTargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
Type = C->getType();
unsigned Size = TD->getABITypeSize(Type);
if (Size > 32)
if (Size > 16)
Size = 0;
Flags = SectionFlags::setEntitySize(Flags, Size);
}

View File

@ -38,8 +38,13 @@ namespace llvm {
explicit X86DarwinTargetAsmInfo(const X86TargetMachine &TM);
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const;
virtual std::string SelectSectionForGlobal(const GlobalValue *GV) const;
virtual unsigned SectionFlagsForGlobal(const GlobalValue *GV,
const char* name) const;
virtual std::string UniqueSectionForGlobal(const GlobalValue* GV,
SectionKind::Kind kind) const;
std::string MergeableConstSection(const GlobalVariable *GV) const;
std::string MergeableStringSection(const GlobalVariable *GV) const;
};
struct X86ELFTargetAsmInfo : public X86TargetAsmInfo {