(root)/
binutils-2.41/
ld/
ldexp.h
       1  /* ldexp.h -
       2     Copyright (C) 1991-2023 Free Software Foundation, Inc.
       3  
       4     This file is part of the GNU Binutils.
       5  
       6     This program is free software; you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3 of the License, or
       9     (at your option) any later version.
      10  
      11     This program is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with this program; if not, write to the Free Software
      18     Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      19     MA 02110-1301, USA.  */
      20  
      21  #ifndef LDEXP_H
      22  #define LDEXP_H
      23  
      24  /* The result of an expression tree */
      25  typedef struct {
      26    bfd_vma value;
      27    char *str;
      28    asection *section;
      29    bool valid_p;
      30  } etree_value_type;
      31  
      32  enum node_tree_enum {
      33    etree_binary,
      34    etree_trinary,
      35    etree_unary,
      36    etree_name,
      37    etree_assign,
      38    etree_provide,
      39    etree_provided,
      40    etree_value,
      41    etree_assert,
      42    etree_rel
      43  };
      44  
      45  typedef struct {
      46    int node_code;
      47    unsigned int lineno;
      48    const char *filename;
      49    enum node_tree_enum node_class;
      50  } node_type;
      51  
      52  typedef union etree_union {
      53    node_type type;
      54    struct {
      55      node_type type;
      56      union etree_union *lhs;
      57      union etree_union *rhs;
      58    } binary;
      59    struct {
      60      node_type type;
      61      union etree_union *cond;
      62      union etree_union *lhs;
      63      union etree_union *rhs;
      64    } trinary;
      65    struct {
      66      node_type type;
      67      const char *dst;
      68      union etree_union *src;
      69      bool hidden;
      70    } assign;
      71    struct {
      72      node_type type;
      73      union etree_union *child;
      74    } unary;
      75    struct {
      76      node_type type;
      77      const char *name;
      78    } name;
      79    struct {
      80      node_type type;
      81      bfd_vma value;
      82      char *str;
      83    } value;
      84    struct {
      85      node_type type;
      86      asection *section;
      87      bfd_vma value;
      88    } rel;
      89    struct {
      90      node_type type;
      91      union etree_union *child;
      92      const char *message;
      93    } assert_s;
      94  } etree_type;
      95  
      96  /* Expression evaluation control.  */
      97  typedef enum
      98  {
      99    /* Parsing linker script.  Will only return "valid" for expressions
     100       that evaluate to a constant.  */
     101    lang_first_phase_enum,
     102    /* Prior to section sizing.  */
     103    lang_mark_phase_enum,
     104    /* During section sizing.  */
     105    lang_allocating_phase_enum,
     106    /* During assignment of symbol values when relaxation in progress.  */
     107    lang_assigning_phase_enum,
     108    /* Final assignment of symbol values.  */
     109    lang_final_phase_enum,
     110    /* Run after symbol values have been fixed, for lang_map.  */
     111    lang_fixed_phase_enum
     112  } lang_phase_type;
     113  
     114  union lang_statement_union;
     115  
     116  enum phase_enum {
     117    /* We step through the first four states here as we see the
     118       associated linker script tokens.  */
     119    exp_seg_none,
     120    exp_seg_align_seen,
     121    exp_seg_relro_seen,
     122    exp_seg_end_seen,
     123    /* The last three states are final, and affect the value returned
     124       by XXX_SEGMENT_ALIGN.  */
     125    exp_seg_relro_adjust,
     126    exp_seg_adjust,
     127    exp_seg_done
     128  };
     129  
     130  enum relro_enum {
     131    exp_seg_relro_none,
     132    exp_seg_relro_start,
     133    exp_seg_relro_end,
     134  };
     135  
     136  typedef struct {
     137    enum phase_enum phase;
     138  
     139    bfd_vma base, relro_offset, relro_end, end;
     140    /* MAXPAGESIZE and COMMMONPAGESIZE as passed to DATA_SEGMENT_ALIGN.
     141       relropagesize sets the alignment of the end of the relro segment.  */
     142    bfd_vma maxpagesize, commonpagesize, relropagesize;
     143  
     144    enum relro_enum relro;
     145  
     146    union lang_statement_union *relro_start_stat;
     147    union lang_statement_union *relro_end_stat;
     148  } seg_align_type;
     149  
     150  struct ldexp_control {
     151    /* Modify expression evaluation depending on this.  */
     152    lang_phase_type phase;
     153  
     154    /* Principally used for diagnostics.  */
     155    bool assigning_to_dot;
     156  
     157    /* Set if the current expression used "dot", SEGMENT_START or
     158       ORIGIN, but not ABSOLUTE or combined symbols in a way that forces
     159       an absolute result.  Used in tracking symbols assigned from dot
     160       outside of output section statements, in order to later convert
     161       them from absolute.  */
     162    bool rel_from_abs;
     163  
     164    /* If evaluating an assignment, the destination.  Cleared if an
     165       etree_name NAME matches this, to signal a self-assignment.
     166       Note that an etree_name DEFINED does not clear this field, nor
     167       does the false branch of a trinary expression.  */
     168    const char *assign_name;
     169  
     170    /* If evaluating an assignment, the source if it is an expression
     171       referencing single etree_name NAME, or a trinary expression where
     172       the true branch references a single etree_name NAME.  */
     173    struct bfd_link_hash_entry *assign_src;
     174  
     175    /* Working results.  */
     176    etree_value_type result;
     177    bfd_vma dot;
     178  
     179    /* Current dot and section passed to ldexp folder.  */
     180    bfd_vma *dotp;
     181    asection *section;
     182  
     183    /* State machine and results for DATASEG.  */
     184    seg_align_type dataseg;
     185  };
     186  
     187  extern struct ldexp_control expld;
     188  
     189  /* A maps from a segment name to a base address.  */
     190  typedef struct segment_struct {
     191    /* The next segment in the linked list.  */
     192    struct segment_struct *next;
     193    /* The name of the sgement.  */
     194    const char *name;
     195    /* The base address for the segment.  */
     196    bfd_vma value;
     197    /* True if a SEGMENT_START directive corresponding to this segment
     198       has been seen.  */
     199    bool used;
     200  } segment_type;
     201  
     202  /* The segments specified by the user on the command-line.  */
     203  extern segment_type *segments;
     204  
     205  typedef struct _fill_type fill_type;
     206  
     207  etree_type *exp_intop
     208    (bfd_vma);
     209  etree_type *exp_bigintop
     210    (bfd_vma, char *);
     211  etree_type *exp_relop
     212    (asection *, bfd_vma);
     213  void exp_fold_tree
     214    (etree_type *, asection *, bfd_vma *);
     215  void exp_fold_tree_no_dot
     216    (etree_type *);
     217  etree_type *exp_binop
     218    (int, etree_type *, etree_type *);
     219  etree_type *exp_trinop
     220    (int,etree_type *, etree_type *, etree_type *);
     221  etree_type *exp_unop
     222    (int, etree_type *);
     223  etree_type *exp_nameop
     224    (int, const char *);
     225  etree_type *exp_assign
     226    (const char *, etree_type *, bool);
     227  etree_type *exp_defsym
     228    (const char *, etree_type *);
     229  etree_type *exp_provide
     230    (const char *, etree_type *, bool);
     231  etree_type *exp_assert
     232    (etree_type *, const char *);
     233  void exp_print_tree
     234    (etree_type *);
     235  bfd_vma exp_get_vma
     236    (etree_type *, bfd_vma, char *);
     237  int exp_get_power
     238    (etree_type *, char *);
     239  fill_type *exp_get_fill
     240    (etree_type *, fill_type *, char *);
     241  bfd_vma exp_get_abs_int
     242    (etree_type *, int, char *);
     243  void ldexp_init (void);
     244  void ldexp_finalize_syms (void);
     245  bool ldexp_is_final_sym_absolute (const struct bfd_link_hash_entry *);
     246  void ldexp_finish (void);
     247  
     248  #endif