Commit | Line | Data |
---|---|---|
14bfc3f5 | 1 | // target.h -- target support for gold -*- C++ -*- |
bae7f79e ILT |
2 | |
3 | // The abstract class Target is the interface for target specific | |
4 | // support. It defines abstract methods which each target must | |
5 | // implement. Typically there will be one target per processor, but | |
6 | // in some cases it may be necessary to have subclasses. | |
7 | ||
8 | // For speed and consistency we want to use inline functions to handle | |
9 | // relocation processing. So besides implementations of the abstract | |
10 | // methods, each target is expected to define a template | |
11 | // specialization of the relocation functions. | |
12 | ||
13 | #ifndef GOLD_TARGET_H | |
14 | #define GOLD_TARGET_H | |
15 | ||
14bfc3f5 ILT |
16 | #include "elfcpp.h" |
17 | ||
bae7f79e ILT |
18 | namespace gold |
19 | { | |
20 | ||
92e059d8 | 21 | class General_options; |
14bfc3f5 | 22 | class Object; |
61ba1cf9 | 23 | template<int size, bool big_endian> |
f6ce93d6 | 24 | class Sized_relobj; |
92e059d8 ILT |
25 | template<int size, bool big_endian> |
26 | struct Relocate_info; | |
f6ce93d6 ILT |
27 | class Symbol; |
28 | template<int size> | |
29 | class Sized_symbol; | |
30 | class Symbol_table; | |
14bfc3f5 ILT |
31 | |
32 | // The abstract class for target specific handling. | |
33 | ||
bae7f79e ILT |
34 | class Target |
35 | { | |
36 | public: | |
14bfc3f5 ILT |
37 | virtual ~Target() |
38 | { } | |
39 | ||
40 | // Return the bit size that this target implements. This should | |
41 | // return 32 or 64. | |
42 | int | |
43 | get_size() const | |
75f65a3e | 44 | { return this->pti_->size; } |
14bfc3f5 ILT |
45 | |
46 | // Return whether this target is big-endian. | |
47 | bool | |
48 | is_big_endian() const | |
75f65a3e | 49 | { return this->pti_->is_big_endian; } |
14bfc3f5 | 50 | |
61ba1cf9 ILT |
51 | // Machine code to store in e_machine field of ELF header. |
52 | elfcpp::EM | |
53 | machine_code() const | |
54 | { return this->pti_->machine_code; } | |
55 | ||
14bfc3f5 ILT |
56 | // Whether this target has a specific make_symbol function. |
57 | bool | |
58 | has_make_symbol() const | |
75f65a3e | 59 | { return this->pti_->has_make_symbol; } |
14bfc3f5 ILT |
60 | |
61 | // Whether this target has a specific resolve function. | |
62 | bool | |
63 | has_resolve() const | |
75f65a3e ILT |
64 | { return this->pti_->has_resolve; } |
65 | ||
dbe717ef ILT |
66 | // Return the default name of the dynamic linker. |
67 | const char* | |
68 | dynamic_linker() const | |
69 | { return this->pti_->dynamic_linker; } | |
70 | ||
75f65a3e ILT |
71 | // Return the default address to use for the text segment. |
72 | uint64_t | |
73 | text_segment_address() const | |
74 | { return this->pti_->text_segment_address; } | |
75 | ||
76 | // Return the ABI specified page size. | |
77 | uint64_t | |
78 | abi_pagesize() const | |
79 | { return this->pti_->abi_pagesize; } | |
80 | ||
81 | // Return the common page size used on actual systems. | |
82 | uint64_t | |
83 | common_pagesize() const | |
84 | { return this->pti_->common_pagesize; } | |
14bfc3f5 | 85 | |
5a6f7e2d ILT |
86 | // This is called to tell the target to complete any sections it is |
87 | // handling. After this all sections must have their final size. | |
88 | void | |
16649710 ILT |
89 | finalize_sections(const General_options* options, Layout* layout) |
90 | { return this->do_finalize_sections(options, layout); } | |
5a6f7e2d | 91 | |
14bfc3f5 | 92 | protected: |
75f65a3e ILT |
93 | // This struct holds the constant information for a child class. We |
94 | // use a struct to avoid the overhead of virtual function calls for | |
95 | // simple information. | |
96 | struct Target_info | |
97 | { | |
98 | // Address size (32 or 64). | |
99 | int size; | |
100 | // Whether the target is big endian. | |
101 | bool is_big_endian; | |
61ba1cf9 ILT |
102 | // The code to store in the e_machine field of the ELF header. |
103 | elfcpp::EM machine_code; | |
75f65a3e ILT |
104 | // Whether this target has a specific make_symbol function. |
105 | bool has_make_symbol; | |
106 | // Whether this target has a specific resolve function. | |
107 | bool has_resolve; | |
dbe717ef ILT |
108 | // The default dynamic linker name. |
109 | const char* dynamic_linker; | |
75f65a3e ILT |
110 | // The default text segment address. |
111 | uint64_t text_segment_address; | |
112 | // The ABI specified page size. | |
113 | uint64_t abi_pagesize; | |
114 | // The common page size used by actual implementations. | |
115 | uint64_t common_pagesize; | |
116 | }; | |
117 | ||
118 | Target(const Target_info* pti) | |
119 | : pti_(pti) | |
14bfc3f5 ILT |
120 | { } |
121 | ||
5a6f7e2d ILT |
122 | // Virtual function which may be implemented by the child class. |
123 | virtual void | |
16649710 | 124 | do_finalize_sections(const General_options*, Layout*) |
5a6f7e2d ILT |
125 | { } |
126 | ||
14bfc3f5 ILT |
127 | private: |
128 | Target(const Target&); | |
129 | Target& operator=(const Target&); | |
130 | ||
75f65a3e ILT |
131 | // The target information. |
132 | const Target_info* pti_; | |
bae7f79e ILT |
133 | }; |
134 | ||
14bfc3f5 ILT |
135 | // The abstract class for a specific size and endianness of target. |
136 | // Each actual target implementation class should derive from an | |
137 | // instantiation of Sized_target. | |
138 | ||
139 | template<int size, bool big_endian> | |
140 | class Sized_target : public Target | |
141 | { | |
142 | public: | |
143 | // Make a new symbol table entry for the target. This should be | |
144 | // overridden by a target which needs additional information in the | |
145 | // symbol table. This will only be called if has_make_symbol() | |
146 | // returns true. | |
147 | virtual Sized_symbol<size>* | |
14b31740 | 148 | make_symbol() const |
a3ad94ed | 149 | { gold_unreachable(); } |
14bfc3f5 ILT |
150 | |
151 | // Resolve a symbol for the target. This should be overridden by a | |
152 | // target which needs to take special action. TO is the | |
153 | // pre-existing symbol. SYM is the new symbol, seen in OBJECT. | |
14b31740 ILT |
154 | // VERSION is the version of SYM. This will only be called if |
155 | // has_resolve() returns true. | |
14bfc3f5 | 156 | virtual void |
14b31740 ILT |
157 | resolve(Symbol*, const elfcpp::Sym<size, big_endian>&, Object*, |
158 | const char*) | |
a3ad94ed | 159 | { gold_unreachable(); } |
14bfc3f5 | 160 | |
92e059d8 ILT |
161 | // Scan the relocs for a section, and record any information |
162 | // required for the symbol. OPTIONS is the command line options. | |
163 | // SYMTAB is the symbol table. OBJECT is the object in which the | |
a3ad94ed ILT |
164 | // section appears. DATA_SHNDX is the section index that these |
165 | // relocs apply to. SH_TYPE is the type of the relocation section, | |
92e059d8 ILT |
166 | // SHT_REL or SHT_RELA. PRELOCS points to the relocation data. |
167 | // RELOC_COUNT is the number of relocs. LOCAL_SYMBOL_COUNT is the | |
168 | // number of local symbols. PLOCAL_SYMBOLS points to the local | |
169 | // symbol data from OBJECT. GLOBAL_SYMBOLS is the array of pointers | |
170 | // to the global symbol table from OBJECT. | |
61ba1cf9 | 171 | virtual void |
92e059d8 ILT |
172 | scan_relocs(const General_options& options, |
173 | Symbol_table* symtab, | |
ead1e424 | 174 | Layout* layout, |
f6ce93d6 | 175 | Sized_relobj<size, big_endian>* object, |
a3ad94ed | 176 | unsigned int data_shndx, |
92e059d8 ILT |
177 | unsigned int sh_type, |
178 | const unsigned char* prelocs, | |
179 | size_t reloc_count, | |
180 | size_t local_symbol_count, | |
181 | const unsigned char* plocal_symbols, | |
182 | Symbol** global_symbols) = 0; | |
183 | ||
184 | // Relocate section data. SH_TYPE is the type of the relocation | |
185 | // section, SHT_REL or SHT_RELA. PRELOCS points to the relocation | |
186 | // information. RELOC_COUNT is the number of relocs. VIEW is a | |
187 | // view into the output file holding the section contents, | |
188 | // VIEW_ADDRESS is the virtual address of the view, and VIEW_SIZE is | |
189 | // the size of the view. | |
190 | virtual void | |
191 | relocate_section(const Relocate_info<size, big_endian>*, | |
192 | unsigned int sh_type, | |
193 | const unsigned char* prelocs, | |
194 | size_t reloc_count, | |
195 | unsigned char* view, | |
196 | typename elfcpp::Elf_types<size>::Elf_Addr view_address, | |
197 | off_t view_size) = 0; | |
61ba1cf9 | 198 | |
14bfc3f5 | 199 | protected: |
75f65a3e ILT |
200 | Sized_target(const Target::Target_info* pti) |
201 | : Target(pti) | |
202 | { | |
a3ad94ed ILT |
203 | gold_assert(pti->size == size); |
204 | gold_assert(pti->is_big_endian ? big_endian : !big_endian); | |
75f65a3e | 205 | } |
14bfc3f5 | 206 | }; |
bae7f79e ILT |
207 | |
208 | } // End namespace gold. | |
209 | ||
210 | #endif // !defined(GOLD_TARGET_H) |