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