Subversion Repositories Kolibri OS

Rev

Rev 5199 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5199 serge 1
/* ldexp.h -
6324 serge 2
   Copyright (C) 1991-2015 Free Software Foundation, Inc.
5199 serge 3
 
4
   This file is part of the GNU Binutils.
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
 
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
 
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
 
21
#ifndef LDEXP_H
22
#define LDEXP_H
23
 
24
/* The result of an expression tree */
25
typedef struct {
26
  bfd_vma value;
27
  char *str;
28
  asection *section;
29
  bfd_boolean valid_p;
30
} etree_value_type;
31
 
32
enum node_tree_enum {
33
  etree_binary,
34
  etree_trinary,
35
  etree_unary,
36
  etree_name,
37
  etree_assign,
38
  etree_provide,
39
  etree_provided,
40
  etree_value,
41
  etree_assert,
42
  etree_rel
43
};
44
 
45
typedef struct {
46
  int node_code;
47
  unsigned int lineno;
48
  const char *filename;
49
  enum node_tree_enum node_class;
50
} node_type;
51
 
52
typedef 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 defsym;
70
    bfd_boolean hidden;
71
  } assign;
72
  struct {
73
    node_type type;
74
    union etree_union *child;
75
  } unary;
76
  struct {
77
    node_type type;
78
    const char *name;
79
  } name;
80
  struct {
81
    node_type type;
82
    bfd_vma value;
83
    char *str;
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;
96
 
97
/* Expression evaluation control.  */
98
typedef enum
99
{
100
  /* Parsing linker script.  Will only return "valid" for expressions
101
     that evaluate to a constant.  */
102
  lang_first_phase_enum,
103
  /* Prior to section sizing.  */
104
  lang_mark_phase_enum,
105
  /* During section sizing.  */
106
  lang_allocating_phase_enum,
107
  /* During assignment of symbol values when relaxation in progress.  */
108
  lang_assigning_phase_enum,
109
  /* Final assignment of symbol values.  */
110
  lang_final_phase_enum
111
} lang_phase_type;
112
 
113
union lang_statement_union;
114
 
115
enum phase_enum {
116
  /* We step through the first four states here as we see the
117
     associated linker script tokens.  */
118
  exp_dataseg_none,
119
  exp_dataseg_align_seen,
120
  exp_dataseg_relro_seen,
121
  exp_dataseg_end_seen,
122
  /* The last three states are final, and affect the value returned
123
     by DATA_SEGMENT_ALIGN.  */
124
  exp_dataseg_relro_adjust,
125
  exp_dataseg_adjust,
126
  exp_dataseg_done
127
};
128
 
129
enum relro_enum {
130
  exp_dataseg_relro_none,
131
  exp_dataseg_relro_start,
132
  exp_dataseg_relro_end,
133
};
134
 
135
struct ldexp_control {
136
  /* Modify expression evaluation depending on this.  */
137
  lang_phase_type phase;
138
 
139
  /* Principally used for diagnostics.  */
140
  bfd_boolean assigning_to_dot;
6324 serge 141
 
142
  /* Set if the current expression used "dot", SEGMENT_START or
143
     ORIGIN, but not ABSOLUTE or combined symbols in a way that forces
144
     an absolute result.  Used in tracking symbols assigned from dot
145
     outside of output section statements, in order to later convert
146
     them from absolute.  */
147
  bfd_boolean rel_from_abs;
148
 
5199 serge 149
  /* If evaluating an assignment, the destination.  Cleared if an
150
     etree_name NAME matches this, to signal a self-assignment.
151
     Note that an etree_name DEFINED does not clear this field, nor
152
     does the false branch of a trinary expression.  */
153
  const char *assign_name;
154
 
155
  /* Working results.  */
156
  etree_value_type result;
157
  bfd_vma dot;
158
 
159
  /* Current dot and section passed to ldexp folder.  */
160
  bfd_vma *dotp;
161
  asection *section;
162
 
163
  /* State machine and results for DATASEG.  */
164
  struct {
165
    enum phase_enum phase;
166
 
6324 serge 167
    bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize;
5199 serge 168
 
169
    enum relro_enum relro;
170
 
171
    union lang_statement_union *relro_start_stat;
172
    union lang_statement_union *relro_end_stat;
173
  } dataseg;
174
};
175
 
176
extern struct ldexp_control expld;
177
 
178
/* A maps from a segment name to a base address.  */
179
typedef struct segment_struct {
180
  /* The next segment in the linked list.  */
181
  struct segment_struct *next;
182
  /* The name of the sgement.  */
183
  const char *name;
184
  /* The base address for the segment.  */
185
  bfd_vma value;
186
  /* True if a SEGMENT_START directive corresponding to this segment
187
     has been seen.  */
188
  bfd_boolean used;
189
} segment_type;
190
 
191
/* The segments specified by the user on the command-line.  */
192
extern segment_type *segments;
193
 
194
typedef struct _fill_type fill_type;
195
 
196
etree_type *exp_intop
197
  (bfd_vma);
198
etree_type *exp_bigintop
199
  (bfd_vma, char *);
200
etree_type *exp_relop
201
  (asection *, bfd_vma);
202
void exp_fold_tree
203
  (etree_type *, asection *, bfd_vma *);
204
void exp_fold_tree_no_dot
205
  (etree_type *);
206
etree_type *exp_binop
207
  (int, etree_type *, etree_type *);
208
etree_type *exp_trinop
209
  (int,etree_type *, etree_type *, etree_type *);
210
etree_type *exp_unop
211
  (int, etree_type *);
212
etree_type *exp_nameop
213
  (int, const char *);
214
etree_type *exp_assign
215
  (const char *, etree_type *, bfd_boolean);
216
etree_type *exp_defsym
217
  (const char *, etree_type *);
218
etree_type *exp_provide
219
  (const char *, etree_type *, bfd_boolean);
220
etree_type *exp_assert
221
  (etree_type *, const char *);
222
void exp_print_tree
223
  (etree_type *);
224
bfd_vma exp_get_vma
225
  (etree_type *, bfd_vma, char *);
226
int exp_get_value_int
227
  (etree_type *, int, char *);
228
fill_type *exp_get_fill
229
  (etree_type *, fill_type *, char *);
230
bfd_vma exp_get_abs_int
231
  (etree_type *, int, char *);
6324 serge 232
void ldexp_init (void);
233
void ldexp_finalize_syms (void);
234
void ldexp_finish (void);
5199 serge 235
 
236
#endif