1/* ldexp.h -
2   Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
3   2003, 2004, 2005, 2007, 2011 Free Software Foundation, Inc.
4
5   This file is part of the GNU Binutils.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
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
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.  */
21
22#ifndef LDEXP_H
23#define LDEXP_H
24
25/* The result of an expression tree */
26typedef struct {
27  bfd_vma value;
28  char *str;
29  asection *section;
30  bfd_boolean valid_p;
31} etree_value_type;
32
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
46typedef struct {
47  int node_code;
48  unsigned int lineno;
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 hidden;
70  } assign;
71  struct {
72    node_type type;
73    union etree_union *child;
74  } unary;
75  struct {
76    node_type type;
77    const char *name;
78  } name;
79  struct {
80    node_type type;
81    bfd_vma value;
82    char *str;
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;
95
96typedef enum {
97  lang_first_phase_enum,
98  lang_mark_phase_enum,
99  lang_allocating_phase_enum,
100  lang_assigning_phase_enum,
101  lang_final_phase_enum
102} lang_phase_type;
103
104union lang_statement_union;
105
106enum phase_enum {
107  /* We step through the first four states here as we see the
108     associated linker script tokens.  */
109  exp_dataseg_none,
110  exp_dataseg_align_seen,
111  exp_dataseg_relro_seen,
112  exp_dataseg_end_seen,
113  /* The last three states are final, and affect the value returned
114     by DATA_SEGMENT_ALIGN.  */
115  exp_dataseg_relro_adjust,
116  exp_dataseg_adjust,
117  exp_dataseg_done
118};
119
120enum relro_enum {
121  exp_dataseg_relro_none,
122  exp_dataseg_relro_start,
123  exp_dataseg_relro_end,
124};
125
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 {
143    enum phase_enum phase;
144
145    bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize;
146
147    enum relro_enum relro;
148
149    union lang_statement_union *relro_start_stat;
150    union lang_statement_union *relro_end_stat;
151  } dataseg;
152};
153
154extern struct ldexp_control expld;
155
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
172typedef struct _fill_type fill_type;
173
174etree_type *exp_intop
175  (bfd_vma);
176etree_type *exp_bigintop
177  (bfd_vma, char *);
178etree_type *exp_relop
179  (asection *, bfd_vma);
180void exp_fold_tree
181  (etree_type *, asection *, bfd_vma *);
182void exp_fold_tree_no_dot
183  (etree_type *);
184etree_type *exp_binop
185  (int, etree_type *, etree_type *);
186etree_type *exp_trinop
187  (int,etree_type *, etree_type *, etree_type *);
188etree_type *exp_unop
189  (int, etree_type *);
190etree_type *exp_nameop
191  (int, const char *);
192etree_type *exp_assign
193  (const char *, etree_type *);
194etree_type *exp_defsym
195  (const char *, etree_type *);
196etree_type *exp_provide
197  (const char *, etree_type *, bfd_boolean);
198etree_type *exp_assert
199  (etree_type *, const char *);
200void exp_print_tree
201  (etree_type *);
202bfd_vma exp_get_vma
203  (etree_type *, bfd_vma, char *);
204int exp_get_value_int
205  (etree_type *, int, char *);
206fill_type *exp_get_fill
207  (etree_type *, fill_type *, char *);
208bfd_vma exp_get_abs_int
209  (etree_type *, int, char *);
210
211#endif
212