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 227