[llvm-commits] [llvm] r53306 - in /llvm/trunk: include/llvm/Target/TargetAsmInfo.h lib/Target/X86/X86TargetAsmInfo.cpp lib/Target/X86/X86TargetAsmInfo.h
Anton Korobeynikov
asl at math.spbu.ru
Wed Jul 9 06:23:37 PDT 2008
Author: asl
Date: Wed Jul 9 08:23:37 2008
New Revision: 53306
URL: http://llvm.org/viewvc/llvm-project?rev=53306&view=rev
Log:
Handle ELF mergeable sections
Modified:
llvm/trunk/include/llvm/Target/TargetAsmInfo.h
llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp
llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h
Modified: llvm/trunk/include/llvm/Target/TargetAsmInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetAsmInfo.h?rev=53306&r1=53305&r2=53306&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Target/TargetAsmInfo.h (original)
+++ llvm/trunk/include/llvm/Target/TargetAsmInfo.h Wed Jul 9 08:23:37 2008
@@ -57,12 +57,12 @@
EntitySize = 0xFF << 24 ///< Entity size for mergeable sections
};
- static inline unsigned getEntitySize(unsigned flags) {
- return (flags >> 24) & 0xFF;
+ static inline unsigned getEntitySize(unsigned Flags) {
+ return (Flags >> 24) & 0xFF;
}
- static inline unsigned setEntitySize(unsigned flags, unsigned size) {
- return ((flags & ~EntitySize) | ((size & 0xFF) << 24));
+ static inline unsigned setEntitySize(unsigned Flags, unsigned Size) {
+ return ((Flags & ~EntitySize) | ((Size & 0xFF) << 24));
}
}
Modified: llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp?rev=53306&r1=53305&r2=53306&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp Wed Jul 9 08:23:37 2008
@@ -341,10 +341,11 @@
// ELF targets usually have BSS sections
return getBSSSection();
case SectionKind::ROData:
+ return getReadOnlySection();
case SectionKind::RODataMergeStr:
+ return MergeableStringSection(GVar);
case SectionKind::RODataMergeConst:
- // FIXME: Temporary
- return getReadOnlySection();
+ return MergeableConstSection(GVar);
case SectionKind::ThreadData:
// ELF targets usually support TLS stuff
return getTLSDataSection();
@@ -358,6 +359,66 @@
assert(0 && "Unsupported global");
}
+std::string
+X86ELFTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const {
+ unsigned Flags = SectionFlagsForGlobal(GV, GV->getSection().c_str());
+ 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();
+}
+
+std::string
+X86ELFTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const {
+ unsigned Flags = SectionFlagsForGlobal(GV, GV->getSection().c_str());
+ unsigned Size = SectionFlags::getEntitySize(Flags);
+
+ if (Size) {
+ // We also need alignment here
+ const TargetData *TD = X86TM->getTargetData();
+ unsigned Align = TD->getPreferredAlignment(GV);
+ 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();
+}
+
+unsigned
+X86ELFTargetAsmInfo::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 > 32)
+ Size = 0;
+ Flags = SectionFlags::setEntitySize(Flags, Size);
+ }
+
+ return Flags;
+}
+
+
std::string X86ELFTargetAsmInfo::PrintSectionFlags(unsigned flags) const {
std::string Flags = ",\"";
Modified: llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h?rev=53306&r1=53305&r2=53306&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h (original)
+++ llvm/trunk/lib/Target/X86/X86TargetAsmInfo.h Wed Jul 9 08:23:37 2008
@@ -20,6 +20,7 @@
// Forward declaration.
class X86TargetMachine;
+ class GlobalVariable;
struct X86TargetAsmInfo : public TargetAsmInfo {
explicit X86TargetAsmInfo(const X86TargetMachine &TM);
@@ -47,7 +48,11 @@
bool Global) const;
virtual std::string SelectSectionForGlobal(const GlobalValue *GV) const;
+ virtual unsigned SectionFlagsForGlobal(const GlobalValue *GV,
+ const char* name) const;
virtual std::string PrintSectionFlags(unsigned flags) const;
+ std::string MergeableConstSection(const GlobalVariable *GV) const;
+ std::string MergeableStringSection(const GlobalVariable *GV) const;
};
struct X86COFFTargetAsmInfo : public X86TargetAsmInfo {
More information about the llvm-commits
mailing list