1 /* ldexp.h - 2 Copyright (C) 1991-2014 Free Software Foundation, Inc. 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; 141 /* If evaluating an assignment, the destination. Cleared if an 142 etree_name NAME matches this, to signal a self-assignment. 143 Note that an etree_name DEFINED does not clear this field, nor 144 does the false branch of a trinary expression. */ 145 const char *assign_name; 146 147 /* Working results. */ 148 etree_value_type result; 149 bfd_vma dot; 150 151 /* Current dot and section passed to ldexp folder. */ 152 bfd_vma *dotp; 153 asection *section; 154 155 /* State machine and results for DATASEG. */ 156 struct { 157 enum phase_enum phase; 158 159 bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize; 160 161 enum relro_enum relro; 162 163 union lang_statement_union *relro_start_stat; 164 union lang_statement_union *relro_end_stat; 165 } dataseg; 166 }; 167 168 extern struct ldexp_control expld; 169 170 /* A maps from a segment name to a base address. */ 171 typedef struct segment_struct { 172 /* The next segment in the linked list. */ 173 struct segment_struct *next; 174 /* The name of the sgement. */ 175 const char *name; 176 /* The base address for the segment. */ 177 bfd_vma value; 178 /* True if a SEGMENT_START directive corresponding to this segment 179 has been seen. */ 180 bfd_boolean used; 181 } segment_type; 182 183 /* The segments specified by the user on the command-line. */ 184 extern segment_type *segments; 185 186 typedef struct _fill_type fill_type; 187 188 etree_type *exp_intop 189 (bfd_vma); 190 etree_type *exp_bigintop 191 (bfd_vma, char *); 192 etree_type *exp_relop 193 (asection *, bfd_vma); 194 void exp_fold_tree 195 (etree_type *, asection *, bfd_vma *); 196 void exp_fold_tree_no_dot 197 (etree_type *); 198 etree_type *exp_binop 199 (int, etree_type *, etree_type *); 200 etree_type *exp_trinop 201 (int,etree_type *, etree_type *, etree_type *); 202 etree_type *exp_unop 203 (int, etree_type *); 204 etree_type *exp_nameop 205 (int, const char *); 206 etree_type *exp_assign 207 (const char *, etree_type *, bfd_boolean); 208 etree_type *exp_defsym 209 (const char *, etree_type *); 210 etree_type *exp_provide 211 (const char *, etree_type *, bfd_boolean); 212 etree_type *exp_assert 213 (etree_type *, const char *); 214 void exp_print_tree 215 (etree_type *); 216 bfd_vma exp_get_vma 217 (etree_type *, bfd_vma, char *); 218 int exp_get_value_int 219 (etree_type *, int, char *); 220 fill_type *exp_get_fill 221 (etree_type *, fill_type *, char *); 222 bfd_vma exp_get_abs_int 223 (etree_type *, int, char *); 224 225 #endif 226