xref: /netbsd-src/external/gpl3/binutils/dist/ld/ldexp.c (revision 413d532bcc3f62d122e56d92e13ac64825a40baf)
1 /* This module handles expression trees.
2    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
4    Free Software Foundation, Inc.
5    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
6 
7    This file is part of the GNU Binutils.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22    MA 02110-1301, USA.  */
23 
24 
25 /* This module is in charge of working out the contents of expressions.
26 
27    It has to keep track of the relative/absness of a symbol etc. This
28    is done by keeping all values in a struct (an etree_value_type)
29    which contains a value, a section to which it is relative and a
30    valid bit.  */
31 
32 #include "sysdep.h"
33 #include "bfd.h"
34 #include "bfdlink.h"
35 
36 #include "ld.h"
37 #include "ldmain.h"
38 #include "ldmisc.h"
39 #include "ldexp.h"
40 #include "ldlex.h"
41 #include <ldgram.h>
42 #include "ldlang.h"
43 #include "libiberty.h"
44 #include "safe-ctype.h"
45 
46 static void exp_fold_tree_1 (etree_type *);
47 static bfd_vma align_n (bfd_vma, bfd_vma);
48 
49 segment_type *segments;
50 
51 struct ldexp_control expld;
52 
53 /* Print the string representation of the given token.  Surround it
54    with spaces if INFIX_P is TRUE.  */
55 
56 static void
57 exp_print_token (token_code_type code, int infix_p)
58 {
59   static const struct
60   {
61     token_code_type code;
62     const char * name;
63   }
64   table[] =
65   {
66     { INT, "int" },
67     { NAME, "NAME" },
68     { PLUSEQ, "+=" },
69     { MINUSEQ, "-=" },
70     { MULTEQ, "*=" },
71     { DIVEQ, "/=" },
72     { LSHIFTEQ, "<<=" },
73     { RSHIFTEQ, ">>=" },
74     { ANDEQ, "&=" },
75     { OREQ, "|=" },
76     { OROR, "||" },
77     { ANDAND, "&&" },
78     { EQ, "==" },
79     { NE, "!=" },
80     { LE, "<=" },
81     { GE, ">=" },
82     { LSHIFT, "<<" },
83     { RSHIFT, ">>" },
84     { ALIGN_K, "ALIGN" },
85     { BLOCK, "BLOCK" },
86     { QUAD, "QUAD" },
87     { SQUAD, "SQUAD" },
88     { LONG, "LONG" },
89     { SHORT, "SHORT" },
90     { BYTE, "BYTE" },
91     { SECTIONS, "SECTIONS" },
92     { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
93     { MEMORY, "MEMORY" },
94     { DEFINED, "DEFINED" },
95     { TARGET_K, "TARGET" },
96     { SEARCH_DIR, "SEARCH_DIR" },
97     { MAP, "MAP" },
98     { ENTRY, "ENTRY" },
99     { NEXT, "NEXT" },
100     { ALIGNOF, "ALIGNOF" },
101     { SIZEOF, "SIZEOF" },
102     { ADDR, "ADDR" },
103     { LOADADDR, "LOADADDR" },
104     { CONSTANT, "CONSTANT" },
105     { ABSOLUTE, "ABSOLUTE" },
106     { MAX_K, "MAX" },
107     { MIN_K, "MIN" },
108     { ASSERT_K, "ASSERT" },
109     { REL, "relocatable" },
110     { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
111     { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
112     { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
113     { ORIGIN, "ORIGIN" },
114     { LENGTH, "LENGTH" },
115     { SEGMENT_START, "SEGMENT_START" }
116   };
117   unsigned int idx;
118 
119   for (idx = 0; idx < ARRAY_SIZE (table); idx++)
120     if (table[idx].code == code)
121       break;
122 
123   if (infix_p)
124     fputc (' ', config.map_file);
125 
126   if (idx < ARRAY_SIZE (table))
127     fputs (table[idx].name, config.map_file);
128   else if (code < 127)
129     fputc (code, config.map_file);
130   else
131     fprintf (config.map_file, "<code %d>", code);
132 
133   if (infix_p)
134     fputc (' ', config.map_file);
135 }
136 
137 static void
138 make_abs (void)
139 {
140   if (expld.result.section != NULL)
141     expld.result.value += expld.result.section->vma;
142   expld.result.section = bfd_abs_section_ptr;
143 }
144 
145 static void
146 new_abs (bfd_vma value)
147 {
148   expld.result.valid_p = TRUE;
149   expld.result.section = bfd_abs_section_ptr;
150   expld.result.value = value;
151   expld.result.str = NULL;
152 }
153 
154 etree_type *
155 exp_intop (bfd_vma value)
156 {
157   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
158   new_e->type.node_code = INT;
159   new_e->type.filename = ldlex_filename ();
160   new_e->type.lineno = lineno;
161   new_e->value.value = value;
162   new_e->value.str = NULL;
163   new_e->type.node_class = etree_value;
164   return new_e;
165 }
166 
167 etree_type *
168 exp_bigintop (bfd_vma value, char *str)
169 {
170   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
171   new_e->type.node_code = INT;
172   new_e->type.filename = ldlex_filename ();
173   new_e->type.lineno = lineno;
174   new_e->value.value = value;
175   new_e->value.str = str;
176   new_e->type.node_class = etree_value;
177   return new_e;
178 }
179 
180 /* Build an expression representing an unnamed relocatable value.  */
181 
182 etree_type *
183 exp_relop (asection *section, bfd_vma value)
184 {
185   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->rel));
186   new_e->type.node_code = REL;
187   new_e->type.filename = ldlex_filename ();
188   new_e->type.lineno = lineno;
189   new_e->type.node_class = etree_rel;
190   new_e->rel.section = section;
191   new_e->rel.value = value;
192   return new_e;
193 }
194 
195 static void
196 new_number (bfd_vma value)
197 {
198   expld.result.valid_p = TRUE;
199   expld.result.value = value;
200   expld.result.str = NULL;
201   expld.result.section = NULL;
202 }
203 
204 static void
205 new_rel (bfd_vma value, asection *section)
206 {
207   expld.result.valid_p = TRUE;
208   expld.result.value = value;
209   expld.result.str = NULL;
210   expld.result.section = section;
211 }
212 
213 static void
214 new_rel_from_abs (bfd_vma value)
215 {
216   asection *s = expld.section;
217 
218   if (s == bfd_abs_section_ptr && expld.phase == lang_final_phase_enum)
219     s = section_for_dot ();
220   expld.result.valid_p = TRUE;
221   expld.result.value = value - s->vma;
222   expld.result.str = NULL;
223   expld.result.section = s;
224 }
225 
226 static void
227 fold_unary (etree_type *tree)
228 {
229   exp_fold_tree_1 (tree->unary.child);
230   if (expld.result.valid_p)
231     {
232       switch (tree->type.node_code)
233 	{
234 	case ALIGN_K:
235 	  if (expld.phase != lang_first_phase_enum)
236 	    new_rel_from_abs (align_n (expld.dot, expld.result.value));
237 	  else
238 	    expld.result.valid_p = FALSE;
239 	  break;
240 
241 	case ABSOLUTE:
242 	  make_abs ();
243 	  break;
244 
245 	case '~':
246 	  expld.result.value = ~expld.result.value;
247 	  break;
248 
249 	case '!':
250 	  expld.result.value = !expld.result.value;
251 	  break;
252 
253 	case '-':
254 	  expld.result.value = -expld.result.value;
255 	  break;
256 
257 	case NEXT:
258 	  /* Return next place aligned to value.  */
259 	  if (expld.phase != lang_first_phase_enum)
260 	    {
261 	      make_abs ();
262 	      expld.result.value = align_n (expld.dot, expld.result.value);
263 	    }
264 	  else
265 	    expld.result.valid_p = FALSE;
266 	  break;
267 
268 	case DATA_SEGMENT_END:
269 	  if (expld.phase == lang_first_phase_enum
270 	      || expld.section != bfd_abs_section_ptr)
271 	    {
272 	      expld.result.valid_p = FALSE;
273 	    }
274 	  else if (expld.dataseg.phase == exp_dataseg_align_seen
275 		   || expld.dataseg.phase == exp_dataseg_relro_seen)
276 	    {
277 	      expld.dataseg.phase = exp_dataseg_end_seen;
278 	      expld.dataseg.end = expld.result.value;
279 	    }
280 	  else if (expld.dataseg.phase == exp_dataseg_done
281 		   || expld.dataseg.phase == exp_dataseg_adjust
282 		   || expld.dataseg.phase == exp_dataseg_relro_adjust)
283 	    {
284 	      /* OK.  */
285 	    }
286 	  else
287 	    expld.result.valid_p = FALSE;
288 	  break;
289 
290 	default:
291 	  FAIL ();
292 	  break;
293 	}
294     }
295 }
296 
297 static void
298 fold_binary (etree_type *tree)
299 {
300   etree_value_type lhs;
301   exp_fold_tree_1 (tree->binary.lhs);
302 
303   /* The SEGMENT_START operator is special because its first
304      operand is a string, not the name of a symbol.  Note that the
305      operands have been swapped, so binary.lhs is second (default)
306      operand, binary.rhs is first operand.  */
307   if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
308     {
309       const char *segment_name;
310       segment_type *seg;
311 
312       /* Check to see if the user has overridden the default
313 	 value.  */
314       segment_name = tree->binary.rhs->name.name;
315       for (seg = segments; seg; seg = seg->next)
316 	if (strcmp (seg->name, segment_name) == 0)
317 	  {
318 	    if (!seg->used
319 		&& config.magic_demand_paged
320 		&& (seg->value % config.maxpagesize) != 0)
321 	      einfo (_("%P: warning: address of `%s' isn't multiple of maximum page size\n"),
322 		     segment_name);
323 	    seg->used = TRUE;
324 	    new_rel_from_abs (seg->value);
325 	    break;
326 	  }
327       return;
328     }
329 
330   lhs = expld.result;
331   exp_fold_tree_1 (tree->binary.rhs);
332   expld.result.valid_p &= lhs.valid_p;
333 
334   if (expld.result.valid_p)
335     {
336       if (lhs.section != expld.result.section)
337 	{
338 	  /* If the values are from different sections, and neither is
339 	     just a number, make both the source arguments absolute.  */
340 	  if (expld.result.section != NULL
341 	      && lhs.section != NULL)
342 	    {
343 	      make_abs ();
344 	      lhs.value += lhs.section->vma;
345 	      lhs.section = bfd_abs_section_ptr;
346 	    }
347 
348 	  /* If the rhs is just a number, keep the lhs section.  */
349 	  else if (expld.result.section == NULL)
350 	    {
351 	      expld.result.section = lhs.section;
352 	      /* Make this NULL so that we know one of the operands
353 		 was just a number, for later tests.  */
354 	      lhs.section = NULL;
355 	    }
356 	}
357       /* At this point we know that both operands have the same
358 	 section, or at least one of them is a plain number.  */
359 
360       switch (tree->type.node_code)
361 	{
362 	  /* Arithmetic operators, bitwise AND, bitwise OR and XOR
363 	     keep the section of one of their operands only when the
364 	     other operand is a plain number.  Losing the section when
365 	     operating on two symbols, ie. a result of a plain number,
366 	     is required for subtraction and XOR.  It's justifiable
367 	     for the other operations on the grounds that adding,
368 	     multiplying etc. two section relative values does not
369 	     really make sense unless they are just treated as
370 	     numbers.
371 	     The same argument could be made for many expressions
372 	     involving one symbol and a number.  For example,
373 	     "1 << x" and "100 / x" probably should not be given the
374 	     section of x.  The trouble is that if we fuss about such
375 	     things the rules become complex and it is onerous to
376 	     document ld expression evaluation.  */
377 #define BOP(x, y) \
378 	case x:							\
379 	  expld.result.value = lhs.value y expld.result.value;	\
380 	  if (expld.result.section == lhs.section)		\
381 	    expld.result.section = NULL;			\
382 	  break;
383 
384 	  /* Comparison operators, logical AND, and logical OR always
385 	     return a plain number.  */
386 #define BOPN(x, y) \
387 	case x:							\
388 	  expld.result.value = lhs.value y expld.result.value;	\
389 	  expld.result.section = NULL;				\
390 	  break;
391 
392 	  BOP ('+', +);
393 	  BOP ('*', *);
394 	  BOP ('-', -);
395 	  BOP (LSHIFT, <<);
396 	  BOP (RSHIFT, >>);
397 	  BOP ('&', &);
398 	  BOP ('^', ^);
399 	  BOP ('|', |);
400 	  BOPN (EQ, ==);
401 	  BOPN (NE, !=);
402 	  BOPN ('<', <);
403 	  BOPN ('>', >);
404 	  BOPN (LE, <=);
405 	  BOPN (GE, >=);
406 	  BOPN (ANDAND, &&);
407 	  BOPN (OROR, ||);
408 
409 	case '%':
410 	  if (expld.result.value != 0)
411 	    expld.result.value = ((bfd_signed_vma) lhs.value
412 				  % (bfd_signed_vma) expld.result.value);
413 	  else if (expld.phase != lang_mark_phase_enum)
414 	    einfo (_("%F%S %% by zero\n"), tree->binary.rhs);
415 	  if (expld.result.section == lhs.section)
416 	    expld.result.section = NULL;
417 	  break;
418 
419 	case '/':
420 	  if (expld.result.value != 0)
421 	    expld.result.value = ((bfd_signed_vma) lhs.value
422 				  / (bfd_signed_vma) expld.result.value);
423 	  else if (expld.phase != lang_mark_phase_enum)
424 	    einfo (_("%F%S / by zero\n"), tree->binary.rhs);
425 	  if (expld.result.section == lhs.section)
426 	    expld.result.section = NULL;
427 	  break;
428 
429 	case MAX_K:
430 	  if (lhs.value > expld.result.value)
431 	    expld.result.value = lhs.value;
432 	  break;
433 
434 	case MIN_K:
435 	  if (lhs.value < expld.result.value)
436 	    expld.result.value = lhs.value;
437 	  break;
438 
439 	case ALIGN_K:
440 	  expld.result.value = align_n (lhs.value, expld.result.value);
441 	  break;
442 
443 	case DATA_SEGMENT_ALIGN:
444 	  expld.dataseg.relro = exp_dataseg_relro_start;
445 	  if (expld.phase == lang_first_phase_enum
446 	      || expld.section != bfd_abs_section_ptr)
447 	    expld.result.valid_p = FALSE;
448 	  else
449 	    {
450 	      bfd_vma maxpage = lhs.value;
451 	      bfd_vma commonpage = expld.result.value;
452 
453 	      expld.result.value = align_n (expld.dot, maxpage);
454 	      if (expld.dataseg.phase == exp_dataseg_relro_adjust)
455 		expld.result.value = expld.dataseg.base;
456 	      else if (expld.dataseg.phase == exp_dataseg_adjust)
457 		{
458 		  if (commonpage < maxpage)
459 		    expld.result.value += ((expld.dot + commonpage - 1)
460 					   & (maxpage - commonpage));
461 		}
462 	      else
463 		{
464 		  expld.result.value += expld.dot & (maxpage - 1);
465 		  if (expld.dataseg.phase == exp_dataseg_done)
466 		    {
467 		      /* OK.  */
468 		    }
469 		  else if (expld.dataseg.phase == exp_dataseg_none)
470 		    {
471 		      expld.dataseg.phase = exp_dataseg_align_seen;
472 		      expld.dataseg.min_base = expld.dot;
473 		      expld.dataseg.base = expld.result.value;
474 		      expld.dataseg.pagesize = commonpage;
475 		      expld.dataseg.maxpagesize = maxpage;
476 		      expld.dataseg.relro_end = 0;
477 		    }
478 		  else
479 		    expld.result.valid_p = FALSE;
480 		}
481 	    }
482 	  break;
483 
484 	case DATA_SEGMENT_RELRO_END:
485 	  expld.dataseg.relro = exp_dataseg_relro_end;
486 	  if (expld.phase == lang_first_phase_enum
487 	      || expld.section != bfd_abs_section_ptr)
488 	    expld.result.valid_p = FALSE;
489 	  else if (expld.dataseg.phase == exp_dataseg_align_seen
490 		   || expld.dataseg.phase == exp_dataseg_adjust
491 		   || expld.dataseg.phase == exp_dataseg_relro_adjust
492 		   || expld.dataseg.phase == exp_dataseg_done)
493 	    {
494 	      if (expld.dataseg.phase == exp_dataseg_align_seen
495 		  || expld.dataseg.phase == exp_dataseg_relro_adjust)
496 		expld.dataseg.relro_end = lhs.value + expld.result.value;
497 
498 	      if (expld.dataseg.phase == exp_dataseg_relro_adjust
499 		  && (expld.dataseg.relro_end
500 		      & (expld.dataseg.pagesize - 1)))
501 		{
502 		  expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
503 		  expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
504 		  expld.result.value = (expld.dataseg.relro_end
505 					- expld.result.value);
506 		}
507 	      else
508 		expld.result.value = lhs.value;
509 
510 	      if (expld.dataseg.phase == exp_dataseg_align_seen)
511 		expld.dataseg.phase = exp_dataseg_relro_seen;
512 	    }
513 	  else
514 	    expld.result.valid_p = FALSE;
515 	  break;
516 
517 	default:
518 	  FAIL ();
519 	}
520     }
521 }
522 
523 static void
524 fold_trinary (etree_type *tree)
525 {
526   exp_fold_tree_1 (tree->trinary.cond);
527   if (expld.result.valid_p)
528     exp_fold_tree_1 (expld.result.value
529 		     ? tree->trinary.lhs
530 		     : tree->trinary.rhs);
531 }
532 
533 static void
534 fold_name (etree_type *tree)
535 {
536   memset (&expld.result, 0, sizeof (expld.result));
537 
538   switch (tree->type.node_code)
539     {
540     case SIZEOF_HEADERS:
541       if (expld.phase != lang_first_phase_enum)
542 	{
543 	  bfd_vma hdr_size = 0;
544 	  /* Don't find the real header size if only marking sections;
545 	     The bfd function may cache incorrect data.  */
546 	  if (expld.phase != lang_mark_phase_enum)
547 	    hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
548 	  new_number (hdr_size);
549 	}
550       break;
551 
552     case DEFINED:
553       if (expld.phase == lang_first_phase_enum)
554 	lang_track_definedness (tree->name.name);
555       else
556 	{
557 	  struct bfd_link_hash_entry *h;
558 	  int def_iteration
559 	    = lang_symbol_definition_iteration (tree->name.name);
560 
561 	  h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
562 					    &link_info,
563 					    tree->name.name,
564 					    FALSE, FALSE, TRUE);
565 	  new_number (h != NULL
566 		      && (h->type == bfd_link_hash_defined
567 			  || h->type == bfd_link_hash_defweak
568 			  || h->type == bfd_link_hash_common)
569 		      && (def_iteration == lang_statement_iteration
570 			  || def_iteration == -1));
571 	}
572       break;
573 
574     case NAME:
575       if (expld.assign_name != NULL
576 	  && strcmp (expld.assign_name, tree->name.name) == 0)
577 	expld.assign_name = NULL;
578       if (expld.phase == lang_first_phase_enum)
579 	;
580       else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
581 	new_rel_from_abs (expld.dot);
582       else
583 	{
584 	  struct bfd_link_hash_entry *h;
585 
586 	  h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
587 					    &link_info,
588 					    tree->name.name,
589 					    TRUE, FALSE, TRUE);
590 	  if (!h)
591 	    einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
592 	  else if (h->type == bfd_link_hash_defined
593 		   || h->type == bfd_link_hash_defweak)
594 	    {
595 	      asection *output_section;
596 
597 	      output_section = h->u.def.section->output_section;
598 	      if (output_section == NULL)
599 		{
600 		  if (expld.phase == lang_mark_phase_enum)
601 		    new_rel (h->u.def.value, h->u.def.section);
602 		  else
603 		    einfo (_("%X%S: unresolvable symbol `%s'"
604 			     " referenced in expression\n"),
605 			   tree, tree->name.name);
606 		}
607 	      else if (output_section == bfd_abs_section_ptr
608 		       && (expld.section != bfd_abs_section_ptr
609 			   || config.sane_expr))
610 		new_number (h->u.def.value + h->u.def.section->output_offset);
611 	      else
612 		new_rel (h->u.def.value + h->u.def.section->output_offset,
613 			 output_section);
614 	    }
615 	  else if (expld.phase == lang_final_phase_enum
616 		   || (expld.phase != lang_mark_phase_enum
617 		       && expld.assigning_to_dot))
618 	    einfo (_("%F%S: undefined symbol `%s'"
619 		     " referenced in expression\n"),
620 		   tree, tree->name.name);
621 	  else if (h->type == bfd_link_hash_new)
622 	    {
623 	      h->type = bfd_link_hash_undefined;
624 	      h->u.undef.abfd = NULL;
625 	      if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
626 		bfd_link_add_undef (link_info.hash, h);
627 	    }
628 	}
629       break;
630 
631     case ADDR:
632       if (expld.phase != lang_first_phase_enum)
633 	{
634 	  lang_output_section_statement_type *os;
635 
636 	  os = lang_output_section_find (tree->name.name);
637 	  if (os == NULL)
638 	    {
639 	      if (expld.phase == lang_final_phase_enum)
640 		einfo (_("%F%S: undefined section `%s'"
641 			 " referenced in expression\n"),
642 		       tree, tree->name.name);
643 	    }
644 	  else if (os->processed_vma)
645 	    new_rel (0, os->bfd_section);
646 	}
647       break;
648 
649     case LOADADDR:
650       if (expld.phase != lang_first_phase_enum)
651 	{
652 	  lang_output_section_statement_type *os;
653 
654 	  os = lang_output_section_find (tree->name.name);
655 	  if (os == NULL)
656 	    {
657 	      if (expld.phase == lang_final_phase_enum)
658 		einfo (_("%F%S: undefined section `%s'"
659 			 " referenced in expression\n"),
660 		       tree, tree->name.name);
661 	    }
662 	  else if (os->processed_lma)
663 	    {
664 	      if (os->load_base == NULL)
665 		new_abs (os->bfd_section->lma);
666 	      else
667 		{
668 		  exp_fold_tree_1 (os->load_base);
669 		  if (expld.result.valid_p)
670 		    make_abs ();
671 		}
672 	    }
673 	}
674       break;
675 
676     case SIZEOF:
677     case ALIGNOF:
678       if (expld.phase != lang_first_phase_enum)
679 	{
680 	  lang_output_section_statement_type *os;
681 
682 	  os = lang_output_section_find (tree->name.name);
683 	  if (os == NULL)
684 	    {
685 	      if (expld.phase == lang_final_phase_enum)
686 		einfo (_("%F%S: undefined section `%s'"
687 			 " referenced in expression\n"),
688 		       tree, tree->name.name);
689 	      new_number (0);
690 	    }
691 	  else if (os->bfd_section != NULL)
692 	    {
693 	      bfd_vma val;
694 
695 	      if (tree->type.node_code == SIZEOF)
696 		val = (os->bfd_section->size
697 		       / bfd_octets_per_byte (link_info.output_bfd));
698 	      else
699 		val = (bfd_vma)1 << os->bfd_section->alignment_power;
700 
701 	      new_number (val);
702 	    }
703 	  else
704 	    new_number (0);
705 	}
706       break;
707 
708     case LENGTH:
709       {
710         lang_memory_region_type *mem;
711 
712         mem = lang_memory_region_lookup (tree->name.name, FALSE);
713         if (mem != NULL)
714           new_number (mem->length);
715         else
716           einfo (_("%F%S: undefined MEMORY region `%s'"
717 		   " referenced in expression\n"),
718 		 tree, tree->name.name);
719       }
720       break;
721 
722     case ORIGIN:
723       if (expld.phase != lang_first_phase_enum)
724 	{
725 	  lang_memory_region_type *mem;
726 
727 	  mem = lang_memory_region_lookup (tree->name.name, FALSE);
728 	  if (mem != NULL)
729 	    new_rel_from_abs (mem->origin);
730 	  else
731 	    einfo (_("%F%S: undefined MEMORY region `%s'"
732 		     " referenced in expression\n"),
733 		   tree, tree->name.name);
734 	}
735       break;
736 
737     case CONSTANT:
738       if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
739 	new_number (config.maxpagesize);
740       else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
741 	new_number (config.commonpagesize);
742       else
743 	einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
744 	       tree, tree->name.name);
745       break;
746 
747     default:
748       FAIL ();
749       break;
750     }
751 }
752 
753 static void
754 exp_fold_tree_1 (etree_type *tree)
755 {
756   if (tree == NULL)
757     {
758       memset (&expld.result, 0, sizeof (expld.result));
759       return;
760     }
761 
762   switch (tree->type.node_class)
763     {
764     case etree_value:
765       if (expld.section == bfd_abs_section_ptr
766 	  && !config.sane_expr)
767 	new_abs (tree->value.value);
768       else
769 	new_number (tree->value.value);
770       expld.result.str = tree->value.str;
771       break;
772 
773     case etree_rel:
774       if (expld.phase != lang_first_phase_enum)
775 	{
776 	  asection *output_section = tree->rel.section->output_section;
777 	  new_rel (tree->rel.value + tree->rel.section->output_offset,
778 		   output_section);
779 	}
780       else
781 	memset (&expld.result, 0, sizeof (expld.result));
782       break;
783 
784     case etree_assert:
785       exp_fold_tree_1 (tree->assert_s.child);
786       if (expld.phase == lang_final_phase_enum && !expld.result.value)
787 	einfo ("%X%P: %s\n", tree->assert_s.message);
788       break;
789 
790     case etree_unary:
791       fold_unary (tree);
792       break;
793 
794     case etree_binary:
795       fold_binary (tree);
796       break;
797 
798     case etree_trinary:
799       fold_trinary (tree);
800       break;
801 
802     case etree_assign:
803     case etree_provide:
804     case etree_provided:
805       if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
806 	{
807 	  if (tree->type.node_class != etree_assign)
808 	    einfo (_("%F%S can not PROVIDE assignment to"
809 		     " location counter\n"), tree);
810 	  if (expld.phase != lang_first_phase_enum)
811 	    {
812 	      /* Notify the folder that this is an assignment to dot.  */
813 	      expld.assigning_to_dot = TRUE;
814 	      exp_fold_tree_1 (tree->assign.src);
815 	      expld.assigning_to_dot = FALSE;
816 
817 	      if (!expld.result.valid_p)
818 		{
819 		  if (expld.phase != lang_mark_phase_enum)
820 		    einfo (_("%F%S invalid assignment to"
821 			     " location counter\n"), tree);
822 		}
823 	      else if (expld.dotp == NULL)
824 		einfo (_("%F%S assignment to location counter"
825 			 " invalid outside of SECTIONS\n"), tree);
826 
827 	      /* After allocation, assignment to dot should not be
828 		 done inside an output section since allocation adds a
829 		 padding statement that effectively duplicates the
830 		 assignment.  */
831 	      else if (expld.phase <= lang_allocating_phase_enum
832 		       || expld.section == bfd_abs_section_ptr)
833 		{
834 		  bfd_vma nextdot;
835 
836 		  nextdot = expld.result.value;
837 		  if (expld.result.section != NULL)
838 		    nextdot += expld.result.section->vma;
839 		  else
840 		    nextdot += expld.section->vma;
841 		  if (nextdot < expld.dot
842 		      && expld.section != bfd_abs_section_ptr)
843 		    einfo (_("%F%S cannot move location counter backwards"
844 			     " (from %V to %V)\n"),
845 			   tree, expld.dot, nextdot);
846 		  else
847 		    {
848 		      expld.dot = nextdot;
849 		      *expld.dotp = nextdot;
850 		    }
851 		}
852 	    }
853 	  else
854 	    memset (&expld.result, 0, sizeof (expld.result));
855 	}
856       else
857 	{
858 	  struct bfd_link_hash_entry *h = NULL;
859 
860 	  if (tree->type.node_class == etree_provide)
861 	    {
862 	      h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
863 					FALSE, FALSE, TRUE);
864 	      if (h == NULL
865 		  || (h->type != bfd_link_hash_new
866 		      && h->type != bfd_link_hash_undefined
867 		      && h->type != bfd_link_hash_common))
868 		{
869 		  /* Do nothing.  The symbol was never referenced, or was
870 		     defined by some object.  */
871 		  break;
872 		}
873 	    }
874 
875 	  expld.assign_name = tree->assign.dst;
876 	  exp_fold_tree_1 (tree->assign.src);
877 	  /* expld.assign_name remaining equal to tree->assign.dst
878 	     below indicates the evaluation of tree->assign.src did
879 	     not use the value of tree->assign.dst.  We don't allow
880 	     self assignment until the final phase for two reasons:
881 	     1) Expressions are evaluated multiple times.  With
882 	     relaxation, the number of times may vary.
883 	     2) Section relative symbol values cannot be correctly
884 	     converted to absolute values, as is required by many
885 	     expressions, until final section sizing is complete.  */
886 	  if ((expld.result.valid_p
887 	       && (expld.phase == lang_final_phase_enum
888 		   || expld.assign_name != NULL))
889 	      || (expld.phase <= lang_mark_phase_enum
890 		  && tree->type.node_class == etree_assign
891 		  && tree->assign.defsym))
892 	    {
893 	      if (h == NULL)
894 		{
895 		  h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
896 					    TRUE, FALSE, TRUE);
897 		  if (h == NULL)
898 		    einfo (_("%P%F:%s: hash creation failed\n"),
899 			   tree->assign.dst);
900 		}
901 
902 	      /* FIXME: Should we worry if the symbol is already
903 		 defined?  */
904 	      lang_update_definedness (tree->assign.dst, h);
905 	      h->type = bfd_link_hash_defined;
906 	      h->u.def.value = expld.result.value;
907 	      if (expld.result.section == NULL)
908 		expld.result.section = expld.section;
909 	      h->u.def.section = expld.result.section;
910 	      if (tree->type.node_class == etree_provide)
911 		tree->type.node_class = etree_provided;
912 
913 	      /* Copy the symbol type if this is a simple assignment of
914 	         one symbol to another.  This could be more general
915 		 (e.g. a ?: operator with NAMEs in each branch).  */
916 	      if (tree->assign.src->type.node_class == etree_name)
917 		{
918 		  struct bfd_link_hash_entry *hsrc;
919 
920 		  hsrc = bfd_link_hash_lookup (link_info.hash,
921 					       tree->assign.src->name.name,
922 					       FALSE, FALSE, TRUE);
923 		  if (hsrc)
924 		    bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
925 						    hsrc);
926 		}
927 	    }
928 	  else if (expld.phase == lang_final_phase_enum)
929 	    {
930 	      h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
931 					FALSE, FALSE, TRUE);
932 	      if (h != NULL
933 		  && h->type == bfd_link_hash_new)
934 		h->type = bfd_link_hash_undefined;
935 	    }
936 	  expld.assign_name = NULL;
937 	}
938       break;
939 
940     case etree_name:
941       fold_name (tree);
942       break;
943 
944     default:
945       FAIL ();
946       memset (&expld.result, 0, sizeof (expld.result));
947       break;
948     }
949 }
950 
951 void
952 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
953 {
954   expld.dot = *dotp;
955   expld.dotp = dotp;
956   expld.section = current_section;
957   exp_fold_tree_1 (tree);
958 }
959 
960 void
961 exp_fold_tree_no_dot (etree_type *tree)
962 {
963   expld.dot = 0;
964   expld.dotp = NULL;
965   expld.section = bfd_abs_section_ptr;
966   exp_fold_tree_1 (tree);
967 }
968 
969 etree_type *
970 exp_binop (int code, etree_type *lhs, etree_type *rhs)
971 {
972   etree_type value, *new_e;
973 
974   value.type.node_code = code;
975   value.type.filename = lhs->type.filename;
976   value.type.lineno = lhs->type.lineno;
977   value.binary.lhs = lhs;
978   value.binary.rhs = rhs;
979   value.type.node_class = etree_binary;
980   exp_fold_tree_no_dot (&value);
981   if (expld.result.valid_p)
982     return exp_intop (expld.result.value);
983 
984   new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
985   memcpy (new_e, &value, sizeof (new_e->binary));
986   return new_e;
987 }
988 
989 etree_type *
990 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
991 {
992   etree_type value, *new_e;
993 
994   value.type.node_code = code;
995   value.type.filename = cond->type.filename;
996   value.type.lineno = cond->type.lineno;
997   value.trinary.lhs = lhs;
998   value.trinary.cond = cond;
999   value.trinary.rhs = rhs;
1000   value.type.node_class = etree_trinary;
1001   exp_fold_tree_no_dot (&value);
1002   if (expld.result.valid_p)
1003     return exp_intop (expld.result.value);
1004 
1005   new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1006   memcpy (new_e, &value, sizeof (new_e->trinary));
1007   return new_e;
1008 }
1009 
1010 etree_type *
1011 exp_unop (int code, etree_type *child)
1012 {
1013   etree_type value, *new_e;
1014 
1015   value.unary.type.node_code = code;
1016   value.unary.type.filename = child->type.filename;
1017   value.unary.type.lineno = child->type.lineno;
1018   value.unary.child = child;
1019   value.unary.type.node_class = etree_unary;
1020   exp_fold_tree_no_dot (&value);
1021   if (expld.result.valid_p)
1022     return exp_intop (expld.result.value);
1023 
1024   new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1025   memcpy (new_e, &value, sizeof (new_e->unary));
1026   return new_e;
1027 }
1028 
1029 etree_type *
1030 exp_nameop (int code, const char *name)
1031 {
1032   etree_type value, *new_e;
1033 
1034   value.name.type.node_code = code;
1035   value.name.type.filename = ldlex_filename ();
1036   value.name.type.lineno = lineno;
1037   value.name.name = name;
1038   value.name.type.node_class = etree_name;
1039 
1040   exp_fold_tree_no_dot (&value);
1041   if (expld.result.valid_p)
1042     return exp_intop (expld.result.value);
1043 
1044   new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1045   memcpy (new_e, &value, sizeof (new_e->name));
1046   return new_e;
1047 
1048 }
1049 
1050 static etree_type *
1051 exp_assop (const char *dst,
1052 	   etree_type *src,
1053 	   enum node_tree_enum class,
1054 	   bfd_boolean defsym,
1055 	   bfd_boolean hidden)
1056 {
1057   etree_type *n;
1058 
1059   n = (etree_type *) stat_alloc (sizeof (n->assign));
1060   n->assign.type.node_code = '=';
1061   n->assign.type.filename = src->type.filename;
1062   n->assign.type.lineno = src->type.lineno;
1063   n->assign.type.node_class = class;
1064   n->assign.src = src;
1065   n->assign.dst = dst;
1066   n->assign.defsym = defsym;
1067   n->assign.hidden = hidden;
1068   return n;
1069 }
1070 
1071 /* Handle linker script assignments and HIDDEN.  */
1072 
1073 etree_type *
1074 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1075 {
1076   return exp_assop (dst, src, etree_assign, FALSE, hidden);
1077 }
1078 
1079 /* Handle --defsym command-line option.  */
1080 
1081 etree_type *
1082 exp_defsym (const char *dst, etree_type *src)
1083 {
1084   return exp_assop (dst, src, etree_assign, TRUE, FALSE);
1085 }
1086 
1087 /* Handle PROVIDE.  */
1088 
1089 etree_type *
1090 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1091 {
1092   return exp_assop (dst, src, etree_provide, FALSE, hidden);
1093 }
1094 
1095 /* Handle ASSERT.  */
1096 
1097 etree_type *
1098 exp_assert (etree_type *exp, const char *message)
1099 {
1100   etree_type *n;
1101 
1102   n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1103   n->assert_s.type.node_code = '!';
1104   n->assert_s.type.filename = exp->type.filename;
1105   n->assert_s.type.lineno = exp->type.lineno;
1106   n->assert_s.type.node_class = etree_assert;
1107   n->assert_s.child = exp;
1108   n->assert_s.message = message;
1109   return n;
1110 }
1111 
1112 void
1113 exp_print_tree (etree_type *tree)
1114 {
1115   bfd_boolean function_like;
1116 
1117   if (config.map_file == NULL)
1118     config.map_file = stderr;
1119 
1120   if (tree == NULL)
1121     {
1122       minfo ("NULL TREE\n");
1123       return;
1124     }
1125 
1126   switch (tree->type.node_class)
1127     {
1128     case etree_value:
1129       minfo ("0x%v", tree->value.value);
1130       return;
1131     case etree_rel:
1132       if (tree->rel.section->owner != NULL)
1133 	minfo ("%B:", tree->rel.section->owner);
1134       minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1135       return;
1136     case etree_assign:
1137       fputs (tree->assign.dst, config.map_file);
1138       exp_print_token (tree->type.node_code, TRUE);
1139       exp_print_tree (tree->assign.src);
1140       break;
1141     case etree_provide:
1142     case etree_provided:
1143       fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1144       exp_print_tree (tree->assign.src);
1145       fputc (')', config.map_file);
1146       break;
1147     case etree_binary:
1148       function_like = FALSE;
1149       switch (tree->type.node_code)
1150 	{
1151 	case MAX_K:
1152 	case MIN_K:
1153 	case ALIGN_K:
1154 	case DATA_SEGMENT_ALIGN:
1155 	case DATA_SEGMENT_RELRO_END:
1156 	  function_like = TRUE;
1157 	  break;
1158 	case SEGMENT_START:
1159 	  /* Special handling because arguments are in reverse order and
1160 	     the segment name is quoted.  */
1161 	  exp_print_token (tree->type.node_code, FALSE);
1162 	  fputs (" (\"", config.map_file);
1163 	  exp_print_tree (tree->binary.rhs);
1164 	  fputs ("\", ", config.map_file);
1165 	  exp_print_tree (tree->binary.lhs);
1166 	  fputc (')', config.map_file);
1167 	  return;
1168 	}
1169       if (function_like)
1170 	{
1171 	  exp_print_token (tree->type.node_code, FALSE);
1172 	  fputc (' ', config.map_file);
1173 	}
1174       fputc ('(', config.map_file);
1175       exp_print_tree (tree->binary.lhs);
1176       if (function_like)
1177 	fprintf (config.map_file, ", ");
1178       else
1179 	exp_print_token (tree->type.node_code, TRUE);
1180       exp_print_tree (tree->binary.rhs);
1181       fputc (')', config.map_file);
1182       break;
1183     case etree_trinary:
1184       exp_print_tree (tree->trinary.cond);
1185       fputc ('?', config.map_file);
1186       exp_print_tree (tree->trinary.lhs);
1187       fputc (':', config.map_file);
1188       exp_print_tree (tree->trinary.rhs);
1189       break;
1190     case etree_unary:
1191       exp_print_token (tree->unary.type.node_code, FALSE);
1192       if (tree->unary.child)
1193 	{
1194 	  fprintf (config.map_file, " (");
1195 	  exp_print_tree (tree->unary.child);
1196 	  fputc (')', config.map_file);
1197 	}
1198       break;
1199 
1200     case etree_assert:
1201       fprintf (config.map_file, "ASSERT (");
1202       exp_print_tree (tree->assert_s.child);
1203       fprintf (config.map_file, ", %s)", tree->assert_s.message);
1204       break;
1205 
1206     case etree_name:
1207       if (tree->type.node_code == NAME)
1208 	fputs (tree->name.name, config.map_file);
1209       else
1210 	{
1211 	  exp_print_token (tree->type.node_code, FALSE);
1212 	  if (tree->name.name)
1213 	    fprintf (config.map_file, " (%s)", tree->name.name);
1214 	}
1215       break;
1216     default:
1217       FAIL ();
1218       break;
1219     }
1220 }
1221 
1222 bfd_vma
1223 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1224 {
1225   if (tree != NULL)
1226     {
1227       exp_fold_tree_no_dot (tree);
1228       if (expld.result.valid_p)
1229 	return expld.result.value;
1230       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1231 	einfo (_("%F%S: nonconstant expression for %s\n"),
1232 	       tree, name);
1233     }
1234   return def;
1235 }
1236 
1237 int
1238 exp_get_value_int (etree_type *tree, int def, char *name)
1239 {
1240   return exp_get_vma (tree, def, name);
1241 }
1242 
1243 fill_type *
1244 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1245 {
1246   fill_type *fill;
1247   size_t len;
1248   unsigned int val;
1249 
1250   if (tree == NULL)
1251     return def;
1252 
1253   exp_fold_tree_no_dot (tree);
1254   if (!expld.result.valid_p)
1255     {
1256       if (name != NULL && expld.phase != lang_mark_phase_enum)
1257 	einfo (_("%F%S: nonconstant expression for %s\n"),
1258 	       tree, name);
1259       return def;
1260     }
1261 
1262   if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1263     {
1264       unsigned char *dst;
1265       unsigned char *s;
1266       fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1267       fill->size = (len + 1) / 2;
1268       dst = fill->data;
1269       s = (unsigned char *) expld.result.str;
1270       val = 0;
1271       do
1272 	{
1273 	  unsigned int digit;
1274 
1275 	  digit = *s++ - '0';
1276 	  if (digit > 9)
1277 	    digit = (digit - 'A' + '0' + 10) & 0xf;
1278 	  val <<= 4;
1279 	  val += digit;
1280 	  --len;
1281 	  if ((len & 1) == 0)
1282 	    {
1283 	      *dst++ = val;
1284 	      val = 0;
1285 	    }
1286 	}
1287       while (len != 0);
1288     }
1289   else
1290     {
1291       fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1292       val = expld.result.value;
1293       fill->data[0] = (val >> 24) & 0xff;
1294       fill->data[1] = (val >> 16) & 0xff;
1295       fill->data[2] = (val >>  8) & 0xff;
1296       fill->data[3] = (val >>  0) & 0xff;
1297       fill->size = 4;
1298     }
1299   return fill;
1300 }
1301 
1302 bfd_vma
1303 exp_get_abs_int (etree_type *tree, int def, char *name)
1304 {
1305   if (tree != NULL)
1306     {
1307       exp_fold_tree_no_dot (tree);
1308 
1309       if (expld.result.valid_p)
1310 	{
1311 	  if (expld.result.section != NULL)
1312 	    expld.result.value += expld.result.section->vma;
1313 	  return expld.result.value;
1314 	}
1315       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1316 	{
1317 	  einfo (_("%F%S: nonconstant expression for %s\n"),
1318 		 tree, name);
1319 	}
1320     }
1321   return def;
1322 }
1323 
1324 static bfd_vma
1325 align_n (bfd_vma value, bfd_vma align)
1326 {
1327   if (align <= 1)
1328     return value;
1329 
1330   value = (value + align - 1) / align;
1331   return value * align;
1332 }
1333