/* This module handles expression trees.
   Copyright (C) 1991-2025 Free Software Foundation, Inc.
   Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.

   This file is part of the GNU Binutils.

   This program 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 3 of the License, or
   (at your option) any later version.

   This program 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 this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */


/* This module is in charge of working out the contents of expressions.

   It has to keep track of the relative/absness of a symbol etc. This
   is done by keeping all values in a struct (an etree_value_type)
   which contains a value, a section to which it is relative and a
   valid bit.  */

#include "sysdep.h"
#include "bfd.h"
#include "bfdlink.h"
#include "ctf-api.h"

#include "ld.h"
#include "ldmain.h"
#include "ldmisc.h"
#include "ldexp.h"
#include "ldlex.h"
#include <ldgram.h>
#include "ldlang.h"
#include "libiberty.h"
#include "safe-ctype.h"

static void exp_fold_tree_1 (etree_type *);
static bfd_vma align_n (bfd_vma, bfd_vma);

segment_type *segments;

struct ldexp_control expld;

/* This structure records symbols for which we need to keep track of
   definedness for use in the DEFINED () test.  It is also used in
   making absolute symbols section relative late in the link.   */

struct definedness_hash_entry
{
  struct bfd_hash_entry root;

  /* If this symbol was assigned from "dot" outside of an output
     section statement, the section we'd like it relative to.  */
  asection *final_sec;

  /* Low bits of iteration count.  Symbols with matching iteration have
     been defined in this pass over the script.  */
  unsigned int iteration : 8;

  /* Symbol was defined by an object file.  */
  unsigned int by_object : 1;
};

static struct bfd_hash_table definedness_table;

/* Print the string representation of the given token.  Surround it
   with spaces if INFIX_P is TRUE.  */

