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