X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fldexp.h;h=10fcf3d96ce9b642bae293de6a519140d16a6dc2;hb=7e993ebf2343a5b39d6d1df29fdebc2818064ae5;hp=1e0069dc0222f19e326d4aa2f119e30b9a3eefc6;hpb=b10a8ae01c27969e5104f76209272fb457c1e20b;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldexp.h b/ld/ldexp.h index 1e0069dc02..10fcf3d96c 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-2015 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -30,21 +29,24 @@ typedef struct { bfd_boolean valid_p; } etree_value_type; +enum node_tree_enum { + etree_binary, + etree_trinary, + etree_unary, + etree_name, + etree_assign, + etree_provide, + etree_provided, + etree_value, + etree_assert, + etree_rel +}; + typedef struct { int node_code; unsigned int lineno; - enum { - etree_binary, - etree_trinary, - etree_unary, - etree_name, - etree_assign, - etree_provide, - etree_provided, - etree_value, - etree_assert, - etree_rel - } node_class; + const char *filename; + enum node_tree_enum node_class; } node_type; typedef union etree_union { @@ -64,6 +66,7 @@ typedef union etree_union { node_type type; const char *dst; union etree_union *src; + bfd_boolean defsym; bfd_boolean hidden; } assign; struct { @@ -91,21 +94,55 @@ 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, + /* During assignment of symbol values when relaxation in progress. */ + lang_assigning_phase_enum, + /* Final assignment of symbol values. */ lang_final_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, + /* 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 +}; + +enum relro_enum { + exp_dataseg_relro_none, + exp_dataseg_relro_start, + exp_dataseg_relro_end, +}; + struct ldexp_control { /* Modify expression evaluation depending on this. */ lang_phase_type phase; /* Principally used for diagnostics. */ bfd_boolean assigning_to_dot; + /* 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; /* Working results. */ etree_value_type result; @@ -117,22 +154,11 @@ struct ldexp_control { /* State machine and results for DATASEG. */ struct { - enum { - exp_dataseg_none, - exp_dataseg_align_seen, - exp_dataseg_relro_seen, - exp_dataseg_end_seen, - exp_dataseg_relro_adjust, - exp_dataseg_adjust - } phase; + enum phase_enum phase; bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize; - enum { - exp_dataseg_relro_none, - exp_dataseg_relro_start, - exp_dataseg_relro_end, - } relro; + enum relro_enum relro; union lang_statement_union *relro_start_stat; union lang_statement_union *relro_end_stat; @@ -167,6 +193,8 @@ etree_type *exp_relop (asection *, bfd_vma); void exp_fold_tree (etree_type *, asection *, bfd_vma *); +void exp_fold_tree_no_dot + (etree_type *); etree_type *exp_binop (int, etree_type *, etree_type *); etree_type *exp_trinop @@ -175,8 +203,10 @@ 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 *, bfd_boolean); +etree_type *exp_defsym + (const char *, etree_type *); etree_type *exp_provide (const char *, etree_type *, bfd_boolean); etree_type *exp_assert @@ -191,5 +221,7 @@ 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_finish (void); #endif