|  | //=====-- PIC16TargetAsmInfo.h - PIC16 asm properties ---------*- C++ -*--====// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file contains the declaration of the PIC16TargetAsmInfo class. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef PIC16TARGETASMINFO_H | 
|  | #define PIC16TARGETASMINFO_H | 
|  |  | 
|  | #include "PIC16.h" | 
|  | #include "llvm/Target/TargetAsmInfo.h" | 
|  | #include <vector> | 
|  | #include "llvm/Module.h" | 
|  | #define DataBankSize 80 | 
|  | namespace llvm { | 
|  |  | 
|  | // Forward declaration. | 
|  | class PIC16TargetMachine; | 
|  | class GlobalVariable; | 
|  |  | 
|  | // 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. | 
|  | struct PIC16Section { | 
|  | const Section *S_; // Connection to actual Section. | 
|  | unsigned Size;  // Total size of the objects contained. | 
|  | bool SectionPrinted; | 
|  | std::vector<const GlobalVariable*> Items; | 
|  |  | 
|  | PIC16Section (const Section *s) { S_ = s; Size = 0; | 
|  | SectionPrinted = false;} | 
|  | bool isPrinted() { return SectionPrinted ; } | 
|  | void setPrintedStatus(bool status) { SectionPrinted = status ;} | 
|  | }; | 
|  |  | 
|  | struct PIC16TargetAsmInfo : public TargetAsmInfo { | 
|  | std::string getSectionNameForSym(const std::string &Sym) const; | 
|  | PIC16TargetAsmInfo(const PIC16TargetMachine &TM); | 
|  | mutable std::vector<PIC16Section *> BSSSections; | 
|  | mutable std::vector<PIC16Section *> IDATASections; | 
|  | mutable std::vector<PIC16Section *> AutosSections; | 
|  | mutable PIC16Section *ROSection; | 
|  | mutable PIC16Section *ExternalVarDecls; | 
|  | mutable PIC16Section *ExternalVarDefs; | 
|  | virtual ~PIC16TargetAsmInfo(); | 
|  |  | 
|  | private: | 
|  | const char *RomData8bitsDirective; | 
|  | const char *RomData16bitsDirective; | 
|  | const char *RomData32bitsDirective; | 
|  | const char *getRomDirective(unsigned size) const; | 
|  | virtual const char *getASDirective(unsigned size, unsigned AS) const; | 
|  | const Section *getBSSSectionForGlobal(const GlobalVariable *GV) const; | 
|  | const Section *getIDATASectionForGlobal(const GlobalVariable *GV) const; | 
|  | const Section *getSectionForAuto(const GlobalVariable *GV) const; | 
|  | virtual const Section *SelectSectionForGlobal(const GlobalValue *GV) const; | 
|  |  | 
|  |  | 
|  | public: | 
|  | void SetSectionForGVs(Module &M); | 
|  | std::vector<PIC16Section *> getBSSSections() const { | 
|  | return BSSSections; | 
|  | } | 
|  | std::vector<PIC16Section *> getIDATASections()  const { | 
|  | return IDATASections; | 
|  | } | 
|  | std::vector<PIC16Section *> getAutosSections()  const { | 
|  | return AutosSections; | 
|  | } | 
|  | }; | 
|  |  | 
|  | } // namespace llvm | 
|  |  | 
|  | #endif |