static void
exp_print_token (token_code_type code, int infix_p)
{
  static const struct
  {
    token_code_type code;
    const char *name;
  }
  table[] =
  {
    { INT, "int" },
    { NAME, "NAME" },
    { PLUSEQ, "+=" },
    { MINUSEQ, "-=" },
    { MULTEQ, "*=" },
    { DIVEQ, "/=" },
    { LSHIFTEQ, "<<=" },
    { RSHIFTEQ, ">>=" },
    { ANDEQ, "&=" },
    { OREQ, "|=" },
    { XOREQ, "^=" },
    { OROR, "||" },
    { ANDAND, "&&" },
    { EQ, "==" },
    { NE, "!=" },
    { LE, "<=" },
    { GE, ">=" },
    { LSHIFT, "<<" },
    { RSHIFT, ">>" },
    { LOG2CEIL, "LOG2CEIL" },
    { ALIGN_K, "ALIGN" },
    { BLOCK, "BLOCK" },
    { QUAD, "QUAD" },
    { SQUAD, "SQUAD" },
    { LONG, "LONG" },
    { SHORT, "SHORT" },
    { BYTE, "BYTE" },
    { SECTIONS, "SECTIONS" },
    { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
    { MEMORY, "MEMORY" },
    { DEFINED, "DEFINED" },
    { TARGET_K, "TARGET" },
    { SEARCH_DIR, "SEARCH_DIR" },
    { MAP, "MAP" },
    { ENTRY, "ENTRY" },
    { NEXT, "NEXT" },
    { ALIGNOF, "ALIGNOF" },
    { SIZEOF, "SIZEOF" },
    { ADDR, "ADDR" },
    { LOADADDR, "LOADADDR" },
    { CONSTANT, "CONSTANT" },
    { ABSOLUTE, "ABSOLUTE" },
    { MAX_K, "MAX" },
    { MIN_K, "MIN" },
    { ASSERT_K, "ASSERT" },
    { REL, "relocatable" },
    { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
    { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
    { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
    { ORIGIN, "ORIGIN" },
    { LENGTH, "LENGTH" },
    { SEGMENT_START, "SEGMENT_START" }
  };
  unsigned int idx;

  for (idx = 0; idx < ARRAY_SIZE (table); idx++)
    if (table[idx].code == code)
      break;

  if (infix_p)
    fputc (' ', config.map_file);

  if (idx < ARRAY_SIZE (table))
    fputs (table[idx].name, config.map_file);
  else if (code < 127)
    fputc (code, config.map_file);
  else
    fprintf (config.map_file, "<code %d>", code);

  if (infix_p)
    fputc (' ', config.map_file);
}

static void
make_log2ceil (void)
{
  bfd_vma value = expld.result.value;
  bfd_vma result = -1;
  bool round_up = false;

  do
    {
      result++;
      /* If more than one bit is set in the value we will need to round up.  */
      if ((value > 1) && (value & 1))
	round_up = true;
    }
  while (value >>= 1);

  if (round_up)
    result += 1;
  expld.result.section = NULL;
  expld.result.value = result;
}

static void
make_abs (void)
{
  if (expld.result.section != NULL)
    expld.result.value += expld.result.section->vma;
  expld.result.section = bfd_abs_section_ptr;
  expld.rel_from_abs = false;
}

static void
new_abs (bfd_vma value)
{
  expld.result.valid_p = true;
  expld.result.section = bfd_abs_section_ptr;
  expld.result.value = value;
  expld.result.str = NULL;
}

etree_type *
exp_intop (bfd_vma value)
{
  etree_type *new_e = stat_alloc (sizeof (new_e->value));
  new_e->type.node_code = INT;
  new_e->type.filename = ldlex_filename ();
  new_e->type.lineno = lineno;
  new_e->value.value = value;
  new_e->value.str = NULL;
  new_e->type.node_class = etree_value;
  return new_e;
}

etree_type *
exp_bigintop (bfd_vma value, char *str)
{
  etree_type *new_e = stat_alloc (sizeof (new_e->value));
  new_e->type.node_code = INT;
  new_e->type.filename = ldlex_filename ();
  new_e->type.lineno = lineno;
  new_e->value.value = value;
  new_e->value.str = str;
  new_e->type.node_class = etree_value;
  return new_e;
}

/* Build an expression representing an unnamed relocatable value.  */

etree_type *
exp_relop (asection *section, bfd_vma value)
{
  etree_type *new_e = stat_alloc (sizeof (new_e->rel));
  new_e->type.node_code = REL;
  new_e->type.filename = ldlex_filename ();
  new_e->type.lineno = lineno;
  new_e->type.node_class = etree_rel;
  new_e->rel.section = section;
  new_e->rel.value = value;
  return new_e;
}

static void
new_number (bfd_vma value)
{
  expld.result.valid_p = true;
  expld.result.value = value;
  expld.result.str = NULL;
  expld.result.section = NULL;
}

static void
new_rel (bfd_vma value, asection *section)
{
  expld.result.valid_p = true;
  expld.result.value = value;
  expld.result.str = NULL;
  expld.result.section = section;
}

static void
new_rel_from_abs (bfd_vma value)
{
  asection *s = expld.section;

  expld.rel_from_abs = true;
  expld.result.valid_p = true;
  expld.result.value = value - s->vma;
  expld.result.str = NULL;
  expld.result.section = s;
}

/* New-function for the definedness hash table.  */

static struct bfd_hash_entry *
definedness_newfunc (struct bfd_hash_entry *entry,
		     struct bfd_hash_table *table ATTRIBUTE_UNUSED,
		     const char *name ATTRIBUTE_UNUSED)
{
  struct definedness_hash_entry *ret = (struct definedness_hash_entry *) entry;

  if (ret == NULL)
    ret = (struct definedness_hash_entry *)
      bfd_hash_allocate (table, sizeof (struct definedness_hash_entry));

  if (ret == NULL)
    fatal (_("%P: bfd_hash_allocate failed creating symbol %s\n"), name);

  ret->by_object = 0;
  ret->iteration = 0;
  return &ret->root;
}

/* Called during processing of linker script script expressions.
   For symbols assigned in a linker script, return a struct describing
   where the symbol is defined relative to the current expression,
   otherwise return NULL.  */

static struct definedness_hash_entry *
symbol_defined (const char *name)
{
  return ((struct definedness_hash_entry *)
	  bfd_hash_lookup (&definedness_table, name, false, false));
}

/* Update the definedness state of NAME.  Return FALSE if script symbol
   is multiply defining a strong symbol in an object.  */

static bool
update_definedness (const char *name, struct bfd_link_hash_entry *h)
{
  bool ret;
  struct definedness_hash_entry *defentry
    = (struct definedness_hash_entry *)
    bfd_hash_lookup (&definedness_table, name, true, false);

  if (defentry == NULL)
    fatal (_("%P: bfd_hash_lookup failed creating symbol %s\n"), name);

  /* If the symbol was already defined, and not by a script, then it
     must be defined by an object file or by the linker target code.  */
  ret = true;
  if (!h->ldscript_def
      && (h->type == bfd_link_hash_defined
	  || h->type == bfd_link_hash_defweak
	  || h->type == bfd_link_hash_common))
    {
      defentry->by_object = 1;
      if (h->type == bfd_link_hash_defined
	  && h->u.def.section->output_section != NULL
	  && !bfd_is_abs_section (h->u.def.section)
	  && !h->linker_def)
	ret = false;
    }

  defentry->iteration = lang_statement_iteration;
  defentry->final_sec = bfd_abs_section_ptr;
  if (expld.phase == lang_final_phase_enum
      && expld.rel_from_abs
      && expld.result.section == bfd_abs_section_ptr)
    defentry->final_sec = section_for_dot ();
  return ret;
}

static void
fold_segment_end (void)
{
  seg_align_type *seg = &expld.dataseg;

  if (expld.phase == lang_first_phase_enum
      || expld.section != bfd_abs_section_ptr)
    {
      expld.result.valid_p = false;
    }
  else if (seg->phase == exp_seg_align_seen
	   || seg->phase == exp_seg_relro_seen)
    {
      seg->phase = exp_seg_end_seen;
      seg->end = expld.result.value;
    }
  else if (seg->phase == exp_seg_done
	   || seg->phase == exp_seg_adjust
	   || seg->phase == exp_seg_relro_adjust)
    {
      /* OK.  */
    }
  else
    expld.result.valid_p = false;
}

static void
fold_unary (etree_type *tree)
{
  exp_fold_tree_1 (tree->unary.child);
  if (expld.result.valid_p)
    {
      switch (tree->type.node_code)
	{
	case ALIGN_K:
	  if (expld.phase != lang_first_phase_enum)
	    new_rel_from_abs (align_n (expld.dot, expld.result.value));
	  else
	    expld.result.valid_p = false;
	  break;

	case ABSOLUTE:
	  make_abs ();
	  break;

	case LOG2CEIL:
	  make_log2ceil ();
	  break;

	case '~':
	  expld.result.value = ~expld.result.value;
	  break;

	case '!':
	  expld.result.value = !expld.result.value;
	  break;

	case '-':
	  expld.result.value = -expld.result.value;
	  break;

	case NEXT:
	  /* Return next place aligned to value.  */
	  if (expld.phase != lang_first_phase_enum)
	    {
	      make_abs ();
	      expld.result.value = align_n (expld.dot, expld.result.value);
	    }
	  else
	    expld.result.valid_p = false;
	  break;

	case DATA_SEGMENT_END:
	  fold_segment_end ();
	  break;

	default:
	  FAIL ();
	  break;
	}
    }
}

/* Arithmetic operators, bitwise AND, bitwise OR and XOR keep the
   section of one of their operands only when the other operand is a
   plain number.  Losing the section when operating on two symbols,
   ie. a result of a plain number, is required for subtraction and
   XOR.  It's justifiable for the other operations on the grounds that
   adding, multiplying etc. two section relative values does not
   really make sense unless they are just treated as numbers.
   The same argument could be made for many expressions involving one
   symbol and a number.  For example, "1 << x" and "100 / x" probably
   should not be given the section of x.  The trouble is that if we
   fuss about such things the rules become complex and it is onerous
   to document ld expression evaluation.  */
static void
arith_result_section (const etree_value_type *lhs)
{
  if (expld.result.section == lhs->section)
    {
      if (expld.section == bfd_abs_section_ptr
	  && !config.sane_expr)
	/* Duplicate the insanity in exp_fold_tree_1 case etree_value.  */
	expld.result.section = bfd_abs_section_ptr;
      else
	expld.result.section = NULL;
    }
}

static void
fold_segment_align (etree_value_type *lhs)
{
  seg_align_type *seg = &expld.dataseg;

  seg->relro = exp_seg_relro_start;
  if (expld.phase == lang_first_phase_enum
      || expld.section != bfd_abs_section_ptr)
    expld.result.valid_p = false;
  else
    {
      bfd_vma maxpage = lhs->value;
      bfd_vma commonpage = expld.result.value;

      expld.result.value = align_n (expld.dot, maxpage);
      if (seg->phase == exp_seg_relro_adjust)
	expld.result.value = seg->base;
      else if (seg->phase == exp_seg_adjust)
	{
	  if (commonpage < maxpage)
	    expld.result.value += ((expld.dot + commonpage - 1)
				   & (maxpage - commonpage));
	}
      else
	{
	  if (!link_info.relro)
	    expld.result.value += expld.dot & (maxpage - 1);
	  if (seg->phase == exp_seg_done)
	    {
	      /* OK.  */
	    }
	  else if (seg->phase == exp_seg_none)
	    {
	      seg->phase = exp_seg_align_seen;
	      seg->base = expld.result.value;
	      seg->commonpagesize = commonpage;
	      seg->maxpagesize = maxpage;
	      seg->relropagesize = maxpage;
	      seg->relro_end = 0;
	    }
	  else
	    expld.result.valid_p = false;
	}
    }
}

static void
fold_segment_relro_end (etree_value_type *lhs)
{
  seg_align_type *seg = &expld.dataseg;

  /* Operands swapped!  XXX_SEGMENT_RELRO_END(offset,exp) has offset
     in expld.result and exp in lhs.  */
  seg->relro = exp_seg_relro_end;
  seg->relro_offset = expld.result.value;
  if (expld.phase == lang_first_phase_enum
      || expld.section != bfd_abs_section_ptr)
    expld.result.valid_p = false;
  else if (seg->phase == exp_seg_align_seen
	   || seg->phase == exp_seg_adjust
	   || seg->phase == exp_seg_relro_adjust
	   || seg->phase == exp_seg_done)
    {
      if (seg->phase == exp_seg_align_seen
	  || seg->phase == exp_seg_relro_adjust)
	seg->relro_end = lhs->value + expld.result.value;

      if (seg->phase == exp_seg_relro_adjust
	  && (seg->relro_end & (seg->relropagesize - 1)))
	{
	  seg->relro_end += seg->relropagesize - 1;
	  seg->relro_end &= ~(seg->relropagesize - 1);
	  expld.result.value = seg->relro_end - expld.result.value;
	}
      else
	expld.result.value = lhs->value;

      if (seg->phase == exp_seg_align_seen)
	seg->phase = exp_seg_relro_seen;
    }
  else
    expld.result.valid_p = false;
}

static void
fold_binary (etree_type *tree)
{
  etree_value_type lhs;
  exp_fold_tree_1 (tree->binary.lhs);

  /* The SEGMENT_START operator is special because its first
     operand is a string, not the name of a symbol.  Note that the
     operands have been swapped, so binary.lhs is second (default)
     operand, binary.rhs is first operand.  */
  if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
    {
      bfd_vma value = expld.result.value;
      const char *segment_name;
      segment_type *seg;

      /* Check to see if the user has overridden the default
	 value.  */
      segment_name = tree->binary.rhs->name.name;
      for (seg = segments; seg; seg = seg->next)
	if (strcmp (seg->name, segment_name) == 0)
	  {
	    if (!seg->used
		&& config.magic_demand_paged
		&& link_info.maxpagesize != 0
		&& (seg->value % link_info.maxpagesize) != 0)
	      einfo (_("%P: warning: address of `%s' "
		       "isn't multiple of maximum page size\n"),
		     segment_name);
	    seg->used = true;
	    value = seg->value;
	    break;
	  }
      new_rel_from_abs (value);
      return;
    }

  lhs = expld.result;
  exp_fold_tree_1 (tree->binary.rhs);
  expld.result.valid_p &= lhs.valid_p;

  if (expld.result.valid_p)
    {
      if (lhs.section != expld.result.section)
	{
	  /* If the values are from different sections, and neither is
	     just a number, make both the source arguments absolute.  */
	  if (expld.result.section != NULL
	      && lhs.section != NULL)
	    {
	      make_abs ();
	      lhs.value += lhs.section->vma;
	      lhs.section = bfd_abs_section_ptr;
	    }

	  /* If the rhs is just a number, keep the lhs section.  */
	  else if (expld.result.section == NULL)
	    {
	      expld.result.section = lhs.section;
	      /* Make this NULL so that we know one of the operands
		 was just a number, for later tests.  */
	      lhs.section = NULL;
	    }
	}
      /* At this point we know that both operands have the same
	 section, or at least one of them is a plain number.  */

      switch (tree->type.node_code)
	{
#define BOP(x, y) \
	case x:							\
	  expld.result.value = lhs.value y expld.result.value;	\
	  arith_result_section (&lhs);				\
	  break;

	  /* Comparison operators, logical AND, and logical OR always
	     return a plain number.  */
#define BOPN(x, y) \
	case x:							\
	  expld.result.value = lhs.value y expld.result.value;	\
	  expld.result.section = NULL;				\
	  break;

	  BOP ('+', +);
	  BOP ('*', *);
	  BOP ('-', -);
	  BOP (LSHIFT, <<);
	  BOP (RSHIFT, >>);
	  BOP ('&', &);
	  BOP ('^', ^);
	  BOP ('|', |);
	  BOPN (EQ, ==);
	  BOPN (NE, !=);
	  BOPN ('<', <);
	  BOPN ('>', >);
	  BOPN (LE, <=);
	  BOPN (GE, >=);
	  BOPN (ANDAND, &&);
	  BOPN (OROR, ||);

	case '%':
	  if (expld.result.value != 0)
	    expld.result.value = ((bfd_signed_vma) lhs.value
				  % (bfd_signed_vma) expld.result.value);
	  else if (expld.phase != lang_mark_phase_enum)
	    fatal (_("%P:%pS %% by zero\n"), tree->binary.rhs);
	  arith_result_section (&lhs);
	  break;

	case '/':
	  if (expld.result.value != 0)
	    expld.result.value = ((bfd_signed_vma) lhs.value
				  / (bfd_signed_vma) expld.result.value);
	  else if (expld.phase != lang_mark_phase_enum)
	    fatal (_("%P:%pS / by zero\n"), tree->binary.rhs);
	  arith_result_section (&lhs);
	  break;

	case MAX_K:
	  if (lhs.value > expld.result.value)
	    expld.result.value = lhs.value;
	  break;

	case MIN_K:
	  if (lhs.value < expld.result.value)
	    expld.result.value = lhs.value;
	  break;

	case ALIGN_K:
	  expld.result.value = align_n (lhs.value, expld.result.value);
	  break;

	case DATA_SEGMENT_ALIGN:
	  fold_segment_align (&lhs);
	  break;

	case DATA_SEGMENT_RELRO_END:
	  fold_segment_relro_end (&lhs);
	  break;

	default:
	  FAIL ();
	}
    }
}

static void
fold_trinary (etree_type *tree)
{
  struct bfd_link_hash_entry *save = expld.assign_src;

  exp_fold_tree_1 (tree->trinary.cond);
  expld.assign_src = save;
  if (expld.result.valid_p)
    exp_fold_tree_1 (expld.result.value
		     ? tree->trinary.lhs
		     : tree->trinary.rhs);
}

static lang_output_section_statement_type *
output_section_find (const char *name)
{
  lang_output_section_statement_type *os = lang_output_section_find (name);

  if (os == NULL && strcmp (name, "NEXT_SECTION") == 0)
    {
      os = expld.last_os;
      if (os != NULL)
	while ((os = os->next) != NULL)
	  if (os->constraint >= 0 && os->bfd_section != NULL)
	    break;
      if (os == NULL)
	os = abs_output_section;
    }
  return os;
}

static void
fold_name (etree_type *tree)
{
  struct bfd_link_hash_entry *h;
  struct definedness_hash_entry *def;

  memset (&expld.result, 0, sizeof (expld.result));

  switch (tree->type.node_code)
    {
    case SIZEOF_HEADERS:
      link_info.load_phdrs = 1;
      if (expld.phase != lang_first_phase_enum)
	{
	  bfd_vma hdr_size = 0;
	  /* Don't find the real header size if only marking sections;
	     The bfd function may cache incorrect data.  */
	  if (expld.phase != lang_mark_phase_enum)
	    hdr_size = (bfd_sizeof_headers (link_info.output_bfd, &link_info)
			/ bfd_octets_per_byte (link_info.output_bfd, NULL));
	  new_number (hdr_size);
	}
      break;

    case DEFINED:
      h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
					&link_info,
					tree->name.name,
					false, false, true);
      new_number (h != NULL
		  && (h->type == bfd_link_hash_defined
		      || h->type == bfd_link_hash_defweak
		      || h->type == bfd_link_hash_common)
		  && (!h->ldscript_def
		      || (def = symbol_defined (tree->name.name)) == NULL
		      || def->by_object
		      || def->iteration == (lang_statement_iteration & 255)));
      break;

    case NAME:
      if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
	new_rel_from_abs (expld.dot);
      else
	{
	  h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
					    &link_info,
					    tree->name.name,
					    true, false, true);
	  if (!h)
	    {
	      if (expld.phase != lang_first_phase_enum)
		fatal (_("%P: bfd_link_hash_lookup failed: %E\n"));
	    }
	  else if (h->type == bfd_link_hash_defined
		   || h->type == bfd_link_hash_defweak)
	    {
	      asection *output_section;

	      output_section = h->u.def.section->output_section;
	      if (output_section == NULL)
		{
		  if (expld.phase <= lang_mark_phase_enum)
		    new_rel (h->u.def.value, h->u.def.section);
		  else
		    einfo (_("%X%P:%pS: unresolvable symbol `%s'"
			     " referenced in expression\n"),
			   tree, tree->name.name);
		}
	      else if (output_section == bfd_abs_section_ptr
		       && (expld.section != bfd_abs_section_ptr
			   || config.sane_expr))
		new_number (h->u.def.value + h->u.def.section->output_offset);
	      else
		new_rel (h->u.def.value + h->u.def.section->output_offset,
			 output_section);
	    }
	  else if (expld.phase == lang_final_phase_enum
		   || (expld.phase != lang_mark_phase_enum
		       && expld.assigning_to_dot))
	    fatal (_("%P:%pS: undefined symbol `%s'"
		     " referenced in expression\n"),
		   tree, tree->name.name);
	  else if (h->type == bfd_link_hash_new)
	    {
	      h->type = bfd_link_hash_undefined;
	      h->u.undef.abfd = NULL;
	      if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
		bfd_link_add_undef (link_info.hash, h);
	    }
	  if (expld.assign_src == NULL)
	    expld.assign_src = h;
	  else
	    expld.assign_src = (struct bfd_link_hash_entry *) - 1;

	  /* Self-assignment is only allowed for absolute symbols
	     defined in a linker script.  */
	  if (expld.assign_name != NULL
	      && strcmp (expld.assign_name, tree->name.name) == 0
	      && !(h != NULL
		   && (h->type == bfd_link_hash_defined
		       || h->type == bfd_link_hash_defweak)
		   && h->u.def.section == bfd_abs_section_ptr
		   && (def = symbol_defined (tree->name.name)) != NULL
		   && def->iteration == (lang_statement_iteration & 255)))
	    expld.assign_name = NULL;
	}
      break;

    case ADDR:
      if (expld.phase != lang_first_phase_enum)
	{
	  lang_output_section_statement_type *os;

	  os = lang_output_section_find (tree->name.name);
	  if (os == NULL)
	    {
	      if (expld.phase == lang_final_phase_enum)
		fatal (_("%P:%pS: undefined section `%s'"
			 " referenced in expression\n"),
		       tree, tree->name.name);
	    }
	  else if (os->processed_vma)
	    new_rel (0, os->bfd_section);
	}
      break;

    case LOADADDR:
      if (expld.phase != lang_first_phase_enum)
	{
	  lang_output_section_statement_type *os;

	  os = lang_output_section_find (tree->name.name);
	  if (os == NULL)
	    {
	      if (expld.phase == lang_final_phase_enum)
		fatal (_("%P:%pS: undefined section `%s'"
			 " referenced in expression\n"),
		       tree, tree->name.name);
	    }
	  else if (os->processed_lma)
	    {
	      if (os->load_base == NULL)
		new_abs (os->bfd_section->lma);
	      else
		{
		  exp_fold_tree_1 (os->load_base);
		  if (expld.result.valid_p)
		    make_abs ();
		}
	    }
	}
      break;

    case SIZEOF:
    case ALIGNOF:
      if (expld.phase != lang_first_phase_enum)
	{
	  lang_output_section_statement_type *os;

	  os = output_section_find (tree->name.name);
	  if (os == NULL)
	    {
	      if (expld.phase == lang_final_phase_enum)
		fatal (_("%P:%pS: undefined section `%s'"
			 " referenced in expression\n"),
		       tree, tree->name.name);
	      new_number (0);
	    }
	  else if (os->bfd_section != NULL)
	    {
	      bfd_vma val;

	      if (tree->type.node_code == SIZEOF)
		{
		  if (os->processed_vma)
		    val = os->bfd_section->size;
		  else
		    /* If we've just called lang_reset_memory_regions,
		       size will be zero and a previous estimate of
		       size will be in rawsize.  */
		    val = os->bfd_section->rawsize;
		  val /= bfd_octets_per_byte (link_info.output_bfd,
					      os->bfd_section);
		}
	      else
		val = (bfd_vma)1 << os->bfd_section->alignment_power;

	      new_number (val);
	    }
	  else
	    new_number (0);
	}
      break;

    case LENGTH:
      {
	lang_memory_region_type *mem;

	mem = lang_memory_region_lookup (tree->name.name, false);
	if (mem != NULL)
	  new_number (mem->length);
	else
	  fatal (_("%P:%pS: undefined MEMORY region `%s'"
		   " referenced in expression\n"),
		 tree, tree->name.name);
      }
      break;

    case ORIGIN:
      {
	lang_memory_region_type *mem;

	mem = lang_memory_region_lookup (tree->name.name, false);
	if (mem != NULL)
	  new_rel_from_abs (mem->origin);
	else
	  fatal (_("%P:%pS: undefined MEMORY region `%s'"
		   " referenced in expression\n"),
		 tree, tree->name.name);
      }
      break;

    case CONSTANT:
      if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
	new_number (link_info.maxpagesize);
      else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
	new_number (link_info.commonpagesize);
      else
	fatal (_("%P:%pS: unknown constant `%s' referenced in expression\n"),
	       tree, tree->name.name);
      break;

    default:
      FAIL ();
      break;
    }
}

/* Return true if TREE is '.'.  */

static bool
is_dot (const etree_type *tree)
{
  return (tree->type.node_class == etree_name
	  && tree->type.node_code == NAME
	  && tree->name.name[0] == '.'
	  && tree->name.name[1] == 0);
}

/* Return true if TREE is a constant equal to VAL.  */

static bool
is_value (const etree_type *tree, bfd_vma val)
{
  return (tree->type.node_class == etree_value
	  && tree->value.value == val);
}

/* Return true if TREE is an absolute symbol equal to VAL defined in
   a linker script.  */

static bool
is_sym_value (const etree_type *tree, bfd_vma val)
{
  struct bfd_link_hash_entry *h;
  struct definedness_hash_entry *def;

  return (tree->type.node_class == etree_name
	  && tree->type.node_code == NAME
	  && (def = symbol_defined (tree->name.name)) != NULL
	  && def->iteration == (lang_statement_iteration & 255)
	  && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
						&link_info,
						tree->name.name,
						false, false, true)) != NULL
	  && h->ldscript_def
	  && h->type == bfd_link_hash_defined
	  && h->u.def.section == bfd_abs_section_ptr
	  && h->u.def.value == val);
}

