X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fldexp.h;h=ebe82f6088f58ce7772a796b5b7492465a859ba9;hb=cf893b0ef7482ec11df3787772f35e820ef2592a;hp=31a06ac86b774d582b750382be05dea1e19bf69b;hpb=5c3049d2ef5d591dadd42bd074f4866616ef8231;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldexp.h b/ld/ldexp.h index 31a06ac86b..ebe82f6088 100644 --- a/ld/ldexp.h +++ b/ld/ldexp.h @@ -1,6 +1,5 @@ /* ldexp.h - - Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 1991-2021 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -27,7 +26,7 @@ typedef struct { bfd_vma value; char *str; asection *section; - bfd_boolean valid_p; + bool valid_p; } etree_value_type; enum node_tree_enum { @@ -46,7 +45,8 @@ enum node_tree_enum { typedef struct { int node_code; unsigned int lineno; - enum node_tree_enum node_class; + const char *filename; + enum node_tree_enum node_class; } node_type; typedef union etree_union { @@ -66,7 +66,7 @@ typedef union etree_union { node_type type; const char *dst; union etree_union *src; - bfd_boolean hidden; + bool hidden; } assign; struct { node_type type; @@ -93,58 +93,92 @@ typedef union etree_union { } assert_s; } etree_type; -typedef enum { +/* Expression evaluation control. */ +typedef enum +{ + /* Parsing linker script. Will only return "valid" for expressions + that evaluate to a constant. */ lang_first_phase_enum, + /* Prior to section sizing. */ lang_mark_phase_enum, + /* During section sizing. */ lang_allocating_phase_enum, - lang_final_phase_enum + /* During assignment of symbol values when relaxation in progress. */ + lang_assigning_phase_enum, + /* Final assignment of symbol values. */ + 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; enum phase_enum { - exp_dataseg_none, - exp_dataseg_align_seen, - exp_dataseg_relro_seen, - exp_dataseg_end_seen, - exp_dataseg_relro_adjust, - exp_dataseg_adjust + /* We step through the first four states here as we see the + associated linker script tokens. */ + 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 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; + bool 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. */ + bool 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; - /* Set if an expression contains DEFINED(). */ - bfd_boolean uses_defined; /* Current dot and section passed to ldexp folder. */ bfd_vma *dotp; 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; @@ -159,7 +193,7 @@ typedef struct segment_struct { bfd_vma value; /* True if a SEGMENT_START directive corresponding to this segment has been seen. */ - bfd_boolean used; + bool used; } segment_type; /* The segments specified by the user on the command-line. */ @@ -185,21 +219,27 @@ etree_type *exp_unop (int, etree_type *); etree_type *exp_nameop (int, const char *); -etree_type *exp_assop - (int, const char *, etree_type *); +etree_type *exp_assign + (const char *, etree_type *, bool); +etree_type *exp_defsym + (const char *, etree_type *); etree_type *exp_provide - (const char *, etree_type *, bfd_boolean); + (const char *, etree_type *, bool); etree_type *exp_assert (etree_type *, const char *); 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); +bool ldexp_is_final_sym_absolute (const struct bfd_link_hash_entry *); +void ldexp_finish (void); #endif