X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ld%2Fldexp.h;h=717e839bd41131703029f2a0386ceee7e941d2df;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=fa0dadad8d5dc663bd44b13d22513a1dc04ecc13;hpb=18d6a79d3527acd718cc8acd9395d1bf4cc4ce0a;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldexp.h b/ld/ldexp.h index fa0dadad8d..717e839bd4 100644 --- a/ld/ldexp.h +++ b/ld/ldexp.h @@ -1,5 +1,5 @@ /* ldexp.h - - Copyright (C) 1991-2014 Free Software Foundation, Inc. + Copyright (C) 1991-2020 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -66,7 +66,6 @@ typedef union etree_union { node_type type; const char *dst; union etree_union *src; - bfd_boolean defsym; bfd_boolean hidden; } assign; struct { @@ -107,7 +106,9 @@ typedef enum /* During assignment of symbol values when relaxation in progress. */ lang_assigning_phase_enum, /* Final assignment of symbol values. */ - lang_final_phase_enum + lang_final_phase_enum, + /* Run after symbol values have been fixed, for lang_map. */ + lang_fixed_phase_enum } lang_phase_type; union lang_statement_union; @@ -115,35 +116,59 @@ union lang_statement_union; enum phase_enum { /* We step through the first four states here as we see the associated linker script tokens. */ - exp_dataseg_none, - exp_dataseg_align_seen, - exp_dataseg_relro_seen, - exp_dataseg_end_seen, + exp_seg_none, + exp_seg_align_seen, + exp_seg_relro_seen, + exp_seg_end_seen, /* The last three states are final, and affect the value returned - by DATA_SEGMENT_ALIGN. */ - exp_dataseg_relro_adjust, - exp_dataseg_adjust, - exp_dataseg_done + by XXX_SEGMENT_ALIGN. */ + exp_seg_relro_adjust, + exp_seg_adjust, + exp_seg_done }; enum relro_enum { - exp_dataseg_relro_none, - exp_dataseg_relro_start, - exp_dataseg_relro_end, + exp_seg_relro_none, + exp_seg_relro_start, + exp_seg_relro_end, }; +typedef struct { + enum phase_enum phase; + + bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize; + + enum relro_enum relro; + + union lang_statement_union *relro_start_stat; + union lang_statement_union *relro_end_stat; +} seg_align_type; + struct ldexp_control { /* Modify expression evaluation depending on this. */ lang_phase_type phase; /* Principally used for diagnostics. */ bfd_boolean assigning_to_dot; + + /* Set if the current expression used "dot", SEGMENT_START or + ORIGIN, but not ABSOLUTE or combined symbols in a way that forces + an absolute result. Used in tracking symbols assigned from dot + outside of output section statements, in order to later convert + them from absolute. */ + bfd_boolean rel_from_abs; + /* If evaluating an assignment, the destination. Cleared if an etree_name NAME matches this, to signal a self-assignment. Note that an etree_name DEFINED does not clear this field, nor does the false branch of a trinary expression. */ const char *assign_name; + /* If evaluating an assignment, the source if it is an expression + referencing single etree_name NAME, or a trinary expression where + the true branch references a single etree_name NAME. */ + struct bfd_link_hash_entry *assign_src; + /* Working results. */ etree_value_type result; bfd_vma dot; @@ -153,16 +178,7 @@ struct ldexp_control { asection *section; /* State machine and results for DATASEG. */ - struct { - enum phase_enum phase; - - bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize; - - enum relro_enum relro; - - union lang_statement_union *relro_start_stat; - union lang_statement_union *relro_end_stat; - } dataseg; + seg_align_type dataseg; }; extern struct ldexp_control expld; @@ -215,13 +231,14 @@ void exp_print_tree (etree_type *); bfd_vma exp_get_vma (etree_type *, bfd_vma, char *); -int exp_get_value_int - (etree_type *, int, char *); +int exp_get_power + (etree_type *, char *); fill_type *exp_get_fill (etree_type *, fill_type *, char *); bfd_vma exp_get_abs_int (etree_type *, int, char *); void ldexp_init (void); +void ldexp_finalize_syms (void); void ldexp_finish (void); #endif