/* ldexp.h - Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GLD, the Gnu Linker. GLD 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. GLD 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. */ #ifndef LDEXP_H #define LDEXP_H /* The result of an expression tree */ typedef struct { bfd_vma value; char *str; asection *section; bfd_boolean valid_p; } etree_value_type; 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; } node_type; typedef union etree_union { node_type type; struct { node_type type; union etree_union *lhs; union etree_union *rhs; } binary; struct { node_type type; union etree_union *cond; union etree_union *lhs; union etree_union *rhs; } trinary; struct { node_type type; const char *dst; union etree_union *src; } assign; struct { node_type type; union etree_union *child; } unary; struct { node_type type; const char *name; } name; struct { node_type type; bfd_vma value; char *str; } value; struct { node_type type; asection *section; bfd_vma value; } rel; struct { node_type type; union etree_union *child; const char *message; } 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; /* A maps from a segment name to a base address. */ typedef struct segment_struct { /* The next segment in the linked list. */ struct segment_struct *next; /* The name of the sgement. */ const char *name; /* The base address for the segment. */ bfd_vma value; /* True if a SEGMENT_START directive corresponding to this segment has been seen. */ bfd_boolean used; } segment_type; /* The segments specified by the user on the command-line. */ extern segment_type *segments; typedef struct _fill_type fill_type; etree_type *exp_intop (bfd_vma); 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 *, asection *, lang_phase_type, bfd_vma, bfd_vma *); etree_type *exp_binop (int, etree_type *, etree_type *); etree_type *exp_trinop (int,etree_type *, etree_type *, etree_type *); 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 (const char *, etree_type *); 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); int exp_get_value_int (etree_type *, int, char *, lang_phase_type); fill_type *exp_get_fill (etree_type *, fill_type *, char *, lang_phase_type); bfd_vma exp_get_abs_int (etree_type *, int, char *, lang_phase_type); void exp_mark_used_section (etree_type *, asection *); #endif