1/* ldexp.h -
2   Copyright (C) 1991-2020 Free Software Foundation, Inc.
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 */
25typedef struct {
26  bfd_vma value;
27  char *str;
28  asection *section;
29  bfd_boolean valid_p;
30} etree_value_type;
31
32enum 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
45typedef struct {
46  int node_code;
47  unsigned int lineno;
48  const char *filename;
49  enum node_tree_enum node_class;
50} node_type;
51
52typedef 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 hidden;
70  } assign;
71  struct {
72    node_type type;
73    union etree_union *child;
74  } unary;
75  struct {
76    node_type type;
77    const char *name;
78  } name;
79  struct {
80    node_type type;
81    bfd_vma value;
82    char *str;
83  } value;
84  struct {
85    node_type type;
86    asection *section;
87    bfd_vma value;
88  } rel;
89  struct {
90    node_type type;
91    union etree_union *child;
92    const char *message;
93  } assert_s;
94} etree_type;
95
96/* Expression evaluation control.  */
97typedef enum
98{
99  /* Parsing linker script.  Will only return "valid" for expressions
100     that evaluate to a constant.  */
101  lang_first_phase_enum,
102  /* Prior to section sizing.  */
103  lang_mark_phase_enum,
104  /* During section sizing.  */
105  lang_allocating_phase_enum,
106  /* During assignment of symbol values when relaxation in progress.  */
107  lang_assigning_phase_enum,
108  /* Final assignment of symbol values.  */
109  lang_final_phase_enum,
110  /* Run after symbol values have been fixed, for lang_map.  */
111  lang_fixed_phase_enum
112} lang_phase_type;
113
114union lang_statement_union;
115
116enum phase_enum {
117  /* We step through the first four states here as we see the
118     associated linker script tokens.  */
119  exp_seg_none,
120  exp_seg_align_seen,
121  exp_seg_relro_seen,
122  exp_seg_end_seen,
123  /* The last three states are final, and affect the value returned
124     by XXX_SEGMENT_ALIGN.  */
125  exp_seg_relro_adjust,
126  exp_seg_adjust,
127  exp_seg_done
128};
129
130enum relro_enum {
131  exp_seg_relro_none,
132  exp_seg_relro_start,
133  exp_seg_relro_end,
134};
135
136typedef struct {
137  enum phase_enum phase;
138
139  bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize;
140
141  enum relro_enum relro;
142
143  union lang_statement_union *relro_start_stat;
144  union lang_statement_union *relro_end_stat;
145} seg_align_type;
146
147struct ldexp_control {
148  /* Modify expression evaluation depending on this.  */
149  lang_phase_type phase;
150
151  /* Principally used for diagnostics.  */
152  bfd_boolean assigning_to_dot;
153
154  /* Set if the current expression used "dot", SEGMENT_START or
155     ORIGIN, but not ABSOLUTE or combined symbols in a way that forces
156     an absolute result.  Used in tracking symbols assigned from dot
157     outside of output section statements, in order to later convert
158     them from absolute.  */
159  bfd_boolean rel_from_abs;
160
161  /* If evaluating an assignment, the destination.  Cleared if an
162     etree_name NAME matches this, to signal a self-assignment.
163     Note that an etree_name DEFINED does not clear this field, nor
164     does the false branch of a trinary expression.  */
165  const char *assign_name;
166
167  /* If evaluating an assignment, the source if it is an expression
168     referencing single etree_name NAME, or a trinary expression where
169     the true branch references a single etree_name NAME.  */
170  struct bfd_link_hash_entry *assign_src;
171
172  /* Working results.  */
173  etree_value_type result;
174  bfd_vma dot;
175
176  /* Current dot and section passed to ldexp folder.  */
177  bfd_vma *dotp;
178  asection *section;
179
180  /* State machine and results for DATASEG.  */
181  seg_align_type dataseg;
182};
183
184extern struct ldexp_control expld;
185
186/* A maps from a segment name to a base address.  */
187typedef struct segment_struct {
188  /* The next segment in the linked list.  */
189  struct segment_struct *next;
190  /* The name of the sgement.  */
191  const char *name;
192  /* The base address for the segment.  */
193  bfd_vma value;
194  /* True if a SEGMENT_START directive corresponding to this segment
195     has been seen.  */
196  bfd_boolean used;
197} segment_type;
198
199/* The segments specified by the user on the command-line.  */
200extern segment_type *segments;
201
202typedef struct _fill_type fill_type;
203
204etree_type *exp_intop
205  (bfd_vma);
206etree_type *exp_bigintop
207  (bfd_vma, char *);
208etree_type *exp_relop
209  (asection *, bfd_vma);
210void exp_fold_tree
211  (etree_type *, asection *, bfd_vma *);
212void exp_fold_tree_no_dot
213  (etree_type *);
214etree_type *exp_binop
215  (int, etree_type *, etree_type *);
216etree_type *exp_trinop
217  (int,etree_type *, etree_type *, etree_type *);
218etree_type *exp_unop
219  (int, etree_type *);
220etree_type *exp_nameop
221  (int, const char *);
222etree_type *exp_assign
223  (const char *, etree_type *, bfd_boolean);
224etree_type *exp_defsym
225  (const char *, etree_type *);
226etree_type *exp_provide
227  (const char *, etree_type *, bfd_boolean);
228etree_type *exp_assert
229  (etree_type *, const char *);
230void exp_print_tree
231  (etree_type *);
232bfd_vma exp_get_vma
233  (etree_type *, bfd_vma, char *);
234int exp_get_power
235  (etree_type *, char *);
236fill_type *exp_get_fill
237  (etree_type *, fill_type *, char *);
238bfd_vma exp_get_abs_int
239  (etree_type *, int, char *);
240void ldexp_init (void);
241void ldexp_finalize_syms (void);
242void ldexp_finish (void);
243
244#endif
245