precreate 4/8/16 byte mergable sections to simplify code.

llvm-svn: 77133
This commit is contained in:
Chris Lattner 2009-07-26 06:16:11 +00:00
parent 911e2b8649
commit aae21f4915
2 changed files with 29 additions and 22 deletions

View File

@ -43,13 +43,17 @@ namespace llvm {
SectionKind Kind) const; SectionKind Kind) const;
virtual std::string printSectionFlags(unsigned flags) const; virtual std::string printSectionFlags(unsigned flags) const;
const Section* DataRelSection; const Section *DataRelSection;
const Section* DataRelLocalSection; const Section *DataRelLocalSection;
const Section* DataRelROSection; const Section *DataRelROSection;
const Section* DataRelROLocalSection; const Section *DataRelROLocalSection;
const Section *MergableConst4Section;
const Section *MergableConst8Section;
const Section *MergableConst16Section;
private: private:
const Section* MergeableStringSection(const GlobalVariable *GV) const; const Section *MergeableStringSection(const GlobalVariable *GV) const;
}; };
} }

View File

@ -43,6 +43,13 @@ ELFTargetAsmInfo::ELFTargetAsmInfo(const TargetMachine &TM)
SectionFlags::Writable); SectionFlags::Writable);
DataRelROLocalSection = getNamedSection("\t.data.rel.ro.local", DataRelROLocalSection = getNamedSection("\t.data.rel.ro.local",
SectionFlags::Writable); SectionFlags::Writable);
MergableConst4Section = getNamedSection(".rodata.cst4",
SectionFlags::setEntitySize(SectionFlags::Mergeable, 4));
MergableConst8Section = getNamedSection(".rodata.cst8",
SectionFlags::setEntitySize(SectionFlags::Mergeable, 8));
MergableConst16Section = getNamedSection(".rodata.cst16",
SectionFlags::setEntitySize(SectionFlags::Mergeable, 16));
} }
@ -54,10 +61,15 @@ ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV,
return MergeableStringSection(cast<GlobalVariable>(GV)); return MergeableStringSection(cast<GlobalVariable>(GV));
if (Kind.isMergableConst()) { if (Kind.isMergableConst()) {
const Type *Ty = cast<GlobalVariable>(GV)->getInitializer()->getType(); if (Kind.isMergableConst4())
const TargetData *TD = TM.getTargetData(); return MergableConst4Section;
return getSectionForMergableConstant(TD->getTypeAllocSize(Ty), 0); if (Kind.isMergableConst8())
return MergableConst8Section;
if (Kind.isMergableConst16())
return MergableConst16Section;
return ReadOnlySection; // .const
} }
if (Kind.isReadOnly()) return getReadOnlySection(); if (Kind.isReadOnly()) return getReadOnlySection();
@ -89,21 +101,12 @@ ELFTargetAsmInfo::getSectionForMergableConstant(uint64_t Size,
if (ReloInfo == 1) if (ReloInfo == 1)
return DataRelROLocalSection; return DataRelROLocalSection;
const char *SecName = 0;
switch (Size) { switch (Size) {
default: break; default: return ReadOnlySection; // .rodata
case 4: SecName = ".rodata.cst4"; break; case 4: return MergableConst4Section;
case 8: SecName = ".rodata.cst8"; break; case 8: return MergableConst8Section;
case 16: SecName = ".rodata.cst16"; break; case 16: return MergableConst16Section;
} }
if (SecName)
return getNamedSection(SecName,
SectionFlags::setEntitySize(SectionFlags::Mergeable,
Size));
return getReadOnlySection(); // .rodata
} }
/// getFlagsForNamedSection - If this target wants to be able to infer /// getFlagsForNamedSection - If this target wants to be able to infer