objdump: set address of debug sections.
[binutils-gdb.git] / ld / ldexp.c
blobd573fb79db78c25bba6f870ace7801ab3f7ab5fb
1 /* This module handles expression trees.
2 Copyright (C) 1991-2014 Free Software Foundation, Inc.
3 Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
5 This file is part of the GNU Binutils.
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.
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.
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. */
23 /* This module is in charge of working out the contents of expressions.
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. */
30 #include "sysdep.h"
31 #include "bfd.h"
32 #include "bfdlink.h"
34 #include "ld.h"
35 #include "ldmain.h"
36 #include "ldmisc.h"
37 #include "ldexp.h"
38 #include "ldlex.h"
39 #include <ldgram.h>
40 #include "ldlang.h"
41 #include "libiberty.h"
42 #include "safe-ctype.h"
44 static void exp_fold_tree_1 (etree_type *);
45 static bfd_vma align_n (bfd_vma, bfd_vma);
47 segment_type *segments;
49 struct ldexp_control expld;
51 /* Print the string representation of the given token. Surround it
52 with spaces if INFIX_P is TRUE. */
54 static void
55 exp_print_token (token_code_type code, int infix_p)
57 static const struct
59 token_code_type code;
60 const char * name;
62 table[] =
64 { INT, "int" },
65 { NAME, "NAME" },
66 { PLUSEQ, "+=" },
67 { MINUSEQ, "-=" },
68 { MULTEQ, "*=" },
69 { DIVEQ, "/=" },
70 { LSHIFTEQ, "<<=" },
71 { RSHIFTEQ, ">>=" },
72 { ANDEQ, "&=" },
73 { OREQ, "|=" },
74 { OROR, "||" },
75 { ANDAND, "&&" },
76 { EQ, "==" },
77 { NE, "!=" },
78 { LE, "<=" },
79 { GE, ">=" },
80 { LSHIFT, "<<" },
81 { RSHIFT, ">>" },
82 { LOG2CEIL, "LOG2CEIL" },
83 { ALIGN_K, "ALIGN" },
84 { BLOCK, "BLOCK" },
85 { QUAD, "QUAD" },
86 { SQUAD, "SQUAD" },
87 { LONG, "LONG" },
88 { SHORT, "SHORT" },
89 { BYTE, "BYTE" },
90 { SECTIONS, "SECTIONS" },
91 { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
92 { MEMORY, "MEMORY" },
93 { DEFINED, "DEFINED" },
94 { TARGET_K, "TARGET" },
95 { SEARCH_DIR, "SEARCH_DIR" },
96 { MAP, "MAP" },
97 { ENTRY, "ENTRY" },
98 { NEXT, "NEXT" },
99 { ALIGNOF, "ALIGNOF" },
100 { SIZEOF, "SIZEOF" },
101 { ADDR, "ADDR" },
102 { LOADADDR, "LOADADDR" },
103 { CONSTANT, "CONSTANT" },
104 { ABSOLUTE, "ABSOLUTE" },
105 { MAX_K, "MAX" },
106 { MIN_K, "MIN" },
107 { ASSERT_K, "ASSERT" },
108 { REL, "relocatable" },
109 { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
110 { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
111 { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
112 { ORIGIN, "ORIGIN" },
113 { LENGTH, "LENGTH" },
114 { SEGMENT_START, "SEGMENT_START" }
116 unsigned int idx;
118 for (idx = 0; idx < ARRAY_SIZE (table); idx++)
119 if (table[idx].code == code)
120 break;
122 if (infix_p)
123 fputc (' ', config.map_file);
125 if (idx < ARRAY_SIZE (table))
126 fputs (table[idx].name, config.map_file);
127 else if (code < 127)
128 fputc (code, config.map_file);
129 else
130 fprintf (config.map_file, "<code %d>", code);
132 if (infix_p)
133 fputc (' ', config.map_file);
136 static void
137 make_log2ceil (void)
139 bfd_vma value = expld.result.value;
140 bfd_vma result = -1;
141 bfd_boolean round_up = FALSE;
145 result++;
146 /* If more than one bit is set in the value we will need to round up. */
147 if ((value > 1) && (value & 1))
148 round_up = TRUE;
150 while (value >>= 1);
152 if (round_up)
153 result += 1;
154 expld.result.section = NULL;
155 expld.result.value = result;
158 static void
159 make_abs (void)
161 if (expld.result.section != NULL)
162 expld.result.value += expld.result.section->vma;
163 expld.result.section = bfd_abs_section_ptr;
166 static void
167 new_abs (bfd_vma value)
169 expld.result.valid_p = TRUE;
170 expld.result.section = bfd_abs_section_ptr;
171 expld.result.value = value;
172 expld.result.str = NULL;
175 etree_type *
176 exp_intop (bfd_vma value)
178 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
179 new_e->type.node_code = INT;
180 new_e->type.filename = ldlex_filename ();
181 new_e->type.lineno = lineno;
182 new_e->value.value = value;
183 new_e->value.str = NULL;
184 new_e->type.node_class = etree_value;
185 return new_e;
188 etree_type *
189 exp_bigintop (bfd_vma value, char *str)
191 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
192 new_e->type.node_code = INT;
193 new_e->type.filename = ldlex_filename ();
194 new_e->type.lineno = lineno;
195 new_e->value.value = value;
196 new_e->value.str = str;
197 new_e->type.node_class = etree_value;
198 return new_e;
201 /* Build an expression representing an unnamed relocatable value. */
203 etree_type *
204 exp_relop (asection *section, bfd_vma value)
206 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->rel));
207 new_e->type.node_code = REL;
208 new_e->type.filename = ldlex_filename ();
209 new_e->type.lineno = lineno;
210 new_e->type.node_class = etree_rel;
211 new_e->rel.section = section;
212 new_e->rel.value = value;
213 return new_e;
216 static void
217 new_number (bfd_vma value)
219 expld.result.valid_p = TRUE;
220 expld.result.value = value;
221 expld.result.str = NULL;
222 expld.result.section = NULL;
225 static void
226 new_rel (bfd_vma value, asection *section)
228 expld.result.valid_p = TRUE;
229 expld.result.value = value;
230 expld.result.str = NULL;
231 expld.result.section = section;
234 static void
235 new_rel_from_abs (bfd_vma value)
237 asection *s = expld.section;
239 if (s == bfd_abs_section_ptr && expld.phase == lang_final_phase_enum)
240 s = section_for_dot ();
241 expld.result.valid_p = TRUE;
242 expld.result.value = value - s->vma;
243 expld.result.str = NULL;
244 expld.result.section = s;
247 static void
248 fold_unary (etree_type *tree)
250 exp_fold_tree_1 (tree->unary.child);
251 if (expld.result.valid_p)
253 switch (tree->type.node_code)
255 case ALIGN_K:
256 if (expld.phase != lang_first_phase_enum)
257 new_rel_from_abs (align_n (expld.dot, expld.result.value));
258 else
259 expld.result.valid_p = FALSE;
260 break;
262 case ABSOLUTE:
263 make_abs ();
264 break;
266 case LOG2CEIL:
267 make_log2ceil ();
268 break;
270 case '~':
271 expld.result.value = ~expld.result.value;
272 break;
274 case '!':
275 expld.result.value = !expld.result.value;
276 break;
278 case '-':
279 expld.result.value = -expld.result.value;
280 break;
282 case NEXT:
283 /* Return next place aligned to value. */
284 if (expld.phase != lang_first_phase_enum)
286 make_abs ();
287 expld.result.value = align_n (expld.dot, expld.result.value);
289 else
290 expld.result.valid_p = FALSE;
291 break;
293 case DATA_SEGMENT_END:
294 if (expld.phase == lang_first_phase_enum
295 || expld.section != bfd_abs_section_ptr)
297 expld.result.valid_p = FALSE;
299 else if (expld.dataseg.phase == exp_dataseg_align_seen
300 || expld.dataseg.phase == exp_dataseg_relro_seen)
302 expld.dataseg.phase = exp_dataseg_end_seen;
303 expld.dataseg.end = expld.result.value;
305 else if (expld.dataseg.phase == exp_dataseg_done
306 || expld.dataseg.phase == exp_dataseg_adjust
307 || expld.dataseg.phase == exp_dataseg_relro_adjust)
309 /* OK. */
311 else
312 expld.result.valid_p = FALSE;
313 break;
315 default:
316 FAIL ();
317 break;
322 static void
323 fold_binary (etree_type *tree)
325 etree_value_type lhs;
326 exp_fold_tree_1 (tree->binary.lhs);
328 /* The SEGMENT_START operator is special because its first
329 operand is a string, not the name of a symbol. Note that the
330 operands have been swapped, so binary.lhs is second (default)
331 operand, binary.rhs is first operand. */
332 if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
334 const char *segment_name;
335 segment_type *seg;
337 /* Check to see if the user has overridden the default
338 value. */
339 segment_name = tree->binary.rhs->name.name;
340 for (seg = segments; seg; seg = seg->next)
341 if (strcmp (seg->name, segment_name) == 0)
343 if (!seg->used
344 && config.magic_demand_paged
345 && (seg->value % config.maxpagesize) != 0)
346 einfo (_("%P: warning: address of `%s' isn't multiple of maximum page size\n"),
347 segment_name);
348 seg->used = TRUE;
349 new_rel_from_abs (seg->value);
350 break;
352 return;
355 lhs = expld.result;
356 exp_fold_tree_1 (tree->binary.rhs);
357 expld.result.valid_p &= lhs.valid_p;
359 if (expld.result.valid_p)
361 if (lhs.section != expld.result.section)
363 /* If the values are from different sections, and neither is
364 just a number, make both the source arguments absolute. */
365 if (expld.result.section != NULL
366 && lhs.section != NULL)
368 make_abs ();
369 lhs.value += lhs.section->vma;
370 lhs.section = bfd_abs_section_ptr;
373 /* If the rhs is just a number, keep the lhs section. */
374 else if (expld.result.section == NULL)
376 expld.result.section = lhs.section;
377 /* Make this NULL so that we know one of the operands
378 was just a number, for later tests. */
379 lhs.section = NULL;
382 /* At this point we know that both operands have the same
383 section, or at least one of them is a plain number. */
385 switch (tree->type.node_code)
387 /* Arithmetic operators, bitwise AND, bitwise OR and XOR
388 keep the section of one of their operands only when the
389 other operand is a plain number. Losing the section when
390 operating on two symbols, ie. a result of a plain number,
391 is required for subtraction and XOR. It's justifiable
392 for the other operations on the grounds that adding,
393 multiplying etc. two section relative values does not
394 really make sense unless they are just treated as
395 numbers.
396 The same argument could be made for many expressions
397 involving one symbol and a number. For example,
398 "1 << x" and "100 / x" probably should not be given the
399 section of x. The trouble is that if we fuss about such
400 things the rules become complex and it is onerous to
401 document ld expression evaluation. */
402 #define BOP(x, y) \
403 case x: \
404 expld.result.value = lhs.value y expld.result.value; \
405 if (expld.result.section == lhs.section) \
406 expld.result.section = NULL; \
407 break;
409 /* Comparison operators, logical AND, and logical OR always
410 return a plain number. */
411 #define BOPN(x, y) \
412 case x: \
413 expld.result.value = lhs.value y expld.result.value; \
414 expld.result.section = NULL; \
415 break;
417 BOP ('+', +);
418 BOP ('*', *);
419 BOP ('-', -);
420 BOP (LSHIFT, <<);
421 BOP (RSHIFT, >>);
422 BOP ('&', &);
423 BOP ('^', ^);
424 BOP ('|', |);
425 BOPN (EQ, ==);
426 BOPN (NE, !=);
427 BOPN ('<', <);
428 BOPN ('>', >);
429 BOPN (LE, <=);
430 BOPN (GE, >=);
431 BOPN (ANDAND, &&);
432 BOPN (OROR, ||);
434 case '%':
435 if (expld.result.value != 0)
436 expld.result.value = ((bfd_signed_vma) lhs.value
437 % (bfd_signed_vma) expld.result.value);
438 else if (expld.phase != lang_mark_phase_enum)
439 einfo (_("%F%S %% by zero\n"), tree->binary.rhs);
440 if (expld.result.section == lhs.section)
441 expld.result.section = NULL;
442 break;
444 case '/':
445 if (expld.result.value != 0)
446 expld.result.value = ((bfd_signed_vma) lhs.value
447 / (bfd_signed_vma) expld.result.value);
448 else if (expld.phase != lang_mark_phase_enum)
449 einfo (_("%F%S / by zero\n"), tree->binary.rhs);
450 if (expld.result.section == lhs.section)
451 expld.result.section = NULL;
452 break;
454 case MAX_K:
455 if (lhs.value > expld.result.value)
456 expld.result.value = lhs.value;
457 break;
459 case MIN_K:
460 if (lhs.value < expld.result.value)
461 expld.result.value = lhs.value;
462 break;
464 case ALIGN_K:
465 expld.result.value = align_n (lhs.value, expld.result.value);
466 break;
468 case DATA_SEGMENT_ALIGN:
469 expld.dataseg.relro = exp_dataseg_relro_start;
470 if (expld.phase == lang_first_phase_enum
471 || expld.section != bfd_abs_section_ptr)
472 expld.result.valid_p = FALSE;
473 else
475 bfd_vma maxpage = lhs.value;
476 bfd_vma commonpage = expld.result.value;
478 expld.result.value = align_n (expld.dot, maxpage);
479 if (expld.dataseg.phase == exp_dataseg_relro_adjust)
480 expld.result.value = expld.dataseg.base;
481 else if (expld.dataseg.phase == exp_dataseg_adjust)
483 if (commonpage < maxpage)
484 expld.result.value += ((expld.dot + commonpage - 1)
485 & (maxpage - commonpage));
487 else
489 expld.result.value += expld.dot & (maxpage - 1);
490 if (expld.dataseg.phase == exp_dataseg_done)
492 /* OK. */
494 else if (expld.dataseg.phase == exp_dataseg_none)
496 expld.dataseg.phase = exp_dataseg_align_seen;
497 expld.dataseg.min_base = expld.dot;
498 expld.dataseg.base = expld.result.value;
499 expld.dataseg.pagesize = commonpage;
500 expld.dataseg.maxpagesize = maxpage;
501 expld.dataseg.relro_end = 0;
503 else
504 expld.result.valid_p = FALSE;
507 break;
509 case DATA_SEGMENT_RELRO_END:
510 expld.dataseg.relro = exp_dataseg_relro_end;
511 if (expld.phase == lang_first_phase_enum
512 || expld.section != bfd_abs_section_ptr)
513 expld.result.valid_p = FALSE;
514 else if (expld.dataseg.phase == exp_dataseg_align_seen
515 || expld.dataseg.phase == exp_dataseg_adjust
516 || expld.dataseg.phase == exp_dataseg_relro_adjust
517 || expld.dataseg.phase == exp_dataseg_done)
519 if (expld.dataseg.phase == exp_dataseg_align_seen
520 || expld.dataseg.phase == exp_dataseg_relro_adjust)
521 expld.dataseg.relro_end = lhs.value + expld.result.value;
523 if (expld.dataseg.phase == exp_dataseg_relro_adjust
524 && (expld.dataseg.relro_end
525 & (expld.dataseg.pagesize - 1)))
527 expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
528 expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
529 expld.result.value = (expld.dataseg.relro_end
530 - expld.result.value);
532 else
533 expld.result.value = lhs.value;
535 if (expld.dataseg.phase == exp_dataseg_align_seen)
536 expld.dataseg.phase = exp_dataseg_relro_seen;
538 else
539 expld.result.valid_p = FALSE;
540 break;
542 default:
543 FAIL ();
548 static void
549 fold_trinary (etree_type *tree)
551 exp_fold_tree_1 (tree->trinary.cond);
552 if (expld.result.valid_p)
553 exp_fold_tree_1 (expld.result.value
554 ? tree->trinary.lhs
555 : tree->trinary.rhs);
558 static void
559 fold_name (etree_type *tree)
561 memset (&expld.result, 0, sizeof (expld.result));
563 switch (tree->type.node_code)
565 case SIZEOF_HEADERS:
566 if (expld.phase != lang_first_phase_enum)
568 bfd_vma hdr_size = 0;
569 /* Don't find the real header size if only marking sections;
570 The bfd function may cache incorrect data. */
571 if (expld.phase != lang_mark_phase_enum)
572 hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
573 new_number (hdr_size);
575 break;
577 case DEFINED:
578 if (expld.phase != lang_first_phase_enum)
580 struct bfd_link_hash_entry *h;
581 struct lang_definedness_hash_entry *def;
583 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
584 &link_info,
585 tree->name.name,
586 FALSE, FALSE, TRUE);
587 new_number (h != NULL
588 && (h->type == bfd_link_hash_defined
589 || h->type == bfd_link_hash_defweak
590 || h->type == bfd_link_hash_common)
591 && ((def = lang_symbol_defined (tree->name.name)) == NULL
592 || def->by_object
593 || def->iteration == (lang_statement_iteration & 1)));
595 break;
597 case NAME:
598 if (expld.assign_name != NULL
599 && strcmp (expld.assign_name, tree->name.name) == 0)
601 /* Self-assignment is only allowed for absolute symbols
602 defined in a linker script. */
603 struct bfd_link_hash_entry *h;
604 struct lang_definedness_hash_entry *def;
606 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
607 &link_info,
608 tree->name.name,
609 FALSE, FALSE, TRUE);
610 if (!(h != NULL
611 && (h->type == bfd_link_hash_defined
612 || h->type == bfd_link_hash_defweak)
613 && h->u.def.section == bfd_abs_section_ptr
614 && (def = lang_symbol_defined (tree->name.name)) != NULL
615 && def->iteration == (lang_statement_iteration & 1)))
616 expld.assign_name = NULL;
618 if (expld.phase == lang_first_phase_enum)
620 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
621 new_rel_from_abs (expld.dot);
622 else
624 struct bfd_link_hash_entry *h;
626 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
627 &link_info,
628 tree->name.name,
629 TRUE, FALSE, TRUE);
630 if (!h)
631 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
632 else if (h->type == bfd_link_hash_defined
633 || h->type == bfd_link_hash_defweak)
635 asection *output_section;
637 output_section = h->u.def.section->output_section;
638 if (output_section == NULL)
640 if (expld.phase == lang_mark_phase_enum)
641 new_rel (h->u.def.value, h->u.def.section);
642 else
643 einfo (_("%X%S: unresolvable symbol `%s'"
644 " referenced in expression\n"),
645 tree, tree->name.name);
647 else if (output_section == bfd_abs_section_ptr
648 && (expld.section != bfd_abs_section_ptr
649 || config.sane_expr))
650 new_number (h->u.def.value + h->u.def.section->output_offset);
651 else
652 new_rel (h->u.def.value + h->u.def.section->output_offset,
653 output_section);
655 else if (expld.phase == lang_final_phase_enum
656 || (expld.phase != lang_mark_phase_enum
657 && expld.assigning_to_dot))
658 einfo (_("%F%S: undefined symbol `%s'"
659 " referenced in expression\n"),
660 tree, tree->name.name);
661 else if (h->type == bfd_link_hash_new)
663 h->type = bfd_link_hash_undefined;
664 h->u.undef.abfd = NULL;
665 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
666 bfd_link_add_undef (link_info.hash, h);
669 break;
671 case ADDR:
672 if (expld.phase != lang_first_phase_enum)
674 lang_output_section_statement_type *os;
676 os = lang_output_section_find (tree->name.name);
677 if (os == NULL)
679 if (expld.phase == lang_final_phase_enum)
680 einfo (_("%F%S: undefined section `%s'"
681 " referenced in expression\n"),
682 tree, tree->name.name);
684 else if (os->processed_vma)
685 new_rel (0, os->bfd_section);
687 break;
689 case LOADADDR:
690 if (expld.phase != lang_first_phase_enum)
692 lang_output_section_statement_type *os;
694 os = lang_output_section_find (tree->name.name);
695 if (os == NULL)
697 if (expld.phase == lang_final_phase_enum)
698 einfo (_("%F%S: undefined section `%s'"
699 " referenced in expression\n"),
700 tree, tree->name.name);
702 else if (os->processed_lma)
704 if (os->load_base == NULL)
705 new_abs (os->bfd_section->lma);
706 else
708 exp_fold_tree_1 (os->load_base);
709 if (expld.result.valid_p)
710 make_abs ();
714 break;
716 case SIZEOF:
717 case ALIGNOF:
718 if (expld.phase != lang_first_phase_enum)
720 lang_output_section_statement_type *os;
722 os = lang_output_section_find (tree->name.name);
723 if (os == NULL)
725 if (expld.phase == lang_final_phase_enum)
726 einfo (_("%F%S: undefined section `%s'"
727 " referenced in expression\n"),
728 tree, tree->name.name);
729 new_number (0);
731 else if (os->bfd_section != NULL)
733 bfd_vma val;
735 if (tree->type.node_code == SIZEOF)
736 val = (os->bfd_section->size
737 / bfd_octets_per_byte (link_info.output_bfd));
738 else
739 val = (bfd_vma)1 << os->bfd_section->alignment_power;
741 new_number (val);
743 else
744 new_number (0);
746 break;
748 case LENGTH:
750 lang_memory_region_type *mem;
752 mem = lang_memory_region_lookup (tree->name.name, FALSE);
753 if (mem != NULL)
754 new_number (mem->length);
755 else
756 einfo (_("%F%S: undefined MEMORY region `%s'"
757 " referenced in expression\n"),
758 tree, tree->name.name);
760 break;
762 case ORIGIN:
763 if (expld.phase != lang_first_phase_enum)
765 lang_memory_region_type *mem;
767 mem = lang_memory_region_lookup (tree->name.name, FALSE);
768 if (mem != NULL)
769 new_rel_from_abs (mem->origin);
770 else
771 einfo (_("%F%S: undefined MEMORY region `%s'"
772 " referenced in expression\n"),
773 tree, tree->name.name);
775 break;
777 case CONSTANT:
778 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
779 new_number (config.maxpagesize);
780 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
781 new_number (config.commonpagesize);
782 else
783 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
784 tree, tree->name.name);
785 break;
787 default:
788 FAIL ();
789 break;
793 /* Return true if TREE is '.'. */
795 static bfd_boolean
796 is_dot (const etree_type *tree)
798 return (tree->type.node_class == etree_name
799 && tree->type.node_code == NAME
800 && tree->name.name[0] == '.'
801 && tree->name.name[1] == 0);
804 /* Return true if TREE is a constant equal to VAL. */
806 static bfd_boolean
807 is_value (const etree_type *tree, bfd_vma val)
809 return (tree->type.node_class == etree_value
810 && tree->value.value == val);
813 /* Return true if TREE is an absolute symbol equal to VAL defined in
814 a linker script. */
816 static bfd_boolean
817 is_sym_value (const etree_type *tree, bfd_vma val)
819 struct bfd_link_hash_entry *h;
820 struct lang_definedness_hash_entry *def;
822 return (tree->type.node_class == etree_name
823 && tree->type.node_code == NAME
824 && (def = lang_symbol_defined (tree->name.name)) != NULL
825 && def->by_script
826 && def->iteration == (lang_statement_iteration & 1)
827 && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
828 &link_info,
829 tree->name.name,
830 FALSE, FALSE, TRUE)) != NULL
831 && h->type == bfd_link_hash_defined
832 && h->u.def.section == bfd_abs_section_ptr
833 && h->u.def.value == val);
836 /* Return true if TREE is ". != 0". */
838 static bfd_boolean
839 is_dot_ne_0 (const etree_type *tree)
841 return (tree->type.node_class == etree_binary
842 && tree->type.node_code == NE
843 && is_dot (tree->binary.lhs)
844 && is_value (tree->binary.rhs, 0));
847 /* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an
848 absolute constant with value 0 defined in a linker script. */
850 static bfd_boolean
851 is_dot_plus_0 (const etree_type *tree)
853 return (tree->type.node_class == etree_binary
854 && tree->type.node_code == '+'
855 && is_dot (tree->binary.lhs)
856 && (is_value (tree->binary.rhs, 0)
857 || is_sym_value (tree->binary.rhs, 0)));
860 /* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)". */
862 static bfd_boolean
863 is_align_conditional (const etree_type *tree)
865 if (tree->type.node_class == etree_unary
866 && tree->type.node_code == ALIGN_K)
868 tree = tree->unary.child;
869 return (tree->type.node_class == etree_trinary
870 && is_dot_ne_0 (tree->trinary.cond)
871 && is_value (tree->trinary.rhs, 1));
873 return 0;
876 static void
877 exp_fold_tree_1 (etree_type *tree)
879 if (tree == NULL)
881 memset (&expld.result, 0, sizeof (expld.result));
882 return;
885 switch (tree->type.node_class)
887 case etree_value:
888 if (expld.section == bfd_abs_section_ptr
889 && !config.sane_expr)
890 new_abs (tree->value.value);
891 else
892 new_number (tree->value.value);
893 expld.result.str = tree->value.str;
894 break;
896 case etree_rel:
897 if (expld.phase != lang_first_phase_enum)
899 asection *output_section = tree->rel.section->output_section;
900 new_rel (tree->rel.value + tree->rel.section->output_offset,
901 output_section);
903 else
904 memset (&expld.result, 0, sizeof (expld.result));
905 break;
907 case etree_assert:
908 exp_fold_tree_1 (tree->assert_s.child);
909 if (expld.phase == lang_final_phase_enum && !expld.result.value)
910 einfo ("%X%P: %s\n", tree->assert_s.message);
911 break;
913 case etree_unary:
914 fold_unary (tree);
915 break;
917 case etree_binary:
918 fold_binary (tree);
919 break;
921 case etree_trinary:
922 fold_trinary (tree);
923 break;
925 case etree_assign:
926 case etree_provide:
927 case etree_provided:
928 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
930 if (tree->type.node_class != etree_assign)
931 einfo (_("%F%S can not PROVIDE assignment to"
932 " location counter\n"), tree);
933 if (expld.phase != lang_first_phase_enum)
935 /* Notify the folder that this is an assignment to dot. */
936 expld.assigning_to_dot = TRUE;
937 exp_fold_tree_1 (tree->assign.src);
938 expld.assigning_to_dot = FALSE;
940 /* If we are assigning to dot inside an output section
941 arrange to keep the section, except for certain
942 expressions that evaluate to zero. We ignore . = 0,
943 . = . + 0, and . = ALIGN (. != 0 ? expr : 1). */
944 if (expld.phase == lang_mark_phase_enum
945 && expld.section != bfd_abs_section_ptr
946 && !(expld.result.valid_p
947 && expld.result.value == 0
948 && (is_value (tree->assign.src, 0)
949 || is_sym_value (tree->assign.src, 0)
950 || is_dot_plus_0 (tree->assign.src)
951 || is_align_conditional (tree->assign.src))))
952 expld.section->flags |= SEC_KEEP;
954 if (!expld.result.valid_p)
956 if (expld.phase != lang_mark_phase_enum)
957 einfo (_("%F%S invalid assignment to"
958 " location counter\n"), tree);
960 else if (expld.dotp == NULL)
961 einfo (_("%F%S assignment to location counter"
962 " invalid outside of SECTIONS\n"), tree);
964 /* After allocation, assignment to dot should not be
965 done inside an output section since allocation adds a
966 padding statement that effectively duplicates the
967 assignment. */
968 else if (expld.phase <= lang_allocating_phase_enum
969 || expld.section == bfd_abs_section_ptr)
971 bfd_vma nextdot;
973 nextdot = expld.result.value;
974 if (expld.result.section != NULL)
975 nextdot += expld.result.section->vma;
976 else
977 nextdot += expld.section->vma;
978 if (nextdot < expld.dot
979 && expld.section != bfd_abs_section_ptr)
980 einfo (_("%F%S cannot move location counter backwards"
981 " (from %V to %V)\n"),
982 tree, expld.dot, nextdot);
983 else
985 expld.dot = nextdot;
986 *expld.dotp = nextdot;
990 else
991 memset (&expld.result, 0, sizeof (expld.result));
993 else
995 struct bfd_link_hash_entry *h = NULL;
997 if (tree->type.node_class == etree_provide)
999 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1000 FALSE, FALSE, TRUE);
1001 if (h == NULL
1002 || (h->type != bfd_link_hash_new
1003 && h->type != bfd_link_hash_undefined
1004 && h->type != bfd_link_hash_common))
1006 /* Do nothing. The symbol was never referenced, or was
1007 defined by some object. */
1008 break;
1012 expld.assign_name = tree->assign.dst;
1013 exp_fold_tree_1 (tree->assign.src);
1014 /* expld.assign_name remaining equal to tree->assign.dst
1015 below indicates the evaluation of tree->assign.src did
1016 not use the value of tree->assign.dst. We don't allow
1017 self assignment until the final phase for two reasons:
1018 1) Expressions are evaluated multiple times. With
1019 relaxation, the number of times may vary.
1020 2) Section relative symbol values cannot be correctly
1021 converted to absolute values, as is required by many
1022 expressions, until final section sizing is complete. */
1023 if ((expld.result.valid_p
1024 && (expld.phase == lang_final_phase_enum
1025 || expld.assign_name != NULL))
1026 || (expld.phase <= lang_mark_phase_enum
1027 && tree->type.node_class == etree_assign
1028 && tree->assign.defsym))
1030 if (h == NULL)
1032 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1033 TRUE, FALSE, TRUE);
1034 if (h == NULL)
1035 einfo (_("%P%F:%s: hash creation failed\n"),
1036 tree->assign.dst);
1039 /* FIXME: Should we worry if the symbol is already
1040 defined? */
1041 lang_update_definedness (tree->assign.dst, h);
1042 h->type = bfd_link_hash_defined;
1043 h->u.def.value = expld.result.value;
1044 if (expld.result.section == NULL)
1045 expld.result.section = expld.section;
1046 h->u.def.section = expld.result.section;
1047 if (tree->type.node_class == etree_provide)
1048 tree->type.node_class = etree_provided;
1050 /* Copy the symbol type if this is a simple assignment of
1051 one symbol to another. This could be more general
1052 (e.g. a ?: operator with NAMEs in each branch). */
1053 if (tree->assign.src->type.node_class == etree_name)
1055 struct bfd_link_hash_entry *hsrc;
1057 hsrc = bfd_link_hash_lookup (link_info.hash,
1058 tree->assign.src->name.name,
1059 FALSE, FALSE, TRUE);
1060 if (hsrc)
1061 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
1062 hsrc);
1065 else if (expld.phase == lang_final_phase_enum)
1067 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1068 FALSE, FALSE, TRUE);
1069 if (h != NULL
1070 && h->type == bfd_link_hash_new)
1071 h->type = bfd_link_hash_undefined;
1073 expld.assign_name = NULL;
1075 break;
1077 case etree_name:
1078 fold_name (tree);
1079 break;
1081 default:
1082 FAIL ();
1083 memset (&expld.result, 0, sizeof (expld.result));
1084 break;
1088 void
1089 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
1091 expld.dot = *dotp;
1092 expld.dotp = dotp;
1093 expld.section = current_section;
1094 exp_fold_tree_1 (tree);
1097 void
1098 exp_fold_tree_no_dot (etree_type *tree)
1100 expld.dot = 0;
1101 expld.dotp = NULL;
1102 expld.section = bfd_abs_section_ptr;
1103 exp_fold_tree_1 (tree);
1106 etree_type *
1107 exp_binop (int code, etree_type *lhs, etree_type *rhs)
1109 etree_type value, *new_e;
1111 value.type.node_code = code;
1112 value.type.filename = lhs->type.filename;
1113 value.type.lineno = lhs->type.lineno;
1114 value.binary.lhs = lhs;
1115 value.binary.rhs = rhs;
1116 value.type.node_class = etree_binary;
1117 exp_fold_tree_no_dot (&value);
1118 if (expld.result.valid_p)
1119 return exp_intop (expld.result.value);
1121 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
1122 memcpy (new_e, &value, sizeof (new_e->binary));
1123 return new_e;
1126 etree_type *
1127 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
1129 etree_type value, *new_e;
1131 value.type.node_code = code;
1132 value.type.filename = cond->type.filename;
1133 value.type.lineno = cond->type.lineno;
1134 value.trinary.lhs = lhs;
1135 value.trinary.cond = cond;
1136 value.trinary.rhs = rhs;
1137 value.type.node_class = etree_trinary;
1138 exp_fold_tree_no_dot (&value);
1139 if (expld.result.valid_p)
1140 return exp_intop (expld.result.value);
1142 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1143 memcpy (new_e, &value, sizeof (new_e->trinary));
1144 return new_e;
1147 etree_type *
1148 exp_unop (int code, etree_type *child)
1150 etree_type value, *new_e;
1152 value.unary.type.node_code = code;
1153 value.unary.type.filename = child->type.filename;
1154 value.unary.type.lineno = child->type.lineno;
1155 value.unary.child = child;
1156 value.unary.type.node_class = etree_unary;
1157 exp_fold_tree_no_dot (&value);
1158 if (expld.result.valid_p)
1159 return exp_intop (expld.result.value);
1161 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1162 memcpy (new_e, &value, sizeof (new_e->unary));
1163 return new_e;
1166 etree_type *
1167 exp_nameop (int code, const char *name)
1169 etree_type value, *new_e;
1171 value.name.type.node_code = code;
1172 value.name.type.filename = ldlex_filename ();
1173 value.name.type.lineno = lineno;
1174 value.name.name = name;
1175 value.name.type.node_class = etree_name;
1177 exp_fold_tree_no_dot (&value);
1178 if (expld.result.valid_p)
1179 return exp_intop (expld.result.value);
1181 new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1182 memcpy (new_e, &value, sizeof (new_e->name));
1183 return new_e;
1187 static etree_type *
1188 exp_assop (const char *dst,
1189 etree_type *src,
1190 enum node_tree_enum class,
1191 bfd_boolean defsym,
1192 bfd_boolean hidden)
1194 etree_type *n;
1196 n = (etree_type *) stat_alloc (sizeof (n->assign));
1197 n->assign.type.node_code = '=';
1198 n->assign.type.filename = src->type.filename;
1199 n->assign.type.lineno = src->type.lineno;
1200 n->assign.type.node_class = class;
1201 n->assign.src = src;
1202 n->assign.dst = dst;
1203 n->assign.defsym = defsym;
1204 n->assign.hidden = hidden;
1205 return n;
1208 /* Handle linker script assignments and HIDDEN. */
1210 etree_type *
1211 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1213 return exp_assop (dst, src, etree_assign, FALSE, hidden);
1216 /* Handle --defsym command-line option. */
1218 etree_type *
1219 exp_defsym (const char *dst, etree_type *src)
1221 return exp_assop (dst, src, etree_assign, TRUE, FALSE);
1224 /* Handle PROVIDE. */
1226 etree_type *
1227 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1229 return exp_assop (dst, src, etree_provide, FALSE, hidden);
1232 /* Handle ASSERT. */
1234 etree_type *
1235 exp_assert (etree_type *exp, const char *message)
1237 etree_type *n;
1239 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1240 n->assert_s.type.node_code = '!';
1241 n->assert_s.type.filename = exp->type.filename;
1242 n->assert_s.type.lineno = exp->type.lineno;
1243 n->assert_s.type.node_class = etree_assert;
1244 n->assert_s.child = exp;
1245 n->assert_s.message = message;
1246 return n;
1249 void
1250 exp_print_tree (etree_type *tree)
1252 bfd_boolean function_like;
1254 if (config.map_file == NULL)
1255 config.map_file = stderr;
1257 if (tree == NULL)
1259 minfo ("NULL TREE\n");
1260 return;
1263 switch (tree->type.node_class)
1265 case etree_value:
1266 minfo ("0x%v", tree->value.value);
1267 return;
1268 case etree_rel:
1269 if (tree->rel.section->owner != NULL)
1270 minfo ("%B:", tree->rel.section->owner);
1271 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1272 return;
1273 case etree_assign:
1274 fputs (tree->assign.dst, config.map_file);
1275 exp_print_token (tree->type.node_code, TRUE);
1276 exp_print_tree (tree->assign.src);
1277 break;
1278 case etree_provide:
1279 case etree_provided:
1280 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1281 exp_print_tree (tree->assign.src);
1282 fputc (')', config.map_file);
1283 break;
1284 case etree_binary:
1285 function_like = FALSE;
1286 switch (tree->type.node_code)
1288 case MAX_K:
1289 case MIN_K:
1290 case ALIGN_K:
1291 case DATA_SEGMENT_ALIGN:
1292 case DATA_SEGMENT_RELRO_END:
1293 function_like = TRUE;
1294 break;
1295 case SEGMENT_START:
1296 /* Special handling because arguments are in reverse order and
1297 the segment name is quoted. */
1298 exp_print_token (tree->type.node_code, FALSE);
1299 fputs (" (\"", config.map_file);
1300 exp_print_tree (tree->binary.rhs);
1301 fputs ("\", ", config.map_file);
1302 exp_print_tree (tree->binary.lhs);
1303 fputc (')', config.map_file);
1304 return;
1306 if (function_like)
1308 exp_print_token (tree->type.node_code, FALSE);
1309 fputc (' ', config.map_file);
1311 fputc ('(', config.map_file);
1312 exp_print_tree (tree->binary.lhs);
1313 if (function_like)
1314 fprintf (config.map_file, ", ");
1315 else
1316 exp_print_token (tree->type.node_code, TRUE);
1317 exp_print_tree (tree->binary.rhs);
1318 fputc (')', config.map_file);
1319 break;
1320 case etree_trinary:
1321 exp_print_tree (tree->trinary.cond);
1322 fputc ('?', config.map_file);
1323 exp_print_tree (tree->trinary.lhs);
1324 fputc (':', config.map_file);
1325 exp_print_tree (tree->trinary.rhs);
1326 break;
1327 case etree_unary:
1328 exp_print_token (tree->unary.type.node_code, FALSE);
1329 if (tree->unary.child)
1331 fprintf (config.map_file, " (");
1332 exp_print_tree (tree->unary.child);
1333 fputc (')', config.map_file);
1335 break;
1337 case etree_assert:
1338 fprintf (config.map_file, "ASSERT (");
1339 exp_print_tree (tree->assert_s.child);
1340 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1341 break;
1343 case etree_name:
1344 if (tree->type.node_code == NAME)
1345 fputs (tree->name.name, config.map_file);
1346 else
1348 exp_print_token (tree->type.node_code, FALSE);
1349 if (tree->name.name)
1350 fprintf (config.map_file, " (%s)", tree->name.name);
1352 break;
1353 default:
1354 FAIL ();
1355 break;
1359 bfd_vma
1360 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1362 if (tree != NULL)
1364 exp_fold_tree_no_dot (tree);
1365 if (expld.result.valid_p)
1366 return expld.result.value;
1367 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1368 einfo (_("%F%S: nonconstant expression for %s\n"),
1369 tree, name);
1371 return def;
1375 exp_get_value_int (etree_type *tree, int def, char *name)
1377 return exp_get_vma (tree, def, name);
1380 fill_type *
1381 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1383 fill_type *fill;
1384 size_t len;
1385 unsigned int val;
1387 if (tree == NULL)
1388 return def;
1390 exp_fold_tree_no_dot (tree);
1391 if (!expld.result.valid_p)
1393 if (name != NULL && expld.phase != lang_mark_phase_enum)
1394 einfo (_("%F%S: nonconstant expression for %s\n"),
1395 tree, name);
1396 return def;
1399 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1401 unsigned char *dst;
1402 unsigned char *s;
1403 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1404 fill->size = (len + 1) / 2;
1405 dst = fill->data;
1406 s = (unsigned char *) expld.result.str;
1407 val = 0;
1410 unsigned int digit;
1412 digit = *s++ - '0';
1413 if (digit > 9)
1414 digit = (digit - 'A' + '0' + 10) & 0xf;
1415 val <<= 4;
1416 val += digit;
1417 --len;
1418 if ((len & 1) == 0)
1420 *dst++ = val;
1421 val = 0;
1424 while (len != 0);
1426 else
1428 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1429 val = expld.result.value;
1430 fill->data[0] = (val >> 24) & 0xff;
1431 fill->data[1] = (val >> 16) & 0xff;
1432 fill->data[2] = (val >> 8) & 0xff;
1433 fill->data[3] = (val >> 0) & 0xff;
1434 fill->size = 4;
1436 return fill;
1439 bfd_vma
1440 exp_get_abs_int (etree_type *tree, int def, char *name)
1442 if (tree != NULL)
1444 exp_fold_tree_no_dot (tree);
1446 if (expld.result.valid_p)
1448 if (expld.result.section != NULL)
1449 expld.result.value += expld.result.section->vma;
1450 return expld.result.value;
1452 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1454 einfo (_("%F%S: nonconstant expression for %s\n"),
1455 tree, name);
1458 return def;
1461 static bfd_vma
1462 align_n (bfd_vma value, bfd_vma align)
1464 if (align <= 1)
1465 return value;
1467 value = (value + align - 1) / align;
1468 return value * align;