1*fae548d3Szrj /* ldexp.h - 2*fae548d3Szrj Copyright (C) 1991-2020 Free Software Foundation, Inc. 3*fae548d3Szrj 4*fae548d3Szrj This file is part of the GNU Binutils. 5*fae548d3Szrj 6*fae548d3Szrj This program is free software; you can redistribute it and/or modify 7*fae548d3Szrj it under the terms of the GNU General Public License as published by 8*fae548d3Szrj the Free Software Foundation; either version 3 of the License, or 9*fae548d3Szrj (at your option) any later version. 10*fae548d3Szrj 11*fae548d3Szrj This program is distributed in the hope that it will be useful, 12*fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 13*fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*fae548d3Szrj GNU General Public License for more details. 15*fae548d3Szrj 16*fae548d3Szrj You should have received a copy of the GNU General Public License 17*fae548d3Szrj along with this program; if not, write to the Free Software 18*fae548d3Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19*fae548d3Szrj MA 02110-1301, USA. */ 20*fae548d3Szrj 21*fae548d3Szrj #ifndef LDEXP_H 22*fae548d3Szrj #define LDEXP_H 23*fae548d3Szrj 24*fae548d3Szrj /* The result of an expression tree */ 25*fae548d3Szrj typedef struct { 26*fae548d3Szrj bfd_vma value; 27*fae548d3Szrj char *str; 28*fae548d3Szrj asection *section; 29*fae548d3Szrj bfd_boolean valid_p; 30*fae548d3Szrj } etree_value_type; 31*fae548d3Szrj 32*fae548d3Szrj enum node_tree_enum { 33*fae548d3Szrj etree_binary, 34*fae548d3Szrj etree_trinary, 35*fae548d3Szrj etree_unary, 36*fae548d3Szrj etree_name, 37*fae548d3Szrj etree_assign, 38*fae548d3Szrj etree_provide, 39*fae548d3Szrj etree_provided, 40*fae548d3Szrj etree_value, 41*fae548d3Szrj etree_assert, 42*fae548d3Szrj etree_rel 43*fae548d3Szrj }; 44*fae548d3Szrj 45*fae548d3Szrj typedef struct { 46*fae548d3Szrj int node_code; 47*fae548d3Szrj unsigned int lineno; 48*fae548d3Szrj const char *filename; 49*fae548d3Szrj enum node_tree_enum node_class; 50*fae548d3Szrj } node_type; 51*fae548d3Szrj 52*fae548d3Szrj typedef union etree_union { 53*fae548d3Szrj node_type type; 54*fae548d3Szrj struct { 55*fae548d3Szrj node_type type; 56*fae548d3Szrj union etree_union *lhs; 57*fae548d3Szrj union etree_union *rhs; 58*fae548d3Szrj } binary; 59*fae548d3Szrj struct { 60*fae548d3Szrj node_type type; 61*fae548d3Szrj union etree_union *cond; 62*fae548d3Szrj union etree_union *lhs; 63*fae548d3Szrj union etree_union *rhs; 64*fae548d3Szrj } trinary; 65*fae548d3Szrj struct { 66*fae548d3Szrj node_type type; 67*fae548d3Szrj const char *dst; 68*fae548d3Szrj union etree_union *src; 69*fae548d3Szrj bfd_boolean hidden; 70*fae548d3Szrj } assign; 71*fae548d3Szrj struct { 72*fae548d3Szrj node_type type; 73*fae548d3Szrj union etree_union *child; 74*fae548d3Szrj } unary; 75*fae548d3Szrj struct { 76*fae548d3Szrj node_type type; 77*fae548d3Szrj const char *name; 78*fae548d3Szrj } name; 79*fae548d3Szrj struct { 80*fae548d3Szrj node_type type; 81*fae548d3Szrj bfd_vma value; 82*fae548d3Szrj char *str; 83*fae548d3Szrj } value; 84*fae548d3Szrj struct { 85*fae548d3Szrj node_type type; 86*fae548d3Szrj asection *section; 87*fae548d3Szrj bfd_vma value; 88*fae548d3Szrj } rel; 89*fae548d3Szrj struct { 90*fae548d3Szrj node_type type; 91*fae548d3Szrj union etree_union *child; 92*fae548d3Szrj const char *message; 93*fae548d3Szrj } assert_s; 94*fae548d3Szrj } etree_type; 95*fae548d3Szrj 96*fae548d3Szrj /* Expression evaluation control. */ 97*fae548d3Szrj typedef enum 98*fae548d3Szrj { 99*fae548d3Szrj /* Parsing linker script. Will only return "valid" for expressions 100*fae548d3Szrj that evaluate to a constant. */ 101*fae548d3Szrj lang_first_phase_enum, 102*fae548d3Szrj /* Prior to section sizing. */ 103*fae548d3Szrj lang_mark_phase_enum, 104*fae548d3Szrj /* During section sizing. */ 105*fae548d3Szrj lang_allocating_phase_enum, 106*fae548d3Szrj /* During assignment of symbol values when relaxation in progress. */ 107*fae548d3Szrj lang_assigning_phase_enum, 108*fae548d3Szrj /* Final assignment of symbol values. */ 109*fae548d3Szrj lang_final_phase_enum, 110*fae548d3Szrj /* Run after symbol values have been fixed, for lang_map. */ 111*fae548d3Szrj lang_fixed_phase_enum 112*fae548d3Szrj } lang_phase_type; 113*fae548d3Szrj 114*fae548d3Szrj union lang_statement_union; 115*fae548d3Szrj 116*fae548d3Szrj enum phase_enum { 117*fae548d3Szrj /* We step through the first four states here as we see the 118*fae548d3Szrj associated linker script tokens. */ 119*fae548d3Szrj exp_seg_none, 120*fae548d3Szrj exp_seg_align_seen, 121*fae548d3Szrj exp_seg_relro_seen, 122*fae548d3Szrj exp_seg_end_seen, 123*fae548d3Szrj /* The last three states are final, and affect the value returned 124*fae548d3Szrj by XXX_SEGMENT_ALIGN. */ 125*fae548d3Szrj exp_seg_relro_adjust, 126*fae548d3Szrj exp_seg_adjust, 127*fae548d3Szrj exp_seg_done 128*fae548d3Szrj }; 129*fae548d3Szrj 130*fae548d3Szrj enum relro_enum { 131*fae548d3Szrj exp_seg_relro_none, 132*fae548d3Szrj exp_seg_relro_start, 133*fae548d3Szrj exp_seg_relro_end, 134*fae548d3Szrj }; 135*fae548d3Szrj 136*fae548d3Szrj typedef struct { 137*fae548d3Szrj enum phase_enum phase; 138*fae548d3Szrj 139*fae548d3Szrj bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize; 140*fae548d3Szrj 141*fae548d3Szrj enum relro_enum relro; 142*fae548d3Szrj 143*fae548d3Szrj union lang_statement_union *relro_start_stat; 144*fae548d3Szrj union lang_statement_union *relro_end_stat; 145*fae548d3Szrj } seg_align_type; 146*fae548d3Szrj 147*fae548d3Szrj struct ldexp_control { 148*fae548d3Szrj /* Modify expression evaluation depending on this. */ 149*fae548d3Szrj lang_phase_type phase; 150*fae548d3Szrj 151*fae548d3Szrj /* Principally used for diagnostics. */ 152*fae548d3Szrj bfd_boolean assigning_to_dot; 153*fae548d3Szrj 154*fae548d3Szrj /* Set if the current expression used "dot", SEGMENT_START or 155*fae548d3Szrj ORIGIN, but not ABSOLUTE or combined symbols in a way that forces 156*fae548d3Szrj an absolute result. Used in tracking symbols assigned from dot 157*fae548d3Szrj outside of output section statements, in order to later convert 158*fae548d3Szrj them from absolute. */ 159*fae548d3Szrj bfd_boolean rel_from_abs; 160*fae548d3Szrj 161*fae548d3Szrj /* If evaluating an assignment, the destination. Cleared if an 162*fae548d3Szrj etree_name NAME matches this, to signal a self-assignment. 163*fae548d3Szrj Note that an etree_name DEFINED does not clear this field, nor 164*fae548d3Szrj does the false branch of a trinary expression. */ 165*fae548d3Szrj const char *assign_name; 166*fae548d3Szrj 167*fae548d3Szrj /* If evaluating an assignment, the source if it is an expression 168*fae548d3Szrj referencing single etree_name NAME, or a trinary expression where 169*fae548d3Szrj the true branch references a single etree_name NAME. */ 170*fae548d3Szrj struct bfd_link_hash_entry *assign_src; 171*fae548d3Szrj 172*fae548d3Szrj /* Working results. */ 173*fae548d3Szrj etree_value_type result; 174*fae548d3Szrj bfd_vma dot; 175*fae548d3Szrj 176*fae548d3Szrj /* Current dot and section passed to ldexp folder. */ 177*fae548d3Szrj bfd_vma *dotp; 178*fae548d3Szrj asection *section; 179*fae548d3Szrj 180*fae548d3Szrj /* State machine and results for DATASEG. */ 181*fae548d3Szrj seg_align_type dataseg; 182*fae548d3Szrj }; 183*fae548d3Szrj 184*fae548d3Szrj extern struct ldexp_control expld; 185*fae548d3Szrj 186*fae548d3Szrj /* A maps from a segment name to a base address. */ 187*fae548d3Szrj typedef struct segment_struct { 188*fae548d3Szrj /* The next segment in the linked list. */ 189*fae548d3Szrj struct segment_struct *next; 190*fae548d3Szrj /* The name of the sgement. */ 191*fae548d3Szrj const char *name; 192*fae548d3Szrj /* The base address for the segment. */ 193*fae548d3Szrj bfd_vma value; 194*fae548d3Szrj /* True if a SEGMENT_START directive corresponding to this segment 195*fae548d3Szrj has been seen. */ 196*fae548d3Szrj bfd_boolean used; 197*fae548d3Szrj } segment_type; 198*fae548d3Szrj 199*fae548d3Szrj /* The segments specified by the user on the command-line. */ 200*fae548d3Szrj extern segment_type *segments; 201*fae548d3Szrj 202*fae548d3Szrj typedef struct _fill_type fill_type; 203*fae548d3Szrj 204*fae548d3Szrj etree_type *exp_intop 205*fae548d3Szrj (bfd_vma); 206*fae548d3Szrj etree_type *exp_bigintop 207*fae548d3Szrj (bfd_vma, char *); 208*fae548d3Szrj etree_type *exp_relop 209*fae548d3Szrj (asection *, bfd_vma); 210*fae548d3Szrj void exp_fold_tree 211*fae548d3Szrj (etree_type *, asection *, bfd_vma *); 212*fae548d3Szrj void exp_fold_tree_no_dot 213*fae548d3Szrj (etree_type *); 214*fae548d3Szrj etree_type *exp_binop 215*fae548d3Szrj (int, etree_type *, etree_type *); 216*fae548d3Szrj etree_type *exp_trinop 217*fae548d3Szrj (int,etree_type *, etree_type *, etree_type *); 218*fae548d3Szrj etree_type *exp_unop 219*fae548d3Szrj (int, etree_type *); 220*fae548d3Szrj etree_type *exp_nameop 221*fae548d3Szrj (int, const char *); 222*fae548d3Szrj etree_type *exp_assign 223*fae548d3Szrj (const char *, etree_type *, bfd_boolean); 224*fae548d3Szrj etree_type *exp_defsym 225*fae548d3Szrj (const char *, etree_type *); 226*fae548d3Szrj etree_type *exp_provide 227*fae548d3Szrj (const char *, etree_type *, bfd_boolean); 228*fae548d3Szrj etree_type *exp_assert 229*fae548d3Szrj (etree_type *, const char *); 230*fae548d3Szrj void exp_print_tree 231*fae548d3Szrj (etree_type *); 232*fae548d3Szrj bfd_vma exp_get_vma 233*fae548d3Szrj (etree_type *, bfd_vma, char *); 234*fae548d3Szrj int exp_get_power 235*fae548d3Szrj (etree_type *, char *); 236*fae548d3Szrj fill_type *exp_get_fill 237*fae548d3Szrj (etree_type *, fill_type *, char *); 238*fae548d3Szrj bfd_vma exp_get_abs_int 239*fae548d3Szrj (etree_type *, int, char *); 240*fae548d3Szrj void ldexp_init (void); 241*fae548d3Szrj void ldexp_finalize_syms (void); 242*fae548d3Szrj void ldexp_finish (void); 243*fae548d3Szrj 244*fae548d3Szrj #endif 245