*** empty log message ***
[deliverable/binutils-gdb.git] / ld / ldexp.h
CommitLineData
252b5132 1/* ldexp.h -
e5caa5e0 2 Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
dab69f68 3 2003, 2004, 2005, 2007, 2011, 2012 Free Software Foundation, Inc.
252b5132 4
f96b4a7b 5 This file is part of the GNU Binutils.
252b5132 6
f96b4a7b 7 This program is free software; you can redistribute it and/or modify
252b5132 8 it under the terms of the GNU General Public License as published by
f96b4a7b
NC
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
252b5132 11
f96b4a7b 12 This program is distributed in the hope that it will be useful,
252b5132
RH
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
f96b4a7b
NC
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. */
252b5132
RH
21
22#ifndef LDEXP_H
23#define LDEXP_H
24
25/* The result of an expression tree */
89cdebba 26typedef struct {
252b5132 27 bfd_vma value;
2c382fb6 28 char *str;
408082ec 29 asection *section;
b34976b6 30 bfd_boolean valid_p;
252b5132
RH
31} etree_value_type;
32
1e9cc1c2
NC
33enum 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
89cdebba 46typedef struct {
252b5132 47 int node_code;
f856040a 48 unsigned int lineno;
dab69f68 49 const char *filename;
2e57b2af 50 enum node_tree_enum node_class;
252b5132
RH
51} node_type;
52
89cdebba 53typedef union etree_union {
252b5132
RH
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;
2c382fb6 68 const char *dst;
252b5132 69 union etree_union *src;
eb8476a6 70 bfd_boolean defsym;
7af8e998 71 bfd_boolean hidden;
252b5132 72 } assign;
252b5132
RH
73 struct {
74 node_type type;
89cdebba 75 union etree_union *child;
252b5132
RH
76 } unary;
77 struct {
78 node_type type;
2c382fb6 79 const char *name;
252b5132
RH
80 } name;
81 struct {
82 node_type type;
83 bfd_vma value;
2c382fb6 84 char *str;
252b5132
RH
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;
2d20f7bf 97
2aa9aad9
NC
98/* Expression evaluation control. */
99typedef enum
100{
101 /* Parsing linker script. Will only return "valid" for expressions
102 that evaluate to a constant. */
e9ee469a 103 lang_first_phase_enum,
2aa9aad9 104 /* Prior to section sizing. */
e9ee469a 105 lang_mark_phase_enum,
2aa9aad9 106 /* During section sizing. */
e9ee469a 107 lang_allocating_phase_enum,
2aa9aad9 108 /* During assignment of symbol values when relaxation in progress. */
2f65ac72 109 lang_assigning_phase_enum,
2aa9aad9 110 /* Final assignment of symbol values. */
e9ee469a
AM
111 lang_final_phase_enum
112} lang_phase_type;
113
b10a8ae0
L
114union lang_statement_union;
115
1e9cc1c2 116enum phase_enum {
ea7c2e6c
AM
117 /* We step through the first four states here as we see the
118 associated linker script tokens. */
1e9cc1c2
NC
119 exp_dataseg_none,
120 exp_dataseg_align_seen,
121 exp_dataseg_relro_seen,
122 exp_dataseg_end_seen,
ea7c2e6c
AM
123 /* The last three states are final, and affect the value returned
124 by DATA_SEGMENT_ALIGN. */
1e9cc1c2 125 exp_dataseg_relro_adjust,
ea7c2e6c
AM
126 exp_dataseg_adjust,
127 exp_dataseg_done
1e9cc1c2
NC
128};
129
130enum relro_enum {
131 exp_dataseg_relro_none,
132 exp_dataseg_relro_start,
133 exp_dataseg_relro_end,
134};
135
e9ee469a
AM
136struct 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
143 /* Working results. */
144 etree_value_type result;
145 bfd_vma dot;
146
147 /* Current dot and section passed to ldexp folder. */
148 bfd_vma *dotp;
149 asection *section;
150
151 /* State machine and results for DATASEG. */
152 struct {
1e9cc1c2 153 enum phase_enum phase;
e9ee469a
AM
154
155 bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize;
b10a8ae0 156
1e9cc1c2 157 enum relro_enum relro;
b10a8ae0
L
158
159 union lang_statement_union *relro_start_stat;
160 union lang_statement_union *relro_end_stat;
e9ee469a
AM
161 } dataseg;
162};
163
164extern struct ldexp_control expld;
252b5132 165
ba916c8a
MM
166/* A maps from a segment name to a base address. */
167typedef struct segment_struct {
168 /* The next segment in the linked list. */
169 struct segment_struct *next;
170 /* The name of the sgement. */
171 const char *name;
172 /* The base address for the segment. */
173 bfd_vma value;
174 /* True if a SEGMENT_START directive corresponding to this segment
175 has been seen. */
176 bfd_boolean used;
177} segment_type;
178
179/* The segments specified by the user on the command-line. */
180extern segment_type *segments;
181
2c382fb6
AM
182typedef struct _fill_type fill_type;
183
b34976b6 184etree_type *exp_intop
1579bae1 185 (bfd_vma);
b34976b6 186etree_type *exp_bigintop
1579bae1 187 (bfd_vma, char *);
b34976b6 188etree_type *exp_relop
1579bae1 189 (asection *, bfd_vma);
e9ee469a
AM
190void exp_fold_tree
191 (etree_type *, asection *, bfd_vma *);
e759c116
AM
192void exp_fold_tree_no_dot
193 (etree_type *);
b34976b6 194etree_type *exp_binop
1579bae1 195 (int, etree_type *, etree_type *);
b34976b6 196etree_type *exp_trinop
1579bae1 197 (int,etree_type *, etree_type *, etree_type *);
b34976b6 198etree_type *exp_unop
1579bae1 199 (int, etree_type *);
b34976b6 200etree_type *exp_nameop
1579bae1 201 (int, const char *);
2e57b2af 202etree_type *exp_assign
eb8476a6 203 (const char *, etree_type *, bfd_boolean);
2e57b2af
AM
204etree_type *exp_defsym
205 (const char *, etree_type *);
b34976b6 206etree_type *exp_provide
7af8e998 207 (const char *, etree_type *, bfd_boolean);
b34976b6 208etree_type *exp_assert
1579bae1 209 (etree_type *, const char *);
b34976b6 210void exp_print_tree
1579bae1 211 (etree_type *);
b34976b6 212bfd_vma exp_get_vma
e9ee469a 213 (etree_type *, bfd_vma, char *);
b34976b6 214int exp_get_value_int
e9ee469a 215 (etree_type *, int, char *);
b34976b6 216fill_type *exp_get_fill
e9ee469a 217 (etree_type *, fill_type *, char *);
b34976b6 218bfd_vma exp_get_abs_int
e9ee469a 219 (etree_type *, int, char *);
252b5132
RH
220
221#endif
This page took 0.692703 seconds and 4 git commands to generate.