xref: /openbsd/gnu/usr.bin/binutils-2.17/ld/ldexp.h (revision 3d8817e4)
1*3d8817e4Smiod /* ldexp.h -
2*3d8817e4Smiod    Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
3*3d8817e4Smiod    2003, 2004, 2005 Free Software Foundation, Inc.
4*3d8817e4Smiod 
5*3d8817e4Smiod    This file is part of GLD, the Gnu Linker.
6*3d8817e4Smiod 
7*3d8817e4Smiod    GLD is free software; you can redistribute it and/or modify
8*3d8817e4Smiod    it under the terms of the GNU General Public License as published by
9*3d8817e4Smiod    the Free Software Foundation; either version 2, or (at your option)
10*3d8817e4Smiod    any later version.
11*3d8817e4Smiod 
12*3d8817e4Smiod    GLD is distributed in the hope that it will be useful,
13*3d8817e4Smiod    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*3d8817e4Smiod    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*3d8817e4Smiod    GNU General Public License for more details.
16*3d8817e4Smiod 
17*3d8817e4Smiod    You should have received a copy of the GNU General Public License
18*3d8817e4Smiod    along with GLD; see the file COPYING.  If not, write to the Free
19*3d8817e4Smiod    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20*3d8817e4Smiod    02110-1301, USA.  */
21*3d8817e4Smiod 
22*3d8817e4Smiod #ifndef LDEXP_H
23*3d8817e4Smiod #define LDEXP_H
24*3d8817e4Smiod 
25*3d8817e4Smiod /* The result of an expression tree */
26*3d8817e4Smiod typedef struct {
27*3d8817e4Smiod   bfd_vma value;
28*3d8817e4Smiod   char *str;
29*3d8817e4Smiod   asection *section;
30*3d8817e4Smiod   bfd_boolean valid_p;
31*3d8817e4Smiod } etree_value_type;
32*3d8817e4Smiod 
33*3d8817e4Smiod typedef struct {
34*3d8817e4Smiod   int node_code;
35*3d8817e4Smiod   enum {
36*3d8817e4Smiod     etree_binary,
37*3d8817e4Smiod     etree_trinary,
38*3d8817e4Smiod     etree_unary,
39*3d8817e4Smiod     etree_name,
40*3d8817e4Smiod     etree_assign,
41*3d8817e4Smiod     etree_provide,
42*3d8817e4Smiod     etree_provided,
43*3d8817e4Smiod     etree_value,
44*3d8817e4Smiod     etree_assert,
45*3d8817e4Smiod     etree_rel
46*3d8817e4Smiod   } node_class;
47*3d8817e4Smiod } node_type;
48*3d8817e4Smiod 
49*3d8817e4Smiod typedef union etree_union {
50*3d8817e4Smiod   node_type type;
51*3d8817e4Smiod   struct {
52*3d8817e4Smiod     node_type type;
53*3d8817e4Smiod     union etree_union *lhs;
54*3d8817e4Smiod     union etree_union *rhs;
55*3d8817e4Smiod   } binary;
56*3d8817e4Smiod   struct {
57*3d8817e4Smiod     node_type type;
58*3d8817e4Smiod     union etree_union *cond;
59*3d8817e4Smiod     union etree_union *lhs;
60*3d8817e4Smiod     union etree_union *rhs;
61*3d8817e4Smiod   } trinary;
62*3d8817e4Smiod   struct {
63*3d8817e4Smiod     node_type type;
64*3d8817e4Smiod     const char *dst;
65*3d8817e4Smiod     union etree_union *src;
66*3d8817e4Smiod     bfd_boolean hidden;
67*3d8817e4Smiod   } assign;
68*3d8817e4Smiod   struct {
69*3d8817e4Smiod     node_type type;
70*3d8817e4Smiod     union etree_union *child;
71*3d8817e4Smiod   } unary;
72*3d8817e4Smiod   struct {
73*3d8817e4Smiod     node_type type;
74*3d8817e4Smiod     const char *name;
75*3d8817e4Smiod   } name;
76*3d8817e4Smiod   struct {
77*3d8817e4Smiod     node_type type;
78*3d8817e4Smiod     bfd_vma value;
79*3d8817e4Smiod     char *str;
80*3d8817e4Smiod   } value;
81*3d8817e4Smiod   struct {
82*3d8817e4Smiod     node_type type;
83*3d8817e4Smiod     asection *section;
84*3d8817e4Smiod     bfd_vma value;
85*3d8817e4Smiod   } rel;
86*3d8817e4Smiod   struct {
87*3d8817e4Smiod     node_type type;
88*3d8817e4Smiod     union etree_union *child;
89*3d8817e4Smiod     const char *message;
90*3d8817e4Smiod   } assert_s;
91*3d8817e4Smiod } etree_type;
92*3d8817e4Smiod 
93*3d8817e4Smiod typedef enum {
94*3d8817e4Smiod   lang_first_phase_enum,
95*3d8817e4Smiod   lang_mark_phase_enum,
96*3d8817e4Smiod   lang_allocating_phase_enum,
97*3d8817e4Smiod   lang_final_phase_enum
98*3d8817e4Smiod } lang_phase_type;
99*3d8817e4Smiod 
100*3d8817e4Smiod struct ldexp_control {
101*3d8817e4Smiod   /* Modify expression evaluation depending on this.  */
102*3d8817e4Smiod   lang_phase_type phase;
103*3d8817e4Smiod 
104*3d8817e4Smiod   /* Principally used for diagnostics.  */
105*3d8817e4Smiod   bfd_boolean assigning_to_dot;
106*3d8817e4Smiod 
107*3d8817e4Smiod   /* Working results.  */
108*3d8817e4Smiod   etree_value_type result;
109*3d8817e4Smiod   bfd_vma dot;
110*3d8817e4Smiod 
111*3d8817e4Smiod   /* Current dot and section passed to ldexp folder.  */
112*3d8817e4Smiod   bfd_vma *dotp;
113*3d8817e4Smiod   asection *section;
114*3d8817e4Smiod 
115*3d8817e4Smiod   /* State machine and results for DATASEG.  */
116*3d8817e4Smiod   struct {
117*3d8817e4Smiod     enum {
118*3d8817e4Smiod       exp_dataseg_none,
119*3d8817e4Smiod       exp_dataseg_align_seen,
120*3d8817e4Smiod       exp_dataseg_relro_seen,
121*3d8817e4Smiod       exp_dataseg_end_seen,
122*3d8817e4Smiod       exp_dataseg_relro_adjust,
123*3d8817e4Smiod       exp_dataseg_adjust
124*3d8817e4Smiod     } phase;
125*3d8817e4Smiod 
126*3d8817e4Smiod     bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize;
127*3d8817e4Smiod   } dataseg;
128*3d8817e4Smiod };
129*3d8817e4Smiod 
130*3d8817e4Smiod extern struct ldexp_control expld;
131*3d8817e4Smiod 
132*3d8817e4Smiod /* A maps from a segment name to a base address.  */
133*3d8817e4Smiod typedef struct segment_struct {
134*3d8817e4Smiod   /* The next segment in the linked list.  */
135*3d8817e4Smiod   struct segment_struct *next;
136*3d8817e4Smiod   /* The name of the sgement.  */
137*3d8817e4Smiod   const char *name;
138*3d8817e4Smiod   /* The base address for the segment.  */
139*3d8817e4Smiod   bfd_vma value;
140*3d8817e4Smiod   /* True if a SEGMENT_START directive corresponding to this segment
141*3d8817e4Smiod      has been seen.  */
142*3d8817e4Smiod   bfd_boolean used;
143*3d8817e4Smiod } segment_type;
144*3d8817e4Smiod 
145*3d8817e4Smiod /* The segments specified by the user on the command-line.  */
146*3d8817e4Smiod extern segment_type *segments;
147*3d8817e4Smiod 
148*3d8817e4Smiod typedef struct _fill_type fill_type;
149*3d8817e4Smiod 
150*3d8817e4Smiod etree_type *exp_intop
151*3d8817e4Smiod   (bfd_vma);
152*3d8817e4Smiod etree_type *exp_bigintop
153*3d8817e4Smiod   (bfd_vma, char *);
154*3d8817e4Smiod etree_type *exp_relop
155*3d8817e4Smiod   (asection *, bfd_vma);
156*3d8817e4Smiod void exp_fold_tree
157*3d8817e4Smiod   (etree_type *, asection *, bfd_vma *);
158*3d8817e4Smiod etree_type *exp_binop
159*3d8817e4Smiod   (int, etree_type *, etree_type *);
160*3d8817e4Smiod etree_type *exp_trinop
161*3d8817e4Smiod   (int,etree_type *, etree_type *, etree_type *);
162*3d8817e4Smiod etree_type *exp_unop
163*3d8817e4Smiod   (int, etree_type *);
164*3d8817e4Smiod etree_type *exp_nameop
165*3d8817e4Smiod   (int, const char *);
166*3d8817e4Smiod etree_type *exp_assop
167*3d8817e4Smiod   (int, const char *, etree_type *);
168*3d8817e4Smiod etree_type *exp_provide
169*3d8817e4Smiod   (const char *, etree_type *, bfd_boolean);
170*3d8817e4Smiod etree_type *exp_assert
171*3d8817e4Smiod   (etree_type *, const char *);
172*3d8817e4Smiod void exp_print_tree
173*3d8817e4Smiod   (etree_type *);
174*3d8817e4Smiod bfd_vma exp_get_vma
175*3d8817e4Smiod   (etree_type *, bfd_vma, char *);
176*3d8817e4Smiod int exp_get_value_int
177*3d8817e4Smiod   (etree_type *, int, char *);
178*3d8817e4Smiod fill_type *exp_get_fill
179*3d8817e4Smiod   (etree_type *, fill_type *, char *);
180*3d8817e4Smiod bfd_vma exp_get_abs_int
181*3d8817e4Smiod   (etree_type *, int, char *);
182*3d8817e4Smiod 
183*3d8817e4Smiod #endif
184