/* ldexp.h -
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
+ Copyright (C) 1991-2021 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
bfd_vma value;
char *str;
asection *section;
- bfd_boolean valid_p;
+ bool valid_p;
} etree_value_type;
enum node_tree_enum {
node_type type;
const char *dst;
union etree_union *src;
- bfd_boolean defsym;
- bfd_boolean hidden;
+ bool hidden;
} assign;
struct {
node_type type;
/* 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;
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;
+ 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. */
- bfd_boolean rel_from_abs;
+ bool rel_from_abs;
/* If evaluating an assignment, the destination. Cleared if an
etree_name NAME matches this, to signal a self-assignment.
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;
asection *section;
/* State machine and results for DATASEG. */
- 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;
- } dataseg;
+ seg_align_type dataseg;
};
extern struct ldexp_control expld;
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. */
etree_type *exp_nameop
(int, const char *);
etree_type *exp_assign
- (const char *, etree_type *, bfd_boolean);
+ (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