~ubuntu-branches/ubuntu/utopic/binutils-arm64-cross/utopic

« back to all changes in this revision

Viewing changes to binutils-2.23.52.20130611/ld/ldexp.h

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-06-20 17:38:09 UTC
  • Revision ID: package-import@ubuntu.com-20130620173809-app8lzgvymy5fg6c
Tags: 0.7
Build-depend on binutils-source (>= 2.23.52.20130620-1~).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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