Home | History | Annotate | Download | only in ld
      1 /* ldexp.h -
      2    Copyright (C) 1991-2016 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   bfd_boolean 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     bfd_boolean defsym;
     70     bfd_boolean hidden;
     71   } assign;
     72   struct {
     73     node_type type;
     74     union etree_union *child;
     75   } unary;
     76   struct {
     77     node_type type;
     78     const char *name;
     79   } name;
     80   struct {
     81     node_type type;
     82     bfd_vma value;
     83     char *str;
     84   } value;
     85   struct {
     86     node_type type;
     87     asection *section;
     88     bfd_vma value;
     89   } rel;
     90   struct {
     91     node_type type;
     92     union etree_union *child;
     93     const char *message;
     94   } assert_s;
     95 } etree_type;
     96 
     97 /* Expression evaluation control.  */
     98 typedef enum
     99 {
    100   /* Parsing linker script.  Will only return "valid" for expressions
    101      that evaluate to a constant.  */
    102   lang_first_phase_enum,
    103   /* Prior to section sizing.  */
    104   lang_mark_phase_enum,
    105   /* During section sizing.  */
    106   lang_allocating_phase_enum,
    107   /* During assignment of symbol values when relaxation in progress.  */
    108   lang_assigning_phase_enum,
    109   /* Final assignment of symbol values.  */
    110   lang_final_phase_enum
    111 } lang_phase_type;
    112 
    113 union lang_statement_union;
    114 
    115 enum phase_enum {
    116   /* We step through the first four states here as we see the
    117      associated linker script tokens.  */
    118   exp_dataseg_none,
    119   exp_dataseg_align_seen,
    120   exp_dataseg_relro_seen,
    121   exp_dataseg_end_seen,
    122   /* The last three states are final, and affect the value returned
    123      by DATA_SEGMENT_ALIGN.  */
    124   exp_dataseg_relro_adjust,
    125   exp_dataseg_adjust,
    126   exp_dataseg_done
    127 };
    128 
    129 enum relro_enum {
    130   exp_dataseg_relro_none,
    131   exp_dataseg_relro_start,
    132   exp_dataseg_relro_end,
    133 };
    134 
    135 struct ldexp_control {
    136   /* Modify expression evaluation depending on this.  */
    137   lang_phase_type phase;
    138 
    139   /* Principally used for diagnostics.  */
    140   bfd_boolean assigning_to_dot;
    141   /* If evaluating an assignment, the destination.  Cleared if an
    142      etree_name NAME matches this, to signal a self-assignment.
    143      Note that an etree_name DEFINED does not clear this field, nor
    144      does the false branch of a trinary expression.  */
    145   const char *assign_name;
    146 
    147   /* Working results.  */
    148   etree_value_type result;
    149   bfd_vma dot;
    150 
    151   /* Current dot and section passed to ldexp folder.  */
    152   bfd_vma *dotp;
    153   asection *section;
    154 
    155   /* State machine and results for DATASEG.  */
    156   struct {
    157     enum phase_enum phase;
    158 
    159     bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize;
    160 
    161     enum relro_enum relro;
    162 
    163     union lang_statement_union *relro_start_stat;
    164     union lang_statement_union *relro_end_stat;
    165   } dataseg;
    166 };
    167 
    168 extern struct ldexp_control expld;
    169 
    170 /* A maps from a segment name to a base address.  */
    171 typedef struct segment_struct {
    172   /* The next segment in the linked list.  */
    173   struct segment_struct *next;
    174   /* The name of the sgement.  */
    175   const char *name;
    176   /* The base address for the segment.  */
    177   bfd_vma value;
    178   /* True if a SEGMENT_START directive corresponding to this segment
    179      has been seen.  */
    180   bfd_boolean used;
    181 } segment_type;
    182 
    183 /* The segments specified by the user on the command-line.  */
    184 extern segment_type *segments;
    185 
    186 typedef struct _fill_type fill_type;
    187 
    188 etree_type *exp_intop
    189   (bfd_vma);
    190 etree_type *exp_bigintop
    191   (bfd_vma, char *);
    192 etree_type *exp_relop
    193   (asection *, bfd_vma);
    194 void exp_fold_tree
    195   (etree_type *, asection *, bfd_vma *);
    196 void exp_fold_tree_no_dot
    197   (etree_type *);
    198 etree_type *exp_binop
    199   (int, etree_type *, etree_type *);
    200 etree_type *exp_trinop
    201   (int,etree_type *, etree_type *, etree_type *);
    202 etree_type *exp_unop
    203   (int, etree_type *);
    204 etree_type *exp_nameop
    205   (int, const char *);
    206 etree_type *exp_assign
    207   (const char *, etree_type *, bfd_boolean);
    208 etree_type *exp_defsym
    209   (const char *, etree_type *);
    210 etree_type *exp_provide
    211   (const char *, etree_type *, bfd_boolean);
    212 etree_type *exp_assert
    213   (etree_type *, const char *);
    214 void exp_print_tree
    215   (etree_type *);
    216 bfd_vma exp_get_vma
    217   (etree_type *, bfd_vma, char *);
    218 int exp_get_value_int
    219   (etree_type *, int, char *);
    220 fill_type *exp_get_fill
    221   (etree_type *, fill_type *, char *);
    222 bfd_vma exp_get_abs_int
    223   (etree_type *, int, char *);
    224 void ldexp_init (void);
    225 void ldexp_finish (void);
    226 
    227 #endif
    228