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
.hidden
))
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,
1061 n
= (etree_type
*) stat_alloc (sizeof (n
->assign
));
1062 n
->assign
.type
.node_code
= '=';
1063 n
->assign
.type
.filename
= src
->type
.filename
;
1064 n
->assign
.type
.lineno
= src
->type
.lineno
;
1065 n
->assign
.type
.node_class
= class;
1066 n
->assign
.src
= src
;
1067 n
->assign
.dst
= dst
;
1068 n
->assign
.hidden
= hidden
;
1073 exp_assign (const char *dst
, etree_type
*src
)
1075 return exp_assop (dst
, src
, etree_assign
, FALSE
);
1079 exp_defsym (const char *dst
, etree_type
*src
)
1081 return exp_assop (dst
, src
, etree_assign
, TRUE
);
1084 /* Handle PROVIDE. */
1087 exp_provide (const char *dst
, etree_type
*src
, bfd_boolean hidden
)
1089 return exp_assop (dst
, src
, etree_provide
, hidden
);
1092 /* Handle ASSERT. */
1095 exp_assert (etree_type
*exp
, const char *message
)
1099 n
= (etree_type
*) stat_alloc (sizeof (n
->assert_s
));
1100 n
->assert_s
.type
.node_code
= '!';
1101 n
->assert_s
.type
.filename
= exp
->type
.filename
;
1102 n
->assert_s
.type
.lineno
= exp
->type
.lineno
;
1103 n
->assert_s
.type
.node_class
= etree_assert
;
1104 n
->assert_s
.child
= exp
;
1105 n
->assert_s
.message
= message
;
1110 exp_print_tree (etree_type
*tree
)
1112 bfd_boolean function_like
;
1114 if (config
.map_file
== NULL
)
1115 config
.map_file
= stderr
;
1119 minfo ("NULL TREE\n");
1123 switch (tree
->type
.node_class
)
1126 minfo ("0x%v", tree
->value
.value
);
1129 if (tree
->rel
.section
->owner
!= NULL
)
1130 minfo ("%B:", tree
->rel
.section
->owner
);
1131 minfo ("%s+0x%v", tree
->rel
.section
->name
, tree
->rel
.value
);
1134 fputs (tree
->assign
.dst
, config
.map_file
);
1135 exp_print_token (tree
->type
.node_code
, TRUE
);
1136 exp_print_tree (tree
->assign
.src
);
1139 case etree_provided
:
1140 fprintf (config
.map_file
, "PROVIDE (%s, ", tree
->assign
.dst
);
1141 exp_print_tree (tree
->assign
.src
);
1142 fputc (')', config
.map_file
);
1145 function_like
= FALSE
;
1146 switch (tree
->type
.node_code
)
1151 case DATA_SEGMENT_ALIGN
:
1152 case DATA_SEGMENT_RELRO_END
:
1153 function_like
= TRUE
;
1156 /* Special handling because arguments are in reverse order and
1157 the segment name is quoted. */
1158 exp_print_token (tree
->type
.node_code
, FALSE
);
1159 fputs (" (\"", config
.map_file
);
1160 exp_print_tree (tree
->binary
.rhs
);
1161 fputs ("\", ", config
.map_file
);
1162 exp_print_tree (tree
->binary
.lhs
);
1163 fputc (')', config
.map_file
);
1168 exp_print_token (tree
->type
.node_code
, FALSE
);
1169 fputc (' ', config
.map_file
);
1171 fputc ('(', config
.map_file
);
1172 exp_print_tree (tree
->binary
.lhs
);
1174 fprintf (config
.map_file
, ", ");
1176 exp_print_token (tree
->type
.node_code
, TRUE
);
1177 exp_print_tree (tree
->binary
.rhs
);
1178 fputc (')', config
.map_file
);
1181 exp_print_tree (tree
->trinary
.cond
);
1182 fputc ('?', config
.map_file
);
1183 exp_print_tree (tree
->trinary
.lhs
);
1184 fputc (':', config
.map_file
);
1185 exp_print_tree (tree
->trinary
.rhs
);
1188 exp_print_token (tree
->unary
.type
.node_code
, FALSE
);
1189 if (tree
->unary
.child
)
1191 fprintf (config
.map_file
, " (");
1192 exp_print_tree (tree
->unary
.child
);
1193 fputc (')', config
.map_file
);
1198 fprintf (config
.map_file
, "ASSERT (");
1199 exp_print_tree (tree
->assert_s
.child
);
1200 fprintf (config
.map_file
, ", %s)", tree
->assert_s
.message
);
1204 if (tree
->type
.node_code
== NAME
)
1205 fputs (tree
->name
.name
, config
.map_file
);
1208 exp_print_token (tree
->type
.node_code
, FALSE
);
1209 if (tree
->name
.name
)
1210 fprintf (config
.map_file
, " (%s)", tree
->name
.name
);
1220 exp_get_vma (etree_type
*tree
, bfd_vma def
, char *name
)
1224 exp_fold_tree_no_dot (tree
);
1225 if (expld
.result
.valid_p
)
1226 return expld
.result
.value
;
1227 else if (name
!= NULL
&& expld
.phase
!= lang_mark_phase_enum
)
1228 einfo (_("%F%S: nonconstant expression for %s\n"),
1235 exp_get_value_int (etree_type
*tree
, int def
, char *name
)
1237 return exp_get_vma (tree
, def
, name
);
1241 exp_get_fill (etree_type
*tree
, fill_type
*def
, char *name
)
1250 exp_fold_tree_no_dot (tree
);
1251 if (!expld
.result
.valid_p
)
1253 if (name
!= NULL
&& expld
.phase
!= lang_mark_phase_enum
)
1254 einfo (_("%F%S: nonconstant expression for %s\n"),
1259 if (expld
.result
.str
!= NULL
&& (len
= strlen (expld
.result
.str
)) != 0)
1263 fill
= (fill_type
*) xmalloc ((len
+ 1) / 2 + sizeof (*fill
) - 1);
1264 fill
->size
= (len
+ 1) / 2;
1266 s
= (unsigned char *) expld
.result
.str
;
1274 digit
= (digit
- 'A' + '0' + 10) & 0xf;
1288 fill
= (fill_type
*) xmalloc (4 + sizeof (*fill
) - 1);
1289 val
= expld
.result
.value
;
1290 fill
->data
[0] = (val
>> 24) & 0xff;
1291 fill
->data
[1] = (val
>> 16) & 0xff;
1292 fill
->data
[2] = (val
>> 8) & 0xff;
1293 fill
->data
[3] = (val
>> 0) & 0xff;
1300 exp_get_abs_int (etree_type
*tree
, int def
, char *name
)
1304 exp_fold_tree_no_dot (tree
);
1306 if (expld
.result
.valid_p
)
1308 if (expld
.result
.section
!= NULL
)
1309 expld
.result
.value
+= expld
.result
.section
->vma
;
1310 return expld
.result
.value
;
1312 else if (name
!= NULL
&& expld
.phase
!= lang_mark_phase_enum
)
1314 einfo (_("%F%S: nonconstant expression for %s\n"),
1322 align_n (bfd_vma value
, bfd_vma align
)
1327 value
= (value
+ align
- 1) / align
;
1328 return value
* align
;