/* Return true if TREE is ". != 0".  */

static bool
is_dot_ne_0 (const etree_type *tree)
{
  return (tree->type.node_class == etree_binary
	  && tree->type.node_code == NE
	  && is_dot (tree->binary.lhs)
	  && is_value (tree->binary.rhs, 0));
}

/* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an
   absolute constant with value 0 defined in a linker script.  */

static bool
is_dot_plus_0 (const etree_type *tree)
{
  return (tree->type.node_class == etree_binary
	  && tree->type.node_code == '+'
	  && is_dot (tree->binary.lhs)
	  && (is_value (tree->binary.rhs, 0)
	      || is_sym_value (tree->binary.rhs, 0)));
}

/* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)".  */

static bool
is_align_conditional (const etree_type *tree)
{
  if (tree->type.node_class == etree_unary
      && tree->type.node_code == ALIGN_K)
    {
      tree = tree->unary.child;
      return (tree->type.node_class == etree_trinary
	      && is_dot_ne_0 (tree->trinary.cond)
	      && is_value (tree->trinary.rhs, 1));
    }
  return false;
}

static void
exp_fold_tree_1 (etree_type *tree)
{
  if (tree == NULL)
    {
      memset (&expld.result, 0, sizeof (expld.result));
      return;
    }

  switch (tree->type.node_class)
    {
    case etree_value:
      if (expld.section == bfd_abs_section_ptr
	  && !config.sane_expr)
	new_abs (tree->value.value);
      else
	new_number (tree->value.value);
      expld.result.str = tree->value.str;
      break;

    case etree_rel:
      if (expld.phase != lang_first_phase_enum)
	{
	  asection *output_section = tree->rel.section->output_section;
	  new_rel (tree->rel.value + tree->rel.section->output_offset,
		   output_section);
	}
      else
	memset (&expld.result, 0, sizeof (expld.result));
      break;

    case etree_assert:
      exp_fold_tree_1 (tree->assert_s.child);
      if (expld.phase == lang_final_phase_enum && !expld.result.value)
	einfo ("%X%P: %s\n", tree->assert_s.message);
      break;

    case etree_unary:
      fold_unary (tree);
      break;

    case etree_binary:
      fold_binary (tree);
      break;

    case etree_trinary:
      fold_trinary (tree);
      break;

    case etree_assign:
    case etree_provide:
    case etree_provided:
      if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
	{
	  if (tree->type.node_class != etree_assign)
	    fatal (_("%P:%pS can not PROVIDE assignment to"
		     " location counter\n"), tree);
	  if (expld.phase != lang_first_phase_enum)
	    {
	      /* Notify the folder that this is an assignment to dot.  */
	      expld.assigning_to_dot = true;
	      exp_fold_tree_1 (tree->assign.src);
	      expld.assigning_to_dot = false;

	      /* If we are assigning to dot inside an output section
		 arrange to keep the section, except for certain
		 expressions that evaluate to zero.  We ignore . = 0,
		 . = . + 0, and . = ALIGN (. != 0 ? expr : 1).
		 We can't ignore all expressions that evaluate to zero
		 because an otherwise empty section might have padding
		 added by an alignment expression that changes with
		 relaxation.  Such a section might have zero size
		 before relaxation and so be stripped incorrectly.  */
	      if (expld.phase == lang_mark_phase_enum
		  && expld.section != bfd_abs_section_ptr
		  && expld.section != bfd_und_section_ptr
		  && !(expld.result.valid_p
		       && expld.result.value == 0
		       && (is_value (tree->assign.src, 0)
			   || is_sym_value (tree->assign.src, 0)
			   || is_dot_plus_0 (tree->assign.src)
			   || is_align_conditional (tree->assign.src))))
		expld.section->flags |= SEC_KEEP;

	      if (!expld.result.valid_p
		  || expld.section == bfd_und_section_ptr)
		{
		  if (expld.phase != lang_mark_phase_enum)
		    fatal (_("%P:%pS invalid assignment to"
			     " location counter\n"), tree);
		}
	      else if (expld.dotp == NULL)
		fatal (_("%P:%pS assignment to location counter"
			 " invalid outside of SECTIONS\n"), tree);

	      /* After allocation, assignment to dot should not be
		 done inside an output section since allocation adds a
		 padding statement that effectively duplicates the
		 assignment.  */
	      else if (expld.phase <= lang_allocating_phase_enum
		       || expld.section == bfd_abs_section_ptr)
		{
		  bfd_vma nextdot;

		  nextdot = expld.result.value;
		  if (expld.result.section != NULL)
		    nextdot += expld.result.section->vma;
		  else
		    nextdot += expld.section->vma;
		  if (nextdot < expld.dot
		      && expld.section != bfd_abs_section_ptr)
		    fatal (_("%P:%pS cannot move location counter backwards"
			     " (from %V to %V)\n"),
			   tree, expld.dot, nextdot);
		  else
		    {
		      expld.dot = nextdot;
		      *expld.dotp = nextdot;
		    }
		}
	    }
	  else
	    memset (&expld.result, 0, sizeof (expld.result));
	}
      else
	{
	  struct bfd_link_hash_entry *h = NULL;

	  if (tree->type.node_class == etree_provide)
	    {
	      h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
					false, false, true);
	      if (h == NULL
		  || !(h->type == bfd_link_hash_new
		       || h->type == bfd_link_hash_undefined
		       || h->type == bfd_link_hash_undefweak
		       || h->linker_def))
		{
		  /* Do nothing.  The symbol was never referenced, or
		     was defined in some object file.  Note that
		     undefweak symbols are defined by PROVIDE.  This
		     is to support glibc use of __rela_iplt_start and
		     similar weak references.  */
		  break;
		}
	    }

	  expld.assign_name = tree->assign.dst;
	  expld.assign_src = NULL;
	  exp_fold_tree_1 (tree->assign.src);
	  /* expld.assign_name remaining equal to tree->assign.dst
	     below indicates the evaluation of tree->assign.src did
	     not use the value of tree->assign.dst.  We don't allow
	     self assignment until the final phase for two reasons:
	     1) Expressions are evaluated multiple times.  With
	     relaxation, the number of times may vary.
	     2) Section relative symbol values cannot be correctly
	     converted to absolute values, as is required by many
	     expressions, until final section sizing is complete.  */
	  if (expld.phase == lang_final_phase_enum
	      || expld.phase == lang_fixed_phase_enum
	      || expld.assign_name != NULL)
	    {
	      if (tree->type.node_class == etree_provide)
		tree->type.node_class = etree_provided;

	      if (h == NULL)
		{
		  h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
					    true, false, true);
		  if (h == NULL)
		    fatal (_("%P:%s: hash creation failed\n"),
			   tree->assign.dst);
		}

              /* If the expression is not valid then fake a zero value.  In
                 the final phase any errors will already have been raised,
                 in earlier phases we want to create this definition so
                 that it can be seen by other expressions.  */
              if (!expld.result.valid_p
                  && h->type == bfd_link_hash_new)
                {
                  expld.result.value = 0;
                  expld.result.section = NULL;
                  expld.result.valid_p = true;
                }

	      if (expld.result.valid_p)
		{
		  if (expld.result.section == NULL)
		    expld.result.section = expld.section;
		  if (!update_definedness (tree->assign.dst, h)
		      && expld.assign_name != NULL)
		    {
		      /* Symbol was already defined, and the script isn't
			 modifying the symbol value for some reason as in
			 ld-elf/var1 and ld-scripts/pr14962.
			 For now this is only a warning.  */
		      unsigned int warn = link_info.warn_multiple_definition;
		      link_info.warn_multiple_definition = 1;
		      (*link_info.callbacks->multiple_definition)
			(&link_info, h, link_info.output_bfd,
			 expld.result.section, expld.result.value);
		      link_info.warn_multiple_definition = warn;
		    }
		  if (expld.phase == lang_fixed_phase_enum)
		    {
		      if (h->type == bfd_link_hash_defined)
			{
			  expld.result.value = h->u.def.value;
			  expld.result.section = h->u.def.section;
			}
		    }
		  else
		    {
		      h->type = bfd_link_hash_defined;
		      h->u.def.value = expld.result.value;
		      h->u.def.section = expld.result.section;
		      h->linker_def = ! tree->assign.type.lineno;
		      h->ldscript_def = 1;
		      h->rel_from_abs = expld.rel_from_abs;
		      if (tree->assign.hidden)
			bfd_link_hide_symbol (link_info.output_bfd,
					      &link_info, h);

		      /* Copy the symbol type and set non_ir_ref_regular
			 on the source if this is an expression only
			 referencing a single symbol.  (If the expression
			 contains ternary conditions, ignoring symbols on
			 false branches.)  */
		      if (expld.assign_src != NULL
			  && (expld.assign_src
			      != (struct bfd_link_hash_entry *) -1))
			{
			  bfd_copy_link_hash_symbol_type (link_info.output_bfd,
							  h, expld.assign_src);
			  expld.assign_src->non_ir_ref_regular = true;
			}
		    }
		}
	    }
	  if (expld.phase != lang_fixed_phase_enum)
	    expld.assign_name = NULL;
	}
      break;

    case etree_name:
      fold_name (tree);
      break;

    default:
      FAIL ();
      memset (&expld.result, 0, sizeof (expld.result));
      break;
    }
}

