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