//===-- PIC16TargetObjectFile.h - PIC16 Object Info -------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_TARGET_PIC16_TARGETOBJECTFILE_H #define LLVM_TARGET_PIC16_TARGETOBJECTFILE_H #include "llvm/Target/TargetLoweringObjectFile.h" #include namespace llvm { class GlobalVariable; class Module; class PIC16TargetMachine; enum { DataBankSize = 80 }; /// PIC16 Splits the global data into mulitple udata and idata sections. /// Each udata and idata section needs to contain a list of globals that /// they contain, in order to avoid scanning over all the global values /// again and printing only those that match the current section. /// Keeping values inside the sections make printing a section much easier. /// /// FIXME: Reimplement by inheriting from MCSection. /// struct PIC16Section { const MCSection *S_; // Connection to actual Section. unsigned Size; // Total size of the objects contained. bool SectionPrinted; std::vector Items; PIC16Section(const MCSection *s) { S_ = s; Size = 0; SectionPrinted = false; } bool isPrinted() const { return SectionPrinted; } void setPrintedStatus(bool status) { SectionPrinted = status; } }; class PIC16TargetObjectFile : public TargetLoweringObjectFile { const TargetMachine *TM; public: mutable std::vector BSSSections; mutable std::vector IDATASections; mutable std::vector AutosSections; mutable std::vector ROSections; mutable PIC16Section *ExternalVarDecls; mutable PIC16Section *ExternalVarDefs; PIC16TargetObjectFile(); ~PIC16TargetObjectFile(); void Initialize(MCContext &Ctx, const TargetMachine &TM); /// getSpecialCasedSectionGlobals - Allow the target to completely override /// section assignment of a global. virtual const MCSection * getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang, SectionKind Kind) const; virtual const MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, const TargetMachine&) const; private: std::string getSectionNameForSym(const std::string &Sym) const; const MCSection *getBSSSectionForGlobal(const GlobalVariable *GV) const; const MCSection *getIDATASectionForGlobal(const GlobalVariable *GV) const; const MCSection *getSectionForAuto(const GlobalVariable *GV) const; const MCSection *CreateBSSSectionForGlobal(const GlobalVariable *GV, std::string Addr = "") const; const MCSection *CreateIDATASectionForGlobal(const GlobalVariable *GV, std::string Addr = "") const; const MCSection *getROSectionForGlobal(const GlobalVariable *GV) const; const MCSection *CreateROSectionForGlobal(const GlobalVariable *GV, std::string Addr = "") const; const MCSection *CreateSectionForGlobal(const GlobalVariable *GV, Mangler *Mang, const std::string &Addr = "") const; public: void SetSectionForGVs(Module &M); const std::vector &getBSSSections() const { return BSSSections; } const std::vector &getIDATASections() const { return IDATASections; } const std::vector &getAutosSections() const { return AutosSections; } const std::vector &getROSections() const { return ROSections; } }; } // end namespace llvm #endif