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>.
7 This file is part of the GNU Binutils.
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.
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.
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. */
25 /* This module is in charge of working out the contents of expressions.
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
43 #include "libiberty.h"
44 #include "safe-ctype.h"
46 static void exp_fold_tree_1 (etree_type *);
47 static bfd_vma align_n (bfd_vma, bfd_vma);
49 segment_type *segments;
51 struct ldexp_control expld;
53 /* Print the string representation of the given token. Surround it
54 with spaces if INFIX_P is TRUE. */
57 exp_print_token (token_code_type code, int infix_p)
91 { SECTIONS, "SECTIONS" },
92 { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
94 { DEFINED, "DEFINED" },
95 { TARGET_K, "TARGET" },
96 { SEARCH_DIR, "SEARCH_DIR" },
100 { ALIGNOF, "ALIGNOF" },
101 { SIZEOF, "SIZEOF" },
103 { LOADADDR, "LOADADDR" },
104 { CONSTANT, "CONSTANT" },
105 { ABSOLUTE, "ABSOLUTE" },
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" }
119 for (idx = 0; idx < ARRAY_SIZE (table); idx++)
120 if (table[idx].code == code)
124 fputc (' ', config.map_file);
126 if (idx < ARRAY_SIZE (table))
127 fputs (table[idx].name, config.map_file);
129 fputc (code, config.map_file);
131 fprintf (config.map_file, "<code %d>", code);
134 fputc (' ', config.map_file);
140 if (expld.result.section != NULL)
141 expld.result.value += expld.result.section->vma;
142 expld.result.section = bfd_abs_section_ptr;
146 new_abs (bfd_vma value)
148 expld.result.valid_p = TRUE;
149 expld.result.section = bfd_abs_section_ptr;
150 expld.result.value = value;
151 expld.result.str = NULL;
155 exp_intop (bfd_vma value)
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;
168 exp_bigintop (bfd_vma value, char *str)
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;
180 /* Build an expression representing an unnamed relocatable value. */
183 exp_relop (asection *section, bfd_vma value)
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;
196 new_number (bfd_vma value)
198 expld.result.valid_p = TRUE;
199 expld.result.value = value;
200 expld.result.str = NULL;
201 expld.result.section = NULL;
205 new_rel (bfd_vma value, asection *section)
207 expld.result.valid_p = TRUE;
208 expld.result.value = value;
209 expld.result.str = NULL;
210 expld.result.section = section;
214 new_rel_from_abs (bfd_vma value)
216 asection *s = expld.section;
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;
227 fold_unary (etree_type *tree)
229 exp_fold_tree_1 (tree->unary.child);
230 if (expld.result.valid_p)
232 switch (tree->type.node_code)
235 if (expld.phase != lang_first_phase_enum)
236 new_rel_from_abs (align_n (expld.dot, expld.result.value));
238 expld.result.valid_p = FALSE;
246 expld.result.value = ~expld.result.value;
250 expld.result.value = !expld.result.value;
254 expld.result.value = -expld.result.value;
258 /* Return next place aligned to value. */
259 if (expld.phase != lang_first_phase_enum)
262 expld.result.value = align_n (expld.dot, expld.result.value);
265 expld.result.valid_p = FALSE;
268 case DATA_SEGMENT_END:
269 if (expld.phase == lang_first_phase_enum
270 || expld.section != bfd_abs_section_ptr)
272 expld.result.valid_p = FALSE;
274 else if (expld.dataseg.phase == exp_dataseg_align_seen
275 || expld.dataseg.phase == exp_dataseg_relro_seen)
277 expld.dataseg.phase = exp_dataseg_end_seen;
278 expld.dataseg.end = expld.result.value;
280 else if (expld.dataseg.phase == exp_dataseg_done
281 || expld.dataseg.phase == exp_dataseg_adjust
282 || expld.dataseg.phase == exp_dataseg_relro_adjust)
287 expld.result.valid_p = FALSE;
298 fold_binary (etree_type *tree)
300 etree_value_type lhs;
301 exp_fold_tree_1 (tree->binary.lhs);
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)
309 const char *segment_name;
312 /* Check to see if the user has overridden the default
314 segment_name = tree->binary.rhs->name.name;
315 for (seg = segments; seg; seg = seg->next)
316 if (strcmp (seg->name, segment_name) == 0)
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"),
324 new_rel_from_abs (seg->value);
331 exp_fold_tree_1 (tree->binary.rhs);
332 expld.result.valid_p &= lhs.valid_p;
334 if (expld.result.valid_p)
336 if (lhs.section != expld.result.section)
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)
344 lhs.value += lhs.section->vma;
345 lhs.section = bfd_abs_section_ptr;
348 /* If the rhs is just a number, keep the lhs section. */
349 else if (expld.result.section == NULL)
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. */
357 /* At this point we know that both operands have the same
358 section, or at least one of them is a plain number. */
360 switch (tree->type.node_code)
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
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. */
379 expld.result.value = lhs.value y expld.result.value; \
380 if (expld.result.section == lhs.section) \
381 expld.result.section = NULL; \
384 /* Comparison operators, logical AND, and logical OR always
385 return a plain number. */
388 expld.result.value = lhs.value y expld.result.value; \
389 expld.result.section = NULL; \
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;
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;
430 if (lhs.value > expld.result.value)
431 expld.result.value = lhs.value;
435 if (lhs.value < expld.result.value)
436 expld.result.value = lhs.value;
440 expld.result.value = align_n (lhs.value, expld.result.value);
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;
450 bfd_vma maxpage = lhs.value;
451 bfd_vma commonpage = expld.result.value;
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)
458 if (commonpage < maxpage)
459 expld.result.value += ((expld.dot + commonpage - 1)
460 & (maxpage - commonpage));
464 expld.result.value += expld.dot & (maxpage - 1);
465 if (expld.dataseg.phase == exp_dataseg_done)
469 else if (expld.dataseg.phase == exp_dataseg_none)
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;
479 expld.result.valid_p = FALSE;
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)
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;
498 if (expld.dataseg.phase == exp_dataseg_relro_adjust
499 && (expld.dataseg.relro_end
500 & (expld.dataseg.pagesize - 1)))
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);
508 expld.result.value = lhs.value;
510 if (expld.dataseg.phase == exp_dataseg_align_seen)
511 expld.dataseg.phase = exp_dataseg_relro_seen;
514 expld.result.valid_p = FALSE;
524 fold_trinary (etree_type *tree)
526 exp_fold_tree_1 (tree->trinary.cond);
527 if (expld.result.valid_p)
528 exp_fold_tree_1 (expld.result.value
530 : tree->trinary.rhs);
534 fold_name (etree_type *tree)
536 memset (&expld.result, 0, sizeof (expld.result));
538 switch (tree->type.node_code)
541 if (expld.phase != lang_first_phase_enum)
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);
553 if (expld.phase == lang_first_phase_enum)
554 lang_track_definedness (tree->name.name);
557 struct bfd_link_hash_entry *h;
559 = lang_symbol_definition_iteration (tree->name.name);
561 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
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));
575 if (expld.phase == lang_first_phase_enum)
577 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
578 new_rel_from_abs (expld.dot);
581 struct bfd_link_hash_entry *h;
583 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
588 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
589 else if (h->type == bfd_link_hash_defined
590 || h->type == bfd_link_hash_defweak)
592 asection *output_section;
594 output_section = h->u.def.section->output_section;
595 if (output_section == NULL)
597 if (expld.phase == lang_mark_phase_enum)
598 new_rel (h->u.def.value, h->u.def.section);
600 einfo (_("%X%S: unresolvable symbol `%s'"
601 " referenced in expression\n"),
602 tree, tree->name.name);
604 else if (output_section == bfd_abs_section_ptr
605 && (expld.section != bfd_abs_section_ptr
606 || config.sane_expr))
607 new_number (h->u.def.value + h->u.def.section->output_offset);
609 new_rel (h->u.def.value + h->u.def.section->output_offset,
612 else if (expld.phase == lang_final_phase_enum
613 || (expld.phase != lang_mark_phase_enum
614 && expld.assigning_to_dot))
615 einfo (_("%F%S: undefined symbol `%s'"
616 " referenced in expression\n"),
617 tree, tree->name.name);
618 else if (h->type == bfd_link_hash_new)
620 h->type = bfd_link_hash_undefined;
621 h->u.undef.abfd = NULL;
622 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
623 bfd_link_add_undef (link_info.hash, h);
629 if (expld.phase != lang_first_phase_enum)
631 lang_output_section_statement_type *os;
633 os = lang_output_section_find (tree->name.name);
636 if (expld.phase == lang_final_phase_enum)
637 einfo (_("%F%S: undefined section `%s'"
638 " referenced in expression\n"),
639 tree, tree->name.name);
641 else if (os->processed_vma)
642 new_rel (0, os->bfd_section);
647 if (expld.phase != lang_first_phase_enum)
649 lang_output_section_statement_type *os;
651 os = lang_output_section_find (tree->name.name);
654 if (expld.phase == lang_final_phase_enum)
655 einfo (_("%F%S: undefined section `%s'"
656 " referenced in expression\n"),
657 tree, tree->name.name);
659 else if (os->processed_lma)
661 if (os->load_base == NULL)
662 new_abs (os->bfd_section->lma);
665 exp_fold_tree_1 (os->load_base);
666 if (expld.result.valid_p)
675 if (expld.phase != lang_first_phase_enum)
677 lang_output_section_statement_type *os;
679 os = lang_output_section_find (tree->name.name);
682 if (expld.phase == lang_final_phase_enum)
683 einfo (_("%F%S: undefined section `%s'"
684 " referenced in expression\n"),
685 tree, tree->name.name);
688 else if (os->bfd_section != NULL)
692 if (tree->type.node_code == SIZEOF)
693 val = (os->bfd_section->size
694 / bfd_octets_per_byte (link_info.output_bfd));
696 val = (bfd_vma)1 << os->bfd_section->alignment_power;
707 lang_memory_region_type *mem;
709 mem = lang_memory_region_lookup (tree->name.name, FALSE);
711 new_number (mem->length);
713 einfo (_("%F%S: undefined MEMORY region `%s'"
714 " referenced in expression\n"),
715 tree, tree->name.name);
720 if (expld.phase != lang_first_phase_enum)
722 lang_memory_region_type *mem;
724 mem = lang_memory_region_lookup (tree->name.name, FALSE);
726 new_rel_from_abs (mem->origin);
728 einfo (_("%F%S: undefined MEMORY region `%s'"
729 " referenced in expression\n"),
730 tree, tree->name.name);
735 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
736 new_number (config.maxpagesize);
737 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
738 new_number (config.commonpagesize);
740 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
741 tree, tree->name.name);
751 exp_fold_tree_1 (etree_type *tree)
755 memset (&expld.result, 0, sizeof (expld.result));
759 switch (tree->type.node_class)
762 if (expld.section == bfd_abs_section_ptr
763 && !config.sane_expr)
764 new_abs (tree->value.value);
766 new_number (tree->value.value);
767 expld.result.str = tree->value.str;
771 if (expld.phase != lang_first_phase_enum)
773 asection *output_section = tree->rel.section->output_section;
774 new_rel (tree->rel.value + tree->rel.section->output_offset,
778 memset (&expld.result, 0, sizeof (expld.result));
782 exp_fold_tree_1 (tree->assert_s.child);
783 if (expld.phase == lang_final_phase_enum && !expld.result.value)
784 einfo ("%X%P: %s\n", tree->assert_s.message);
802 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
804 if (tree->type.node_class != etree_assign)
805 einfo (_("%F%S can not PROVIDE assignment to"
806 " location counter\n"), tree);
807 if (expld.phase != lang_first_phase_enum)
809 /* Notify the folder that this is an assignment to dot. */
810 expld.assigning_to_dot = TRUE;
811 exp_fold_tree_1 (tree->assign.src);
812 expld.assigning_to_dot = FALSE;
814 if (!expld.result.valid_p)
816 if (expld.phase != lang_mark_phase_enum)
817 einfo (_("%F%S invalid assignment to"
818 " location counter\n"), tree);
820 else if (expld.dotp == NULL)
821 einfo (_("%F%S assignment to location counter"
822 " invalid outside of SECTIONS\n"), tree);
824 /* After allocation, assignment to dot should not be
825 done inside an output section since allocation adds a
826 padding statement that effectively duplicates the
828 else if (expld.phase <= lang_allocating_phase_enum
829 || expld.section == bfd_abs_section_ptr)
833 nextdot = expld.result.value;
834 if (expld.result.section != NULL)
835 nextdot += expld.result.section->vma;
837 nextdot += expld.section->vma;
838 if (nextdot < expld.dot
839 && expld.section != bfd_abs_section_ptr)
840 einfo (_("%F%S cannot move location counter backwards"
841 " (from %V to %V)\n"),
842 tree, expld.dot, nextdot);
846 *expld.dotp = nextdot;
851 memset (&expld.result, 0, sizeof (expld.result));
857 struct bfd_link_hash_entry *h = NULL;
859 if (tree->type.node_class == etree_provide)
861 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
864 || (h->type != bfd_link_hash_new
865 && h->type != bfd_link_hash_undefined
866 && h->type != bfd_link_hash_common))
868 /* Do nothing. The symbol was never referenced, or was
869 defined by some object. */
874 name = tree->assign.src;
875 if (name->type.node_class == etree_trinary)
877 exp_fold_tree_1 (name->trinary.cond);
878 if (expld.result.valid_p)
879 name = (expld.result.value
880 ? name->trinary.lhs : name->trinary.rhs);
883 if (name->type.node_class == etree_name
884 && name->type.node_code == NAME
885 && strcmp (tree->assign.dst, name->name.name) == 0)
886 /* Leave it alone. Do not replace a symbol with its own
887 output address, in case there is another section sizing
888 pass. Folding does not preserve input sections. */
891 exp_fold_tree_1 (tree->assign.src);
892 if (expld.result.valid_p
893 || (expld.phase <= lang_mark_phase_enum
894 && tree->type.node_class == etree_assign
895 && tree->assign.defsym))
899 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
902 einfo (_("%P%F:%s: hash creation failed\n"),
906 /* FIXME: Should we worry if the symbol is already
908 lang_update_definedness (tree->assign.dst, h);
909 h->type = bfd_link_hash_defined;
910 h->u.def.value = expld.result.value;
911 if (expld.result.section == NULL)
912 expld.result.section = expld.section;
913 h->u.def.section = expld.result.section;
914 if (tree->type.node_class == etree_provide)
915 tree->type.node_class = etree_provided;
917 /* Copy the symbol type if this is a simple assignment of
918 one symbol to another. This could be more general
919 (e.g. a ?: operator with NAMEs in each branch). */
920 if (tree->assign.src->type.node_class == etree_name)
922 struct bfd_link_hash_entry *hsrc;
924 hsrc = bfd_link_hash_lookup (link_info.hash,
925 tree->assign.src->name.name,
928 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
932 else if (expld.phase == lang_final_phase_enum)
934 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
937 && h->type == bfd_link_hash_new)
938 h->type = bfd_link_hash_undefined;
949 memset (&expld.result, 0, sizeof (expld.result));
955 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
959 expld.section = current_section;
960 exp_fold_tree_1 (tree);
964 exp_fold_tree_no_dot (etree_type *tree)
968 expld.section = bfd_abs_section_ptr;
969 exp_fold_tree_1 (tree);
973 exp_binop (int code, etree_type *lhs, etree_type *rhs)
975 etree_type value, *new_e;
977 value.type.node_code = code;
978 value.type.filename = lhs->type.filename;
979 value.type.lineno = lhs->type.lineno;
980 value.binary.lhs = lhs;
981 value.binary.rhs = rhs;
982 value.type.node_class = etree_binary;
983 exp_fold_tree_no_dot (&value);
984 if (expld.result.valid_p)
985 return exp_intop (expld.result.value);
987 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
988 memcpy (new_e, &value, sizeof (new_e->binary));
993 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
995 etree_type value, *new_e;
997 value.type.node_code = code;
998 value.type.filename = cond->type.filename;
999 value.type.lineno = cond->type.lineno;
1000 value.trinary.lhs = lhs;
1001 value.trinary.cond = cond;
1002 value.trinary.rhs = rhs;
1003 value.type.node_class = etree_trinary;
1004 exp_fold_tree_no_dot (&value);
1005 if (expld.result.valid_p)
1006 return exp_intop (expld.result.value);
1008 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1009 memcpy (new_e, &value, sizeof (new_e->trinary));
1014 exp_unop (int code, etree_type *child)
1016 etree_type value, *new_e;
1018 value.unary.type.node_code = code;
1019 value.unary.type.filename = child->type.filename;
1020 value.unary.type.lineno = child->type.lineno;
1021 value.unary.child = child;
1022 value.unary.type.node_class = etree_unary;
1023 exp_fold_tree_no_dot (&value);
1024 if (expld.result.valid_p)
1025 return exp_intop (expld.result.value);
1027 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1028 memcpy (new_e, &value, sizeof (new_e->unary));
1033 exp_nameop (int code, const char *name)
1035 etree_type value, *new_e;
1037 value.name.type.node_code = code;
1038 value.name.type.filename = ldlex_filename ();
1039 value.name.type.lineno = lineno;
1040 value.name.name = name;
1041 value.name.type.node_class = etree_name;
1043 exp_fold_tree_no_dot (&value);
1044 if (expld.result.valid_p)
1045 return exp_intop (expld.result.value);
1047 new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1048 memcpy (new_e, &value, sizeof (new_e->name));
1054 exp_assop (const char *dst,
1056 enum node_tree_enum class,
1062 n = (etree_type *) stat_alloc (sizeof (n->assign));
1063 n->assign.type.node_code = '=';
1064 n->assign.type.filename = src->type.filename;
1065 n->assign.type.lineno = src->type.lineno;
1066 n->assign.type.node_class = class;
1067 n->assign.src = src;
1068 n->assign.dst = dst;
1069 n->assign.defsym = defsym;
1070 n->assign.hidden = hidden;
1074 /* Handle linker script assignments and HIDDEN. */
1077 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1079 return exp_assop (dst, src, etree_assign, FALSE, hidden);
1082 /* Handle --defsym command-line option. */
1085 exp_defsym (const char *dst, etree_type *src)
1087 return exp_assop (dst, src, etree_assign, TRUE, FALSE);
1090 /* Handle PROVIDE. */
1093 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1095 return exp_assop (dst, src, etree_provide, FALSE, hidden);
1098 /* Handle ASSERT. */
1101 exp_assert (etree_type *exp, const char *message)
1105 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1106 n->assert_s.type.node_code = '!';
1107 n->assert_s.type.filename = exp->type.filename;
1108 n->assert_s.type.lineno = exp->type.lineno;
1109 n->assert_s.type.node_class = etree_assert;
1110 n->assert_s.child = exp;
1111 n->assert_s.message = message;
1116 exp_print_tree (etree_type *tree)
1118 bfd_boolean function_like;
1120 if (config.map_file == NULL)
1121 config.map_file = stderr;
1125 minfo ("NULL TREE\n");
1129 switch (tree->type.node_class)
1132 minfo ("0x%v", tree->value.value);
1135 if (tree->rel.section->owner != NULL)
1136 minfo ("%B:", tree->rel.section->owner);
1137 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1140 fputs (tree->assign.dst, config.map_file);
1141 exp_print_token (tree->type.node_code, TRUE);
1142 exp_print_tree (tree->assign.src);
1145 case etree_provided:
1146 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1147 exp_print_tree (tree->assign.src);
1148 fputc (')', config.map_file);
1151 function_like = FALSE;
1152 switch (tree->type.node_code)
1157 case DATA_SEGMENT_ALIGN:
1158 case DATA_SEGMENT_RELRO_END:
1159 function_like = TRUE;
1162 /* Special handling because arguments are in reverse order and
1163 the segment name is quoted. */
1164 exp_print_token (tree->type.node_code, FALSE);
1165 fputs (" (\"", config.map_file);
1166 exp_print_tree (tree->binary.rhs);
1167 fputs ("\", ", config.map_file);
1168 exp_print_tree (tree->binary.lhs);
1169 fputc (')', config.map_file);
1174 exp_print_token (tree->type.node_code, FALSE);
1175 fputc (' ', config.map_file);
1177 fputc ('(', config.map_file);
1178 exp_print_tree (tree->binary.lhs);
1180 fprintf (config.map_file, ", ");
1182 exp_print_token (tree->type.node_code, TRUE);
1183 exp_print_tree (tree->binary.rhs);
1184 fputc (')', config.map_file);
1187 exp_print_tree (tree->trinary.cond);
1188 fputc ('?', config.map_file);
1189 exp_print_tree (tree->trinary.lhs);
1190 fputc (':', config.map_file);
1191 exp_print_tree (tree->trinary.rhs);
1194 exp_print_token (tree->unary.type.node_code, FALSE);
1195 if (tree->unary.child)
1197 fprintf (config.map_file, " (");
1198 exp_print_tree (tree->unary.child);
1199 fputc (')', config.map_file);
1204 fprintf (config.map_file, "ASSERT (");
1205 exp_print_tree (tree->assert_s.child);
1206 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1210 if (tree->type.node_code == NAME)
1211 fputs (tree->name.name, config.map_file);
1214 exp_print_token (tree->type.node_code, FALSE);
1215 if (tree->name.name)
1216 fprintf (config.map_file, " (%s)", tree->name.name);
1226 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1230 exp_fold_tree_no_dot (tree);
1231 if (expld.result.valid_p)
1232 return expld.result.value;
1233 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1234 einfo (_("%F%S: nonconstant expression for %s\n"),
1241 exp_get_value_int (etree_type *tree, int def, char *name)
1243 return exp_get_vma (tree, def, name);
1247 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1256 exp_fold_tree_no_dot (tree);
1257 if (!expld.result.valid_p)
1259 if (name != NULL && expld.phase != lang_mark_phase_enum)
1260 einfo (_("%F%S: nonconstant expression for %s\n"),
1265 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1269 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1270 fill->size = (len + 1) / 2;
1272 s = (unsigned char *) expld.result.str;
1280 digit = (digit - 'A' + '0' + 10) & 0xf;
1294 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1295 val = expld.result.value;
1296 fill->data[0] = (val >> 24) & 0xff;
1297 fill->data[1] = (val >> 16) & 0xff;
1298 fill->data[2] = (val >> 8) & 0xff;
1299 fill->data[3] = (val >> 0) & 0xff;
1306 exp_get_abs_int (etree_type *tree, int def, char *name)
1310 exp_fold_tree_no_dot (tree);
1312 if (expld.result.valid_p)
1314 if (expld.result.section != NULL)
1315 expld.result.value += expld.result.section->vma;
1316 return expld.result.value;
1318 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1320 einfo (_("%F%S: nonconstant expression for %s\n"),
1328 align_n (bfd_vma value, bfd_vma align)
1333 value = (value + align - 1) / align;
1334 return value * align;