[llvm-commits] [llvm] r53307 - in /llvm/trunk/lib/Target/X86: X86TargetAsmInfo.cpp X86TargetAsmInfo.h
Anton Korobeynikov
asl at math.spbu.ru
Wed Jul 9 06:23:57 PDT 2008
Author: asl
Date: Wed Jul 9 08:23:57 2008
New Revision: 53307
URL: http://llvm.org/viewvc/llvm-project?rev=53307&view=rev
Log:
Add funny darwin section selection logic
Modified:
llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp
llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h
Modified: llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp?rev=53307&r1=53306&r2=53307&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp Wed Jul 9 08:23:57 2008
@@ -222,12 +222,113 @@
}
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 @@
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 @@
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 @@
Type = C->getType();
unsigned Size = TD->getABITypeSize(Type);
- if (Size > 32)
+ if (Size > 16)
Size = 0;
Flags = SectionFlags::setEntitySize(Flags, Size);
}
Modified: llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h?rev=53307&r1=53306&r2=53307&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h (original)
+++ llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h Wed Jul 9 08:23:57 2008
@@ -38,8 +38,13 @@
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 {
More information about the llvm-commits
mailing list