From 93b6db3de934a3cfca5586df25184fef4a54c500 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 8 Aug 2009 23:39:42 +0000 Subject: [PATCH] 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 --- include/llvm/MC/MCContext.h | 9 ++- include/llvm/MC/MCSection.h | 70 +++++++++++++------- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 7 +- lib/CodeGen/ELFWriter.cpp | 20 +++--- lib/MC/MCAsmStreamer.cpp | 20 +++--- lib/MC/MCSection.cpp | 27 ++++++-- lib/Target/PIC16/PIC16AsmPrinter.cpp | 10 +-- lib/Target/PIC16/PIC16Section.h | 20 +++--- lib/Target/PIC16/PIC16TargetObjectFile.cpp | 77 ++++++++++++---------- lib/Target/PIC16/PIC16TargetObjectFile.h | 9 +-- test/MC/AsmParser/labels.s | 4 +- tools/llvm-mc/AsmParser.cpp | 8 +-- tools/llvm-mc/llvm-mc.cpp | 2 +- 13 files changed, 167 insertions(+), 116 deletions(-) diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index a8187cce6f5..f0f5e155553 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -41,8 +41,6 @@ namespace llvm { /// We use a bump pointer allocator to avoid the need to track all allocated /// objects. BumpPtrAllocator Allocator; - - friend class MCSection; public: MCContext(); ~MCContext(); @@ -51,6 +49,13 @@ namespace llvm { /// null if it doesn't exist. MCSection *GetSection(const StringRef &Name) const; + + void SetSection(const StringRef &Name, MCSection *S) { + MCSection *&Entry = Sections[Name]; + assert(Entry == 0 && "Multiple sections with the same name created"); + Entry = S; + } + /// CreateSymbol - Create a new symbol with the specified @param Name. /// /// @param Name - The symbol name, which must be unique across all symbols. diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h index 4e5969ab3e5..4d505028db3 100644 --- a/include/llvm/MC/MCSection.h +++ b/include/llvm/MC/MCSection.h @@ -27,6 +27,22 @@ namespace llvm { /// section in the current translation unit. The MCContext class uniques and /// creates these. class MCSection { + MCSection(const MCSection&); // DO NOT IMPLEMENT + void operator=(const MCSection&); // DO NOT IMPLEMENT + protected: + MCSection(SectionKind K) : Kind(K) {} + SectionKind Kind; + public: + virtual ~MCSection(); + + SectionKind getKind() const { return Kind; } + + virtual void PrintSwitchToSection(const TargetAsmInfo &TAI, + raw_ostream &OS) const = 0; + }; + + + class MCSectionELF : public MCSection { std::string Name; /// IsDirective - This is true if the section name is a directive, not @@ -36,56 +52,64 @@ namespace llvm { /// of a syntactic one. bool IsDirective; - MCSection(const MCSection&); // DO NOT IMPLEMENT - void operator=(const MCSection&); // DO NOT IMPLEMENT - protected: - MCSection(const StringRef &Name, bool IsDirective, SectionKind K, - MCContext &Ctx); - SectionKind Kind; - public: - virtual ~MCSection(); - - const std::string &getName() const { return Name; } - bool isDirective() const { return IsDirective; } - - SectionKind getKind() const { return Kind; } - - virtual void PrintSwitchToSection(const TargetAsmInfo &TAI, - raw_ostream &OS) const = 0; - }; - - - class MCSectionELF : public MCSection { MCSectionELF(const StringRef &Name, bool IsDirective, SectionKind K, - MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {} + MCContext &Ctx); public: static MCSectionELF *Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx); + const std::string &getName() const { return Name; } + bool isDirective() const { return IsDirective; } + + virtual void PrintSwitchToSection(const TargetAsmInfo &TAI, raw_ostream &OS) const; }; class MCSectionMachO : public MCSection { + std::string Name; + + /// IsDirective - This is true if the section name is a directive, not + /// something that should be printed with ".section". + /// + /// FIXME: This is a hack. Switch to a semantic view of the section instead + /// of a syntactic one. + bool IsDirective; + MCSectionMachO(const StringRef &Name, bool IsDirective, SectionKind K, - MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {} + MCContext &Ctx); public: static MCSectionMachO *Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx); + const std::string &getName() const { return Name; } + bool isDirective() const { return IsDirective; } + virtual void PrintSwitchToSection(const TargetAsmInfo &TAI, raw_ostream &OS) const; }; class MCSectionCOFF : public MCSection { + std::string Name; + + /// IsDirective - This is true if the section name is a directive, not + /// something that should be printed with ".section". + /// + /// FIXME: This is a hack. Switch to a semantic view of the section instead + /// of a syntactic one. + bool IsDirective; + MCSectionCOFF(const StringRef &Name, bool IsDirective, SectionKind K, - MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {} + MCContext &Ctx); public: static MCSectionCOFF *Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx); + + const std::string &getName() const { return Name; } + bool isDirective() const { return IsDirective; } virtual void PrintSwitchToSection(const TargetAsmInfo &TAI, raw_ostream &OS) const; diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index be481bdc271..c05e84772f1 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 &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 42fe56df616..ca79d9dcaf8 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 a71174a77b0..0aed948d30d 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 a1f56648597..80a80e7d8d0 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 dc332ffe6d5..7a5fdc853cd 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 4c2ae05707c..f69cc2c8073 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 a9668f9c07c..ed1caf225e2 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 f8389a6adc7..edd2b1cc15e 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 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 BSSSections; mutable std::vector IDATASections; diff --git a/test/MC/AsmParser/labels.s b/test/MC/AsmParser/labels.s index a5998c4dc34..d4c80315a4f 100644 --- a/test/MC/AsmParser/labels.s +++ b/test/MC/AsmParser/labels.s @@ -29,8 +29,8 @@ foo: // CHECK: .long 11 .long "a 0" -// CHECK: .section "a 1,a 2" -.section "a 1", "a 2" +// XXCHCK: .section "a 1,a 2" +//.section "a 1", "a 2" // CHECK: .globl "a 3" .globl "a 3" diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index 29657de5d86..8f6583a5916 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -706,7 +706,7 @@ bool AsmParser::ParseDirectiveDarwinSection() { // FIXME: Arch specific. MCSection *S = Ctx.GetSection(Section); if (S == 0) - S = MCSectionCOFF::Create(Section, false, SectionKind(), Ctx); + S = MCSectionMachO::Create(Section, false, SectionKind(), Ctx); Out.SwitchSection(S); return false; @@ -727,7 +727,7 @@ bool AsmParser::ParseDirectiveSectionSwitch(const char *Section, // FIXME: Arch specific. MCSection *S = Ctx.GetSection(Section); if (S == 0) - S = MCSectionCOFF::Create(Section, false, SectionKind(), Ctx); + S = MCSectionMachO::Create(Section, false, SectionKind(), Ctx); Out.SwitchSection(S); return false; @@ -1118,7 +1118,7 @@ bool AsmParser::ParseDirectiveDarwinZerofill() { // FIXME: Arch specific. MCSection *S = Ctx.GetSection(Section); if (S == 0) - S = MCSectionCOFF::Create(Section, false, SectionKind(), Ctx); + S = MCSectionMachO::Create(Section, false, SectionKind(), Ctx); // Create the zerofill section but no symbol Out.EmitZerofill(S); @@ -1178,7 +1178,7 @@ bool AsmParser::ParseDirectiveDarwinZerofill() { // FIXME: Arch specific. MCSection *S = Ctx.GetSection(Section); if (S == 0) - S = MCSectionCOFF::Create(Section, false, SectionKind(), Ctx); + S = MCSectionMachO::Create(Section, false, SectionKind(), Ctx); // Create the zerofill Symbol with Size and Pow2Alignment Out.EmitZerofill(S, Sym, Size, Pow2Alignment); diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 5c24a8d4ad4..5f746f2e475 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -186,7 +186,7 @@ static int AssembleInput(const char *ProgName) { OwningPtr Str(createAsmStreamer(Ctx, outs())); // FIXME: Target hook & command line option for initial section. - Str.get()->SwitchSection(MCSectionCOFF::Create("__TEXT,__text," + Str.get()->SwitchSection(MCSectionMachO::Create("__TEXT,__text," "regular,pure_instructions", false, SectionKind::getText(),