1 //===-- PIC16TargetObjectFile.h - PIC16 Object Info -------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_TARGET_PIC16_TARGETOBJECTFILE_H
11 #define LLVM_TARGET_PIC16_TARGETOBJECTFILE_H
14 #include "PIC16ABINames.h"
15 #include "llvm/Target/TargetLoweringObjectFile.h"
16 #include "llvm/ADT/StringMap.h"
23 class PIC16TargetMachine;
26 enum { DataBankSize = 80 };
28 /// PIC16 Splits the global data into mulitple udata and idata sections.
29 /// Each udata and idata section needs to contain a list of globals that
30 /// they contain, in order to avoid scanning over all the global values
31 /// again and printing only those that match the current section.
32 /// Keeping values inside the sections make printing a section much easier.
34 /// FIXME: MOVE ALL THIS STUFF TO PIC16Section.
37 /// PIC16TargetObjectFile - PIC16 Object file. Contains data and code
39 // PIC16 Object File has two types of sections.
40 // 1. Standard Sections
41 // 1.1 un-initialized global data
42 // 1.2 initialized global data
43 // 1.3 program memory data
44 // 1.4 local variables of functions.
45 // 2. User defined sections
46 // 2.1 Objects placed in a specific section. (By _Section() macro)
47 // 2.2 Objects placed at a specific address. (By _Address() macro)
48 class PIC16TargetObjectFile : public TargetLoweringObjectFile {
49 /// SectionsByName - Bindings of names to allocated sections.
50 mutable StringMap<PIC16Section*> SectionsByName;
52 const TargetMachine *TM;
54 /// Lists of sections.
55 /// Standard Data Sections.
56 mutable std::vector<PIC16Section *> UDATASections_;
57 mutable std::vector<PIC16Section *> IDATASections_;
58 mutable PIC16Section * ROMDATASection_;
60 /// Standard Auto Sections.
61 mutable std::vector<PIC16Section *> AUTOSections_;
63 /// User specified sections.
64 mutable std::vector<PIC16Section *> USERSections_;
67 /// Find or Create a PIC16 Section, without adding it to any
69 PIC16Section *getPIC16Section(const std::string &Name,
71 const std::string &Address = "",
72 int Color = -1) const;
74 /// Convenience functions. These wrappers also take care of adding
75 /// the newly created section to the appropriate sections list.
77 /// Find or Create PIC16 Standard Data Section.
78 PIC16Section *getPIC16DataSection(const std::string &Name,
80 const std::string &Address = "",
81 int Color = -1) const;
83 /// Find or Create PIC16 Standard Auto Section.
84 PIC16Section *getPIC16AutoSection(const std::string &Name,
85 PIC16SectionType Ty = UDATA_OVR,
86 const std::string &Address = "",
87 int Color = -1) const;
89 /// Find or Create PIC16 Standard Auto Section.
90 PIC16Section *getPIC16UserSection(const std::string &Name,
92 const std::string &Address = "",
93 int Color = -1) const;
95 /// Allocate Un-initialized data to a standard UDATA section.
96 const MCSection *allocateUDATA(const GlobalVariable *GV) const;
98 /// Allocate Initialized data to a standard IDATA section.
99 const MCSection *allocateIDATA(const GlobalVariable *GV) const;
101 /// Allocate ROM data to the standard ROMDATA section.
102 const MCSection *allocateROMDATA(const GlobalVariable *GV) const;
104 /// Allocate an AUTO variable to an AUTO section.
105 const MCSection *allocateAUTO(const GlobalVariable *GV) const;
107 /// Allocate DATA in user specified section.
108 const MCSection *allocateInGivenSection(const GlobalVariable *GV) const;
110 /// Allocate DATA at user specified address.
111 const MCSection *allocateAtGivenAddress(const GlobalVariable *GV,
112 const std::string &Addr) const;
115 PIC16TargetObjectFile();
116 ~PIC16TargetObjectFile();
117 void Initialize(MCContext &Ctx, const TargetMachine &TM);
119 /// Override section allocations for user specified sections.
120 virtual const MCSection *
121 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
122 Mangler *Mang, const TargetMachine &TM) const;
124 /// Select sections for Data and Auto variables(globals).
125 virtual const MCSection *SelectSectionForGlobal(const GlobalValue *GV,
128 const TargetMachine&) const;
130 /// Return a code section for a function.
131 const PIC16Section *SectionForCode (const std::string &FnName) const;
133 /// Return a frame section for a function.
134 const PIC16Section *SectionForFrame (const std::string &FnName) const;
136 /// Accessors for various section lists.
137 const std::vector<PIC16Section *> &UDATASections() const {
138 return UDATASections_;
140 const std::vector<PIC16Section *> &IDATASections() const {
141 return IDATASections_;
143 const PIC16Section *ROMDATASection() const {
144 return ROMDATASection_;
146 const std::vector<PIC16Section *> &AUTOSections() const {
147 return AUTOSections_;
149 const std::vector<PIC16Section *> &USERSections() const {
150 return USERSections_;
153 } // end namespace llvm