//===-- 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 "llvm/ADT/StringMap.h" #include #include namespace llvm { class GlobalVariable; class Module; class PIC16TargetMachine; class MCSectionPIC16; 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: MOVE ALL THIS STUFF TO MCSectionPIC16. /// struct PIC16Section { const MCSectionPIC16 *S_; // Connection to actual Section. unsigned Size; // Total size of the objects contained. bool SectionPrinted; std::vector Items; PIC16Section(const MCSectionPIC16 *s) { S_ = s; Size = 0; SectionPrinted = false; } bool isPrinted() const { return SectionPrinted; } void setPrintedStatus(bool status) { SectionPrinted = status; } }; class PIC16TargetObjectFile : public TargetLoweringObjectFile { /// SectionsByName - Bindings of names to allocated sections. mutable StringMap SectionsByName; const TargetMachine *TM; const MCSectionPIC16 *getPIC16Section(const char *Name, SectionKind K, int Address = -1) const; 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); virtual const MCSection * getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, const TargetMachine &TM) const; virtual const MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, const TargetMachine&) const; const MCSection *getSectionForFunction(const std::string &FnName) const; const MCSection *getSectionForFunctionFrame(const std::string &FnName)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