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