Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5199 serge 1
/* ldexp.h -
2
   Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
3
   2003, 2004, 2005, 2007, 2011, 2012 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 */
26
typedef struct {
27
  bfd_vma value;
28
  char *str;
29
  asection *section;
30
  bfd_boolean valid_p;
31
} etree_value_type;
32
 
33
enum 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
 
46
typedef struct {
47
  int node_code;
48
  unsigned int lineno;
49
  const char *filename;
50
  enum node_tree_enum node_class;
51
} node_type;
52
 
53
typedef union etree_union {
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;
68
    const char *dst;
69
    union etree_union *src;
70
    bfd_boolean defsym;
71
    bfd_boolean hidden;
72
  } assign;
73
  struct {
74
    node_type type;
75
    union etree_union *child;
76
  } unary;
77
  struct {
78
    node_type type;
79
    const char *name;
80
  } name;
81
  struct {
82
    node_type type;
83
    bfd_vma value;
84
    char *str;
85
  } value;
86
  struct {
87
    node_type type;
88
    asection *section;
89
    bfd_vma value;
90
  } rel;
91
  struct {
92
    node_type type;
93
    union etree_union *child;
94
    const char *message;
95
  } assert_s;
96
} etree_type;
97
 
98
/* Expression evaluation control.  */
99
typedef enum
100
{
101
  /* Parsing linker script.  Will only return "valid" for expressions
102
     that evaluate to a constant.  */
103
  lang_first_phase_enum,
104
  /* Prior to section sizing.  */
105
  lang_mark_phase_enum,
106
  /* During section sizing.  */
107
  lang_allocating_phase_enum,
108
  /* During assignment of symbol values when relaxation in progress.  */
109
  lang_assigning_phase_enum,
110
  /* Final assignment of symbol values.  */
111
  lang_final_phase_enum
112
} lang_phase_type;
113
 
114
union lang_statement_union;
115
 
116
enum phase_enum {
117
  /* We step through the first four states here as we see the
118
     associated linker script tokens.  */
119
  exp_dataseg_none,
120
  exp_dataseg_align_seen,
121
  exp_dataseg_relro_seen,
122
  exp_dataseg_end_seen,
123
  /* The last three states are final, and affect the value returned
124
     by DATA_SEGMENT_ALIGN.  */
125
  exp_dataseg_relro_adjust,
126
  exp_dataseg_adjust,
127
  exp_dataseg_done
128
};
129
 
130
enum relro_enum {
131
  exp_dataseg_relro_none,
132
  exp_dataseg_relro_start,
133
  exp_dataseg_relro_end,
134
};
135
 
136
struct ldexp_control {
137
  /* Modify expression evaluation depending on this.  */
138
  lang_phase_type phase;
139
 
140
  /* Principally used for diagnostics.  */
141
  bfd_boolean assigning_to_dot;
142
  /* If evaluating an assignment, the destination.  Cleared if an
143
     etree_name NAME matches this, to signal a self-assignment.
144
     Note that an etree_name DEFINED does not clear this field, nor
145
     does the false branch of a trinary expression.  */
146
  const char *assign_name;
147
 
148
  /* Working results.  */
149
  etree_value_type result;
150
  bfd_vma dot;
151
 
152
  /* Current dot and section passed to ldexp folder.  */
153
  bfd_vma *dotp;
154
  asection *section;
155
 
156
  /* State machine and results for DATASEG.  */
157
  struct {
158
    enum phase_enum phase;
159
 
160
    bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize;
161
 
162
    enum relro_enum relro;
163
 
164
    union lang_statement_union *relro_start_stat;
165
    union lang_statement_union *relro_end_stat;
166
  } dataseg;
167
};
168
 
169
extern struct ldexp_control expld;
170
 
171
/* A maps from a segment name to a base address.  */
172
typedef struct segment_struct {
173
  /* The next segment in the linked list.  */
174
  struct segment_struct *next;
175
  /* The name of the sgement.  */
176
  const char *name;
177
  /* The base address for the segment.  */
178
  bfd_vma value;
179
  /* True if a SEGMENT_START directive corresponding to this segment
180
     has been seen.  */
181
  bfd_boolean used;
182
} segment_type;
183
 
184
/* The segments specified by the user on the command-line.  */
185
extern segment_type *segments;
186
 
187
typedef struct _fill_type fill_type;
188
 
189
etree_type *exp_intop
190
  (bfd_vma);
191
etree_type *exp_bigintop
192
  (bfd_vma, char *);
193
etree_type *exp_relop
194
  (asection *, bfd_vma);
195
void exp_fold_tree
196
  (etree_type *, asection *, bfd_vma *);
197
void exp_fold_tree_no_dot
198
  (etree_type *);
199
etree_type *exp_binop
200
  (int, etree_type *, etree_type *);
201
etree_type *exp_trinop
202
  (int,etree_type *, etree_type *, etree_type *);
203
etree_type *exp_unop
204
  (int, etree_type *);
205
etree_type *exp_nameop
206
  (int, const char *);
207
etree_type *exp_assign
208
  (const char *, etree_type *, bfd_boolean);
209
etree_type *exp_defsym
210
  (const char *, etree_type *);
211
etree_type *exp_provide
212
  (const char *, etree_type *, bfd_boolean);
213
etree_type *exp_assert
214
  (etree_type *, const char *);
215
void exp_print_tree
216
  (etree_type *);
217
bfd_vma exp_get_vma
218
  (etree_type *, bfd_vma, char *);
219
int exp_get_value_int
220
  (etree_type *, int, char *);
221
fill_type *exp_get_fill
222
  (etree_type *, fill_type *, char *);
223
bfd_vma exp_get_abs_int
224
  (etree_type *, int, char *);
225
 
226
#endif