gdb/testsuite/
[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,
ea7c2e6c 3 2003, 2004, 2005, 2007, 2011 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;
2e57b2af 49 enum node_tree_enum node_class;
252b5132
RH
50} node_type;
51
89cdebba 52typedef union etree_union {
252b5132
RH
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;
2c382fb6 67 const char *dst;
252b5132 68 union etree_union *src;
7af8e998 69 bfd_boolean hidden;
252b5132 70 } assign;
252b5132
RH
71 struct {
72 node_type type;
89cdebba 73 union etree_union *child;
252b5132
RH
74 } unary;
75 struct {
76 node_type type;
2c382fb6 77 const char *name;
252b5132
RH
78 } name;
79 struct {
80 node_type type;
81 bfd_vma value;
2c382fb6 82 char *str;
252b5132
RH
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;
2d20f7bf 95
e9ee469a
AM
96typedef enum {
97 lang_first_phase_enum,
98 lang_mark_phase_enum,
99 lang_allocating_phase_enum,
2f65ac72 100 lang_assigning_phase_enum,
e9ee469a
AM
101 lang_final_phase_enum
102} lang_phase_type;
103
b10a8ae0
L
104union lang_statement_union;
105
1e9cc1c2 106enum phase_enum {
ea7c2e6c
AM
107 /* We step through the first four states here as we see the
108 associated linker script tokens. */
1e9cc1c2
NC
109 exp_dataseg_none,
110 exp_dataseg_align_seen,
111 exp_dataseg_relro_seen,
112 exp_dataseg_end_seen,
ea7c2e6c
AM
113 /* The last three states are final, and affect the value returned
114 by DATA_SEGMENT_ALIGN. */
1e9cc1c2 115 exp_dataseg_relro_adjust,
ea7c2e6c
AM
116 exp_dataseg_adjust,
117 exp_dataseg_done
1e9cc1c2
NC
118};
119
120enum relro_enum {
121 exp_dataseg_relro_none,
122 exp_dataseg_relro_start,
123 exp_dataseg_relro_end,
124};
125
e9ee469a
AM
126struct ldexp_control {
127 /* Modify expression evaluation depending on this. */
128 lang_phase_type phase;
129
130 /* Principally used for diagnostics. */
131 bfd_boolean assigning_to_dot;
132
133 /* Working results. */
134 etree_value_type result;
135 bfd_vma dot;
136
137 /* Current dot and section passed to ldexp folder. */
138 bfd_vma *dotp;
139 asection *section;
140
141 /* State machine and results for DATASEG. */
142 struct {
1e9cc1c2 143 enum phase_enum phase;
e9ee469a
AM
144
145 bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize;
b10a8ae0 146
1e9cc1c2 147 enum relro_enum relro;
b10a8ae0
L
148
149 union lang_statement_union *relro_start_stat;
150 union lang_statement_union *relro_end_stat;
e9ee469a
AM
151 } dataseg;
152};
153
154extern struct ldexp_control expld;
252b5132 155
ba916c8a
MM
156/* A maps from a segment name to a base address. */
157typedef struct segment_struct {
158 /* The next segment in the linked list. */
159 struct segment_struct *next;
160 /* The name of the sgement. */
161 const char *name;
162 /* The base address for the segment. */
163 bfd_vma value;
164 /* True if a SEGMENT_START directive corresponding to this segment
165 has been seen. */
166 bfd_boolean used;
167} segment_type;
168
169/* The segments specified by the user on the command-line. */
170extern segment_type *segments;
171
2c382fb6
AM
172typedef struct _fill_type fill_type;
173
b34976b6 174etree_type *exp_intop
1579bae1 175 (bfd_vma);
b34976b6 176etree_type *exp_bigintop
1579bae1 177 (bfd_vma, char *);
b34976b6 178etree_type *exp_relop
1579bae1 179 (asection *, bfd_vma);
e9ee469a
AM
180void exp_fold_tree
181 (etree_type *, asection *, bfd_vma *);
e759c116
AM
182void exp_fold_tree_no_dot
183 (etree_type *);
b34976b6 184etree_type *exp_binop
1579bae1 185 (int, etree_type *, etree_type *);
b34976b6 186etree_type *exp_trinop
1579bae1 187 (int,etree_type *, etree_type *, etree_type *);
b34976b6 188etree_type *exp_unop
1579bae1 189 (int, etree_type *);
b34976b6 190etree_type *exp_nameop
1579bae1 191 (int, const char *);
2e57b2af
AM
192etree_type *exp_assign
193 (const char *, etree_type *);
194etree_type *exp_defsym
195 (const char *, etree_type *);
b34976b6 196etree_type *exp_provide
7af8e998 197 (const char *, etree_type *, bfd_boolean);
b34976b6 198etree_type *exp_assert
1579bae1 199 (etree_type *, const char *);
b34976b6 200void exp_print_tree
1579bae1 201 (etree_type *);
b34976b6 202bfd_vma exp_get_vma
e9ee469a 203 (etree_type *, bfd_vma, char *);
b34976b6 204int exp_get_value_int
e9ee469a 205 (etree_type *, int, char *);
b34976b6 206fill_type *exp_get_fill
e9ee469a 207 (etree_type *, fill_type *, char *);
b34976b6 208bfd_vma exp_get_abs_int
e9ee469a 209 (etree_type *, int, char *);
252b5132
RH
210
211#endif
This page took 0.667691 seconds and 4 git commands to generate.