* cgen.c (gas_cgen_parse_operand): Do not set BSF_RELC flag on
[binutils.git] / ld / ldexp.c
blob293d28a98c058a00866c553106797be39e63f24e
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
30 valid bit. */
32 #include "sysdep.h"
33 #include "bfd.h"
34 #include "bfdlink.h"
36 #include "ld.h"
37 #include "ldmain.h"
38 #include "ldmisc.h"
39 #include "ldexp.h"
40 #include "ldlex.h"
41 #include <ldgram.h>
42 #include "ldlang.h"
43 #include "libiberty.h"
44 #include "safe-ctype.h"
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. */
56 static void
57 exp_print_token (token_code_type code, int infix_p)
59 static const struct
61 token_code_type code;
62 char * name;
64 table[] =
66 { INT, "int" },
67 { NAME, "NAME" },
68 { PLUSEQ, "+=" },
69 { MINUSEQ, "-=" },
70 { MULTEQ, "*=" },
71 { DIVEQ, "/=" },
72 { LSHIFTEQ, "<<=" },
73 { RSHIFTEQ, ">>=" },
74 { ANDEQ, "&=" },
75 { OREQ, "|=" },
76 { OROR, "||" },
77 { ANDAND, "&&" },
78 { EQ, "==" },
79 { NE, "!=" },
80 { LE, "<=" },
81 { GE, ">=" },
82 { LSHIFT, "<<" },
83 { RSHIFT, ">>" },
84 { ALIGN_K, "ALIGN" },
85 { BLOCK, "BLOCK" },
86 { QUAD, "QUAD" },
87 { SQUAD, "SQUAD" },
88 { LONG, "LONG" },
89 { SHORT, "SHORT" },
90 { BYTE, "BYTE" },
91 { SECTIONS, "SECTIONS" },
92 { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
93 { MEMORY, "MEMORY" },
94 { DEFINED, "DEFINED" },
95 { TARGET_K, "TARGET" },
96 { SEARCH_DIR, "SEARCH_DIR" },
97 { MAP, "MAP" },
98 { ENTRY, "ENTRY" },
99 { NEXT, "NEXT" },
100 { ALIGNOF, "ALIGNOF" },
101 { SIZEOF, "SIZEOF" },
102 { ADDR, "ADDR" },
103 { LOADADDR, "LOADADDR" },
104 { CONSTANT, "CONSTANT" },
105 { ABSOLUTE, "ABSOLUTE" },
106 { MAX_K, "MAX" },
107 { MIN_K, "MIN" },
108 { ASSERT_K, "ASSERT" },
109 { REL, "relocatable" },
110 { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
111 { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
112 { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
113 { ORIGIN, "ORIGIN" },
114 { LENGTH, "LENGTH" },
115 { SEGMENT_START, "SEGMENT_START" }
117 unsigned int idx;
119 for (idx = 0; idx < ARRAY_SIZE (table); idx++)
120 if (table[idx].code == code)
121 break;
123 if (infix_p)
124 fputc (' ', config.map_file);
126 if (idx < ARRAY_SIZE (table))
127 fputs (table[idx].name, config.map_file);
128 else if (code < 127)
129 fputc (code, config.map_file);
130 else
131 fprintf (config.map_file, "<code %d>", code);
133 if (infix_p)
134 fputc (' ', config.map_file);
137 static void
138 make_abs (void)
140 if (expld.result.section != NULL)
141 expld.result.value += expld.result.section->vma;
142 expld.result.section = bfd_abs_section_ptr;
145 static void
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;
154 etree_type *
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;
164 return new_e;
167 etree_type *
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;
177 return new_e;
180 /* Build an expression representing an unnamed relocatable value. */
182 etree_type *
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;
192 return new_e;
195 static void
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;
204 static void
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;
213 static void
214 new_rel_from_abs (bfd_vma value)
216 expld.result.valid_p = TRUE;
217 expld.result.value = value - expld.section->vma;
218 expld.result.str = NULL;
219 expld.result.section = expld.section;
222 static void
223 fold_unary (etree_type *tree)
225 exp_fold_tree_1 (tree->unary.child);
226 if (expld.result.valid_p)
228 switch (tree->type.node_code)
230 case ALIGN_K:
231 if (expld.phase != lang_first_phase_enum)
232 new_rel_from_abs (align_n (expld.dot, expld.result.value));
233 else
234 expld.result.valid_p = FALSE;
235 break;
237 case ABSOLUTE:
238 make_abs ();
239 break;
241 case '~':
242 expld.result.value = ~expld.result.value;
243 break;
245 case '!':
246 expld.result.value = !expld.result.value;
247 break;
249 case '-':
250 expld.result.value = -expld.result.value;
251 break;
253 case NEXT:
254 /* Return next place aligned to value. */
255 if (expld.phase != lang_first_phase_enum)
257 make_abs ();
258 expld.result.value = align_n (expld.dot, expld.result.value);
260 else
261 expld.result.valid_p = FALSE;
262 break;
264 case DATA_SEGMENT_END:
265 if (expld.phase == lang_first_phase_enum
266 || expld.section != bfd_abs_section_ptr)
268 expld.result.valid_p = FALSE;
270 else if (expld.dataseg.phase == exp_dataseg_align_seen
271 || expld.dataseg.phase == exp_dataseg_relro_seen)
273 expld.dataseg.phase = exp_dataseg_end_seen;
274 expld.dataseg.end = expld.result.value;
276 else if (expld.dataseg.phase == exp_dataseg_done
277 || expld.dataseg.phase == exp_dataseg_adjust
278 || expld.dataseg.phase == exp_dataseg_relro_adjust)
280 /* OK. */
282 else
283 expld.result.valid_p = FALSE;
284 break;
286 default:
287 FAIL ();
288 break;
293 static void
294 fold_binary (etree_type *tree)
296 etree_value_type lhs;
297 exp_fold_tree_1 (tree->binary.lhs);
299 /* The SEGMENT_START operator is special because its first
300 operand is a string, not the name of a symbol. Note that the
301 operands have been swapped, so binary.lhs is second (default)
302 operand, binary.rhs is first operand. */
303 if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
305 const char *segment_name;
306 segment_type *seg;
308 /* Check to see if the user has overridden the default
309 value. */
310 segment_name = tree->binary.rhs->name.name;
311 for (seg = segments; seg; seg = seg->next)
312 if (strcmp (seg->name, segment_name) == 0)
314 if (!seg->used
315 && config.magic_demand_paged
316 && (seg->value % config.maxpagesize) != 0)
317 einfo (_("%P: warning: address of `%s' isn't multiple of maximum page size\n"),
318 segment_name);
319 seg->used = TRUE;
320 new_rel_from_abs (seg->value);
321 break;
323 return;
326 lhs = expld.result;
327 exp_fold_tree_1 (tree->binary.rhs);
328 expld.result.valid_p &= lhs.valid_p;
330 if (expld.result.valid_p)
332 if (lhs.section != expld.result.section)
334 /* If the values are from different sections, and neither is
335 just a number, make both the source arguments absolute. */
336 if (expld.result.section != NULL
337 && lhs.section != NULL)
339 make_abs ();
340 lhs.value += lhs.section->vma;
341 lhs.section = bfd_abs_section_ptr;
344 /* If the rhs is just a number, keep the lhs section. */
345 else if (expld.result.section == NULL)
347 expld.result.section = lhs.section;
348 /* Make this NULL so that we know one of the operands
349 was just a number, for later tests. */
350 lhs.section = NULL;
353 /* At this point we know that both operands have the same
354 section, or at least one of them is a plain number. */
356 switch (tree->type.node_code)
358 /* Arithmetic operators, bitwise AND, bitwise OR and XOR
359 keep the section of one of their operands only when the
360 other operand is a plain number. Losing the section when
361 operating on two symbols, ie. a result of a plain number,
362 is required for subtraction and XOR. It's justifiable
363 for the other operations on the grounds that adding,
364 multiplying etc. two section relative values does not
365 really make sense unless they are just treated as
366 numbers.
367 The same argument could be made for many expressions
368 involving one symbol and a number. For example,
369 "1 << x" and "100 / x" probably should not be given the
370 section of x. The trouble is that if we fuss about such
371 things the rules become complex and it is onerous to
372 document ld expression evaluation. */
373 #define BOP(x, y) \
374 case x: \
375 expld.result.value = lhs.value y expld.result.value; \
376 if (expld.result.section == lhs.section) \
377 expld.result.section = NULL; \
378 break;
380 /* Comparison operators, logical AND, and logical OR always
381 return a plain number. */
382 #define BOPN(x, y) \
383 case x: \
384 expld.result.value = lhs.value y expld.result.value; \
385 expld.result.section = NULL; \
386 break;
388 BOP ('+', +);
389 BOP ('*', *);
390 BOP ('-', -);
391 BOP (LSHIFT, <<);
392 BOP (RSHIFT, >>);
393 BOP ('&', &);
394 BOP ('^', ^);
395 BOP ('|', |);
396 BOPN (EQ, ==);
397 BOPN (NE, !=);
398 BOPN ('<', <);
399 BOPN ('>', >);
400 BOPN (LE, <=);
401 BOPN (GE, >=);
402 BOPN (ANDAND, &&);
403 BOPN (OROR, ||);
405 case '%':
406 if (expld.result.value != 0)
407 expld.result.value = ((bfd_signed_vma) lhs.value
408 % (bfd_signed_vma) expld.result.value);
409 else if (expld.phase != lang_mark_phase_enum)
410 einfo (_("%F%S %% by zero\n"), tree->binary.rhs);
411 if (expld.result.section == lhs.section)
412 expld.result.section = NULL;
413 break;
415 case '/':
416 if (expld.result.value != 0)
417 expld.result.value = ((bfd_signed_vma) lhs.value
418 / (bfd_signed_vma) expld.result.value);
419 else if (expld.phase != lang_mark_phase_enum)
420 einfo (_("%F%S / by zero\n"), tree->binary.rhs);
421 if (expld.result.section == lhs.section)
422 expld.result.section = NULL;
423 break;
425 case MAX_K:
426 if (lhs.value > expld.result.value)
427 expld.result.value = lhs.value;
428 break;
430 case MIN_K:
431 if (lhs.value < expld.result.value)
432 expld.result.value = lhs.value;
433 break;
435 case ALIGN_K:
436 expld.result.value = align_n (lhs.value, expld.result.value);
437 break;
439 case DATA_SEGMENT_ALIGN:
440 expld.dataseg.relro = exp_dataseg_relro_start;
441 if (expld.phase == lang_first_phase_enum
442 || expld.section != bfd_abs_section_ptr)
443 expld.result.valid_p = FALSE;
444 else
446 bfd_vma maxpage = lhs.value;
447 bfd_vma commonpage = expld.result.value;
449 expld.result.value = align_n (expld.dot, maxpage);
450 if (expld.dataseg.phase == exp_dataseg_relro_adjust)
451 expld.result.value = expld.dataseg.base;
452 else if (expld.dataseg.phase == exp_dataseg_adjust)
454 if (commonpage < maxpage)
455 expld.result.value += ((expld.dot + commonpage - 1)
456 & (maxpage - commonpage));
458 else
460 expld.result.value += expld.dot & (maxpage - 1);
461 if (expld.dataseg.phase == exp_dataseg_done)
463 /* OK. */
465 else if (expld.dataseg.phase == exp_dataseg_none)
467 expld.dataseg.phase = exp_dataseg_align_seen;
468 expld.dataseg.min_base = expld.dot;
469 expld.dataseg.base = expld.result.value;
470 expld.dataseg.pagesize = commonpage;
471 expld.dataseg.maxpagesize = maxpage;
472 expld.dataseg.relro_end = 0;
474 else
475 expld.result.valid_p = FALSE;
478 break;
480 case DATA_SEGMENT_RELRO_END:
481 expld.dataseg.relro = exp_dataseg_relro_end;
482 if (expld.phase == lang_first_phase_enum
483 || expld.section != bfd_abs_section_ptr)
484 expld.result.valid_p = FALSE;
485 else if (expld.dataseg.phase == exp_dataseg_align_seen
486 || expld.dataseg.phase == exp_dataseg_adjust
487 || expld.dataseg.phase == exp_dataseg_relro_adjust
488 || expld.dataseg.phase == exp_dataseg_done)
490 if (expld.dataseg.phase == exp_dataseg_align_seen
491 || expld.dataseg.phase == exp_dataseg_relro_adjust)
492 expld.dataseg.relro_end = lhs.value + expld.result.value;
494 if (expld.dataseg.phase == exp_dataseg_relro_adjust
495 && (expld.dataseg.relro_end
496 & (expld.dataseg.pagesize - 1)))
498 expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
499 expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
500 expld.result.value = (expld.dataseg.relro_end
501 - expld.result.value);
503 else
504 expld.result.value = lhs.value;
506 if (expld.dataseg.phase == exp_dataseg_align_seen)
507 expld.dataseg.phase = exp_dataseg_relro_seen;
509 else
510 expld.result.valid_p = FALSE;
511 break;
513 default:
514 FAIL ();
519 static void
520 fold_trinary (etree_type *tree)
522 exp_fold_tree_1 (tree->trinary.cond);
523 if (expld.result.valid_p)
524 exp_fold_tree_1 (expld.result.value
525 ? tree->trinary.lhs
526 : tree->trinary.rhs);
529 static void
530 fold_name (etree_type *tree)
532 memset (&expld.result, 0, sizeof (expld.result));
534 switch (tree->type.node_code)
536 case SIZEOF_HEADERS:
537 if (expld.phase != lang_first_phase_enum)
539 bfd_vma hdr_size = 0;
540 /* Don't find the real header size if only marking sections;
541 The bfd function may cache incorrect data. */
542 if (expld.phase != lang_mark_phase_enum)
543 hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
544 new_number (hdr_size);
546 break;
548 case DEFINED:
549 if (expld.phase == lang_first_phase_enum)
550 lang_track_definedness (tree->name.name);
551 else
553 struct bfd_link_hash_entry *h;
554 int def_iteration
555 = lang_symbol_definition_iteration (tree->name.name);
557 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
558 &link_info,
559 tree->name.name,
560 FALSE, FALSE, TRUE);
561 new_number (h != NULL
562 && (h->type == bfd_link_hash_defined
563 || h->type == bfd_link_hash_defweak
564 || h->type == bfd_link_hash_common)
565 && (def_iteration == lang_statement_iteration
566 || def_iteration == -1));
568 break;
570 case NAME:
571 if (expld.phase == lang_first_phase_enum)
573 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
574 new_rel_from_abs (expld.dot);
575 else
577 struct bfd_link_hash_entry *h;
579 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
580 &link_info,
581 tree->name.name,
582 TRUE, FALSE, TRUE);
583 if (!h)
584 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
585 else if (h->type == bfd_link_hash_defined
586 || h->type == bfd_link_hash_defweak)
588 asection *output_section;
590 output_section = h->u.def.section->output_section;
591 if (output_section == NULL)
593 if (expld.phase != lang_mark_phase_enum)
594 einfo (_("%X%S: unresolvable symbol `%s'"
595 " referenced in expression\n"),
596 tree, tree->name.name);
598 else if (output_section == bfd_abs_section_ptr
599 && (expld.section != bfd_abs_section_ptr
600 || config.sane_expr))
601 new_number (h->u.def.value + h->u.def.section->output_offset);
602 else
603 new_rel (h->u.def.value + h->u.def.section->output_offset,
604 output_section);
606 else if (expld.phase == lang_final_phase_enum
607 || expld.assigning_to_dot)
608 einfo (_("%F%S: undefined symbol `%s'"
609 " referenced in expression\n"),
610 tree, tree->name.name);
611 else if (h->type == bfd_link_hash_new)
613 h->type = bfd_link_hash_undefined;
614 h->u.undef.abfd = NULL;
615 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
616 bfd_link_add_undef (link_info.hash, h);
619 break;
621 case ADDR:
622 if (expld.phase != lang_first_phase_enum)
624 lang_output_section_statement_type *os;
626 os = lang_output_section_find (tree->name.name);
627 if (os == NULL)
629 if (expld.phase == lang_final_phase_enum)
630 einfo (_("%F%S: undefined section `%s'"
631 " referenced in expression\n"),
632 tree, tree->name.name);
634 else if (os->processed_vma)
635 new_rel (0, os->bfd_section);
637 break;
639 case LOADADDR:
640 if (expld.phase != lang_first_phase_enum)
642 lang_output_section_statement_type *os;
644 os = lang_output_section_find (tree->name.name);
645 if (os == NULL)
647 if (expld.phase == lang_final_phase_enum)
648 einfo (_("%F%S: undefined section `%s'"
649 " referenced in expression\n"),
650 tree, tree->name.name);
652 else if (os->processed_lma)
654 if (os->load_base == NULL)
655 new_abs (os->bfd_section->lma);
656 else
658 exp_fold_tree_1 (os->load_base);
659 if (expld.result.valid_p)
660 make_abs ();
664 break;
666 case SIZEOF:
667 case ALIGNOF:
668 if (expld.phase != lang_first_phase_enum)
670 lang_output_section_statement_type *os;
672 os = lang_output_section_find (tree->name.name);
673 if (os == NULL)
675 if (expld.phase == lang_final_phase_enum)
676 einfo (_("%F%S: undefined section `%s'"
677 " referenced in expression\n"),
678 tree, tree->name.name);
679 new_number (0);
681 else if (os->processed_vma)
683 bfd_vma val;
685 if (tree->type.node_code == SIZEOF)
686 val = (os->bfd_section->size
687 / bfd_octets_per_byte (link_info.output_bfd));
688 else
689 val = (bfd_vma)1 << os->bfd_section->alignment_power;
691 new_number (val);
694 break;
696 case LENGTH:
698 lang_memory_region_type *mem;
700 mem = lang_memory_region_lookup (tree->name.name, FALSE);
701 if (mem != NULL)
702 new_number (mem->length);
703 else
704 einfo (_("%F%S: undefined MEMORY region `%s'"
705 " referenced in expression\n"),
706 tree, tree->name.name);
708 break;
710 case ORIGIN:
711 if (expld.phase != lang_first_phase_enum)
713 lang_memory_region_type *mem;
715 mem = lang_memory_region_lookup (tree->name.name, FALSE);
716 if (mem != NULL)
717 new_rel_from_abs (mem->origin);
718 else
719 einfo (_("%F%S: undefined MEMORY region `%s'"
720 " referenced in expression\n"),
721 tree, tree->name.name);
723 break;
725 case CONSTANT:
726 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
727 new_number (config.maxpagesize);
728 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
729 new_number (config.commonpagesize);
730 else
731 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
732 tree, tree->name.name);
733 break;
735 default:
736 FAIL ();
737 break;
741 static void
742 exp_fold_tree_1 (etree_type *tree)
744 if (tree == NULL)
746 memset (&expld.result, 0, sizeof (expld.result));
747 return;
750 switch (tree->type.node_class)
752 case etree_value:
753 if (expld.section == bfd_abs_section_ptr
754 && !config.sane_expr)
755 new_abs (tree->value.value);
756 else
757 new_number (tree->value.value);
758 expld.result.str = tree->value.str;
759 break;
761 case etree_rel:
762 if (expld.phase != lang_first_phase_enum)
764 asection *output_section = tree->rel.section->output_section;
765 new_rel (tree->rel.value + tree->rel.section->output_offset,
766 output_section);
768 else
769 memset (&expld.result, 0, sizeof (expld.result));
770 break;
772 case etree_assert:
773 exp_fold_tree_1 (tree->assert_s.child);
774 if (expld.phase == lang_final_phase_enum && !expld.result.value)
775 einfo ("%X%P: %s\n", tree->assert_s.message);
776 break;
778 case etree_unary:
779 fold_unary (tree);
780 break;
782 case etree_binary:
783 fold_binary (tree);
784 break;
786 case etree_trinary:
787 fold_trinary (tree);
788 break;
790 case etree_assign:
791 case etree_provide:
792 case etree_provided:
793 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
795 if (tree->type.node_class != etree_assign)
796 einfo (_("%F%S can not PROVIDE assignment to"
797 " location counter\n"), tree);
798 /* After allocation, assignment to dot should not be done inside
799 an output section since allocation adds a padding statement
800 that effectively duplicates the assignment. */
801 if (expld.phase == lang_mark_phase_enum
802 || expld.phase == lang_allocating_phase_enum
803 || ((expld.phase == lang_assigning_phase_enum
804 || expld.phase == lang_final_phase_enum)
805 && expld.section == bfd_abs_section_ptr))
807 /* Notify the folder that this is an assignment to dot. */
808 expld.assigning_to_dot = TRUE;
809 exp_fold_tree_1 (tree->assign.src);
810 expld.assigning_to_dot = FALSE;
812 if (!expld.result.valid_p)
814 if (expld.phase != lang_mark_phase_enum)
815 einfo (_("%F%S invalid assignment to"
816 " location counter\n"), tree);
818 else if (expld.dotp == NULL)
819 einfo (_("%F%S assignment to location counter"
820 " invalid outside of SECTION\n"), tree);
821 else
823 bfd_vma nextdot;
825 nextdot = expld.result.value;
826 if (expld.result.section != NULL)
827 nextdot += expld.result.section->vma;
828 else
829 nextdot += expld.section->vma;
830 if (nextdot < expld.dot
831 && expld.section != bfd_abs_section_ptr)
832 einfo (_("%F%S cannot move location counter backwards"
833 " (from %V to %V)\n"),
834 tree, expld.dot, nextdot);
835 else
837 expld.dot = nextdot;
838 *expld.dotp = nextdot;
842 else
843 memset (&expld.result, 0, sizeof (expld.result));
845 else
847 etree_type *name;
849 struct bfd_link_hash_entry *h = NULL;
851 if (tree->type.node_class == etree_provide)
853 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
854 FALSE, FALSE, TRUE);
855 if (h == NULL
856 || (h->type != bfd_link_hash_new
857 && h->type != bfd_link_hash_undefined
858 && h->type != bfd_link_hash_common))
860 /* Do nothing. The symbol was never referenced, or was
861 defined by some object. */
862 break;
866 name = tree->assign.src;
867 if (name->type.node_class == etree_trinary)
869 exp_fold_tree_1 (name->trinary.cond);
870 if (expld.result.valid_p)
871 name = (expld.result.value
872 ? name->trinary.lhs : name->trinary.rhs);
875 if (name->type.node_class == etree_name
876 && name->type.node_code == NAME
877 && strcmp (tree->assign.dst, name->name.name) == 0)
878 /* Leave it alone. Do not replace a symbol with its own
879 output address, in case there is another section sizing
880 pass. Folding does not preserve input sections. */
881 break;
883 exp_fold_tree_1 (tree->assign.src);
884 if (expld.result.valid_p
885 || (expld.phase == lang_first_phase_enum
886 && tree->type.node_class == etree_assign
887 && tree->assign.hidden))
889 if (h == NULL)
891 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
892 TRUE, FALSE, TRUE);
893 if (h == NULL)
894 einfo (_("%P%F:%s: hash creation failed\n"),
895 tree->assign.dst);
898 /* FIXME: Should we worry if the symbol is already
899 defined? */
900 lang_update_definedness (tree->assign.dst, h);
901 h->type = bfd_link_hash_defined;
902 h->u.def.value = expld.result.value;
903 if (expld.result.section == NULL)
904 expld.result.section = expld.section;
905 h->u.def.section = expld.result.section;
906 if (tree->type.node_class == etree_provide)
907 tree->type.node_class = etree_provided;
909 /* Copy the symbol type if this is a simple assignment of
910 one symbol to another. This could be more general
911 (e.g. a ?: operator with NAMEs in each branch). */
912 if (tree->assign.src->type.node_class == etree_name)
914 struct bfd_link_hash_entry *hsrc;
916 hsrc = bfd_link_hash_lookup (link_info.hash,
917 tree->assign.src->name.name,
918 FALSE, FALSE, TRUE);
919 if (hsrc)
920 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
921 hsrc);
924 else if (expld.phase == lang_final_phase_enum)
926 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
927 FALSE, FALSE, TRUE);
928 if (h != NULL
929 && h->type == bfd_link_hash_new)
930 h->type = bfd_link_hash_undefined;
933 break;
935 case etree_name:
936 fold_name (tree);
937 break;
939 default:
940 FAIL ();
941 memset (&expld.result, 0, sizeof (expld.result));
942 break;
946 void
947 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
949 expld.dot = *dotp;
950 expld.dotp = dotp;
951 expld.section = current_section;
952 exp_fold_tree_1 (tree);
955 void
956 exp_fold_tree_no_dot (etree_type *tree)
958 expld.dot = 0;
959 expld.dotp = NULL;
960 expld.section = bfd_abs_section_ptr;
961 exp_fold_tree_1 (tree);
964 etree_type *
965 exp_binop (int code, etree_type *lhs, etree_type *rhs)
967 etree_type value, *new_e;
969 value.type.node_code = code;
970 value.type.filename = lhs->type.filename;
971 value.type.lineno = lhs->type.lineno;
972 value.binary.lhs = lhs;
973 value.binary.rhs = rhs;
974 value.type.node_class = etree_binary;
975 exp_fold_tree_no_dot (&value);
976 if (expld.result.valid_p)
977 return exp_intop (expld.result.value);
979 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
980 memcpy (new_e, &value, sizeof (new_e->binary));
981 return new_e;
984 etree_type *
985 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
987 etree_type value, *new_e;
989 value.type.node_code = code;
990 value.type.filename = cond->type.filename;
991 value.type.lineno = cond->type.lineno;
992 value.trinary.lhs = lhs;
993 value.trinary.cond = cond;
994 value.trinary.rhs = rhs;
995 value.type.node_class = etree_trinary;
996 exp_fold_tree_no_dot (&value);
997 if (expld.result.valid_p)
998 return exp_intop (expld.result.value);
1000 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1001 memcpy (new_e, &value, sizeof (new_e->trinary));
1002 return new_e;
1005 etree_type *
1006 exp_unop (int code, etree_type *child)
1008 etree_type value, *new_e;
1010 value.unary.type.node_code = code;
1011 value.unary.type.filename = child->type.filename;
1012 value.unary.type.lineno = child->type.lineno;
1013 value.unary.child = child;
1014 value.unary.type.node_class = etree_unary;
1015 exp_fold_tree_no_dot (&value);
1016 if (expld.result.valid_p)
1017 return exp_intop (expld.result.value);
1019 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1020 memcpy (new_e, &value, sizeof (new_e->unary));
1021 return new_e;
1024 etree_type *
1025 exp_nameop (int code, const char *name)
1027 etree_type value, *new_e;
1029 value.name.type.node_code = code;
1030 value.name.type.filename = ldlex_filename ();
1031 value.name.type.lineno = lineno;
1032 value.name.name = name;
1033 value.name.type.node_class = etree_name;
1035 exp_fold_tree_no_dot (&value);
1036 if (expld.result.valid_p)
1037 return exp_intop (expld.result.value);
1039 new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1040 memcpy (new_e, &value, sizeof (new_e->name));
1041 return new_e;
1045 static etree_type *
1046 exp_assop (const char *dst,
1047 etree_type *src,
1048 enum node_tree_enum class,
1049 bfd_boolean hidden)
1051 etree_type *n;
1053 n = (etree_type *) stat_alloc (sizeof (n->assign));
1054 n->assign.type.node_code = '=';
1055 n->assign.type.filename = src->type.filename;
1056 n->assign.type.lineno = src->type.lineno;
1057 n->assign.type.node_class = class;
1058 n->assign.src = src;
1059 n->assign.dst = dst;
1060 n->assign.hidden = hidden;
1061 return n;
1064 etree_type *
1065 exp_assign (const char *dst, etree_type *src)
1067 return exp_assop (dst, src, etree_assign, FALSE);
1070 etree_type *
1071 exp_defsym (const char *dst, etree_type *src)
1073 return exp_assop (dst, src, etree_assign, TRUE);
1076 /* Handle PROVIDE. */
1078 etree_type *
1079 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1081 return exp_assop (dst, src, etree_provide, hidden);
1084 /* Handle ASSERT. */
1086 etree_type *
1087 exp_assert (etree_type *exp, const char *message)
1089 etree_type *n;
1091 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1092 n->assert_s.type.node_code = '!';
1093 n->assert_s.type.filename = exp->type.filename;
1094 n->assert_s.type.lineno = exp->type.lineno;
1095 n->assert_s.type.node_class = etree_assert;
1096 n->assert_s.child = exp;
1097 n->assert_s.message = message;
1098 return n;
1101 void
1102 exp_print_tree (etree_type *tree)
1104 bfd_boolean function_like;
1106 if (config.map_file == NULL)
1107 config.map_file = stderr;
1109 if (tree == NULL)
1111 minfo ("NULL TREE\n");
1112 return;
1115 switch (tree->type.node_class)
1117 case etree_value:
1118 minfo ("0x%v", tree->value.value);
1119 return;
1120 case etree_rel:
1121 if (tree->rel.section->owner != NULL)
1122 minfo ("%B:", tree->rel.section->owner);
1123 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1124 return;
1125 case etree_assign:
1126 fputs (tree->assign.dst, config.map_file);
1127 exp_print_token (tree->type.node_code, TRUE);
1128 exp_print_tree (tree->assign.src);
1129 break;
1130 case etree_provide:
1131 case etree_provided:
1132 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1133 exp_print_tree (tree->assign.src);
1134 fputc (')', config.map_file);
1135 break;
1136 case etree_binary:
1137 function_like = FALSE;
1138 switch (tree->type.node_code)
1140 case MAX_K:
1141 case MIN_K:
1142 case ALIGN_K:
1143 case DATA_SEGMENT_ALIGN:
1144 case DATA_SEGMENT_RELRO_END:
1145 function_like = TRUE;
1147 if (function_like)
1149 exp_print_token (tree->type.node_code, FALSE);
1150 fputc (' ', config.map_file);
1152 fputc ('(', config.map_file);
1153 exp_print_tree (tree->binary.lhs);
1154 if (function_like)
1155 fprintf (config.map_file, ", ");
1156 else
1157 exp_print_token (tree->type.node_code, TRUE);
1158 exp_print_tree (tree->binary.rhs);
1159 fputc (')', config.map_file);
1160 break;
1161 case etree_trinary:
1162 exp_print_tree (tree->trinary.cond);
1163 fputc ('?', config.map_file);
1164 exp_print_tree (tree->trinary.lhs);
1165 fputc (':', config.map_file);
1166 exp_print_tree (tree->trinary.rhs);
1167 break;
1168 case etree_unary:
1169 exp_print_token (tree->unary.type.node_code, FALSE);
1170 if (tree->unary.child)
1172 fprintf (config.map_file, " (");
1173 exp_print_tree (tree->unary.child);
1174 fputc (')', config.map_file);
1176 break;
1178 case etree_assert:
1179 fprintf (config.map_file, "ASSERT (");
1180 exp_print_tree (tree->assert_s.child);
1181 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1182 break;
1184 case etree_name:
1185 if (tree->type.node_code == NAME)
1186 fputs (tree->name.name, config.map_file);
1187 else
1189 exp_print_token (tree->type.node_code, FALSE);
1190 if (tree->name.name)
1191 fprintf (config.map_file, " (%s)", tree->name.name);
1193 break;
1194 default:
1195 FAIL ();
1196 break;
1200 bfd_vma
1201 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1203 if (tree != NULL)
1205 exp_fold_tree_no_dot (tree);
1206 if (expld.result.valid_p)
1207 return expld.result.value;
1208 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1209 einfo (_("%F%S: nonconstant expression for %s\n"),
1210 tree, name);
1212 return def;
1216 exp_get_value_int (etree_type *tree, int def, char *name)
1218 return exp_get_vma (tree, def, name);
1221 fill_type *
1222 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1224 fill_type *fill;
1225 size_t len;
1226 unsigned int val;
1228 if (tree == NULL)
1229 return def;
1231 exp_fold_tree_no_dot (tree);
1232 if (!expld.result.valid_p)
1234 if (name != NULL && expld.phase != lang_mark_phase_enum)
1235 einfo (_("%F%S: nonconstant expression for %s\n"),
1236 tree, name);
1237 return def;
1240 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1242 unsigned char *dst;
1243 unsigned char *s;
1244 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1245 fill->size = (len + 1) / 2;
1246 dst = fill->data;
1247 s = (unsigned char *) expld.result.str;
1248 val = 0;
1251 unsigned int digit;
1253 digit = *s++ - '0';
1254 if (digit > 9)
1255 digit = (digit - 'A' + '0' + 10) & 0xf;
1256 val <<= 4;
1257 val += digit;
1258 --len;
1259 if ((len & 1) == 0)
1261 *dst++ = val;
1262 val = 0;
1265 while (len != 0);
1267 else
1269 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1270 val = expld.result.value;
1271 fill->data[0] = (val >> 24) & 0xff;
1272 fill->data[1] = (val >> 16) & 0xff;
1273 fill->data[2] = (val >> 8) & 0xff;
1274 fill->data[3] = (val >> 0) & 0xff;
1275 fill->size = 4;
1277 return fill;
1280 bfd_vma
1281 exp_get_abs_int (etree_type *tree, int def, char *name)
1283 if (tree != NULL)
1285 exp_fold_tree_no_dot (tree);
1287 if (expld.result.valid_p)
1289 if (expld.result.section != NULL)
1290 expld.result.value += expld.result.section->vma;
1291 return expld.result.value;
1293 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1295 einfo (_("%F%S: nonconstant expression for %s\n"),
1296 tree, name);
1299 return def;
1302 static bfd_vma
1303 align_n (bfd_vma value, bfd_vma align)
1305 if (align <= 1)
1306 return value;
1308 value = (value + align - 1) / align;
1309 return value * align;