//===- PIC16Section.h - PIC16-specific section representation -*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file declares the PIC16Section class. // //===----------------------------------------------------------------------===// #ifndef LLVM_PIC16SECTION_H #define LLVM_PIC16SECTION_H #include "llvm/MC/MCSection.h" #include "llvm/GlobalVariable.h" #include namespace llvm { /// PIC16Section - Represents a physical section in PIC16 COFF. /// Contains data objects. /// class PIC16Section : public MCSection { /// PIC16 Sections does not really use the SectionKind class to /// to distinguish between various types of sections. PIC16 maintain /// its own Section Type info. See the PIC16SectionType enum in PIC16.h /// for various section types. PIC16SectionType T; /// Name of the section to uniquely identify it. StringRef Name; /// User can specify an address at which a section should be placed. /// Negative value here means user hasn't specified any. StringRef Address; /// Overlay information - Sections with same color can be overlaid on /// one another. int Color; /// Total size of all data objects contained here. unsigned Size; PIC16Section(StringRef name, SectionKind K, StringRef addr, int color) : MCSection(SV_PIC16, K), Name(name), Address(addr), Color(color), Size(0) { } public: /// Return the name of the section. StringRef getName() const { return Name; } /// Return the Address of the section. StringRef getAddress() const { return Address; } /// Return the Color of the section. int getColor() const { return Color; } void setColor(int color) { Color = color; } /// Return the size of the section. unsigned getSize() const { return Size; } void setSize(unsigned size) { Size = size; } /// Conatined data objects. // FIXME: This vector is leaked because sections are allocated with a // BumpPtrAllocator. std::vectorItems; /// Check section type. bool isUDATA_Type() const { return T == UDATA; } bool isIDATA_Type() const { return T == IDATA; } bool isROMDATA_Type() const { return T == ROMDATA; } bool isUDATA_OVR_Type() const { return T == UDATA_OVR; } bool isUDATA_SHR_Type() const { return T == UDATA_SHR; } bool isCODE_Type() const { return T == CODE; } PIC16SectionType getType() const { return T; } /// This would be the only way to create a section. static PIC16Section *Create(StringRef Name, PIC16SectionType Ty, StringRef Address, int Color, MCContext &Ctx); /// Override this as PIC16 has its own way of printing switching /// to a section. virtual void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS) const; virtual bool UseCodeAlign() const; static bool classof(const MCSection *S) { return S->getVariant() == SV_PIC16; } static bool classof(const PIC16Section *) { return true; } }; } // end namespace llvm #endif