X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ld%2Fldexp.h;h=265bb7bd655c235f8bf4500fb1d15ae2b4fc5c7c;hb=53a346d8236aec06f1d3c767716d3340fb0aa013;hp=5a48f1d04a6251b7d2b9514f42b8c6b9ad076d9a;hpb=75ff45898cb591177506dc60164e167fc8c79c59;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldexp.h b/ld/ldexp.h index 5a48f1d04a..265bb7bd65 100644 --- a/ld/ldexp.h +++ b/ld/ldexp.h @@ -1,23 +1,22 @@ /* ldexp.h - - Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, - 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of GLD, the Gnu Linker. + This file is part of the GNU Binutils. - GLD is free software; you can redistribute it and/or modify + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. - GLD is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with GLD; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ #ifndef LDEXP_H #define LDEXP_H @@ -26,26 +25,28 @@ typedef struct { bfd_vma value; char *str; - struct lang_output_section_statement_struct *section; + asection *section; 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; - enum { - etree_binary, - etree_trinary, - etree_unary, - etree_name, - etree_assign, - etree_provide, - etree_provided, - etree_undef, - etree_unspec, - etree_value, - etree_assert, - etree_rel - } node_class; + unsigned int lineno; + const char *filename; + enum node_tree_enum node_class; } node_type; typedef union etree_union { @@ -65,6 +66,8 @@ typedef union etree_union { node_type type; const char *dst; union etree_union *src; + bfd_boolean defsym; + bfd_boolean hidden; } assign; struct { node_type type; @@ -91,17 +94,86 @@ typedef union etree_union { } assert_s; } etree_type; -extern struct exp_data_seg { - enum { - exp_dataseg_none, - exp_dataseg_align_seen, - exp_dataseg_relro_seen, - exp_dataseg_end_seen, - exp_dataseg_relro_adjust, - exp_dataseg_adjust - } phase; - bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize; -} exp_data_seg; +/* 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; + + /* 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; + + /* Working results. */ + etree_value_type result; + bfd_vma dot; + + /* 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, 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; +}; + +extern struct ldexp_control expld; /* A maps from a segment name to a base address. */ typedef struct segment_struct { @@ -127,11 +199,10 @@ etree_type *exp_bigintop (bfd_vma, char *); etree_type *exp_relop (asection *, bfd_vma); -etree_value_type invalid - (void); -etree_value_type exp_fold_tree - (etree_type *, struct lang_output_section_statement_struct *, - lang_phase_type, bfd_vma, 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 @@ -140,23 +211,26 @@ 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_provide +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 *, const char *); void exp_print_tree (etree_type *); bfd_vma exp_get_vma - (etree_type *, bfd_vma, char *, lang_phase_type); + (etree_type *, bfd_vma, char *); int exp_get_value_int - (etree_type *, int, char *, lang_phase_type); + (etree_type *, int, char *); fill_type *exp_get_fill - (etree_type *, fill_type *, char *, lang_phase_type); + (etree_type *, fill_type *, char *); bfd_vma exp_get_abs_int - (etree_type *, int, char *, lang_phase_type); -void exp_mark_used_section - (etree_type *, struct lang_output_section_statement_struct *); + (etree_type *, int, char *); +void ldexp_init (void); +void ldexp_finalize_syms (void); +void ldexp_finish (void); #endif