void
exp_fold_tree (etree_type *tree, lang_output_section_statement_type *os,
	       asection *current_section, bfd_vma *dotp)
{
  expld.rel_from_abs = false;
  expld.dot = *dotp;
  expld.dotp = dotp;
  expld.section = current_section;
  expld.last_os = os;
  exp_fold_tree_1 (tree);
}

void
exp_fold_tree_no_dot (etree_type *tree, lang_output_section_statement_type *os)
{
  expld.rel_from_abs = false;
  expld.dot = 0;
  expld.dotp = NULL;
  expld.section = bfd_abs_section_ptr;
  expld.last_os = os;
  exp_fold_tree_1 (tree);
}

static void
exp_value_fold (etree_type *tree)
{
  exp_fold_tree_no_dot (tree, NULL);
  if (expld.result.valid_p)
    {
      tree->type.node_code = INT;
      tree->value.value = expld.result.value;
      tree->value.str = NULL;
      tree->type.node_class = etree_value;
    }
}

#define MAX(a, b) ((a) > (b) ? (a) : (b))

etree_type *
exp_binop (int code, etree_type *lhs, etree_type *rhs)
{
  etree_type *new_e = stat_alloc (MAX (sizeof (new_e->binary),
				       sizeof (new_e->value)));
  new_e->type.node_code = code;
  new_e->type.filename = lhs->type.filename;
  new_e->type.lineno = lhs->type.lineno;
  new_e->binary.lhs = lhs;
  new_e->binary.rhs = rhs;
  new_e->type.node_class = etree_binary;
  if (lhs->type.node_class == etree_value
      && rhs->type.node_class == etree_value
      && code != ALIGN_K
      && code != DATA_SEGMENT_ALIGN
      && code != DATA_SEGMENT_RELRO_END)
    exp_value_fold (new_e);
  return new_e;
}

