Rev 5199 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5199 | serge | 1 | /* ldexp.h - |
6324 | serge | 2 | Copyright (C) 1991-2015 Free Software Foundation, Inc. |
5199 | serge | 3 | |
4 | This file is part of the GNU Binutils. |
||
5 | |||
6 | This program is free software; you can redistribute it and/or modify |
||
7 | it under the terms of the GNU General Public License as published by |
||
8 | the Free Software Foundation; either version 3 of the License, or |
||
9 | (at your option) any later version. |
||
10 | |||
11 | This program is distributed in the hope that it will be useful, |
||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
14 | GNU General Public License for more details. |
||
15 | |||
16 | You should have received a copy of the GNU General Public License |
||
17 | along with this program; if not, write to the Free Software |
||
18 | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
||
19 | MA 02110-1301, USA. */ |
||
20 | |||
21 | #ifndef LDEXP_H |
||
22 | #define LDEXP_H |
||
23 | |||
24 | /* The result of an expression tree */ |
||
25 | typedef struct { |
||
26 | bfd_vma value; |
||
27 | char *str; |
||
28 | asection *section; |
||
29 | bfd_boolean valid_p; |
||
30 | } etree_value_type; |
||
31 | |||
32 | enum node_tree_enum { |
||
33 | etree_binary, |
||
34 | etree_trinary, |
||
35 | etree_unary, |
||
36 | etree_name, |
||
37 | etree_assign, |
||
38 | etree_provide, |
||
39 | etree_provided, |
||
40 | etree_value, |
||
41 | etree_assert, |
||
42 | etree_rel |
||
43 | }; |
||
44 | |||
45 | typedef struct { |
||
46 | int node_code; |
||
47 | unsigned int lineno; |
||
48 | const char *filename; |
||
49 | enum node_tree_enum node_class; |
||
50 | } node_type; |
||
51 | |||
52 | typedef union etree_union { |
||
53 | node_type type; |
||
54 | struct { |
||
55 | node_type type; |
||
56 | union etree_union *lhs; |
||
57 | union etree_union *rhs; |
||
58 | } binary; |
||
59 | struct { |
||
60 | node_type type; |
||
61 | union etree_union *cond; |
||
62 | union etree_union *lhs; |
||
63 | union etree_union *rhs; |
||
64 | } trinary; |
||
65 | struct { |
||
66 | node_type type; |
||
67 | const char *dst; |
||
68 | union etree_union *src; |
||
69 | bfd_boolean defsym; |
||
70 | bfd_boolean hidden; |
||
71 | } assign; |
||
72 | struct { |
||
73 | node_type type; |
||
74 | union etree_union *child; |
||
75 | } unary; |
||
76 | struct { |
||
77 | node_type type; |
||
78 | const char *name; |
||
79 | } name; |
||
80 | struct { |
||
81 | node_type type; |
||
82 | bfd_vma value; |
||
83 | char *str; |
||
84 | } value; |
||
85 | struct { |
||
86 | node_type type; |
||
87 | asection *section; |
||
88 | bfd_vma value; |
||
89 | } rel; |
||
90 | struct { |
||
91 | node_type type; |
||
92 | union etree_union *child; |
||
93 | const char *message; |
||
94 | } assert_s; |
||
95 | } etree_type; |
||
96 | |||
97 | /* Expression evaluation control. */ |
||
98 | typedef enum |
||
99 | { |
||
100 | /* Parsing linker script. Will only return "valid" for expressions |
||
101 | that evaluate to a constant. */ |
||
102 | lang_first_phase_enum, |
||
103 | /* Prior to section sizing. */ |
||
104 | lang_mark_phase_enum, |
||
105 | /* During section sizing. */ |
||
106 | lang_allocating_phase_enum, |
||
107 | /* During assignment of symbol values when relaxation in progress. */ |
||
108 | lang_assigning_phase_enum, |
||
109 | /* Final assignment of symbol values. */ |
||
110 | lang_final_phase_enum |
||
111 | } lang_phase_type; |
||
112 | |||
113 | union lang_statement_union; |
||
114 | |||
115 | enum phase_enum { |
||
116 | /* We step through the first four states here as we see the |
||
117 | associated linker script tokens. */ |
||
118 | exp_dataseg_none, |
||
119 | exp_dataseg_align_seen, |
||
120 | exp_dataseg_relro_seen, |
||
121 | exp_dataseg_end_seen, |
||
122 | /* The last three states are final, and affect the value returned |
||
123 | by DATA_SEGMENT_ALIGN. */ |
||
124 | exp_dataseg_relro_adjust, |
||
125 | exp_dataseg_adjust, |
||
126 | exp_dataseg_done |
||
127 | }; |
||
128 | |||
129 | enum relro_enum { |
||
130 | exp_dataseg_relro_none, |
||
131 | exp_dataseg_relro_start, |
||
132 | exp_dataseg_relro_end, |
||
133 | }; |
||
134 | |||
135 | struct ldexp_control { |
||
136 | /* Modify expression evaluation depending on this. */ |
||
137 | lang_phase_type phase; |
||
138 | |||
139 | /* Principally used for diagnostics. */ |
||
140 | bfd_boolean assigning_to_dot; |
||
6324 | serge | 141 | |
142 | /* Set if the current expression used "dot", SEGMENT_START or |
||
143 | ORIGIN, but not ABSOLUTE or combined symbols in a way that forces |
||
144 | an absolute result. Used in tracking symbols assigned from dot |
||
145 | outside of output section statements, in order to later convert |
||
146 | them from absolute. */ |
||
147 | bfd_boolean rel_from_abs; |
||
148 | |||
5199 | serge | 149 | /* If evaluating an assignment, the destination. Cleared if an |
150 | etree_name NAME matches this, to signal a self-assignment. |
||
151 | Note that an etree_name DEFINED does not clear this field, nor |
||
152 | does the false branch of a trinary expression. */ |
||
153 | const char *assign_name; |
||
154 | |||
155 | /* Working results. */ |
||
156 | etree_value_type result; |
||
157 | bfd_vma dot; |
||
158 | |||
159 | /* Current dot and section passed to ldexp folder. */ |
||
160 | bfd_vma *dotp; |
||
161 | asection *section; |
||
162 | |||
163 | /* State machine and results for DATASEG. */ |
||
164 | struct { |
||
165 | enum phase_enum phase; |
||
166 | |||
6324 | serge | 167 | bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize; |
5199 | serge | 168 | |
169 | enum relro_enum relro; |
||
170 | |||
171 | union lang_statement_union *relro_start_stat; |
||
172 | union lang_statement_union *relro_end_stat; |
||
173 | } dataseg; |
||
174 | }; |
||
175 | |||
176 | extern struct ldexp_control expld; |
||
177 | |||
178 | /* A maps from a segment name to a base address. */ |
||
179 | typedef struct segment_struct { |
||
180 | /* The next segment in the linked list. */ |
||
181 | struct segment_struct *next; |
||
182 | /* The name of the sgement. */ |
||
183 | const char *name; |
||
184 | /* The base address for the segment. */ |
||
185 | bfd_vma value; |
||
186 | /* True if a SEGMENT_START directive corresponding to this segment |
||
187 | has been seen. */ |
||
188 | bfd_boolean used; |
||
189 | } segment_type; |
||
190 | |||
191 | /* The segments specified by the user on the command-line. */ |
||
192 | extern segment_type *segments; |
||
193 | |||
194 | typedef struct _fill_type fill_type; |
||
195 | |||
196 | etree_type *exp_intop |
||
197 | (bfd_vma); |
||
198 | etree_type *exp_bigintop |
||
199 | (bfd_vma, char *); |
||
200 | etree_type *exp_relop |
||
201 | (asection *, bfd_vma); |
||
202 | void exp_fold_tree |
||
203 | (etree_type *, asection *, bfd_vma *); |
||
204 | void exp_fold_tree_no_dot |
||
205 | (etree_type *); |
||
206 | etree_type *exp_binop |
||
207 | (int, etree_type *, etree_type *); |
||
208 | etree_type *exp_trinop |
||
209 | (int,etree_type *, etree_type *, etree_type *); |
||
210 | etree_type *exp_unop |
||
211 | (int, etree_type *); |
||
212 | etree_type *exp_nameop |
||
213 | (int, const char *); |
||
214 | etree_type *exp_assign |
||
215 | (const char *, etree_type *, bfd_boolean); |
||
216 | etree_type *exp_defsym |
||
217 | (const char *, etree_type *); |
||
218 | etree_type *exp_provide |
||
219 | (const char *, etree_type *, bfd_boolean); |
||
220 | etree_type *exp_assert |
||
221 | (etree_type *, const char *); |
||
222 | void exp_print_tree |
||
223 | (etree_type *); |
||
224 | bfd_vma exp_get_vma |
||
225 | (etree_type *, bfd_vma, char *); |
||
226 | int exp_get_value_int |
||
227 | (etree_type *, int, char *); |
||
228 | fill_type *exp_get_fill |
||
229 | (etree_type *, fill_type *, char *); |
||
230 | bfd_vma exp_get_abs_int |
||
231 | (etree_type *, int, char *); |
||
6324 | serge | 232 | void ldexp_init (void); |
233 | void ldexp_finalize_syms (void); |
||
234 | void ldexp_finish (void); |
||
5199 | serge | 235 | |
236 | #endif |