blob: 6ec551271977ed8ce1fc8bbf862b85ce89cd7573 [file] [log] [blame]
Chris Lattnerf0144122009-07-28 03:13:23 +00001//===-- PIC16TargetObjectFile.h - PIC16 Object Info -------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_TARGET_PIC16_TARGETOBJECTFILE_H
11#define LLVM_TARGET_PIC16_TARGETOBJECTFILE_H
12
Sanjiv Gupta753ec152009-10-15 19:26:25 +000013#include "PIC16.h"
14#include "PIC16ABINames.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000015#include "llvm/Target/TargetLoweringObjectFile.h"
Chris Lattner873bc4c2009-08-13 00:26:52 +000016#include "llvm/ADT/StringMap.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000017#include <vector>
Chris Lattnera4629202009-08-12 23:53:59 +000018#include <string>
Chris Lattnerf0144122009-07-28 03:13:23 +000019
20namespace llvm {
21 class GlobalVariable;
22 class Module;
23 class PIC16TargetMachine;
Sanjiv Gupta753ec152009-10-15 19:26:25 +000024 class PIC16Section;
Chris Lattnerf0144122009-07-28 03:13:23 +000025
26 enum { DataBankSize = 80 };
27
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.
33 ///
Sanjiv Gupta753ec152009-10-15 19:26:25 +000034 /// FIXME: MOVE ALL THIS STUFF TO PIC16Section.
Chris Lattnerf0144122009-07-28 03:13:23 +000035 ///
Sanjiv Gupta753ec152009-10-15 19:26:25 +000036
37 /// PIC16TargetObjectFile - PIC16 Object file. Contains data and code
38 /// sections.
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)
Chris Lattnerf0144122009-07-28 03:13:23 +000048 class PIC16TargetObjectFile : public TargetLoweringObjectFile {
Chris Lattner873bc4c2009-08-13 00:26:52 +000049 /// SectionsByName - Bindings of names to allocated sections.
Sanjiv Gupta753ec152009-10-15 19:26:25 +000050 mutable StringMap<PIC16Section*> SectionsByName;
Chris Lattner873bc4c2009-08-13 00:26:52 +000051
Chris Lattnera87dea42009-07-31 18:48:30 +000052 const TargetMachine *TM;
Chris Lattnerfbf1d272009-08-08 20:14:13 +000053
Sanjiv Gupta753ec152009-10-15 19:26:25 +000054 /// Lists of sections.
55 /// Standard Data Sections.
56 mutable std::vector<PIC16Section *> UDATASections_;
57 mutable std::vector<PIC16Section *> IDATASections_;
58 mutable PIC16Section * ROMDATASection_;
Daniel Dunbar967ce7f2009-08-02 01:25:15 +000059
Sanjiv Gupta753ec152009-10-15 19:26:25 +000060 /// Standard Auto Sections.
61 mutable std::vector<PIC16Section *> AUTOSections_;
62
63 /// User specified sections.
64 mutable std::vector<PIC16Section *> USERSections_;
65
66
67 /// Find or Create a PIC16 Section, without adding it to any
68 /// section list.
69 PIC16Section *getPIC16Section(const std::string &Name,
70 PIC16SectionType Ty,
71 const std::string &Address = "",
72 int Color = -1) const;
73
74 /// Convenience functions. These wrappers also take care of adding
75 /// the newly created section to the appropriate sections list.
76
77 /// Find or Create PIC16 Standard Data Section.
78 PIC16Section *getPIC16DataSection(const std::string &Name,
79 PIC16SectionType Ty,
80 const std::string &Address = "",
81 int Color = -1) const;
82
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;
88
89 /// Find or Create PIC16 Standard Auto Section.
90 PIC16Section *getPIC16UserSection(const std::string &Name,
91 PIC16SectionType Ty,
92 const std::string &Address = "",
93 int Color = -1) const;
94
95 /// Allocate Un-initialized data to a standard UDATA section.
96 const MCSection *allocateUDATA(const GlobalVariable *GV) const;
97
98 /// Allocate Initialized data to a standard IDATA section.
99 const MCSection *allocateIDATA(const GlobalVariable *GV) const;
100
101 /// Allocate ROM data to the standard ROMDATA section.
102 const MCSection *allocateROMDATA(const GlobalVariable *GV) const;
103
104 /// Allocate an AUTO variable to an AUTO section.
105 const MCSection *allocateAUTO(const GlobalVariable *GV) const;
106
107 /// Allocate DATA in user specified section.
108 const MCSection *allocateInGivenSection(const GlobalVariable *GV) const;
109
110 /// Allocate DATA at user specified address.
111 const MCSection *allocateAtGivenAddress(const GlobalVariable *GV,
112 const std::string &Addr) const;
113
114 public:
Daniel Dunbar967ce7f2009-08-02 01:25:15 +0000115 PIC16TargetObjectFile();
Chris Lattnerf0144122009-07-28 03:13:23 +0000116 ~PIC16TargetObjectFile();
Chris Lattnera87dea42009-07-31 18:48:30 +0000117 void Initialize(MCContext &Ctx, const TargetMachine &TM);
118
Sanjiv Gupta753ec152009-10-15 19:26:25 +0000119 /// Override section allocations for user specified sections.
Chris Lattnera87dea42009-07-31 18:48:30 +0000120 virtual const MCSection *
Chris Lattner24f654c2009-08-06 16:39:58 +0000121 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
122 Mangler *Mang, const TargetMachine &TM) const;
Chris Lattner759b8882009-08-06 16:27:28 +0000123
Sanjiv Gupta753ec152009-10-15 19:26:25 +0000124 /// Select sections for Data and Auto variables(globals).
Chris Lattnera87dea42009-07-31 18:48:30 +0000125 virtual const MCSection *SelectSectionForGlobal(const GlobalValue *GV,
Chris Lattnerf9650c02009-08-01 21:46:23 +0000126 SectionKind Kind,
Chris Lattnera87dea42009-07-31 18:48:30 +0000127 Mangler *Mang,
128 const TargetMachine&) const;
Chris Lattner759b8882009-08-06 16:27:28 +0000129
Sanjiv Gupta753ec152009-10-15 19:26:25 +0000130 /// Return a code section for a function.
131 const PIC16Section *SectionForCode (const std::string &FnName) const;
Chris Lattnerf0144122009-07-28 03:13:23 +0000132
Sanjiv Gupta753ec152009-10-15 19:26:25 +0000133 /// Return a frame section for a function.
134 const PIC16Section *SectionForFrame (const std::string &FnName) const;
135
136 /// Accessors for various section lists.
137 const std::vector<PIC16Section *> &UDATASections() const {
138 return UDATASections_;
Chris Lattnerf0144122009-07-28 03:13:23 +0000139 }
Sanjiv Gupta753ec152009-10-15 19:26:25 +0000140 const std::vector<PIC16Section *> &IDATASections() const {
141 return IDATASections_;
Chris Lattnerf0144122009-07-28 03:13:23 +0000142 }
Sanjiv Gupta753ec152009-10-15 19:26:25 +0000143 const PIC16Section *ROMDATASection() const {
144 return ROMDATASection_;
Chris Lattnerf0144122009-07-28 03:13:23 +0000145 }
Sanjiv Gupta753ec152009-10-15 19:26:25 +0000146 const std::vector<PIC16Section *> &AUTOSections() const {
147 return AUTOSections_;
Chris Lattnerf0144122009-07-28 03:13:23 +0000148 }
Sanjiv Gupta753ec152009-10-15 19:26:25 +0000149 const std::vector<PIC16Section *> &USERSections() const {
150 return USERSections_;
151 }
Chris Lattnerf0144122009-07-28 03:13:23 +0000152 };
153} // end namespace llvm
154
155#endif