etree_type *
exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
{
  etree_type *new_e = stat_alloc (MAX (sizeof (new_e->trinary),
				       sizeof (new_e->value)));
  new_e->type.node_code = code;
  new_e->type.filename = cond->type.filename;
  new_e->type.lineno = cond->type.lineno;
  new_e->trinary.lhs = lhs;
  new_e->trinary.cond = cond;
  new_e->trinary.rhs = rhs;
  new_e->type.node_class = etree_trinary;
  if (cond->type.node_class == etree_value
      && lhs->type.node_class == etree_value
      && rhs->type.node_class == etree_value)
    exp_value_fold (new_e);
  return new_e;
}

etree_type *
exp_unop (int code, etree_type *child)
{
  etree_type *new_e = stat_alloc (MAX (sizeof (new_e->unary),
				       sizeof (new_e->value)));
  new_e->unary.type.node_code = code;
  new_e->unary.type.filename = child->type.filename;
  new_e->unary.type.lineno = child->type.lineno;
  new_e->unary.child = child;
  new_e->unary.type.node_class = etree_unary;
  if (child->type.node_class == etree_value
      && code != ALIGN_K
      && code != ABSOLUTE
      && code != NEXT
      && code != DATA_SEGMENT_END)
    exp_value_fold (new_e);
  return new_e;
}

