1/* ldexp.h -
2   Copyright (C) 1991-2017 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 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.  */
98typedef 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
113union lang_statement_union;
114
115enum 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
129enum relro_enum {
130  exp_dataseg_relro_none,
131  exp_dataseg_relro_start,
132  exp_dataseg_relro_end,
133};
134
135struct 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;
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
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
167    bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize;
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
176extern struct ldexp_control expld;
177
178/* A maps from a segment name to a base address.  */
179typedef 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.  */
192extern segment_type *segments;
193
194typedef struct _fill_type fill_type;
195
196etree_type *exp_intop
197  (bfd_vma);
198etree_type *exp_bigintop
199  (bfd_vma, char *);
200etree_type *exp_relop
201  (asection *, bfd_vma);
202void exp_fold_tree
203  (etree_type *, asection *, bfd_vma *);
204void exp_fold_tree_no_dot
205  (etree_type *);
206etree_type *exp_binop
207  (int, etree_type *, etree_type *);
208etree_type *exp_trinop
209  (int,etree_type *, etree_type *, etree_type *);
210etree_type *exp_unop
211  (int, etree_type *);
212etree_type *exp_nameop
213  (int, const char *);
214etree_type *exp_assign
215  (const char *, etree_type *, bfd_boolean);
216etree_type *exp_defsym
217  (const char *, etree_type *);
218etree_type *exp_provide
219  (const char *, etree_type *, bfd_boolean);
220etree_type *exp_assert
221  (etree_type *, const char *);
222void exp_print_tree
223  (etree_type *);
224bfd_vma exp_get_vma
225  (etree_type *, bfd_vma, char *);
226int exp_get_value_int
227  (etree_type *, int, char *);
228fill_type *exp_get_fill
229  (etree_type *, fill_type *, char *);
230bfd_vma exp_get_abs_int
231  (etree_type *, int, char *);
232void ldexp_init (void);
233void ldexp_finalize_syms (void);
234void ldexp_finish (void);
235
236#endif
237