xref: /dragonfly/contrib/binutils-2.34/ld/ldexp.c (revision 37de577a)
1 /* This module handles expression trees.
2    Copyright (C) 1991-2020 Free Software Foundation, Inc.
3    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
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 
23 /* This module is in charge of working out the contents of expressions.
24 
25    It has to keep track of the relative/absness of a symbol etc. This
26    is done by keeping all values in a struct (an etree_value_type)
27    which contains a value, a section to which it is relative and a
28    valid bit.  */
29 
30 #include "sysdep.h"
31 #include "bfd.h"
32 #include "bfdlink.h"
33 #include "ctf-api.h"
34 
35 #include "ld.h"
36 #include "ldmain.h"
37 #include "ldmisc.h"
38 #include "ldexp.h"
39 #include "ldlex.h"
40 #include <ldgram.h>
41 #include "ldlang.h"
42 #include "libiberty.h"
43 #include "safe-ctype.h"
44 
45 static void exp_fold_tree_1 (etree_type *);
46 static bfd_vma align_n (bfd_vma, bfd_vma);
47 
48 segment_type *segments;
49 
50 struct ldexp_control expld;
51 
52 /* This structure records symbols for which we need to keep track of
53    definedness for use in the DEFINED () test.  It is also used in
54    making absolute symbols section relative late in the link.   */
55 
56 struct definedness_hash_entry
57 {
58   struct bfd_hash_entry root;
59 
60   /* If this symbol was assigned from "dot" outside of an output
61      section statement, the section we'd like it relative to.  */
62   asection *final_sec;
63 
64   /* Low bits of iteration count.  Symbols with matching iteration have
65      been defined in this pass over the script.  */
66   unsigned int iteration : 8;
67 
68   /* Symbol was defined by an object file.  */
69   unsigned int by_object : 1;
70 };
71 
72 static struct bfd_hash_table definedness_table;
73 
74 /* Print the string representation of the given token.  Surround it
75    with spaces if INFIX_P is TRUE.  */
76 
77 static void
78 exp_print_token (token_code_type code, int infix_p)
79 {
80   static const struct
81   {
82     token_code_type code;
83     const char *name;
84   }
85   table[] =
86   {
87     { INT, "int" },
88     { NAME, "NAME" },
89     { PLUSEQ, "+=" },
90     { MINUSEQ, "-=" },
91     { MULTEQ, "*=" },
92     { DIVEQ, "/=" },
93     { LSHIFTEQ, "<<=" },
94     { RSHIFTEQ, ">>=" },
95     { ANDEQ, "&=" },
96     { OREQ, "|=" },
97     { OROR, "||" },
98     { ANDAND, "&&" },
99     { EQ, "==" },
100     { NE, "!=" },
101     { LE, "<=" },
102     { GE, ">=" },
103     { LSHIFT, "<<" },
104     { RSHIFT, ">>" },
105     { LOG2CEIL, "LOG2CEIL" },
106     { ALIGN_K, "ALIGN" },
107     { BLOCK, "BLOCK" },
108     { QUAD, "QUAD" },
109     { SQUAD, "SQUAD" },
110     { LONG, "LONG" },
111     { SHORT, "SHORT" },
112     { BYTE, "BYTE" },
113     { SECTIONS, "SECTIONS" },
114     { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
115     { MEMORY, "MEMORY" },
116     { DEFINED, "DEFINED" },
117     { TARGET_K, "TARGET" },
118     { SEARCH_DIR, "SEARCH_DIR" },
119     { MAP, "MAP" },
120     { ENTRY, "ENTRY" },
121     { NEXT, "NEXT" },
122     { ALIGNOF, "ALIGNOF" },
123     { SIZEOF, "SIZEOF" },
124     { ADDR, "ADDR" },
125     { LOADADDR, "LOADADDR" },
126     { CONSTANT, "CONSTANT" },
127     { ABSOLUTE, "ABSOLUTE" },
128     { MAX_K, "MAX" },
129     { MIN_K, "MIN" },
130     { ASSERT_K, "ASSERT" },
131     { REL, "relocatable" },
132     { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
133     { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
134     { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
135     { ORIGIN, "ORIGIN" },
136     { LENGTH, "LENGTH" },
137     { SEGMENT_START, "SEGMENT_START" }
138   };
139   unsigned int idx;
140 
141   for (idx = 0; idx < ARRAY_SIZE (table); idx++)
142     if (table[idx].code == code)
143       break;
144 
145   if (infix_p)
146     fputc (' ', config.map_file);
147 
148   if (idx < ARRAY_SIZE (table))
149     fputs (table[idx].name, config.map_file);
150   else if (code < 127)
151     fputc (code, config.map_file);
152   else
153     fprintf (config.map_file, "<code %d>", code);
154 
155   if (infix_p)
156     fputc (' ', config.map_file);
157 }
158 
159 static void
160 make_log2ceil (void)
161 {
162   bfd_vma value = expld.result.value;
163   bfd_vma result = -1;
164   bfd_boolean round_up = FALSE;
165 
166   do
167     {
168       result++;
169       /* If more than one bit is set in the value we will need to round up.  */
170       if ((value > 1) && (value & 1))
171 	round_up = TRUE;
172     }
173   while (value >>= 1);
174 
175   if (round_up)
176     result += 1;
177   expld.result.section = NULL;
178   expld.result.value = result;
179 }
180 
181 static void
182 make_abs (void)
183 {
184   if (expld.result.section != NULL)
185     expld.result.value += expld.result.section->vma;
186   expld.result.section = bfd_abs_section_ptr;
187   expld.rel_from_abs = FALSE;
188 }
189 
190 static void
191 new_abs (bfd_vma value)
192 {
193   expld.result.valid_p = TRUE;
194   expld.result.section = bfd_abs_section_ptr;
195   expld.result.value = value;
196   expld.result.str = NULL;
197 }
198 
199 etree_type *
200 exp_intop (bfd_vma value)
201 {
202   etree_type *new_e = stat_alloc (sizeof (new_e->value));
203   new_e->type.node_code = INT;
204   new_e->type.filename = ldlex_filename ();
205   new_e->type.lineno = lineno;
206   new_e->value.value = value;
207   new_e->value.str = NULL;
208   new_e->type.node_class = etree_value;
209   return new_e;
210 }
211 
212 etree_type *
213 exp_bigintop (bfd_vma value, char *str)
214 {
215   etree_type *new_e = stat_alloc (sizeof (new_e->value));
216   new_e->type.node_code = INT;
217   new_e->type.filename = ldlex_filename ();
218   new_e->type.lineno = lineno;
219   new_e->value.value = value;
220   new_e->value.str = str;
221   new_e->type.node_class = etree_value;
222   return new_e;
223 }
224 
225 /* Build an expression representing an unnamed relocatable value.  */
226 
227 etree_type *
228 exp_relop (asection *section, bfd_vma value)
229 {
230   etree_type *new_e = stat_alloc (sizeof (new_e->rel));
231   new_e->type.node_code = REL;
232   new_e->type.filename = ldlex_filename ();
233   new_e->type.lineno = lineno;
234   new_e->type.node_class = etree_rel;
235   new_e->rel.section = section;
236   new_e->rel.value = value;
237   return new_e;
238 }
239 
240 static void
241 new_number (bfd_vma value)
242 {
243   expld.result.valid_p = TRUE;
244   expld.result.value = value;
245   expld.result.str = NULL;
246   expld.result.section = NULL;
247 }
248 
249 static void
250 new_rel (bfd_vma value, asection *section)
251 {
252   expld.result.valid_p = TRUE;
253   expld.result.value = value;
254   expld.result.str = NULL;
255   expld.result.section = section;
256 }
257 
258 static void
259 new_rel_from_abs (bfd_vma value)
260 {
261   asection *s = expld.section;
262 
263   expld.rel_from_abs = TRUE;
264   expld.result.valid_p = TRUE;
265   expld.result.value = value - s->vma;
266   expld.result.str = NULL;
267   expld.result.section = s;
268 }
269 
270 /* New-function for the definedness hash table.  */
271 
272 static struct bfd_hash_entry *
273 definedness_newfunc (struct bfd_hash_entry *entry,
274 		     struct bfd_hash_table *table ATTRIBUTE_UNUSED,
275 		     const char *name ATTRIBUTE_UNUSED)
276 {
277   struct definedness_hash_entry *ret = (struct definedness_hash_entry *) entry;
278 
279   if (ret == NULL)
280     ret = (struct definedness_hash_entry *)
281       bfd_hash_allocate (table, sizeof (struct definedness_hash_entry));
282 
283   if (ret == NULL)
284     einfo (_("%F%P: bfd_hash_allocate failed creating symbol %s\n"), name);
285 
286   ret->by_object = 0;
287   ret->iteration = 0;
288   return &ret->root;
289 }
290 
291 /* Called during processing of linker script script expressions.
292    For symbols assigned in a linker script, return a struct describing
293    where the symbol is defined relative to the current expression,
294    otherwise return NULL.  */
295 
296 static struct definedness_hash_entry *
297 symbol_defined (const char *name)
298 {
299   return ((struct definedness_hash_entry *)
300 	  bfd_hash_lookup (&definedness_table, name, FALSE, FALSE));
301 }
302 
303 /* Update the definedness state of NAME.  Return FALSE if script symbol
304    is multiply defining a strong symbol in an object.  */
305 
306 static bfd_boolean
307 update_definedness (const char *name, struct bfd_link_hash_entry *h)
308 {
309   bfd_boolean ret;
310   struct definedness_hash_entry *defentry
311     = (struct definedness_hash_entry *)
312     bfd_hash_lookup (&definedness_table, name, TRUE, FALSE);
313 
314   if (defentry == NULL)
315     einfo (_("%F%P: bfd_hash_lookup failed creating symbol %s\n"), name);
316 
317   /* If the symbol was already defined, and not by a script, then it
318      must be defined by an object file or by the linker target code.  */
319   ret = TRUE;
320   if (!h->ldscript_def
321       && (h->type == bfd_link_hash_defined
322 	  || h->type == bfd_link_hash_defweak
323 	  || h->type == bfd_link_hash_common))
324     {
325       defentry->by_object = 1;
326       if (h->type == bfd_link_hash_defined
327 	  && h->u.def.section->output_section != NULL
328 	  && !h->linker_def)
329 	ret = FALSE;
330     }
331 
332   defentry->iteration = lang_statement_iteration;
333   defentry->final_sec = bfd_abs_section_ptr;
334   if (expld.phase == lang_final_phase_enum
335       && expld.rel_from_abs
336       && expld.result.section == bfd_abs_section_ptr)
337     defentry->final_sec = section_for_dot ();
338   return ret;
339 }
340 
341 static void
342 fold_segment_end (seg_align_type *seg)
343 {
344   if (expld.phase == lang_first_phase_enum
345       || expld.section != bfd_abs_section_ptr)
346     {
347       expld.result.valid_p = FALSE;
348     }
349   else if (seg->phase == exp_seg_align_seen
350 	   || seg->phase == exp_seg_relro_seen)
351     {
352       seg->phase = exp_seg_end_seen;
353       seg->end = expld.result.value;
354     }
355   else if (seg->phase == exp_seg_done
356 	   || seg->phase == exp_seg_adjust
357 	   || seg->phase == exp_seg_relro_adjust)
358     {
359       /* OK.  */
360     }
361   else
362     expld.result.valid_p = FALSE;
363 }
364 
365 static void
366 fold_unary (etree_type *tree)
367 {
368   exp_fold_tree_1 (tree->unary.child);
369   if (expld.result.valid_p)
370     {
371       switch (tree->type.node_code)
372 	{
373 	case ALIGN_K:
374 	  if (expld.phase != lang_first_phase_enum)
375 	    new_rel_from_abs (align_n (expld.dot, expld.result.value));
376 	  else
377 	    expld.result.valid_p = FALSE;
378 	  break;
379 
380 	case ABSOLUTE:
381 	  make_abs ();
382 	  break;
383 
384 	case LOG2CEIL:
385 	  make_log2ceil ();
386 	  break;
387 
388 	case '~':
389 	  expld.result.value = ~expld.result.value;
390 	  break;
391 
392 	case '!':
393 	  expld.result.value = !expld.result.value;
394 	  break;
395 
396 	case '-':
397 	  expld.result.value = -expld.result.value;
398 	  break;
399 
400 	case NEXT:
401 	  /* Return next place aligned to value.  */
402 	  if (expld.phase != lang_first_phase_enum)
403 	    {
404 	      make_abs ();
405 	      expld.result.value = align_n (expld.dot, expld.result.value);
406 	    }
407 	  else
408 	    expld.result.valid_p = FALSE;
409 	  break;
410 
411 	case DATA_SEGMENT_END:
412 	  fold_segment_end (&expld.dataseg);
413 	  break;
414 
415 	default:
416 	  FAIL ();
417 	  break;
418 	}
419     }
420 }
421 
422 /* Arithmetic operators, bitwise AND, bitwise OR and XOR keep the
423    section of one of their operands only when the other operand is a
424    plain number.  Losing the section when operating on two symbols,
425    ie. a result of a plain number, is required for subtraction and
426    XOR.  It's justifiable for the other operations on the grounds that
427    adding, multiplying etc. two section relative values does not
428    really make sense unless they are just treated as numbers.
429    The same argument could be made for many expressions involving one
430    symbol and a number.  For example, "1 << x" and "100 / x" probably
431    should not be given the section of x.  The trouble is that if we
432    fuss about such things the rules become complex and it is onerous
433    to document ld expression evaluation.  */
434 static void
435 arith_result_section (const etree_value_type *lhs)
436 {
437   if (expld.result.section == lhs->section)
438     {
439       if (expld.section == bfd_abs_section_ptr
440 	  && !config.sane_expr)
441 	/* Duplicate the insanity in exp_fold_tree_1 case etree_value.  */
442 	expld.result.section = bfd_abs_section_ptr;
443       else
444 	expld.result.section = NULL;
445     }
446 }
447 
448 static void
449 fold_segment_align (seg_align_type *seg, etree_value_type *lhs)
450 {
451   seg->relro = exp_seg_relro_start;
452   if (expld.phase == lang_first_phase_enum
453       || expld.section != bfd_abs_section_ptr)
454     expld.result.valid_p = FALSE;
455   else
456     {
457       bfd_vma maxpage = lhs->value;
458       bfd_vma commonpage = expld.result.value;
459 
460       expld.result.value = align_n (expld.dot, maxpage);
461       if (seg->phase == exp_seg_relro_adjust)
462 	expld.result.value = seg->base;
463       else if (seg->phase == exp_seg_adjust)
464 	{
465 	  if (commonpage < maxpage)
466 	    expld.result.value += ((expld.dot + commonpage - 1)
467 				   & (maxpage - commonpage));
468 	}
469       else
470 	{
471 	  expld.result.value += expld.dot & (maxpage - 1);
472 	  if (seg->phase == exp_seg_done)
473 	    {
474 	      /* OK.  */
475 	    }
476 	  else if (seg->phase == exp_seg_none)
477 	    {
478 	      seg->phase = exp_seg_align_seen;
479 	      seg->base = expld.result.value;
480 	      seg->pagesize = commonpage;
481 	      seg->maxpagesize = maxpage;
482 	      seg->relro_end = 0;
483 	    }
484 	  else
485 	    expld.result.valid_p = FALSE;
486 	}
487     }
488 }
489 
490 static void
491 fold_segment_relro_end (seg_align_type *seg, etree_value_type *lhs)
492 {
493   /* Operands swapped!  XXX_SEGMENT_RELRO_END(offset,exp) has offset
494      in expld.result and exp in lhs.  */
495   seg->relro = exp_seg_relro_end;
496   seg->relro_offset = expld.result.value;
497   if (expld.phase == lang_first_phase_enum
498       || expld.section != bfd_abs_section_ptr)
499     expld.result.valid_p = FALSE;
500   else if (seg->phase == exp_seg_align_seen
501 	   || seg->phase == exp_seg_adjust
502 	   || seg->phase == exp_seg_relro_adjust
503 	   || seg->phase == exp_seg_done)
504     {
505       if (seg->phase == exp_seg_align_seen
506 	  || seg->phase == exp_seg_relro_adjust)
507 	seg->relro_end = lhs->value + expld.result.value;
508 
509       if (seg->phase == exp_seg_relro_adjust
510 	  && (seg->relro_end & (seg->pagesize - 1)))
511 	{
512 	  seg->relro_end += seg->pagesize - 1;
513 	  seg->relro_end &= ~(seg->pagesize - 1);
514 	  expld.result.value = seg->relro_end - expld.result.value;
515 	}
516       else
517 	expld.result.value = lhs->value;
518 
519       if (seg->phase == exp_seg_align_seen)
520 	seg->phase = exp_seg_relro_seen;
521     }
522   else
523     expld.result.valid_p = FALSE;
524 }
525 
526 static void
527 fold_binary (etree_type *tree)
528 {
529   etree_value_type lhs;
530   exp_fold_tree_1 (tree->binary.lhs);
531 
532   /* The SEGMENT_START operator is special because its first
533      operand is a string, not the name of a symbol.  Note that the
534      operands have been swapped, so binary.lhs is second (default)
535      operand, binary.rhs is first operand.  */
536   if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
537     {
538       bfd_vma value = expld.result.value;
539       const char *segment_name;
540       segment_type *seg;
541 
542       /* Check to see if the user has overridden the default
543 	 value.  */
544       segment_name = tree->binary.rhs->name.name;
545       for (seg = segments; seg; seg = seg->next)
546 	if (strcmp (seg->name, segment_name) == 0)
547 	  {
548 	    if (!seg->used
549 		&& config.magic_demand_paged
550 		&& config.maxpagesize != 0
551 		&& (seg->value % config.maxpagesize) != 0)
552 	      einfo (_("%P: warning: address of `%s' "
553 		       "isn't multiple of maximum page size\n"),
554 		     segment_name);
555 	    seg->used = TRUE;
556 	    value = seg->value;
557 	    break;
558 	  }
559       new_rel_from_abs (value);
560       return;
561     }
562 
563   lhs = expld.result;
564   exp_fold_tree_1 (tree->binary.rhs);
565   expld.result.valid_p &= lhs.valid_p;
566 
567   if (expld.result.valid_p)
568     {
569       if (lhs.section != expld.result.section)
570 	{
571 	  /* If the values are from different sections, and neither is
572 	     just a number, make both the source arguments absolute.  */
573 	  if (expld.result.section != NULL
574 	      && lhs.section != NULL)
575 	    {
576 	      make_abs ();
577 	      lhs.value += lhs.section->vma;
578 	      lhs.section = bfd_abs_section_ptr;
579 	    }
580 
581 	  /* If the rhs is just a number, keep the lhs section.  */
582 	  else if (expld.result.section == NULL)
583 	    {
584 	      expld.result.section = lhs.section;
585 	      /* Make this NULL so that we know one of the operands
586 		 was just a number, for later tests.  */
587 	      lhs.section = NULL;
588 	    }
589 	}
590       /* At this point we know that both operands have the same
591 	 section, or at least one of them is a plain number.  */
592 
593       switch (tree->type.node_code)
594 	{
595 #define BOP(x, y) \
596 	case x:							\
597 	  expld.result.value = lhs.value y expld.result.value;	\
598 	  arith_result_section (&lhs);				\
599 	  break;
600 
601 	  /* Comparison operators, logical AND, and logical OR always
602 	     return a plain number.  */
603 #define BOPN(x, y) \
604 	case x:							\
605 	  expld.result.value = lhs.value y expld.result.value;	\
606 	  expld.result.section = NULL;				\
607 	  break;
608 
609 	  BOP ('+', +);
610 	  BOP ('*', *);
611 	  BOP ('-', -);
612 	  BOP (LSHIFT, <<);
613 	  BOP (RSHIFT, >>);
614 	  BOP ('&', &);
615 	  BOP ('^', ^);
616 	  BOP ('|', |);
617 	  BOPN (EQ, ==);
618 	  BOPN (NE, !=);
619 	  BOPN ('<', <);
620 	  BOPN ('>', >);
621 	  BOPN (LE, <=);
622 	  BOPN (GE, >=);
623 	  BOPN (ANDAND, &&);
624 	  BOPN (OROR, ||);
625 
626 	case '%':
627 	  if (expld.result.value != 0)
628 	    expld.result.value = ((bfd_signed_vma) lhs.value
629 				  % (bfd_signed_vma) expld.result.value);
630 	  else if (expld.phase != lang_mark_phase_enum)
631 	    einfo (_("%F%P:%pS %% by zero\n"), tree->binary.rhs);
632 	  arith_result_section (&lhs);
633 	  break;
634 
635 	case '/':
636 	  if (expld.result.value != 0)
637 	    expld.result.value = ((bfd_signed_vma) lhs.value
638 				  / (bfd_signed_vma) expld.result.value);
639 	  else if (expld.phase != lang_mark_phase_enum)
640 	    einfo (_("%F%P:%pS / by zero\n"), tree->binary.rhs);
641 	  arith_result_section (&lhs);
642 	  break;
643 
644 	case MAX_K:
645 	  if (lhs.value > expld.result.value)
646 	    expld.result.value = lhs.value;
647 	  break;
648 
649 	case MIN_K:
650 	  if (lhs.value < expld.result.value)
651 	    expld.result.value = lhs.value;
652 	  break;
653 
654 	case ALIGN_K:
655 	  expld.result.value = align_n (lhs.value, expld.result.value);
656 	  break;
657 
658 	case DATA_SEGMENT_ALIGN:
659 	  fold_segment_align (&expld.dataseg, &lhs);
660 	  break;
661 
662 	case DATA_SEGMENT_RELRO_END:
663 	  fold_segment_relro_end (&expld.dataseg, &lhs);
664 	  break;
665 
666 	default:
667 	  FAIL ();
668 	}
669     }
670 }
671 
672 static void
673 fold_trinary (etree_type *tree)
674 {
675   struct bfd_link_hash_entry *save = expld.assign_src;
676 
677   exp_fold_tree_1 (tree->trinary.cond);
678   expld.assign_src = save;
679   if (expld.result.valid_p)
680     exp_fold_tree_1 (expld.result.value
681 		     ? tree->trinary.lhs
682 		     : tree->trinary.rhs);
683 }
684 
685 static void
686 fold_name (etree_type *tree)
687 {
688   struct bfd_link_hash_entry *h;
689   struct definedness_hash_entry *def;
690 
691   memset (&expld.result, 0, sizeof (expld.result));
692 
693   switch (tree->type.node_code)
694     {
695     case SIZEOF_HEADERS:
696       link_info.load_phdrs = 1;
697       if (expld.phase != lang_first_phase_enum)
698 	{
699 	  bfd_vma hdr_size = 0;
700 	  /* Don't find the real header size if only marking sections;
701 	     The bfd function may cache incorrect data.  */
702 	  if (expld.phase != lang_mark_phase_enum)
703 	    hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
704 	  new_number (hdr_size);
705 	}
706       break;
707 
708     case DEFINED:
709       h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
710 					&link_info,
711 					tree->name.name,
712 					FALSE, FALSE, TRUE);
713       new_number (h != NULL
714 		  && (h->type == bfd_link_hash_defined
715 		      || h->type == bfd_link_hash_defweak
716 		      || h->type == bfd_link_hash_common)
717 		  && (!h->ldscript_def
718 		      || (def = symbol_defined (tree->name.name)) == NULL
719 		      || def->by_object
720 		      || def->iteration == (lang_statement_iteration & 255)));
721       break;
722 
723     case NAME:
724       if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
725 	new_rel_from_abs (expld.dot);
726       else
727 	{
728 	  h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
729 					    &link_info,
730 					    tree->name.name,
731 					    TRUE, FALSE, TRUE);
732 	  if (!h)
733 	    {
734 	      if (expld.phase != lang_first_phase_enum)
735 		einfo (_("%F%P: bfd_link_hash_lookup failed: %E\n"));
736 	    }
737 	  else if (h->type == bfd_link_hash_defined
738 		   || h->type == bfd_link_hash_defweak)
739 	    {
740 	      asection *output_section;
741 
742 	      output_section = h->u.def.section->output_section;
743 	      if (output_section == NULL)
744 		{
745 		  if (expld.phase <= lang_mark_phase_enum)
746 		    new_rel (h->u.def.value, h->u.def.section);
747 		  else
748 		    einfo (_("%X%P:%pS: unresolvable symbol `%s'"
749 			     " referenced in expression\n"),
750 			   tree, tree->name.name);
751 		}
752 	      else if (output_section == bfd_abs_section_ptr
753 		       && (expld.section != bfd_abs_section_ptr
754 			   || config.sane_expr))
755 		new_number (h->u.def.value + h->u.def.section->output_offset);
756 	      else
757 		new_rel (h->u.def.value + h->u.def.section->output_offset,
758 			 output_section);
759 	    }
760 	  else if (expld.phase == lang_final_phase_enum
761 		   || (expld.phase != lang_mark_phase_enum
762 		       && expld.assigning_to_dot))
763 	    einfo (_("%F%P:%pS: undefined symbol `%s'"
764 		     " referenced in expression\n"),
765 		   tree, tree->name.name);
766 	  else if (h->type == bfd_link_hash_new)
767 	    {
768 	      h->type = bfd_link_hash_undefined;
769 	      h->u.undef.abfd = NULL;
770 	      if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
771 		bfd_link_add_undef (link_info.hash, h);
772 	    }
773 	  if (expld.assign_src == NULL)
774 	    expld.assign_src = h;
775 	  else
776 	    expld.assign_src = (struct bfd_link_hash_entry *) - 1;
777 
778 	  /* Self-assignment is only allowed for absolute symbols
779 	     defined in a linker script.  */
780 	  if (expld.assign_name != NULL
781 	      && strcmp (expld.assign_name, tree->name.name) == 0
782 	      && !(h != NULL
783 		   && (h->type == bfd_link_hash_defined
784 		       || h->type == bfd_link_hash_defweak)
785 		   && h->u.def.section == bfd_abs_section_ptr
786 		   && (def = symbol_defined (tree->name.name)) != NULL
787 		   && def->iteration == (lang_statement_iteration & 255)))
788 	    expld.assign_name = NULL;
789 	}
790       break;
791 
792     case ADDR:
793       if (expld.phase != lang_first_phase_enum)
794 	{
795 	  lang_output_section_statement_type *os;
796 
797 	  os = lang_output_section_find (tree->name.name);
798 	  if (os == NULL)
799 	    {
800 	      if (expld.phase == lang_final_phase_enum)
801 		einfo (_("%F%P:%pS: undefined section `%s'"
802 			 " referenced in expression\n"),
803 		       tree, tree->name.name);
804 	    }
805 	  else if (os->processed_vma)
806 	    new_rel (0, os->bfd_section);
807 	}
808       break;
809 
810     case LOADADDR:
811       if (expld.phase != lang_first_phase_enum)
812 	{
813 	  lang_output_section_statement_type *os;
814 
815 	  os = lang_output_section_find (tree->name.name);
816 	  if (os == NULL)
817 	    {
818 	      if (expld.phase == lang_final_phase_enum)
819 		einfo (_("%F%P:%pS: undefined section `%s'"
820 			 " referenced in expression\n"),
821 		       tree, tree->name.name);
822 	    }
823 	  else if (os->processed_lma)
824 	    {
825 	      if (os->load_base == NULL)
826 		new_abs (os->bfd_section->lma);
827 	      else
828 		{
829 		  exp_fold_tree_1 (os->load_base);
830 		  if (expld.result.valid_p)
831 		    make_abs ();
832 		}
833 	    }
834 	}
835       break;
836 
837     case SIZEOF:
838     case ALIGNOF:
839       if (expld.phase != lang_first_phase_enum)
840 	{
841 	  lang_output_section_statement_type *os;
842 
843 	  os = lang_output_section_find (tree->name.name);
844 	  if (os == NULL)
845 	    {
846 	      if (expld.phase == lang_final_phase_enum)
847 		einfo (_("%F%P:%pS: undefined section `%s'"
848 			 " referenced in expression\n"),
849 		       tree, tree->name.name);
850 	      new_number (0);
851 	    }
852 	  else if (os->bfd_section != NULL)
853 	    {
854 	      bfd_vma val;
855 
856 	      if (tree->type.node_code == SIZEOF)
857 		val = (os->bfd_section->size
858 		       / bfd_octets_per_byte (link_info.output_bfd,
859 					      os->bfd_section));
860 	      else
861 		val = (bfd_vma)1 << os->bfd_section->alignment_power;
862 
863 	      new_number (val);
864 	    }
865 	  else
866 	    new_number (0);
867 	}
868       break;
869 
870     case LENGTH:
871       {
872 	lang_memory_region_type *mem;
873 
874 	mem = lang_memory_region_lookup (tree->name.name, FALSE);
875 	if (mem != NULL)
876 	  new_number (mem->length);
877 	else
878 	  einfo (_("%F%P:%pS: undefined MEMORY region `%s'"
879 		   " referenced in expression\n"),
880 		 tree, tree->name.name);
881       }
882       break;
883 
884     case ORIGIN:
885       {
886 	lang_memory_region_type *mem;
887 
888 	mem = lang_memory_region_lookup (tree->name.name, FALSE);
889 	if (mem != NULL)
890 	  new_rel_from_abs (mem->origin);
891 	else
892 	  einfo (_("%F%P:%pS: undefined MEMORY region `%s'"
893 		   " referenced in expression\n"),
894 		 tree, tree->name.name);
895       }
896       break;
897 
898     case CONSTANT:
899       if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
900 	new_number (config.maxpagesize);
901       else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
902 	new_number (config.commonpagesize);
903       else
904 	einfo (_("%F%P:%pS: unknown constant `%s' referenced in expression\n"),
905 	       tree, tree->name.name);
906       break;
907 
908     default:
909       FAIL ();
910       break;
911     }
912 }
913 
914 /* Return true if TREE is '.'.  */
915 
916 static bfd_boolean
917 is_dot (const etree_type *tree)
918 {
919   return (tree->type.node_class == etree_name
920 	  && tree->type.node_code == NAME
921 	  && tree->name.name[0] == '.'
922 	  && tree->name.name[1] == 0);
923 }
924 
925 /* Return true if TREE is a constant equal to VAL.  */
926 
927 static bfd_boolean
928 is_value (const etree_type *tree, bfd_vma val)
929 {
930   return (tree->type.node_class == etree_value
931 	  && tree->value.value == val);
932 }
933 
934 /* Return true if TREE is an absolute symbol equal to VAL defined in
935    a linker script.  */
936 
937 static bfd_boolean
938 is_sym_value (const etree_type *tree, bfd_vma val)
939 {
940   struct bfd_link_hash_entry *h;
941   struct definedness_hash_entry *def;
942 
943   return (tree->type.node_class == etree_name
944 	  && tree->type.node_code == NAME
945 	  && (def = symbol_defined (tree->name.name)) != NULL
946 	  && def->iteration == (lang_statement_iteration & 255)
947 	  && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
948 						&link_info,
949 						tree->name.name,
950 						FALSE, FALSE, TRUE)) != NULL
951 	  && h->ldscript_def
952 	  && h->type == bfd_link_hash_defined
953 	  && h->u.def.section == bfd_abs_section_ptr
954 	  && h->u.def.value == val);
955 }
956 
957 /* Return true if TREE is ". != 0".  */
958 
959 static bfd_boolean
960 is_dot_ne_0 (const etree_type *tree)
961 {
962   return (tree->type.node_class == etree_binary
963 	  && tree->type.node_code == NE
964 	  && is_dot (tree->binary.lhs)
965 	  && is_value (tree->binary.rhs, 0));
966 }
967 
968 /* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an
969    absolute constant with value 0 defined in a linker script.  */
970 
971 static bfd_boolean
972 is_dot_plus_0 (const etree_type *tree)
973 {
974   return (tree->type.node_class == etree_binary
975 	  && tree->type.node_code == '+'
976 	  && is_dot (tree->binary.lhs)
977 	  && (is_value (tree->binary.rhs, 0)
978 	      || is_sym_value (tree->binary.rhs, 0)));
979 }
980 
981 /* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)".  */
982 
983 static bfd_boolean
984 is_align_conditional (const etree_type *tree)
985 {
986   if (tree->type.node_class == etree_unary
987       && tree->type.node_code == ALIGN_K)
988     {
989       tree = tree->unary.child;
990       return (tree->type.node_class == etree_trinary
991 	      && is_dot_ne_0 (tree->trinary.cond)
992 	      && is_value (tree->trinary.rhs, 1));
993     }
994   return FALSE;
995 }
996 
997 static void
998 exp_fold_tree_1 (etree_type *tree)
999 {
1000   if (tree == NULL)
1001     {
1002       memset (&expld.result, 0, sizeof (expld.result));
1003       return;
1004     }
1005 
1006   switch (tree->type.node_class)
1007     {
1008     case etree_value:
1009       if (expld.section == bfd_abs_section_ptr
1010 	  && !config.sane_expr)
1011 	new_abs (tree->value.value);
1012       else
1013 	new_number (tree->value.value);
1014       expld.result.str = tree->value.str;
1015       break;
1016 
1017     case etree_rel:
1018       if (expld.phase != lang_first_phase_enum)
1019 	{
1020 	  asection *output_section = tree->rel.section->output_section;
1021 	  new_rel (tree->rel.value + tree->rel.section->output_offset,
1022 		   output_section);
1023 	}
1024       else
1025 	memset (&expld.result, 0, sizeof (expld.result));
1026       break;
1027 
1028     case etree_assert:
1029       exp_fold_tree_1 (tree->assert_s.child);
1030       if (expld.phase == lang_final_phase_enum && !expld.result.value)
1031 	einfo ("%X%P: %s\n", tree->assert_s.message);
1032       break;
1033 
1034     case etree_unary:
1035       fold_unary (tree);
1036       break;
1037 
1038     case etree_binary:
1039       fold_binary (tree);
1040       break;
1041 
1042     case etree_trinary:
1043       fold_trinary (tree);
1044       break;
1045 
1046     case etree_assign:
1047     case etree_provide:
1048     case etree_provided:
1049       if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
1050 	{
1051 	  if (tree->type.node_class != etree_assign)
1052 	    einfo (_("%F%P:%pS can not PROVIDE assignment to"
1053 		     " location counter\n"), tree);
1054 	  if (expld.phase != lang_first_phase_enum)
1055 	    {
1056 	      /* Notify the folder that this is an assignment to dot.  */
1057 	      expld.assigning_to_dot = TRUE;
1058 	      exp_fold_tree_1 (tree->assign.src);
1059 	      expld.assigning_to_dot = FALSE;
1060 
1061 	      /* If we are assigning to dot inside an output section
1062 		 arrange to keep the section, except for certain
1063 		 expressions that evaluate to zero.  We ignore . = 0,
1064 		 . = . + 0, and . = ALIGN (. != 0 ? expr : 1).
1065 		 We can't ignore all expressions that evaluate to zero
1066 		 because an otherwise empty section might have padding
1067 		 added by an alignment expression that changes with
1068 		 relaxation.  Such a section might have zero size
1069 		 before relaxation and so be stripped incorrectly.  */
1070 	      if (expld.phase == lang_mark_phase_enum
1071 		  && expld.section != bfd_abs_section_ptr
1072 		  && expld.section != bfd_und_section_ptr
1073 		  && !(expld.result.valid_p
1074 		       && expld.result.value == 0
1075 		       && (is_value (tree->assign.src, 0)
1076 			   || is_sym_value (tree->assign.src, 0)
1077 			   || is_dot_plus_0 (tree->assign.src)
1078 			   || is_align_conditional (tree->assign.src))))
1079 		expld.section->flags |= SEC_KEEP;
1080 
1081 	      if (!expld.result.valid_p
1082 		  || expld.section == bfd_und_section_ptr)
1083 		{
1084 		  if (expld.phase != lang_mark_phase_enum)
1085 		    einfo (_("%F%P:%pS invalid assignment to"
1086 			     " location counter\n"), tree);
1087 		}
1088 	      else if (expld.dotp == NULL)
1089 		einfo (_("%F%P:%pS assignment to location counter"
1090 			 " invalid outside of SECTIONS\n"), tree);
1091 
1092 	      /* After allocation, assignment to dot should not be
1093 		 done inside an output section since allocation adds a
1094 		 padding statement that effectively duplicates the
1095 		 assignment.  */
1096 	      else if (expld.phase <= lang_allocating_phase_enum
1097 		       || expld.section == bfd_abs_section_ptr)
1098 		{
1099 		  bfd_vma nextdot;
1100 
1101 		  nextdot = expld.result.value;
1102 		  if (expld.result.section != NULL)
1103 		    nextdot += expld.result.section->vma;
1104 		  else
1105 		    nextdot += expld.section->vma;
1106 		  if (nextdot < expld.dot
1107 		      && expld.section != bfd_abs_section_ptr)
1108 		    einfo (_("%F%P:%pS cannot move location counter backwards"
1109 			     " (from %V to %V)\n"),
1110 			   tree, expld.dot, nextdot);
1111 		  else
1112 		    {
1113 		      expld.dot = nextdot;
1114 		      *expld.dotp = nextdot;
1115 		    }
1116 		}
1117 	    }
1118 	  else
1119 	    memset (&expld.result, 0, sizeof (expld.result));
1120 	}
1121       else
1122 	{
1123 	  struct bfd_link_hash_entry *h = NULL;
1124 
1125 	  if (tree->type.node_class == etree_provide)
1126 	    {
1127 	      h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1128 					FALSE, FALSE, TRUE);
1129 	      if (h == NULL
1130 		  || !(h->type == bfd_link_hash_new
1131 		       || h->type == bfd_link_hash_undefined
1132 		       || h->type == bfd_link_hash_undefweak
1133 		       || h->linker_def))
1134 		{
1135 		  /* Do nothing.  The symbol was never referenced, or
1136 		     was defined in some object file.  Note that
1137 		     undefweak symbols are defined by PROVIDE.  This
1138 		     is to support glibc use of __rela_iplt_start and
1139 		     similar weak references.  */
1140 		  break;
1141 		}
1142 	    }
1143 
1144 	  expld.assign_name = tree->assign.dst;
1145 	  expld.assign_src = NULL;
1146 	  exp_fold_tree_1 (tree->assign.src);
1147 	  /* expld.assign_name remaining equal to tree->assign.dst
1148 	     below indicates the evaluation of tree->assign.src did
1149 	     not use the value of tree->assign.dst.  We don't allow
1150 	     self assignment until the final phase for two reasons:
1151 	     1) Expressions are evaluated multiple times.  With
1152 	     relaxation, the number of times may vary.
1153 	     2) Section relative symbol values cannot be correctly
1154 	     converted to absolute values, as is required by many
1155 	     expressions, until final section sizing is complete.  */
1156 	  if (expld.phase == lang_final_phase_enum
1157 	      || expld.phase == lang_fixed_phase_enum
1158 	      || expld.assign_name != NULL)
1159 	    {
1160 	      if (tree->type.node_class == etree_provide)
1161 		tree->type.node_class = etree_provided;
1162 
1163 	      if (h == NULL)
1164 		{
1165 		  h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1166 					    TRUE, FALSE, TRUE);
1167 		  if (h == NULL)
1168 		    einfo (_("%F%P:%s: hash creation failed\n"),
1169 			   tree->assign.dst);
1170 		}
1171 
1172               /* If the expression is not valid then fake a zero value.  In
1173                  the final phase any errors will already have been raised,
1174                  in earlier phases we want to create this definition so
1175                  that it can be seen by other expressions.  */
1176               if (!expld.result.valid_p
1177                   && h->type == bfd_link_hash_new)
1178                 {
1179                   expld.result.value = 0;
1180                   expld.result.section = NULL;
1181                   expld.result.valid_p = TRUE;
1182                 }
1183 
1184 	      if (expld.result.valid_p)
1185 		{
1186 		  if (expld.result.section == NULL)
1187 		    expld.result.section = expld.section;
1188 		  if (!update_definedness (tree->assign.dst, h) && 0)
1189 		    {
1190 		      /* Symbol was already defined.  For now this error
1191 			 is disabled because it causes failures in the ld
1192 			 testsuite: ld-elf/var1, ld-scripts/defined5, and
1193 			 ld-scripts/pr14962.  Some of these no doubt
1194 			 reflect scripts used in the wild.  */
1195 		      (*link_info.callbacks->multiple_definition)
1196 			(&link_info, h, link_info.output_bfd,
1197 			 expld.result.section, expld.result.value);
1198 		    }
1199 		  if (expld.phase == lang_fixed_phase_enum)
1200 		    {
1201 		      if (h->type == bfd_link_hash_defined)
1202 			{
1203 			  expld.result.value = h->u.def.value;
1204 			  expld.result.section = h->u.def.section;
1205 			}
1206 		    }
1207 		  else
1208 		    {
1209 		      h->type = bfd_link_hash_defined;
1210 		      h->u.def.value = expld.result.value;
1211 		      h->u.def.section = expld.result.section;
1212 		      h->linker_def = ! tree->assign.type.lineno;
1213 		      h->ldscript_def = 1;
1214 		      h->rel_from_abs = expld.rel_from_abs;
1215 		      if (tree->assign.hidden)
1216 			bfd_link_hide_symbol (link_info.output_bfd,
1217 					      &link_info, h);
1218 
1219 		      /* Copy the symbol type if this is an expression only
1220 			 referencing a single symbol.  (If the expression
1221 			 contains ternary conditions, ignoring symbols on
1222 			 false branches.)  */
1223 		      if (expld.assign_src != NULL
1224 			  && (expld.assign_src
1225 			      != (struct bfd_link_hash_entry *) -1))
1226 			bfd_copy_link_hash_symbol_type (link_info.output_bfd,
1227 							h, expld.assign_src);
1228 		    }
1229 		}
1230 	    }
1231 	  if (expld.phase != lang_fixed_phase_enum)
1232 	    expld.assign_name = NULL;
1233 	}
1234       break;
1235 
1236     case etree_name:
1237       fold_name (tree);
1238       break;
1239 
1240     default:
1241       FAIL ();
1242       memset (&expld.result, 0, sizeof (expld.result));
1243       break;
1244     }
1245 }
1246 
1247 void
1248 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
1249 {
1250   expld.rel_from_abs = FALSE;
1251   expld.dot = *dotp;
1252   expld.dotp = dotp;
1253   expld.section = current_section;
1254   exp_fold_tree_1 (tree);
1255 }
1256 
1257 void
1258 exp_fold_tree_no_dot (etree_type *tree)
1259 {
1260   expld.rel_from_abs = FALSE;
1261   expld.dot = 0;
1262   expld.dotp = NULL;
1263   expld.section = bfd_abs_section_ptr;
1264   exp_fold_tree_1 (tree);
1265 }
1266 
1267 static void
1268 exp_value_fold (etree_type *tree)
1269 {
1270   exp_fold_tree_no_dot (tree);
1271   if (expld.result.valid_p)
1272     {
1273       tree->type.node_code = INT;
1274       tree->value.value = expld.result.value;
1275       tree->value.str = NULL;
1276       tree->type.node_class = etree_value;
1277     }
1278 }
1279 
1280 #define MAX(a, b) ((a) > (b) ? (a) : (b))
1281 
1282 etree_type *
1283 exp_binop (int code, etree_type *lhs, etree_type *rhs)
1284 {
1285   etree_type *new_e = stat_alloc (MAX (sizeof (new_e->binary),
1286 				       sizeof (new_e->value)));
1287   new_e->type.node_code = code;
1288   new_e->type.filename = lhs->type.filename;
1289   new_e->type.lineno = lhs->type.lineno;
1290   new_e->binary.lhs = lhs;
1291   new_e->binary.rhs = rhs;
1292   new_e->type.node_class = etree_binary;
1293   if (lhs->type.node_class == etree_value
1294       && rhs->type.node_class == etree_value
1295       && code != ALIGN_K
1296       && code != DATA_SEGMENT_ALIGN
1297       && code != DATA_SEGMENT_RELRO_END)
1298     exp_value_fold (new_e);
1299   return new_e;
1300 }
1301 
1302 etree_type *
1303 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
1304 {
1305   etree_type *new_e = stat_alloc (MAX (sizeof (new_e->trinary),
1306 				       sizeof (new_e->value)));
1307   new_e->type.node_code = code;
1308   new_e->type.filename = cond->type.filename;
1309   new_e->type.lineno = cond->type.lineno;
1310   new_e->trinary.lhs = lhs;
1311   new_e->trinary.cond = cond;
1312   new_e->trinary.rhs = rhs;
1313   new_e->type.node_class = etree_trinary;
1314   if (cond->type.node_class == etree_value
1315       && lhs->type.node_class == etree_value
1316       && rhs->type.node_class == etree_value)
1317     exp_value_fold (new_e);
1318   return new_e;
1319 }
1320 
1321 etree_type *
1322 exp_unop (int code, etree_type *child)
1323 {
1324   etree_type *new_e = stat_alloc (MAX (sizeof (new_e->unary),
1325 				       sizeof (new_e->value)));
1326   new_e->unary.type.node_code = code;
1327   new_e->unary.type.filename = child->type.filename;
1328   new_e->unary.type.lineno = child->type.lineno;
1329   new_e->unary.child = child;
1330   new_e->unary.type.node_class = etree_unary;
1331   if (child->type.node_class == etree_value
1332       && code != ALIGN_K
1333       && code != ABSOLUTE
1334       && code != NEXT
1335       && code != DATA_SEGMENT_END)
1336     exp_value_fold (new_e);
1337   return new_e;
1338 }
1339 
1340 etree_type *
1341 exp_nameop (int code, const char *name)
1342 {
1343   etree_type *new_e = stat_alloc (sizeof (new_e->name));
1344 
1345   new_e->name.type.node_code = code;
1346   new_e->name.type.filename = ldlex_filename ();
1347   new_e->name.type.lineno = lineno;
1348   new_e->name.name = name;
1349   new_e->name.type.node_class = etree_name;
1350   return new_e;
1351 
1352 }
1353 
1354 static etree_type *
1355 exp_assop (const char *dst,
1356 	   etree_type *src,
1357 	   enum node_tree_enum class,
1358 	   bfd_boolean hidden)
1359 {
1360   etree_type *n;
1361 
1362   n = stat_alloc (sizeof (n->assign));
1363   n->assign.type.node_code = '=';
1364   n->assign.type.filename = src->type.filename;
1365   n->assign.type.lineno = src->type.lineno;
1366   n->assign.type.node_class = class;
1367   n->assign.src = src;
1368   n->assign.dst = dst;
1369   n->assign.hidden = hidden;
1370   return n;
1371 }
1372 
1373 /* Handle linker script assignments and HIDDEN.  */
1374 
1375 etree_type *
1376 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1377 {
1378   return exp_assop (dst, src, etree_assign, hidden);
1379 }
1380 
1381 /* Handle --defsym command-line option.  */
1382 
1383 etree_type *
1384 exp_defsym (const char *dst, etree_type *src)
1385 {
1386   return exp_assop (dst, src, etree_assign, FALSE);
1387 }
1388 
1389 /* Handle PROVIDE.  */
1390 
1391 etree_type *
1392 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1393 {
1394   return exp_assop (dst, src, etree_provide, hidden);
1395 }
1396 
1397 /* Handle ASSERT.  */
1398 
1399 etree_type *
1400 exp_assert (etree_type *exp, const char *message)
1401 {
1402   etree_type *n;
1403 
1404   n = stat_alloc (sizeof (n->assert_s));
1405   n->assert_s.type.node_code = '!';
1406   n->assert_s.type.filename = exp->type.filename;
1407   n->assert_s.type.lineno = exp->type.lineno;
1408   n->assert_s.type.node_class = etree_assert;
1409   n->assert_s.child = exp;
1410   n->assert_s.message = message;
1411   return n;
1412 }
1413 
1414 void
1415 exp_print_tree (etree_type *tree)
1416 {
1417   bfd_boolean function_like;
1418 
1419   if (config.map_file == NULL)
1420     config.map_file = stderr;
1421 
1422   if (tree == NULL)
1423     {
1424       minfo ("NULL TREE\n");
1425       return;
1426     }
1427 
1428   switch (tree->type.node_class)
1429     {
1430     case etree_value:
1431       minfo ("0x%v", tree->value.value);
1432       return;
1433     case etree_rel:
1434       if (tree->rel.section->owner != NULL)
1435 	minfo ("%pB:", tree->rel.section->owner);
1436       minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1437       return;
1438     case etree_assign:
1439       fputs (tree->assign.dst, config.map_file);
1440       exp_print_token (tree->type.node_code, TRUE);
1441       exp_print_tree (tree->assign.src);
1442       break;
1443     case etree_provide:
1444     case etree_provided:
1445       fprintf (config.map_file, "PROVIDE (%s = ", tree->assign.dst);
1446       exp_print_tree (tree->assign.src);
1447       fputc (')', config.map_file);
1448       break;
1449     case etree_binary:
1450       function_like = FALSE;
1451       switch (tree->type.node_code)
1452 	{
1453 	case MAX_K:
1454 	case MIN_K:
1455 	case ALIGN_K:
1456 	case DATA_SEGMENT_ALIGN:
1457 	case DATA_SEGMENT_RELRO_END:
1458 	  function_like = TRUE;
1459 	  break;
1460 	case SEGMENT_START:
1461 	  /* Special handling because arguments are in reverse order and
1462 	     the segment name is quoted.  */
1463 	  exp_print_token (tree->type.node_code, FALSE);
1464 	  fputs (" (\"", config.map_file);
1465 	  exp_print_tree (tree->binary.rhs);
1466 	  fputs ("\", ", config.map_file);
1467 	  exp_print_tree (tree->binary.lhs);
1468 	  fputc (')', config.map_file);
1469 	  return;
1470 	}
1471       if (function_like)
1472 	{
1473 	  exp_print_token (tree->type.node_code, FALSE);
1474 	  fputc (' ', config.map_file);
1475 	}
1476       fputc ('(', config.map_file);
1477       exp_print_tree (tree->binary.lhs);
1478       if (function_like)
1479 	fprintf (config.map_file, ", ");
1480       else
1481 	exp_print_token (tree->type.node_code, TRUE);
1482       exp_print_tree (tree->binary.rhs);
1483       fputc (')', config.map_file);
1484       break;
1485     case etree_trinary:
1486       exp_print_tree (tree->trinary.cond);
1487       fputc ('?', config.map_file);
1488       exp_print_tree (tree->trinary.lhs);
1489       fputc (':', config.map_file);
1490       exp_print_tree (tree->trinary.rhs);
1491       break;
1492     case etree_unary:
1493       exp_print_token (tree->unary.type.node_code, FALSE);
1494       if (tree->unary.child)
1495 	{
1496 	  fprintf (config.map_file, " (");
1497 	  exp_print_tree (tree->unary.child);
1498 	  fputc (')', config.map_file);
1499 	}
1500       break;
1501 
1502     case etree_assert:
1503       fprintf (config.map_file, "ASSERT (");
1504       exp_print_tree (tree->assert_s.child);
1505       fprintf (config.map_file, ", %s)", tree->assert_s.message);
1506       break;
1507 
1508     case etree_name:
1509       if (tree->type.node_code == NAME)
1510 	fputs (tree->name.name, config.map_file);
1511       else
1512 	{
1513 	  exp_print_token (tree->type.node_code, FALSE);
1514 	  if (tree->name.name)
1515 	    fprintf (config.map_file, " (%s)", tree->name.name);
1516 	}
1517       break;
1518     default:
1519       FAIL ();
1520       break;
1521     }
1522 }
1523 
1524 bfd_vma
1525 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1526 {
1527   if (tree != NULL)
1528     {
1529       exp_fold_tree_no_dot (tree);
1530       if (expld.result.valid_p)
1531 	return expld.result.value;
1532       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1533 	einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1534 	       tree, name);
1535     }
1536   return def;
1537 }
1538 
1539 /* Return the smallest non-negative integer such that two raised to
1540    that power is at least as large as the vma evaluated at TREE, if
1541    TREE is a non-NULL expression that can be resolved.  If TREE is
1542    NULL or cannot be resolved, return -1.  */
1543 
1544 int
1545 exp_get_power (etree_type *tree, char *name)
1546 {
1547   bfd_vma x = exp_get_vma (tree, -1, name);
1548   bfd_vma p2;
1549   int n;
1550 
1551   if (x == (bfd_vma) -1)
1552     return -1;
1553 
1554   for (n = 0, p2 = 1; p2 < x; ++n, p2 <<= 1)
1555     if (p2 == 0)
1556       break;
1557 
1558   return n;
1559 }
1560 
1561 fill_type *
1562 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1563 {
1564   fill_type *fill;
1565   size_t len;
1566   unsigned int val;
1567 
1568   if (tree == NULL)
1569     return def;
1570 
1571   exp_fold_tree_no_dot (tree);
1572   if (!expld.result.valid_p)
1573     {
1574       if (name != NULL && expld.phase != lang_mark_phase_enum)
1575 	einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1576 	       tree, name);
1577       return def;
1578     }
1579 
1580   if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1581     {
1582       unsigned char *dst;
1583       unsigned char *s;
1584       fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1585       fill->size = (len + 1) / 2;
1586       dst = fill->data;
1587       s = (unsigned char *) expld.result.str;
1588       val = 0;
1589       do
1590 	{
1591 	  unsigned int digit;
1592 
1593 	  digit = *s++ - '0';
1594 	  if (digit > 9)
1595 	    digit = (digit - 'A' + '0' + 10) & 0xf;
1596 	  val <<= 4;
1597 	  val += digit;
1598 	  --len;
1599 	  if ((len & 1) == 0)
1600 	    {
1601 	      *dst++ = val;
1602 	      val = 0;
1603 	    }
1604 	}
1605       while (len != 0);
1606     }
1607   else
1608     {
1609       fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1610       val = expld.result.value;
1611       fill->data[0] = (val >> 24) & 0xff;
1612       fill->data[1] = (val >> 16) & 0xff;
1613       fill->data[2] = (val >>  8) & 0xff;
1614       fill->data[3] = (val >>  0) & 0xff;
1615       fill->size = 4;
1616     }
1617   return fill;
1618 }
1619 
1620 bfd_vma
1621 exp_get_abs_int (etree_type *tree, int def, char *name)
1622 {
1623   if (tree != NULL)
1624     {
1625       exp_fold_tree_no_dot (tree);
1626 
1627       if (expld.result.valid_p)
1628 	{
1629 	  if (expld.result.section != NULL)
1630 	    expld.result.value += expld.result.section->vma;
1631 	  return expld.result.value;
1632 	}
1633       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1634 	{
1635 	  einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1636 		 tree, name);
1637 	}
1638     }
1639   return def;
1640 }
1641 
1642 static bfd_vma
1643 align_n (bfd_vma value, bfd_vma align)
1644 {
1645   if (align <= 1)
1646     return value;
1647 
1648   value = (value + align - 1) / align;
1649   return value * align;
1650 }
1651 
1652 void
1653 ldexp_init (void)
1654 {
1655   /* The value "13" is ad-hoc, somewhat related to the expected number of
1656      assignments in a linker script.  */
1657   if (!bfd_hash_table_init_n (&definedness_table,
1658 			      definedness_newfunc,
1659 			      sizeof (struct definedness_hash_entry),
1660 			      13))
1661     einfo (_("%F%P: can not create hash table: %E\n"));
1662 }
1663 
1664 /* Convert absolute symbols defined by a script from "dot" (also
1665    SEGMENT_START or ORIGIN) outside of an output section statement,
1666    to section relative.  */
1667 
1668 static bfd_boolean
1669 set_sym_sections (struct bfd_hash_entry *bh, void *inf ATTRIBUTE_UNUSED)
1670 {
1671   struct definedness_hash_entry *def = (struct definedness_hash_entry *) bh;
1672   if (def->final_sec != bfd_abs_section_ptr)
1673     {
1674       struct bfd_link_hash_entry *h;
1675       h = bfd_link_hash_lookup (link_info.hash, bh->string,
1676 				FALSE, FALSE, TRUE);
1677       if (h != NULL
1678 	  && h->type == bfd_link_hash_defined
1679 	  && h->u.def.section == bfd_abs_section_ptr)
1680 	{
1681 	  h->u.def.value -= def->final_sec->vma;
1682 	  h->u.def.section = def->final_sec;
1683 	}
1684     }
1685   return TRUE;
1686 }
1687 
1688 void
1689 ldexp_finalize_syms (void)
1690 {
1691   bfd_hash_traverse (&definedness_table, set_sym_sections, NULL);
1692 }
1693 
1694 void
1695 ldexp_finish (void)
1696 {
1697   bfd_hash_table_free (&definedness_table);
1698 }
1699