etree_type *
exp_nameop (int code, const char *name)
{
  etree_type *new_e = stat_alloc (sizeof (new_e->name));

  new_e->name.type.node_code = code;
  new_e->name.type.filename = ldlex_filename ();
  new_e->name.type.lineno = lineno;
  new_e->name.name = name;
  new_e->name.type.node_class = etree_name;
  return new_e;

}

static etree_type *
exp_assop (const char *dst,
	   etree_type *src,
	   enum node_tree_enum class,
	   bool hidden)
{
  etree_type *n;

  n = stat_alloc (sizeof (n->assign));
  n->assign.type.node_code = '=';
  n->assign.type.filename = src->type.filename;
  n->assign.type.lineno = src->type.lineno;
  n->assign.type.node_class = class;
  n->assign.src = src;
  n->assign.dst = dst;
  n->assign.hidden = hidden;
  return n;
}

/* Handle linker script assignments and HIDDEN.  */

etree_type *
exp_assign (const char *dst, etree_type *src, bool hidden)
{
  return exp_assop (dst, src, etree_assign, hidden);
}

/* Handle --defsym command-line option.  */

etree_type *
exp_defsym (const char *dst, etree_type *src)
{
  return exp_assop (dst, src, etree_assign, false);
}

/* Handle PROVIDE.  */

