/* ldexp.h -
- Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
- 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1991-2019 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
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 {
} 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;
+ /* 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;
- 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;
(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 *, bfd_boolean);
+etree_type *exp_defsym
+ (const char *, etree_type *);
etree_type *exp_provide
(const char *, etree_type *, bfd_boolean);
etree_type *exp_assert
(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