Subversion Repositories Kolibri OS

Rev

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

  1. /* ldexp.h -
  2.    Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
  3.    2003, 2004, 2005, 2007, 2011, 2012 Free Software Foundation, Inc.
  4.  
  5.    This file is part of the GNU Binutils.
  6.  
  7.    This program is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 3 of the License, or
  10.    (at your option) any later version.
  11.  
  12.    This program is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with this program; if not, write to the Free Software
  19.    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  20.    MA 02110-1301, USA.  */
  21.  
  22. #ifndef LDEXP_H
  23. #define LDEXP_H
  24.  
  25. /* The result of an expression tree */
  26. typedef struct {
  27.   bfd_vma value;
  28.   char *str;
  29.   asection *section;
  30.   bfd_boolean valid_p;
  31. } etree_value_type;
  32.  
  33. enum node_tree_enum {
  34.   etree_binary,
  35.   etree_trinary,
  36.   etree_unary,
  37.   etree_name,
  38.   etree_assign,
  39.   etree_provide,
  40.   etree_provided,
  41.   etree_value,
  42.   etree_assert,
  43.   etree_rel
  44. };
  45.  
  46. typedef struct {
  47.   int node_code;
  48.   unsigned int lineno;
  49.   const char *filename;
  50.   enum node_tree_enum node_class;
  51. } node_type;
  52.  
  53. typedef union etree_union {
  54.   node_type type;
  55.   struct {
  56.     node_type type;
  57.     union etree_union *lhs;
  58.     union etree_union *rhs;
  59.   } binary;
  60.   struct {
  61.     node_type type;
  62.     union etree_union *cond;
  63.     union etree_union *lhs;
  64.     union etree_union *rhs;
  65.   } trinary;
  66.   struct {
  67.     node_type type;
  68.     const char *dst;
  69.     union etree_union *src;
  70.     bfd_boolean defsym;
  71.     bfd_boolean hidden;
  72.   } assign;
  73.   struct {
  74.     node_type type;
  75.     union etree_union *child;
  76.   } unary;
  77.   struct {
  78.     node_type type;
  79.     const char *name;
  80.   } name;
  81.   struct {
  82.     node_type type;
  83.     bfd_vma value;
  84.     char *str;
  85.   } value;
  86.   struct {
  87.     node_type type;
  88.     asection *section;
  89.     bfd_vma value;
  90.   } rel;
  91.   struct {
  92.     node_type type;
  93.     union etree_union *child;
  94.     const char *message;
  95.   } assert_s;
  96. } etree_type;
  97.  
  98. /* Expression evaluation control.  */
  99. typedef enum
  100. {
  101.   /* Parsing linker script.  Will only return "valid" for expressions
  102.      that evaluate to a constant.  */
  103.   lang_first_phase_enum,
  104.   /* Prior to section sizing.  */
  105.   lang_mark_phase_enum,
  106.   /* During section sizing.  */
  107.   lang_allocating_phase_enum,
  108.   /* During assignment of symbol values when relaxation in progress.  */
  109.   lang_assigning_phase_enum,
  110.   /* Final assignment of symbol values.  */
  111.   lang_final_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_dataseg_none,
  120.   exp_dataseg_align_seen,
  121.   exp_dataseg_relro_seen,
  122.   exp_dataseg_end_seen,
  123.   /* The last three states are final, and affect the value returned
  124.      by DATA_SEGMENT_ALIGN.  */
  125.   exp_dataseg_relro_adjust,
  126.   exp_dataseg_adjust,
  127.   exp_dataseg_done
  128. };
  129.  
  130. enum relro_enum {
  131.   exp_dataseg_relro_none,
  132.   exp_dataseg_relro_start,
  133.   exp_dataseg_relro_end,
  134. };
  135.  
  136. struct ldexp_control {
  137.   /* Modify expression evaluation depending on this.  */
  138.   lang_phase_type phase;
  139.  
  140.   /* Principally used for diagnostics.  */
  141.   bfd_boolean assigning_to_dot;
  142.   /* If evaluating an assignment, the destination.  Cleared if an
  143.      etree_name NAME matches this, to signal a self-assignment.
  144.      Note that an etree_name DEFINED does not clear this field, nor
  145.      does the false branch of a trinary expression.  */
  146.   const char *assign_name;
  147.  
  148.   /* Working results.  */
  149.   etree_value_type result;
  150.   bfd_vma dot;
  151.  
  152.   /* Current dot and section passed to ldexp folder.  */
  153.   bfd_vma *dotp;
  154.   asection *section;
  155.  
  156.   /* State machine and results for DATASEG.  */
  157.   struct {
  158.     enum phase_enum phase;
  159.  
  160.     bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize;
  161.  
  162.     enum relro_enum relro;
  163.  
  164.     union lang_statement_union *relro_start_stat;
  165.     union lang_statement_union *relro_end_stat;
  166.   } dataseg;
  167. };
  168.  
  169. extern struct ldexp_control expld;
  170.  
  171. /* A maps from a segment name to a base address.  */
  172. typedef struct segment_struct {
  173.   /* The next segment in the linked list.  */
  174.   struct segment_struct *next;
  175.   /* The name of the sgement.  */
  176.   const char *name;
  177.   /* The base address for the segment.  */
  178.   bfd_vma value;
  179.   /* True if a SEGMENT_START directive corresponding to this segment
  180.      has been seen.  */
  181.   bfd_boolean used;
  182. } segment_type;
  183.  
  184. /* The segments specified by the user on the command-line.  */
  185. extern segment_type *segments;
  186.  
  187. typedef struct _fill_type fill_type;
  188.  
  189. etree_type *exp_intop
  190.   (bfd_vma);
  191. etree_type *exp_bigintop
  192.   (bfd_vma, char *);
  193. etree_type *exp_relop
  194.   (asection *, bfd_vma);
  195. void exp_fold_tree
  196.   (etree_type *, asection *, bfd_vma *);
  197. void exp_fold_tree_no_dot
  198.   (etree_type *);
  199. etree_type *exp_binop
  200.   (int, etree_type *, etree_type *);
  201. etree_type *exp_trinop
  202.   (int,etree_type *, etree_type *, etree_type *);
  203. etree_type *exp_unop
  204.   (int, etree_type *);
  205. etree_type *exp_nameop
  206.   (int, const char *);
  207. etree_type *exp_assign
  208.   (const char *, etree_type *, bfd_boolean);
  209. etree_type *exp_defsym
  210.   (const char *, etree_type *);
  211. etree_type *exp_provide
  212.   (const char *, etree_type *, bfd_boolean);
  213. etree_type *exp_assert
  214.   (etree_type *, const char *);
  215. void exp_print_tree
  216.   (etree_type *);
  217. bfd_vma exp_get_vma
  218.   (etree_type *, bfd_vma, char *);
  219. int exp_get_value_int
  220.   (etree_type *, int, char *);
  221. fill_type *exp_get_fill
  222.   (etree_type *, fill_type *, char *);
  223. bfd_vma exp_get_abs_int
  224.   (etree_type *, int, char *);
  225.  
  226. #endif
  227.