diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-26 06:16:11 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-26 06:16:11 +0000 |
commit | aae21f49156a17c347cf6da44ff30af1ba7bde54 (patch) | |
tree | 567c878890b94b7e087e45772e04924834edcb76 | |
parent | 911e2b8649c71aa25c0f0bbcd3e8e5737665957a (diff) | |
download | bcm5719-llvm-aae21f49156a17c347cf6da44ff30af1ba7bde54.tar.gz bcm5719-llvm-aae21f49156a17c347cf6da44ff30af1ba7bde54.zip |
precreate 4/8/16 byte mergable sections to simplify code.
llvm-svn: 77133
-rw-r--r-- | llvm/include/llvm/Target/ELFTargetAsmInfo.h | 16 | ||||
-rw-r--r-- | llvm/lib/Target/ELFTargetAsmInfo.cpp | 35 |
2 files changed, 29 insertions, 22 deletions
diff --git a/llvm/include/llvm/Target/ELFTargetAsmInfo.h b/llvm/include/llvm/Target/ELFTargetAsmInfo.h index c5d94baf9e5..9d31faa94ad 100644 --- a/llvm/include/llvm/Target/ELFTargetAsmInfo.h +++ b/llvm/include/llvm/Target/ELFTargetAsmInfo.h @@ -43,13 +43,17 @@ namespace llvm { SectionKind Kind) const; virtual std::string printSectionFlags(unsigned flags) const; - const Section* DataRelSection; - const Section* DataRelLocalSection; - const Section* DataRelROSection; - const Section* DataRelROLocalSection; - + const Section *DataRelSection; + const Section *DataRelLocalSection; + const Section *DataRelROSection; + const Section *DataRelROLocalSection; + + const Section *MergableConst4Section; + const Section *MergableConst8Section; + const Section *MergableConst16Section; + private: - const Section* MergeableStringSection(const GlobalVariable *GV) const; + const Section *MergeableStringSection(const GlobalVariable *GV) const; }; } diff --git a/llvm/lib/Target/ELFTargetAsmInfo.cpp b/llvm/lib/Target/ELFTargetAsmInfo.cpp index 4631cda2296..82c993b685a 100644 --- a/llvm/lib/Target/ELFTargetAsmInfo.cpp +++ b/llvm/lib/Target/ELFTargetAsmInfo.cpp @@ -43,6 +43,13 @@ ELFTargetAsmInfo::ELFTargetAsmInfo(const TargetMachine &TM) SectionFlags::Writable); DataRelROLocalSection = getNamedSection("\t.data.rel.ro.local", 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)); if (Kind.isMergableConst()) { - const Type *Ty = cast<GlobalVariable>(GV)->getInitializer()->getType(); - const TargetData *TD = TM.getTargetData(); - return getSectionForMergableConstant(TD->getTypeAllocSize(Ty), 0); + if (Kind.isMergableConst4()) + return MergableConst4Section; + if (Kind.isMergableConst8()) + return MergableConst8Section; + if (Kind.isMergableConst16()) + return MergableConst16Section; + return ReadOnlySection; // .const } + if (Kind.isReadOnly()) return getReadOnlySection(); @@ -89,21 +101,12 @@ ELFTargetAsmInfo::getSectionForMergableConstant(uint64_t Size, if (ReloInfo == 1) return DataRelROLocalSection; - - const char *SecName = 0; switch (Size) { - default: break; - case 4: SecName = ".rodata.cst4"; break; - case 8: SecName = ".rodata.cst8"; break; - case 16: SecName = ".rodata.cst16"; break; + default: return ReadOnlySection; // .rodata + case 4: return MergableConst4Section; + case 8: return MergableConst8Section; + 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 |