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