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