etree_type *
exp_provide (const char *dst, etree_type *src, bool hidden)
{
  return exp_assop (dst, src, etree_provide, hidden);
}

/* Handle ASSERT.  */

etree_type *
exp_assert (etree_type *exp, const char *message)
{
  etree_type *n;

  n = stat_alloc (sizeof (n->assert_s));
  n->assert_s.type.node_code = '!';
  n->assert_s.type.filename = exp->type.filename;
  n->assert_s.type.lineno = exp->type.lineno;
  n->assert_s.type.node_class = etree_assert;
  n->assert_s.child = exp;
  n->assert_s.message = message;
  return n;
}

void
exp_print_tree (etree_type *tree)
{
  bool function_like;

  if (config.map_file == NULL)
    config.map_file = stderr;

  if (tree == NULL)
    {
      minfo ("NULL TREE\n");
      return;
    }

  switch (tree->type.node_class)
    {
    case etree_value:
      minfo ("0x%v", tree->value.value);
      return;
    case etree_rel:
      if (tree->rel.section->owner != NULL)
	minfo ("%pB:", tree->rel.section->owner);
      minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
      return;
    case etree_assign:
      fputs (tree->assign.dst, config.map_file);
      exp_print_token (tree->type.node_code, true);
      exp_print_tree (tree->assign.src);
      break;
    case etree_provide:
    case etree_provided:
      fprintf (config.map_file, "PROVIDE (%s = ", tree->assign.dst);
      exp_print_tree (tree->assign.src);
      fputc (')', config.map_file);
      break;
    case etree_binary:
      function_like = false;
      switch (tree->type.node_code)
	{
	case MAX_K:
	case MIN_K:
	case ALIGN_K:
	case DATA_SEGMENT_ALIGN:
	case DATA_SEGMENT_RELRO_END:
	  function_like = true;
	  break;
	case SEGMENT_START:
	  /* Special handling because arguments are in reverse order and
	     the segment name is quoted.  */
	  exp_print_token (tree->type.node_code, false);
	  fputs (" (\"", config.map_file);
	  exp_print_tree (tree->binary.rhs);
	  fputs ("\", ", config.map_file);
	  exp_print_tree (tree->binary.lhs);
	  fputc (')', config.map_file);
	  return;
	}
      if (function_like)
	{
	  exp_print_token (tree->type.node_code, false);
	  fputc (' ', config.map_file);
	}
      fputc ('(', config.map_file);
      exp_print_tree (tree->binary.lhs);
      if (function_like)
	fprintf (config.map_file, ", ");
      else
	exp_print_token (tree->type.node_code, true);
      exp_print_tree (tree->binary.rhs);
      fputc (')', config.map_file);
      break;
    case etree_trinary:
      exp_print_tree (tree->trinary.cond);
      fputc ('?', config.map_file);
      exp_print_tree (tree->trinary.lhs);
      fputc (':', config.map_file);
      exp_print_tree (tree->trinary.rhs);
      break;
    case etree_unary:
      exp_print_token (tree->unary.type.node_code, false);
      if (tree->unary.child)
	{
	  fprintf (config.map_file, " (");
	  exp_print_tree (tree->unary.child);
	  fputc (')', config.map_file);
	}
      break;

    case etree_assert:
      fprintf (config.map_file, "ASSERT (");
      exp_print_tree (tree->assert_s.child);
      fprintf (config.map_file, ", %s)", tree->assert_s.message);
      break;

    case etree_name:
      if (tree->type.node_code == NAME)
	fputs (tree->name.name, config.map_file);
      else
	{
	  exp_print_token (tree->type.node_code, false);
	  if (tree->name.name)
	    fprintf (config.map_file, " (%s)", tree->name.name);
	}
      break;
    default:
      FAIL ();
      break;
    }
}

