ldexp.h revision 130562
1/* ldexp.h -
2   Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
3   2003, 2004 Free Software Foundation, Inc.
4
5   This file is part of GLD, the Gnu Linker.
6
7   GLD 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 2, or (at your option)
10   any later version.
11
12   GLD 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 GLD; see the file COPYING.  If not, write to the Free
19   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20   02111-1307, 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  struct lang_output_section_statement_struct *section;
30  bfd_boolean valid_p;
31} etree_value_type;
32
33typedef struct {
34  int node_code;
35  enum {
36    etree_binary,
37    etree_trinary,
38    etree_unary,
39    etree_name,
40    etree_assign,
41    etree_provide,
42    etree_provided,
43    etree_undef,
44    etree_unspec,
45    etree_value,
46    etree_assert,
47    etree_rel
48  } node_class;
49} node_type;
50
51typedef union etree_union {
52  node_type type;
53  struct {
54    node_type type;
55    union etree_union *lhs;
56    union etree_union *rhs;
57  } binary;
58  struct {
59    node_type type;
60    union etree_union *cond;
61    union etree_union *lhs;
62    union etree_union *rhs;
63  } trinary;
64  struct {
65    node_type type;
66    const char *dst;
67    union etree_union *src;
68  } assign;
69  struct {
70    node_type type;
71    union etree_union *child;
72  } unary;
73  struct {
74    node_type type;
75    const char *name;
76  } name;
77  struct {
78    node_type type;
79    bfd_vma value;
80    char *str;
81  } value;
82  struct {
83    node_type type;
84    asection *section;
85    bfd_vma value;
86  } rel;
87  struct {
88    node_type type;
89    union etree_union *child;
90    const char *message;
91  } assert_s;
92} etree_type;
93
94extern struct exp_data_seg {
95  enum {
96    exp_dataseg_none,
97    exp_dataseg_align_seen,
98    exp_dataseg_end_seen,
99    exp_dataseg_adjust
100  } phase;
101  bfd_vma base, end, pagesize;
102} exp_data_seg;
103
104typedef struct _fill_type fill_type;
105
106etree_type *exp_intop
107  (bfd_vma);
108etree_type *exp_bigintop
109  (bfd_vma, char *);
110etree_type *exp_relop
111  (asection *, bfd_vma);
112etree_value_type invalid
113  (void);
114etree_value_type exp_fold_tree
115  (etree_type *, struct lang_output_section_statement_struct *,
116   lang_phase_type, bfd_vma, bfd_vma *);
117etree_type *exp_binop
118  (int, etree_type *, etree_type *);
119etree_type *exp_trinop
120  (int,etree_type *, etree_type *, etree_type *);
121etree_type *exp_unop
122  (int, etree_type *);
123etree_type *exp_nameop
124  (int, const char *);
125etree_type *exp_assop
126  (int, const char *, etree_type *);
127etree_type *exp_provide
128  (const char *, etree_type *);
129etree_type *exp_assert
130  (etree_type *, const char *);
131void exp_print_tree
132  (etree_type *);
133bfd_vma exp_get_vma
134  (etree_type *, bfd_vma, char *, lang_phase_type);
135int exp_get_value_int
136  (etree_type *, int, char *, lang_phase_type);
137fill_type *exp_get_fill
138  (etree_type *, fill_type *, char *, lang_phase_type);
139bfd_vma exp_get_abs_int
140  (etree_type *, int, char *, lang_phase_type);
141
142#endif
143