diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-08 23:39:42 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-08 23:39:42 +0000 |
commit | 93b6db3de934a3cfca5586df25184fef4a54c500 (patch) | |
tree | 3c32466a689b69726787f2b72bcdaf6a3879df50 /lib | |
parent | 8e9ece75db5045ec057efbbdba6550fa0d85e695 (diff) | |
download | llvm-93b6db3de934a3cfca5586df25184fef4a54c500.tar.gz llvm-93b6db3de934a3cfca5586df25184fef4a54c500.tar.bz2 llvm-93b6db3de934a3cfca5586df25184fef4a54c500.tar.xz |
sink the 'name' and 'isdirective' state out of MCSection into its derived classes.
This totally optimizes PIC16 sections by not having an 'isdirective' bit anymore!! ;-)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78517 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 7 | ||||
-rw-r--r-- | lib/CodeGen/ELFWriter.cpp | 20 | ||||
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 20 | ||||
-rw-r--r-- | lib/MC/MCSection.cpp | 27 | ||||
-rw-r--r-- | lib/Target/PIC16/PIC16AsmPrinter.cpp | 10 | ||||
-rw-r--r-- | lib/Target/PIC16/PIC16Section.h | 20 | ||||
-rw-r--r-- | lib/Target/PIC16/PIC16TargetObjectFile.cpp | 77 | ||||
-rw-r--r-- | lib/Target/PIC16/PIC16TargetObjectFile.h | 9 |
8 files changed, 106 insertions, 84 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index be481bdc27..c05e84772f 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2133,13 +2133,12 @@ void DwarfDebug::EmitDebugLines() { // Isolate current sections line info. const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j]; - if (Asm->isVerbose()) { + /*if (Asm->isVerbose()) { const MCSection *S = SectionMap[j + 1]; O << '\t' << TAI->getCommentString() << " Section" << S->getName() << '\n'; - } else { - Asm->EOL(); - } + }*/ + Asm->EOL(); // Dwarf assumes we start with first line of first source file. unsigned Source = 1; diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp index 42fe56df61..ca79d9dcaf 100644 --- a/lib/CodeGen/ELFWriter.cpp +++ b/lib/CodeGen/ELFWriter.cpp @@ -179,21 +179,21 @@ void ELFWriter::addExternalSymbol(const char *External) { // getCtorSection - Get the static constructor section ELFSection &ELFWriter::getCtorSection() { const MCSection *Ctor = TLOF.getStaticCtorSection(); - return getSection(Ctor->getName(), ELFSection::SHT_PROGBITS, + return getSection(((MCSectionELF*)Ctor)->getName(), ELFSection::SHT_PROGBITS, getElfSectionFlags(Ctor->getKind())); } // getDtorSection - Get the static destructor section ELFSection &ELFWriter::getDtorSection() { const MCSection *Dtor = TLOF.getStaticDtorSection(); - return getSection(Dtor->getName(), ELFSection::SHT_PROGBITS, + return getSection(((MCSectionELF*)Dtor)->getName(), ELFSection::SHT_PROGBITS, getElfSectionFlags(Dtor->getKind())); } // getTextSection - Get the text section for the specified function ELFSection &ELFWriter::getTextSection(Function *F) { const MCSection *Text = TLOF.SectionForGlobal(F, Mang, TM); - return getSection(Text->getName(), ELFSection::SHT_PROGBITS, + return getSection(((MCSectionELF*)Text)->getName(), ELFSection::SHT_PROGBITS, getElfSectionFlags(Text->getKind())); } @@ -201,7 +201,7 @@ ELFSection &ELFWriter::getTextSection(Function *F) { // emitting jump tables. TODO: add PIC support ELFSection &ELFWriter::getJumpTableSection() { const MCSection *JT = TLOF.getSectionForConstant(SectionKind::getReadOnly()); - return getSection(JT->getName(), + return getSection(((MCSectionELF*)JT)->getName(), ELFSection::SHT_PROGBITS, getElfSectionFlags(JT->getKind()), TM.getTargetData()->getPointerABIAlignment()); @@ -226,7 +226,8 @@ ELFSection &ELFWriter::getConstantPoolSection(MachineConstantPoolEntry &CPE) { } } - return getSection(TLOF.getSectionForConstant(Kind)->getName(), + const MCSection *CPSect = TLOF.getSectionForConstant(Kind); + return getSection(((MCSectionELF*)CPSect)->getName(), ELFSection::SHT_PROGBITS, getElfSectionFlags(Kind), CPE.getAlignment()); @@ -369,7 +370,8 @@ void ELFWriter::EmitGlobal(const GlobalValue *GV) { if (isELFCommonSym(GVar)) { GblSym->SectionIdx = ELFSection::SHN_COMMON; - getSection(S->getName(), ELFSection::SHT_NOBITS, SectionFlags, 1); + getSection(((MCSectionELF*)S)->getName(), + ELFSection::SHT_NOBITS, SectionFlags, 1); // A new linkonce section is created for each global in the // common section, the default alignment is 1 and the symbol @@ -378,7 +380,8 @@ void ELFWriter::EmitGlobal(const GlobalValue *GV) { } else if (isELFBssSym(GVar, Kind)) { ELFSection &ES = - getSection(S->getName(), ELFSection::SHT_NOBITS, SectionFlags); + getSection(((MCSectionELF*)S)->getName(), ELFSection::SHT_NOBITS, + SectionFlags); GblSym->SectionIdx = ES.SectionIdx; // Update the size with alignment and the next object can @@ -393,7 +396,8 @@ void ELFWriter::EmitGlobal(const GlobalValue *GV) { } else { // The symbol must go to some kind of data section ELFSection &ES = - getSection(S->getName(), ELFSection::SHT_PROGBITS, SectionFlags); + getSection(((MCSectionELF*)S)->getName(), ELFSection::SHT_PROGBITS, + SectionFlags); GblSym->SectionIdx = ES.SectionIdx; // GblSym->Value should contain the symbol offset inside the section, diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index a71174a77b..0aed948d30 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -100,13 +100,6 @@ static inline bool NeedsQuoting(const StringRef &Str) { return false; } -/// Allow printing sections directly to a raw_ostream with proper quoting. -static inline raw_ostream &operator<<(raw_ostream &os, const MCSection *S) { - if (NeedsQuoting(S->getName())) - return os << '"' << S->getName() << '"'; - return os << S->getName(); -} - /// Allow printing symbols directly to a raw_ostream with proper quoting. static inline raw_ostream &operator<<(raw_ostream &os, const MCSymbol *S) { if (NeedsQuoting(S->getName())) @@ -144,10 +137,8 @@ void MCAsmStreamer::SwitchSection(MCSection *Section) { if (Section != CurSection) { CurSection = Section; - // FIXME: Really we would like the segment, flags, etc. to be separate - // values instead of embedded in the name. Not all assemblers understand all - // this stuff though. - OS << ".section " << Section << "\n"; + // FIXME: Needs TargetAsmInfo! + Section->PrintSwitchToSection(*(const TargetAsmInfo*)0, OS); } } @@ -228,7 +219,12 @@ void MCAsmStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, // FIXME: Really we would like the segment and section names as well as the // section type to be separate values instead of embedded in the name. Not // all assemblers understand all this stuff though. - OS << ".zerofill " << Section; + OS << ".zerofill "; + + // This is a mach-o specific directive. + OS << '"' << ((MCSectionMachO*)Section)->getName() << '"'; + + if (Symbol != NULL) { OS << ',' << Symbol << ',' << Size; if (Pow2Alignment != 0) diff --git a/lib/MC/MCSection.cpp b/lib/MC/MCSection.cpp index a1f5664859..80a80e7d8d 100644 --- a/lib/MC/MCSection.cpp +++ b/lib/MC/MCSection.cpp @@ -20,13 +20,6 @@ using namespace llvm; MCSection::~MCSection() { } -MCSection::MCSection(const StringRef &N, bool isDirective, SectionKind K, - MCContext &Ctx) - : Name(N), IsDirective(isDirective), Kind(K) { - MCSection *&Entry = Ctx.Sections[Name]; - assert(Entry == 0 && "Multiple sections with the same name created"); - Entry = this; -} //===----------------------------------------------------------------------===// // MCSectionELF @@ -37,6 +30,13 @@ Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { return new (Ctx) MCSectionELF(Name, IsDirective, K, Ctx); } +MCSectionELF::MCSectionELF(const StringRef &name, bool isDirective, + SectionKind K, MCContext &Ctx) + : MCSection(K), Name(name), IsDirective(isDirective) { + Ctx.SetSection(Name, this); +} + + void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI, raw_ostream &OS) const { if (isDirective()) { @@ -118,6 +118,12 @@ Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { return new (Ctx) MCSectionMachO(Name, IsDirective, K, Ctx); } +MCSectionMachO::MCSectionMachO(const StringRef &name, bool isDirective, + SectionKind K, MCContext &Ctx) + : MCSection(K), Name(name), IsDirective(isDirective) { + Ctx.SetSection(Name, this); +} + void MCSectionMachO::PrintSwitchToSection(const TargetAsmInfo &TAI, raw_ostream &OS) const { if (!isDirective()) @@ -135,6 +141,13 @@ Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { return new (Ctx) MCSectionCOFF(Name, IsDirective, K, Ctx); } +MCSectionCOFF::MCSectionCOFF(const StringRef &name, bool isDirective, + SectionKind K, MCContext &Ctx) + : MCSection(K), Name(name), IsDirective(isDirective) { + Ctx.SetSection(Name, this); +} + + void MCSectionCOFF::PrintSwitchToSection(const TargetAsmInfo &TAI, raw_ostream &OS) const { diff --git a/lib/Target/PIC16/PIC16AsmPrinter.cpp b/lib/Target/PIC16/PIC16AsmPrinter.cpp index dc332ffe6d..7a5fdc853c 100644 --- a/lib/Target/PIC16/PIC16AsmPrinter.cpp +++ b/lib/Target/PIC16/PIC16AsmPrinter.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "PIC16AsmPrinter.h" +#include "PIC16Section.h" #include "PIC16TargetAsmInfo.h" #include "llvm/DerivedTypes.h" #include "llvm/Function.h" @@ -21,7 +22,6 @@ #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/DwarfWriter.h" #include "llvm/CodeGen/MachineModuleInfo.h" -#include "llvm/MC/MCSection.h" #include "llvm/Target/TargetRegistry.h" #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Support/ErrorHandling.h" @@ -227,9 +227,11 @@ bool PIC16AsmPrinter::doInitialization(Module &M) { // Set the section names for all globals. for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) - if (!I->isDeclaration() && !I->hasAvailableExternallyLinkage()) - I->setSection(getObjFileLowering(). - SectionForGlobal(I, Mang,TM)->getName()); + if (!I->isDeclaration() && !I->hasAvailableExternallyLinkage()) { + const MCSection *S = getObjFileLowering().SectionForGlobal(I, Mang, TM); + + I->setSection(((const MCSectionPIC16*)S)->getName()); + } DbgInfo.BeginModule(M); EmitFunctionDecls(M); diff --git a/lib/Target/PIC16/PIC16Section.h b/lib/Target/PIC16/PIC16Section.h index 4c2ae05707..f69cc2c807 100644 --- a/lib/Target/PIC16/PIC16Section.h +++ b/lib/Target/PIC16/PIC16Section.h @@ -15,27 +15,23 @@ #define LLVM_PIC16SECTION_H #include "llvm/MC/MCSection.h" -#include "llvm/MC/MCContext.h" -#include "llvm/Support/raw_ostream.h" namespace llvm { class MCSectionPIC16 : public MCSection { - MCSectionPIC16(const StringRef &Name, bool IsDirective, SectionKind K, - MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {} + std::string Name; + + MCSectionPIC16(const StringRef &name, SectionKind K, + MCContext &Ctx); public: - static MCSectionPIC16 *Create(const StringRef &Name, bool IsDirective, - SectionKind K, MCContext &Ctx) { - return new (Ctx) MCSectionPIC16(Name, IsDirective, K, Ctx); - } + const std::string &getName() const { return Name; } + static MCSectionPIC16 *Create(const StringRef &Name, + SectionKind K, MCContext &Ctx); virtual void PrintSwitchToSection(const TargetAsmInfo &TAI, - raw_ostream &OS) const { - OS << getName() << '\n'; - } - + raw_ostream &OS) const; }; } // end namespace llvm diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.cpp b/lib/Target/PIC16/PIC16TargetObjectFile.cpp index a9668f9c07..ed1caf225e 100644 --- a/lib/Target/PIC16/PIC16TargetObjectFile.cpp +++ b/lib/Target/PIC16/PIC16TargetObjectFile.cpp @@ -15,17 +15,37 @@ #include "llvm/Module.h" #include "llvm/MC/MCSection.h" #include "llvm/MC/MCContext.h" +#include "llvm/Support/raw_ostream.h" using namespace llvm; +MCSectionPIC16::MCSectionPIC16(const StringRef &name, SectionKind K, + MCContext &Ctx) : MCSection(K), Name(name) { + Ctx.SetSection(Name, this); +} + +MCSectionPIC16 *MCSectionPIC16::Create(const StringRef &Name, + SectionKind K, MCContext &Ctx) { + return new (Ctx) MCSectionPIC16(Name, K, Ctx); +} + + +void MCSectionPIC16::PrintSwitchToSection(const TargetAsmInfo &TAI, + raw_ostream &OS) const { + OS << getName() << '\n'; +} + + + + PIC16TargetObjectFile::PIC16TargetObjectFile() : ExternalVarDecls(0), ExternalVarDefs(0) { } -const MCSection *PIC16TargetObjectFile:: -getPIC16Section(const char *Name, bool isDirective, SectionKind Kind) const { +const MCSectionPIC16 *PIC16TargetObjectFile:: +getPIC16Section(const char *Name, SectionKind Kind) const { if (MCSection *S = getContext().GetSection(Name)) - return S; - return MCSectionPIC16::Create(Name, isDirective, Kind, getContext()); + return (MCSectionPIC16*)S; + return MCSectionPIC16::Create(Name, Kind, getContext()); } @@ -33,39 +53,35 @@ void PIC16TargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &tm){ TargetLoweringObjectFile::Initialize(Ctx, tm); TM = &tm; - BSSSection = getPIC16Section("udata.# UDATA", false, - SectionKind::getBSS()); - ReadOnlySection = getPIC16Section("romdata.# ROMDATA", false, + BSSSection = getPIC16Section("udata.# UDATA", SectionKind::getBSS()); + ReadOnlySection = getPIC16Section("romdata.# ROMDATA", SectionKind::getReadOnly()); - DataSection = getPIC16Section("idata.# IDATA", false, - SectionKind::getDataRel()); + DataSection = getPIC16Section("idata.# IDATA", SectionKind::getDataRel()); // Need because otherwise a .text symbol is emitted by DwarfWriter // in BeginModule, and gpasm cribbs for that .text symbol. - TextSection = getPIC16Section("", true, SectionKind::getText()); + TextSection = getPIC16Section("", SectionKind::getText()); - ROSections.push_back(new PIC16Section(ReadOnlySection)); + ROSections.push_back(new PIC16Section((MCSectionPIC16*)ReadOnlySection)); // FIXME: I don't know what the classification of these sections really is. ExternalVarDecls = new PIC16Section(getPIC16Section("ExternalVarDecls", - false, SectionKind::getMetadata())); ExternalVarDefs = new PIC16Section(getPIC16Section("ExternalVarDefs", - false, SectionKind::getMetadata())); } const MCSection *PIC16TargetObjectFile:: getSectionForFunction(const std::string &FnName) const { std::string T = PAN::getCodeSectionName(FnName); - return getPIC16Section(T.c_str(), false, SectionKind::getText()); + return getPIC16Section(T.c_str(), SectionKind::getText()); } const MCSection *PIC16TargetObjectFile:: getSectionForFunctionFrame(const std::string &FnName) const { std::string T = PAN::getFrameSectionName(FnName); - return getPIC16Section(T.c_str(), false, SectionKind::getDataRel()); + return getPIC16Section(T.c_str(), SectionKind::getDataRel()); } const MCSection * @@ -92,9 +108,8 @@ PIC16TargetObjectFile::getBSSSectionForGlobal(const GlobalVariable *GV) const { // No BSS section spacious enough was found. Crate a new one. if (!FoundBSS) { std::string name = PAN::getUdataSectionName(BSSSections.size()); - const MCSection *NewSection = getPIC16Section(name.c_str(), false, - // FIXME. - SectionKind::getMetadata()); + const MCSectionPIC16 *NewSection + = getPIC16Section(name.c_str(), /*FIXME*/ SectionKind::getMetadata()); FoundBSS = new PIC16Section(NewSection); @@ -134,9 +149,8 @@ PIC16TargetObjectFile::getIDATASectionForGlobal(const GlobalVariable *GV) const{ // No IDATA section spacious enough was found. Crate a new one. if (!FoundIDATA) { std::string name = PAN::getIdataSectionName(IDATASections.size()); - const MCSection *NewSection = getPIC16Section(name.c_str(), false, - // FIXME. - SectionKind::getMetadata()); + const MCSectionPIC16 *NewSection = + getPIC16Section(name.c_str(), /*FIXME*/ SectionKind::getMetadata()); FoundIDATA = new PIC16Section(NewSection); @@ -169,10 +183,8 @@ PIC16TargetObjectFile::getSectionForAuto(const GlobalVariable *GV) const { // No Auto section was found. Crate a new one. if (!FoundAutoSec) { - const MCSection *NewSection = getPIC16Section(name.c_str(), - // FIXME. - false, - SectionKind::getMetadata()); + const MCSectionPIC16 *NewSection = + getPIC16Section(name.c_str(), /*FIXME*/ SectionKind::getMetadata()); FoundAutoSec = new PIC16Section(NewSection); @@ -270,7 +282,7 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, return CreateSectionForGlobal(GVar, Mang); } - return getPIC16Section(GV->getSection().c_str(), false, Kind); + return getPIC16Section(GV->getSection().c_str(), Kind); } // Create a new section for global variable. If Addr is given then create @@ -322,8 +334,8 @@ PIC16TargetObjectFile::CreateBSSSectionForGlobal(const GlobalVariable *GV, PIC16Section *NewBSS = FoundBSS; if (NewBSS == NULL) { - const MCSection *NewSection = getPIC16Section(Name.c_str(), false, - SectionKind::getBSS()); + const MCSectionPIC16 *NewSection = + getPIC16Section(Name.c_str(), SectionKind::getBSS()); NewBSS = new PIC16Section(NewSection); BSSSections.push_back(NewBSS); } @@ -374,9 +386,8 @@ PIC16TargetObjectFile::CreateIDATASectionForGlobal(const GlobalVariable *GV, PIC16Section *NewIDATASec = FoundIDATASec; if (NewIDATASec == NULL) { - const MCSection *NewSection = getPIC16Section(Name.c_str(), false, - // FIXME: - SectionKind::getMetadata()); + const MCSectionPIC16 *NewSection = + getPIC16Section(Name.c_str(), /* FIXME */SectionKind::getMetadata()); NewIDATASec = new PIC16Section(NewSection); IDATASections.push_back(NewIDATASec); } @@ -414,8 +425,8 @@ PIC16TargetObjectFile::CreateROSectionForGlobal(const GlobalVariable *GV, PIC16Section *NewRomSec = FoundROSec; if (NewRomSec == NULL) { - const MCSection *NewSection = getPIC16Section(Name.c_str(), false, - SectionKind::getReadOnly()); + const MCSectionPIC16 *NewSection = + getPIC16Section(Name.c_str(), SectionKind::getReadOnly()); NewRomSec = new PIC16Section(NewSection); ROSections.push_back(NewRomSec); } diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.h b/lib/Target/PIC16/PIC16TargetObjectFile.h index f8389a6adc..edd2b1cc15 100644 --- a/lib/Target/PIC16/PIC16TargetObjectFile.h +++ b/lib/Target/PIC16/PIC16TargetObjectFile.h @@ -17,6 +17,7 @@ namespace llvm { class GlobalVariable; class Module; class PIC16TargetMachine; + class MCSectionPIC16; enum { DataBankSize = 80 }; @@ -29,12 +30,12 @@ namespace llvm { /// FIXME: MOVE ALL THIS STUFF TO MCSectionPIC16. /// struct PIC16Section { - const MCSection *S_; // Connection to actual Section. + const MCSectionPIC16 *S_; // Connection to actual Section. unsigned Size; // Total size of the objects contained. bool SectionPrinted; std::vector<const GlobalVariable*> Items; - PIC16Section(const MCSection *s) { + PIC16Section(const MCSectionPIC16 *s) { S_ = s; Size = 0; SectionPrinted = false; @@ -46,8 +47,8 @@ namespace llvm { class PIC16TargetObjectFile : public TargetLoweringObjectFile { const TargetMachine *TM; - const MCSection *getPIC16Section(const char *Name, bool isDirective, - SectionKind K) const; + const MCSectionPIC16 *getPIC16Section(const char *Name, + SectionKind K) const; public: mutable std::vector<PIC16Section*> BSSSections; mutable std::vector<PIC16Section*> IDATASections; |