bfd_vma
exp_get_vma (etree_type *tree, lang_output_section_statement_type *os,
	     bfd_vma def, char *name)
{
  if (tree != NULL)
    {
      exp_fold_tree_no_dot (tree, os);
      if (expld.result.valid_p)
	return expld.result.value;
      else if (name != NULL && expld.phase != lang_mark_phase_enum)
	fatal (_("%P:%pS: nonconstant expression for %s\n"),
	       tree, name);
    }
  return def;
}

/* Return the smallest non-negative integer such that two raised to
   that power is at least as large as the vma evaluated at TREE, if
   TREE is a non-NULL expression that can be resolved.  If TREE is
   NULL or cannot be resolved, return -1.  */

int
exp_get_power (etree_type *tree, lang_output_section_statement_type *os,
	       char *name)
{
  bfd_vma x = exp_get_vma (tree, os, -1, name);
  bfd_vma p2;
  int n;

  if (x == (bfd_vma) -1)
    return -1;

  for (n = 0, p2 = 1; p2 < x; ++n, p2 <<= 1)
    if (p2 == 0)
      break;

  return n;
}

fill_type *
exp_get_fill (etree_type *tree, fill_type *def, char *name)
{
  fill_type *fill;
  size_t len;
  unsigned int val;

  if (tree == NULL)
    return def;

  exp_fold_tree_no_dot (tree, NULL);
  if (!expld.result.valid_p)
    {
      if (name != NULL && expld.phase != lang_mark_phase_enum)
	fatal (_("%P:%pS: nonconstant expression for %s\n"),
	       tree, name);
      return def;
    }

  if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
    {
      unsigned char *dst;
      unsigned char *s;
      fill = stat_alloc ((len + 1) / 2 + sizeof (*fill) - 1);
      fill->size = (len + 1) / 2;
      dst = fill->data;
      s = (unsigned char *) expld.result.str;
      val = 0;
      do
	{
	  unsigned int digit;

	  digit = *s++ - '0';
	  if (digit > 9)
	    digit = (digit - 'A' + '0' + 10) & 0xf;
	  val <<= 4;
	  val += digit;
	  --len;
	  if ((len & 1) == 0)
	    {
	      *dst++ = val;
	      val = 0;
	    }
	}
      while (len != 0);
    }
  else
    {
      fill = stat_alloc (4 + sizeof (*fill) - 1);
      val = expld.result.value;
      fill->data[0] = (val >> 24) & 0xff;
      fill->data[1] = (val >> 16) & 0xff;
      fill->data[2] = (val >>  8) & 0xff;
      fill->data[3] = (val >>  0) & 0xff;
      fill->size = 4;
    }
  return fill;
}

bfd_vma
exp_get_abs_int (etree_type *tree, int def, char *name)
{
  if (tree != NULL)
    {
      exp_fold_tree_no_dot (tree, NULL);

      if (expld.result.valid_p)
	{
	  if (expld.result.section != NULL)
	    expld.result.value += expld.result.section->vma;
	  return expld.result.value;
	}
      else if (name != NULL && expld.phase != lang_mark_phase_enum)
	{
	  fatal (_("%P:%pS: nonconstant expression for %s\n"),
		 tree, name);
	}
    }
  return def;
}

static bfd_vma
align_n (bfd_vma value, bfd_vma align)
{
  if (align <= 1)
    return value;

  value = (value + align - 1) / align;
  return value * align;
}

void
ldexp_init (bool object_only)
{
  /* The value "13" is ad-hoc, somewhat related to the expected number of
     assignments in a linker script.  */
  if (!object_only
      && !bfd_hash_table_init_n (&definedness_table,
				 definedness_newfunc,
				 sizeof (struct definedness_hash_entry),
				 13))
    fatal (_("%P: can not create hash table: %E\n"));
}

/* Convert absolute symbols defined by a script from "dot" (also
   SEGMENT_START or ORIGIN) outside of an output section statement,
   to section relative.  */

static bool
set_sym_sections (struct bfd_hash_entry *bh, void *inf ATTRIBUTE_UNUSED)
{
  struct definedness_hash_entry *def = (struct definedness_hash_entry *) bh;
  if (def->final_sec != bfd_abs_section_ptr)
    {
      struct bfd_link_hash_entry *h;
      h = bfd_link_hash_lookup (link_info.hash, bh->string,
				false, false, true);
      if (h != NULL
	  && h->type == bfd_link_hash_defined
	  && h->u.def.section == bfd_abs_section_ptr)
	{
	  h->u.def.value -= def->final_sec->vma;
	  h->u.def.section = def->final_sec;
	}
    }
  return true;
}

void
ldexp_finalize_syms (void)
{
  bfd_hash_traverse (&definedness_table, set_sym_sections, NULL);
}

/* Determine whether a symbol is going to remain absolute even after
   ldexp_finalize_syms() has run.  */

bool
ldexp_is_final_sym_absolute (const struct bfd_link_hash_entry *h)
{
  if (h->type == bfd_link_hash_defined
      && h->u.def.section == bfd_abs_section_ptr)
    {
      const struct definedness_hash_entry *def;

      if (!h->ldscript_def)
	return true;

      def = symbol_defined (h->root.string);
      if (def != NULL)
	return def->final_sec == bfd_abs_section_ptr;
    }

  return false;
}

void
ldexp_finish (bool object_only)
{
  if (!object_only)
    bfd_hash_table_free (&definedness_table);
}
