Subversion Repositories Kolibri OS

Rev

Rev 5199 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* ldexp.h -
  2.    Copyright (C) 1991-2015 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.  
  142.   /* Set if the current expression used "dot", SEGMENT_START or
  143.      ORIGIN, but not ABSOLUTE or combined symbols in a way that forces
  144.      an absolute result.  Used in tracking symbols assigned from dot
  145.      outside of output section statements, in order to later convert
  146.      them from absolute.  */
  147.   bfd_boolean rel_from_abs;
  148.  
  149.   /* If evaluating an assignment, the destination.  Cleared if an
  150.      etree_name NAME matches this, to signal a self-assignment.
  151.      Note that an etree_name DEFINED does not clear this field, nor
  152.      does the false branch of a trinary expression.  */
  153.   const char *assign_name;
  154.  
  155.   /* Working results.  */
  156.   etree_value_type result;
  157.   bfd_vma dot;
  158.  
  159.   /* Current dot and section passed to ldexp folder.  */
  160.   bfd_vma *dotp;
  161.   asection *section;
  162.  
  163.   /* State machine and results for DATASEG.  */
  164.   struct {
  165.     enum phase_enum phase;
  166.  
  167.     bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize;
  168.  
  169.     enum relro_enum relro;
  170.  
  171.     union lang_statement_union *relro_start_stat;
  172.     union lang_statement_union *relro_end_stat;
  173.   } dataseg;
  174. };
  175.  
  176. extern struct ldexp_control expld;
  177.  
  178. /* A maps from a segment name to a base address.  */
  179. typedef struct segment_struct {
  180.   /* The next segment in the linked list.  */
  181.   struct segment_struct *next;
  182.   /* The name of the sgement.  */
  183.   const char *name;
  184.   /* The base address for the segment.  */
  185.   bfd_vma value;
  186.   /* True if a SEGMENT_START directive corresponding to this segment
  187.      has been seen.  */
  188.   bfd_boolean used;
  189. } segment_type;
  190.  
  191. /* The segments specified by the user on the command-line.  */
  192. extern segment_type *segments;
  193.  
  194. typedef struct _fill_type fill_type;
  195.  
  196. etree_type *exp_intop
  197.   (bfd_vma);
  198. etree_type *exp_bigintop
  199.   (bfd_vma, char *);
  200. etree_type *exp_relop
  201.   (asection *, bfd_vma);
  202. void exp_fold_tree
  203.   (etree_type *, asection *, bfd_vma *);
  204. void exp_fold_tree_no_dot
  205.   (etree_type *);
  206. etree_type *exp_binop
  207.   (int, etree_type *, etree_type *);
  208. etree_type *exp_trinop
  209.   (int,etree_type *, etree_type *, etree_type *);
  210. etree_type *exp_unop
  211.   (int, etree_type *);
  212. etree_type *exp_nameop
  213.   (int, const char *);
  214. etree_type *exp_assign
  215.   (const char *, etree_type *, bfd_boolean);
  216. etree_type *exp_defsym
  217.   (const char *, etree_type *);
  218. etree_type *exp_provide
  219.   (const char *, etree_type *, bfd_boolean);
  220. etree_type *exp_assert
  221.   (etree_type *, const char *);
  222. void exp_print_tree
  223.   (etree_type *);
  224. bfd_vma exp_get_vma
  225.   (etree_type *, bfd_vma, char *);
  226. int exp_get_value_int
  227.   (etree_type *, int, char *);
  228. fill_type *exp_get_fill
  229.   (etree_type *, fill_type *, char *);
  230. bfd_vma exp_get_abs_int
  231.   (etree_type *, int, char *);
  232. void ldexp_init (void);
  233. void ldexp_finalize_syms (void);
  234. void ldexp_finish (void);
  235.  
  236. #endif
  237.