Don't merge sections with differing MASKPROC or MASKOS flags
[deliverable/binutils-gdb.git] / ld / ldexp.c
1 /* This module handles expression trees.
2 Copyright (C) 1991-2020 Free Software Foundation, Inc.
3 Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
4
5 This file is part of the GNU Binutils.
6
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.
11
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.
16
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. */
21
22
23 /* This module is in charge of working out the contents of expressions.
24
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. */
29
30 #include "sysdep.h"
31 #include "bfd.h"
32 #include "bfdlink.h"
33 #include "ctf-api.h"
34
35 #include "ld.h"
36 #include "ldmain.h"
37 #include "ldmisc.h"
38 #include "ldexp.h"
39 #include "ldlex.h"
40 #include <ldgram.h>
41 #include "ldlang.h"
42 #include "libiberty.h"
43 #include "safe-ctype.h"
44
45 static void exp_fold_tree_1 (etree_type *);
46 static bfd_vma align_n (bfd_vma, bfd_vma);
47
48 segment_type *segments;
49
50 struct ldexp_control expld;
51
52 /* This structure records symbols for which we need to keep track of
53 definedness for use in the DEFINED () test. It is also used in
54 making absolute symbols section relative late in the link. */
55
56 struct definedness_hash_entry
57 {
58 struct bfd_hash_entry root;
59
60 /* If this symbol was assigned from "dot" outside of an output
61 section statement, the section we'd like it relative to. */
62 asection *final_sec;
63
64 /* Low bits of iteration count. Symbols with matching iteration have
65 been defined in this pass over the script. */
66 unsigned int iteration : 8;
67
68 /* Symbol was defined by an object file. */
69 unsigned int by_object : 1;
70 };
71
72 static struct bfd_hash_table definedness_table;
73
74 /* Print the string representation of the given token. Surround it
75 with spaces if INFIX_P is TRUE. */
76
77 static void
78 exp_print_token (token_code_type code, int infix_p)
79 {
80 static const struct
81 {
82 token_code_type code;
83 const char *name;
84 }
85 table[] =
86 {
87 { INT, "int" },
88 { NAME, "NAME" },
89 { PLUSEQ, "+=" },
90 { MINUSEQ, "-=" },
91 { MULTEQ, "*=" },
92 { DIVEQ, "/=" },
93 { LSHIFTEQ, "<<=" },
94 { RSHIFTEQ, ">>=" },
95 { ANDEQ, "&=" },
96 { OREQ, "|=" },
97 { OROR, "||" },
98 { ANDAND, "&&" },
99 { EQ, "==" },
100 { NE, "!=" },
101 { LE, "<=" },
102 { GE, ">=" },
103 { LSHIFT, "<<" },
104 { RSHIFT, ">>" },
105 { LOG2CEIL, "LOG2CEIL" },
106 { ALIGN_K, "ALIGN" },
107 { BLOCK, "BLOCK" },
108 { QUAD, "QUAD" },
109 { SQUAD, "SQUAD" },
110 { LONG, "LONG" },
111 { SHORT, "SHORT" },
112 { BYTE, "BYTE" },
113 { SECTIONS, "SECTIONS" },
114 { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
115 { MEMORY, "MEMORY" },
116 { DEFINED, "DEFINED" },
117 { TARGET_K, "TARGET" },
118 { SEARCH_DIR, "SEARCH_DIR" },
119 { MAP, "MAP" },
120 { ENTRY, "ENTRY" },
121 { NEXT, "NEXT" },
122 { ALIGNOF, "ALIGNOF" },
123 { SIZEOF, "SIZEOF" },
124 { ADDR, "ADDR" },
125 { LOADADDR, "LOADADDR" },
126 { CONSTANT, "CONSTANT" },
127 { ABSOLUTE, "ABSOLUTE" },
128 { MAX_K, "MAX" },
129 { MIN_K, "MIN" },
130 { ASSERT_K, "ASSERT" },
131 { REL, "relocatable" },
132 { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
133 { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
134 { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
135 { ORIGIN, "ORIGIN" },
136 { LENGTH, "LENGTH" },
137 { SEGMENT_START, "SEGMENT_START" }
138 };
139 unsigned int idx;
140
141 for (idx = 0; idx < ARRAY_SIZE (table); idx++)
142 if (table[idx].code == code)
143 break;
144
145 if (infix_p)
146 fputc (' ', config.map_file);
147
148 if (idx < ARRAY_SIZE (table))
149 fputs (table[idx].name, config.map_file);
150 else if (code < 127)
151 fputc (code, config.map_file);
152 else
153 fprintf (config.map_file, "<code %d>", code);
154
155 if (infix_p)
156 fputc (' ', config.map_file);
157 }
158
159 static void
160 make_log2ceil (void)
161 {
162 bfd_vma value = expld.result.value;
163 bfd_vma result = -1;
164 bfd_boolean round_up = FALSE;
165
166 do
167 {
168 result++;
169 /* If more than one bit is set in the value we will need to round up. */
170 if ((value > 1) && (value & 1))
171 round_up = TRUE;
172 }
173 while (value >>= 1);
174
175 if (round_up)
176 result += 1;
177 expld.result.section = NULL;
178 expld.result.value = result;
179 }
180
181 static void
182 make_abs (void)
183 {
184 if (expld.result.section != NULL)
185 expld.result.value += expld.result.section->vma;
186 expld.result.section = bfd_abs_section_ptr;
187 expld.rel_from_abs = FALSE;
188 }
189
190 static void
191 new_abs (bfd_vma value)
192 {
193 expld.result.valid_p = TRUE;
194 expld.result.section = bfd_abs_section_ptr;
195 expld.result.value = value;
196 expld.result.str = NULL;
197 }
198
199 etree_type *
200 exp_intop (bfd_vma value)
201 {
202 etree_type *new_e = stat_alloc (sizeof (new_e->value));
203 new_e->type.node_code = INT;
204 new_e->type.filename = ldlex_filename ();
205 new_e->type.lineno = lineno;
206 new_e->value.value = value;
207 new_e->value.str = NULL;
208 new_e->type.node_class = etree_value;
209 return new_e;
210 }
211
212 etree_type *
213 exp_bigintop (bfd_vma value, char *str)
214 {
215 etree_type *new_e = stat_alloc (sizeof (new_e->value));
216 new_e->type.node_code = INT;
217 new_e->type.filename = ldlex_filename ();
218 new_e->type.lineno = lineno;
219 new_e->value.value = value;
220 new_e->value.str = str;
221 new_e->type.node_class = etree_value;
222 return new_e;
223 }
224
225 /* Build an expression representing an unnamed relocatable value. */
226
227 etree_type *
228 exp_relop (asection *section, bfd_vma value)
229 {
230 etree_type *new_e = stat_alloc (sizeof (new_e->rel));
231 new_e->type.node_code = REL;
232 new_e->type.filename = ldlex_filename ();
233 new_e->type.lineno = lineno;
234 new_e->type.node_class = etree_rel;
235 new_e->rel.section = section;
236 new_e->rel.value = value;
237 return new_e;
238 }
239
240 static void
241 new_number (bfd_vma value)
242 {
243 expld.result.valid_p = TRUE;
244 expld.result.value = value;
245 expld.result.str = NULL;
246 expld.result.section = NULL;
247 }
248
249 static void
250 new_rel (bfd_vma value, asection *section)
251 {
252 expld.result.valid_p = TRUE;
253 expld.result.value = value;
254 expld.result.str = NULL;
255 expld.result.section = section;
256 }
257
258 static void
259 new_rel_from_abs (bfd_vma value)
260 {
261 asection *s = expld.section;
262
263 expld.rel_from_abs = TRUE;
264 expld.result.valid_p = TRUE;
265 expld.result.value = value - s->vma;
266 expld.result.str = NULL;
267 expld.result.section = s;
268 }
269
270 /* New-function for the definedness hash table. */
271
272 static struct bfd_hash_entry *
273 definedness_newfunc (struct bfd_hash_entry *entry,
274 struct bfd_hash_table *table ATTRIBUTE_UNUSED,
275 const char *name ATTRIBUTE_UNUSED)
276 {
277 struct definedness_hash_entry *ret = (struct definedness_hash_entry *) entry;
278
279 if (ret == NULL)
280 ret = (struct definedness_hash_entry *)
281 bfd_hash_allocate (table, sizeof (struct definedness_hash_entry));
282
283 if (ret == NULL)
284 einfo (_("%F%P: bfd_hash_allocate failed creating symbol %s\n"), name);
285
286 ret->by_object = 0;
287 ret->iteration = 0;
288 return &ret->root;
289 }
290
291 /* Called during processing of linker script script expressions.
292 For symbols assigned in a linker script, return a struct describing
293 where the symbol is defined relative to the current expression,
294 otherwise return NULL. */
295
296 static struct definedness_hash_entry *
297 symbol_defined (const char *name)
298 {
299 return ((struct definedness_hash_entry *)
300 bfd_hash_lookup (&definedness_table, name, FALSE, FALSE));
301 }
302
303 /* Update the definedness state of NAME. Return FALSE if script symbol
304 is multiply defining a strong symbol in an object. */
305
306 static bfd_boolean
307 update_definedness (const char *name, struct bfd_link_hash_entry *h)
308 {
309 bfd_boolean ret;
310 struct definedness_hash_entry *defentry
311 = (struct definedness_hash_entry *)
312 bfd_hash_lookup (&definedness_table, name, TRUE, FALSE);
313
314 if (defentry == NULL)
315 einfo (_("%F%P: bfd_hash_lookup failed creating symbol %s\n"), name);
316
317 /* If the symbol was already defined, and not by a script, then it
318 must be defined by an object file or by the linker target code. */
319 ret = TRUE;
320 if (!h->ldscript_def
321 && (h->type == bfd_link_hash_defined
322 || h->type == bfd_link_hash_defweak
323 || h->type == bfd_link_hash_common))
324 {
325 defentry->by_object = 1;
326 if (h->type == bfd_link_hash_defined
327 && h->u.def.section->output_section != NULL
328 && !h->linker_def)
329 ret = FALSE;
330 }
331
332 defentry->iteration = lang_statement_iteration;
333 defentry->final_sec = bfd_abs_section_ptr;
334 if (expld.phase == lang_final_phase_enum
335 && expld.rel_from_abs
336 && expld.result.section == bfd_abs_section_ptr)
337 defentry->final_sec = section_for_dot ();
338 return ret;
339 }
340
341 static void
342 fold_segment_end (seg_align_type *seg)
343 {
344 if (expld.phase == lang_first_phase_enum
345 || expld.section != bfd_abs_section_ptr)
346 {
347 expld.result.valid_p = FALSE;
348 }
349 else if (seg->phase == exp_seg_align_seen
350 || seg->phase == exp_seg_relro_seen)
351 {
352 seg->phase = exp_seg_end_seen;
353 seg->end = expld.result.value;
354 }
355 else if (seg->phase == exp_seg_done
356 || seg->phase == exp_seg_adjust
357 || seg->phase == exp_seg_relro_adjust)
358 {
359 /* OK. */
360 }
361 else
362 expld.result.valid_p = FALSE;
363 }
364
365 static void
366 fold_unary (etree_type *tree)
367 {
368 exp_fold_tree_1 (tree->unary.child);
369 if (expld.result.valid_p)
370 {
371 switch (tree->type.node_code)
372 {
373 case ALIGN_K:
374 if (expld.phase != lang_first_phase_enum)
375 new_rel_from_abs (align_n (expld.dot, expld.result.value));
376 else
377 expld.result.valid_p = FALSE;
378 break;
379
380 case ABSOLUTE:
381 make_abs ();
382 break;
383
384 case LOG2CEIL:
385 make_log2ceil ();
386 break;
387
388 case '~':
389 expld.result.value = ~expld.result.value;
390 break;
391
392 case '!':
393 expld.result.value = !expld.result.value;
394 break;
395
396 case '-':
397 expld.result.value = -expld.result.value;
398 break;
399
400 case NEXT:
401 /* Return next place aligned to value. */
402 if (expld.phase != lang_first_phase_enum)
403 {
404 make_abs ();
405 expld.result.value = align_n (expld.dot, expld.result.value);
406 }
407 else
408 expld.result.valid_p = FALSE;
409 break;
410
411 case DATA_SEGMENT_END:
412 fold_segment_end (&expld.dataseg);
413 break;
414
415 default:
416 FAIL ();
417 break;
418 }
419 }
420 }
421
422 /* Arithmetic operators, bitwise AND, bitwise OR and XOR keep the
423 section of one of their operands only when the other operand is a
424 plain number. Losing the section when operating on two symbols,
425 ie. a result of a plain number, is required for subtraction and
426 XOR. It's justifiable for the other operations on the grounds that
427 adding, multiplying etc. two section relative values does not
428 really make sense unless they are just treated as numbers.
429 The same argument could be made for many expressions involving one
430 symbol and a number. For example, "1 << x" and "100 / x" probably
431 should not be given the section of x. The trouble is that if we
432 fuss about such things the rules become complex and it is onerous
433 to document ld expression evaluation. */
434 static void
435 arith_result_section (const etree_value_type *lhs)
436 {
437 if (expld.result.section == lhs->section)
438 {
439 if (expld.section == bfd_abs_section_ptr
440 && !config.sane_expr)
441 /* Duplicate the insanity in exp_fold_tree_1 case etree_value. */
442 expld.result.section = bfd_abs_section_ptr;
443 else
444 expld.result.section = NULL;
445 }
446 }
447
448 static void
449 fold_segment_align (seg_align_type *seg, etree_value_type *lhs)
450 {
451 seg->relro = exp_seg_relro_start;
452 if (expld.phase == lang_first_phase_enum
453 || expld.section != bfd_abs_section_ptr)
454 expld.result.valid_p = FALSE;
455 else
456 {
457 bfd_vma maxpage = lhs->value;
458 bfd_vma commonpage = expld.result.value;
459
460 expld.result.value = align_n (expld.dot, maxpage);
461 if (seg->phase == exp_seg_relro_adjust)
462 expld.result.value = seg->base;
463 else if (seg->phase == exp_seg_adjust)
464 {
465 if (commonpage < maxpage)
466 expld.result.value += ((expld.dot + commonpage - 1)
467 & (maxpage - commonpage));
468 }
469 else
470 {
471 expld.result.value += expld.dot & (maxpage - 1);
472 if (seg->phase == exp_seg_done)
473 {
474 /* OK. */
475 }
476 else if (seg->phase == exp_seg_none)
477 {
478 seg->phase = exp_seg_align_seen;
479 seg->base = expld.result.value;
480 seg->pagesize = commonpage;
481 seg->maxpagesize = maxpage;
482 seg->relro_end = 0;
483 }
484 else
485 expld.result.valid_p = FALSE;
486 }
487 }
488 }
489
490 static void
491 fold_segment_relro_end (seg_align_type *seg, etree_value_type *lhs)
492 {
493 /* Operands swapped! XXX_SEGMENT_RELRO_END(offset,exp) has offset
494 in expld.result and exp in lhs. */
495 seg->relro = exp_seg_relro_end;
496 seg->relro_offset = expld.result.value;
497 if (expld.phase == lang_first_phase_enum
498 || expld.section != bfd_abs_section_ptr)
499 expld.result.valid_p = FALSE;
500 else if (seg->phase == exp_seg_align_seen
501 || seg->phase == exp_seg_adjust
502 || seg->phase == exp_seg_relro_adjust
503 || seg->phase == exp_seg_done)
504 {
505 if (seg->phase == exp_seg_align_seen
506 || seg->phase == exp_seg_relro_adjust)
507 seg->relro_end = lhs->value + expld.result.value;
508
509 if (seg->phase == exp_seg_relro_adjust
510 && (seg->relro_end & (seg->pagesize - 1)))
511 {
512 seg->relro_end += seg->pagesize - 1;
513 seg->relro_end &= ~(seg->pagesize - 1);
514 expld.result.value = seg->relro_end - expld.result.value;
515 }
516 else
517 expld.result.value = lhs->value;
518
519 if (seg->phase == exp_seg_align_seen)
520 seg->phase = exp_seg_relro_seen;
521 }
522 else
523 expld.result.valid_p = FALSE;
524 }
525
526 static void
527 fold_binary (etree_type *tree)
528 {
529 etree_value_type lhs;
530 exp_fold_tree_1 (tree->binary.lhs);
531
532 /* The SEGMENT_START operator is special because its first
533 operand is a string, not the name of a symbol. Note that the
534 operands have been swapped, so binary.lhs is second (default)
535 operand, binary.rhs is first operand. */
536 if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
537 {
538 bfd_vma value = expld.result.value;
539 const char *segment_name;
540 segment_type *seg;
541
542 /* Check to see if the user has overridden the default
543 value. */
544 segment_name = tree->binary.rhs->name.name;
545 for (seg = segments; seg; seg = seg->next)
546 if (strcmp (seg->name, segment_name) == 0)
547 {
548 if (!seg->used
549 && config.magic_demand_paged
550 && config.maxpagesize != 0
551 && (seg->value % config.maxpagesize) != 0)
552 einfo (_("%P: warning: address of `%s' "
553 "isn't multiple of maximum page size\n"),
554 segment_name);
555 seg->used = TRUE;
556 value = seg->value;
557 break;
558 }
559 new_rel_from_abs (value);
560 return;
561 }
562
563 lhs = expld.result;
564 exp_fold_tree_1 (tree->binary.rhs);
565 expld.result.valid_p &= lhs.valid_p;
566
567 if (expld.result.valid_p)
568 {
569 if (lhs.section != expld.result.section)
570 {
571 /* If the values are from different sections, and neither is
572 just a number, make both the source arguments absolute. */
573 if (expld.result.section != NULL
574 && lhs.section != NULL)
575 {
576 make_abs ();
577 lhs.value += lhs.section->vma;
578 lhs.section = bfd_abs_section_ptr;
579 }
580
581 /* If the rhs is just a number, keep the lhs section. */
582 else if (expld.result.section == NULL)
583 {
584 expld.result.section = lhs.section;
585 /* Make this NULL so that we know one of the operands
586 was just a number, for later tests. */
587 lhs.section = NULL;
588 }
589 }
590 /* At this point we know that both operands have the same
591 section, or at least one of them is a plain number. */
592
593 switch (tree->type.node_code)
594 {
595 #define BOP(x, y) \
596 case x: \
597 expld.result.value = lhs.value y expld.result.value; \
598 arith_result_section (&lhs); \
599 break;
600
601 /* Comparison operators, logical AND, and logical OR always
602 return a plain number. */
603 #define BOPN(x, y) \
604 case x: \
605 expld.result.value = lhs.value y expld.result.value; \
606 expld.result.section = NULL; \
607 break;
608
609 BOP ('+', +);
610 BOP ('*', *);
611 BOP ('-', -);
612 BOP (LSHIFT, <<);
613 BOP (RSHIFT, >>);
614 BOP ('&', &);
615 BOP ('^', ^);
616 BOP ('|', |);
617 BOPN (EQ, ==);
618 BOPN (NE, !=);
619 BOPN ('<', <);
620 BOPN ('>', >);
621 BOPN (LE, <=);
622 BOPN (GE, >=);
623 BOPN (ANDAND, &&);
624 BOPN (OROR, ||);
625
626 case '%':
627 if (expld.result.value != 0)
628 expld.result.value = ((bfd_signed_vma) lhs.value
629 % (bfd_signed_vma) expld.result.value);
630 else if (expld.phase != lang_mark_phase_enum)
631 einfo (_("%F%P:%pS %% by zero\n"), tree->binary.rhs);
632 arith_result_section (&lhs);
633 break;
634
635 case '/':
636 if (expld.result.value != 0)
637 expld.result.value = ((bfd_signed_vma) lhs.value
638 / (bfd_signed_vma) expld.result.value);
639 else if (expld.phase != lang_mark_phase_enum)
640 einfo (_("%F%P:%pS / by zero\n"), tree->binary.rhs);
641 arith_result_section (&lhs);
642 break;
643
644 case MAX_K:
645 if (lhs.value > expld.result.value)
646 expld.result.value = lhs.value;
647 break;
648
649 case MIN_K:
650 if (lhs.value < expld.result.value)
651 expld.result.value = lhs.value;
652 break;
653
654 case ALIGN_K:
655 expld.result.value = align_n (lhs.value, expld.result.value);
656 break;
657
658 case DATA_SEGMENT_ALIGN:
659 fold_segment_align (&expld.dataseg, &lhs);
660 break;
661
662 case DATA_SEGMENT_RELRO_END:
663 fold_segment_relro_end (&expld.dataseg, &lhs);
664 break;
665
666 default:
667 FAIL ();
668 }
669 }
670 }
671
672 static void
673 fold_trinary (etree_type *tree)
674 {
675 struct bfd_link_hash_entry *save = expld.assign_src;
676
677 exp_fold_tree_1 (tree->trinary.cond);
678 expld.assign_src = save;
679 if (expld.result.valid_p)
680 exp_fold_tree_1 (expld.result.value
681 ? tree->trinary.lhs
682 : tree->trinary.rhs);
683 }
684
685 static void
686 fold_name (etree_type *tree)
687 {
688 struct bfd_link_hash_entry *h;
689 struct definedness_hash_entry *def;
690
691 memset (&expld.result, 0, sizeof (expld.result));
692
693 switch (tree->type.node_code)
694 {
695 case SIZEOF_HEADERS:
696 link_info.load_phdrs = 1;
697 if (expld.phase != lang_first_phase_enum)
698 {
699 bfd_vma hdr_size = 0;
700 /* Don't find the real header size if only marking sections;
701 The bfd function may cache incorrect data. */
702 if (expld.phase != lang_mark_phase_enum)
703 hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
704 new_number (hdr_size);
705 }
706 break;
707
708 case DEFINED:
709 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
710 &link_info,
711 tree->name.name,
712 FALSE, FALSE, TRUE);
713 new_number (h != NULL
714 && (h->type == bfd_link_hash_defined
715 || h->type == bfd_link_hash_defweak
716 || h->type == bfd_link_hash_common)
717 && (!h->ldscript_def
718 || (def = symbol_defined (tree->name.name)) == NULL
719 || def->by_object
720 || def->iteration == (lang_statement_iteration & 255)));
721 break;
722
723 case NAME:
724 if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
725 new_rel_from_abs (expld.dot);
726 else
727 {
728 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
729 &link_info,
730 tree->name.name,
731 TRUE, FALSE, TRUE);
732 if (!h)
733 {
734 if (expld.phase != lang_first_phase_enum)
735 einfo (_("%F%P: bfd_link_hash_lookup failed: %E\n"));
736 }
737 else if (h->type == bfd_link_hash_defined
738 || h->type == bfd_link_hash_defweak)
739 {
740 asection *output_section;
741
742 output_section = h->u.def.section->output_section;
743 if (output_section == NULL)
744 {
745 if (expld.phase <= lang_mark_phase_enum)
746 new_rel (h->u.def.value, h->u.def.section);
747 else
748 einfo (_("%X%P:%pS: unresolvable symbol `%s'"
749 " referenced in expression\n"),
750 tree, tree->name.name);
751 }
752 else if (output_section == bfd_abs_section_ptr
753 && (expld.section != bfd_abs_section_ptr
754 || config.sane_expr))
755 new_number (h->u.def.value + h->u.def.section->output_offset);
756 else
757 new_rel (h->u.def.value + h->u.def.section->output_offset,
758 output_section);
759 }
760 else if (expld.phase == lang_final_phase_enum
761 || (expld.phase != lang_mark_phase_enum
762 && expld.assigning_to_dot))
763 einfo (_("%F%P:%pS: undefined symbol `%s'"
764 " referenced in expression\n"),
765 tree, tree->name.name);
766 else if (h->type == bfd_link_hash_new)
767 {
768 h->type = bfd_link_hash_undefined;
769 h->u.undef.abfd = NULL;
770 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
771 bfd_link_add_undef (link_info.hash, h);
772 }
773 if (expld.assign_src == NULL)
774 expld.assign_src = h;
775 else
776 expld.assign_src = (struct bfd_link_hash_entry *) - 1;
777
778 /* Self-assignment is only allowed for absolute symbols
779 defined in a linker script. */
780 if (expld.assign_name != NULL
781 && strcmp (expld.assign_name, tree->name.name) == 0
782 && !(h != NULL
783 && (h->type == bfd_link_hash_defined
784 || h->type == bfd_link_hash_defweak)
785 && h->u.def.section == bfd_abs_section_ptr
786 && (def = symbol_defined (tree->name.name)) != NULL
787 && def->iteration == (lang_statement_iteration & 255)))
788 expld.assign_name = NULL;
789 }
790 break;
791
792 case ADDR:
793 if (expld.phase != lang_first_phase_enum)
794 {
795 lang_output_section_statement_type *os;
796
797 os = lang_output_section_find (tree->name.name);
798 if (os == NULL)
799 {
800 if (expld.phase == lang_final_phase_enum)
801 einfo (_("%F%P:%pS: undefined section `%s'"
802 " referenced in expression\n"),
803 tree, tree->name.name);
804 }
805 else if (os->processed_vma)
806 new_rel (0, os->bfd_section);
807 }
808 break;
809
810 case LOADADDR:
811 if (expld.phase != lang_first_phase_enum)
812 {
813 lang_output_section_statement_type *os;
814
815 os = lang_output_section_find (tree->name.name);
816 if (os == NULL)
817 {
818 if (expld.phase == lang_final_phase_enum)
819 einfo (_("%F%P:%pS: undefined section `%s'"
820 " referenced in expression\n"),
821 tree, tree->name.name);
822 }
823 else if (os->processed_lma)
824 {
825 if (os->load_base == NULL)
826 new_abs (os->bfd_section->lma);
827 else
828 {
829 exp_fold_tree_1 (os->load_base);
830 if (expld.result.valid_p)
831 make_abs ();
832 }
833 }
834 }
835 break;
836
837 case SIZEOF:
838 case ALIGNOF:
839 if (expld.phase != lang_first_phase_enum)
840 {
841 lang_output_section_statement_type *os;
842
843 os = lang_output_section_find (tree->name.name);
844 if (os == NULL)
845 {
846 if (expld.phase == lang_final_phase_enum)
847 einfo (_("%F%P:%pS: undefined section `%s'"
848 " referenced in expression\n"),
849 tree, tree->name.name);
850 new_number (0);
851 }
852 else if (os->bfd_section != NULL)
853 {
854 bfd_vma val;
855
856 if (tree->type.node_code == SIZEOF)
857 val = (os->bfd_section->size
858 / bfd_octets_per_byte (link_info.output_bfd,
859 os->bfd_section));
860 else
861 val = (bfd_vma)1 << os->bfd_section->alignment_power;
862
863 new_number (val);
864 }
865 else
866 new_number (0);
867 }
868 break;
869
870 case LENGTH:
871 {
872 lang_memory_region_type *mem;
873
874 mem = lang_memory_region_lookup (tree->name.name, FALSE);
875 if (mem != NULL)
876 new_number (mem->length);
877 else
878 einfo (_("%F%P:%pS: undefined MEMORY region `%s'"
879 " referenced in expression\n"),
880 tree, tree->name.name);
881 }
882 break;
883
884 case ORIGIN:
885 {
886 lang_memory_region_type *mem;
887
888 mem = lang_memory_region_lookup (tree->name.name, FALSE);
889 if (mem != NULL)
890 new_rel_from_abs (mem->origin);
891 else
892 einfo (_("%F%P:%pS: undefined MEMORY region `%s'"
893 " referenced in expression\n"),
894 tree, tree->name.name);
895 }
896 break;
897
898 case CONSTANT:
899 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
900 new_number (config.maxpagesize);
901 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
902 new_number (config.commonpagesize);
903 else
904 einfo (_("%F%P:%pS: unknown constant `%s' referenced in expression\n"),
905 tree, tree->name.name);
906 break;
907
908 default:
909 FAIL ();
910 break;
911 }
912 }
913
914 /* Return true if TREE is '.'. */
915
916 static bfd_boolean
917 is_dot (const etree_type *tree)
918 {
919 return (tree->type.node_class == etree_name
920 && tree->type.node_code == NAME
921 && tree->name.name[0] == '.'
922 && tree->name.name[1] == 0);
923 }
924
925 /* Return true if TREE is a constant equal to VAL. */
926
927 static bfd_boolean
928 is_value (const etree_type *tree, bfd_vma val)
929 {
930 return (tree->type.node_class == etree_value
931 && tree->value.value == val);
932 }
933
934 /* Return true if TREE is an absolute symbol equal to VAL defined in
935 a linker script. */
936
937 static bfd_boolean
938 is_sym_value (const etree_type *tree, bfd_vma val)
939 {
940 struct bfd_link_hash_entry *h;
941 struct definedness_hash_entry *def;
942
943 return (tree->type.node_class == etree_name
944 && tree->type.node_code == NAME
945 && (def = symbol_defined (tree->name.name)) != NULL
946 && def->iteration == (lang_statement_iteration & 255)
947 && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
948 &link_info,
949 tree->name.name,
950 FALSE, FALSE, TRUE)) != NULL
951 && h->ldscript_def
952 && h->type == bfd_link_hash_defined
953 && h->u.def.section == bfd_abs_section_ptr
954 && h->u.def.value == val);
955 }
956
957 /* Return true if TREE is ". != 0". */
958
959 static bfd_boolean
960 is_dot_ne_0 (const etree_type *tree)
961 {
962 return (tree->type.node_class == etree_binary
963 && tree->type.node_code == NE
964 && is_dot (tree->binary.lhs)
965 && is_value (tree->binary.rhs, 0));
966 }
967
968 /* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an
969 absolute constant with value 0 defined in a linker script. */
970
971 static bfd_boolean
972 is_dot_plus_0 (const etree_type *tree)
973 {
974 return (tree->type.node_class == etree_binary
975 && tree->type.node_code == '+'
976 && is_dot (tree->binary.lhs)
977 && (is_value (tree->binary.rhs, 0)
978 || is_sym_value (tree->binary.rhs, 0)));
979 }
980
981 /* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)". */
982
983 static bfd_boolean
984 is_align_conditional (const etree_type *tree)
985 {
986 if (tree->type.node_class == etree_unary
987 && tree->type.node_code == ALIGN_K)
988 {
989 tree = tree->unary.child;
990 return (tree->type.node_class == etree_trinary
991 && is_dot_ne_0 (tree->trinary.cond)
992 && is_value (tree->trinary.rhs, 1));
993 }
994 return FALSE;
995 }
996
997 static void
998 exp_fold_tree_1 (etree_type *tree)
999 {
1000 if (tree == NULL)
1001 {
1002 memset (&expld.result, 0, sizeof (expld.result));
1003 return;
1004 }
1005
1006 switch (tree->type.node_class)
1007 {
1008 case etree_value:
1009 if (expld.section == bfd_abs_section_ptr
1010 && !config.sane_expr)
1011 new_abs (tree->value.value);
1012 else
1013 new_number (tree->value.value);
1014 expld.result.str = tree->value.str;
1015 break;
1016
1017 case etree_rel:
1018 if (expld.phase != lang_first_phase_enum)
1019 {
1020 asection *output_section = tree->rel.section->output_section;
1021 new_rel (tree->rel.value + tree->rel.section->output_offset,
1022 output_section);
1023 }
1024 else
1025 memset (&expld.result, 0, sizeof (expld.result));
1026 break;
1027
1028 case etree_assert:
1029 exp_fold_tree_1 (tree->assert_s.child);
1030 if (expld.phase == lang_final_phase_enum && !expld.result.value)
1031 einfo ("%X%P: %s\n", tree->assert_s.message);
1032 break;
1033
1034 case etree_unary:
1035 fold_unary (tree);
1036 break;
1037
1038 case etree_binary:
1039 fold_binary (tree);
1040 break;
1041
1042 case etree_trinary:
1043 fold_trinary (tree);
1044 break;
1045
1046 case etree_assign:
1047 case etree_provide:
1048 case etree_provided:
1049 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
1050 {
1051 if (tree->type.node_class != etree_assign)
1052 einfo (_("%F%P:%pS can not PROVIDE assignment to"
1053 " location counter\n"), tree);
1054 if (expld.phase != lang_first_phase_enum)
1055 {
1056 /* Notify the folder that this is an assignment to dot. */
1057 expld.assigning_to_dot = TRUE;
1058 exp_fold_tree_1 (tree->assign.src);
1059 expld.assigning_to_dot = FALSE;
1060
1061 /* If we are assigning to dot inside an output section
1062 arrange to keep the section, except for certain
1063 expressions that evaluate to zero. We ignore . = 0,
1064 . = . + 0, and . = ALIGN (. != 0 ? expr : 1).
1065 We can't ignore all expressions that evaluate to zero
1066 because an otherwise empty section might have padding
1067 added by an alignment expression that changes with
1068 relaxation. Such a section might have zero size
1069 before relaxation and so be stripped incorrectly. */
1070 if (expld.phase == lang_mark_phase_enum
1071 && expld.section != bfd_abs_section_ptr
1072 && expld.section != bfd_und_section_ptr
1073 && !(expld.result.valid_p
1074 && expld.result.value == 0
1075 && (is_value (tree->assign.src, 0)
1076 || is_sym_value (tree->assign.src, 0)
1077 || is_dot_plus_0 (tree->assign.src)
1078 || is_align_conditional (tree->assign.src))))
1079 expld.section->flags |= SEC_KEEP;
1080
1081 if (!expld.result.valid_p
1082 || expld.section == bfd_und_section_ptr)
1083 {
1084 if (expld.phase != lang_mark_phase_enum)
1085 einfo (_("%F%P:%pS invalid assignment to"
1086 " location counter\n"), tree);
1087 }
1088 else if (expld.dotp == NULL)
1089 einfo (_("%F%P:%pS assignment to location counter"
1090 " invalid outside of SECTIONS\n"), tree);
1091
1092 /* After allocation, assignment to dot should not be
1093 done inside an output section since allocation adds a
1094 padding statement that effectively duplicates the
1095 assignment. */
1096 else if (expld.phase <= lang_allocating_phase_enum
1097 || expld.section == bfd_abs_section_ptr)
1098 {
1099 bfd_vma nextdot;
1100
1101 nextdot = expld.result.value;
1102 if (expld.result.section != NULL)
1103 nextdot += expld.result.section->vma;
1104 else
1105 nextdot += expld.section->vma;
1106 if (nextdot < expld.dot
1107 && expld.section != bfd_abs_section_ptr)
1108 einfo (_("%F%P:%pS cannot move location counter backwards"
1109 " (from %V to %V)\n"),
1110 tree, expld.dot, nextdot);
1111 else
1112 {
1113 expld.dot = nextdot;
1114 *expld.dotp = nextdot;
1115 }
1116 }
1117 }
1118 else
1119 memset (&expld.result, 0, sizeof (expld.result));
1120 }
1121 else
1122 {
1123 struct bfd_link_hash_entry *h = NULL;
1124
1125 if (tree->type.node_class == etree_provide)
1126 {
1127 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1128 FALSE, FALSE, TRUE);
1129 if (h == NULL
1130 || !(h->type == bfd_link_hash_new
1131 || h->type == bfd_link_hash_undefined
1132 || h->type == bfd_link_hash_undefweak
1133 || h->linker_def))
1134 {
1135 /* Do nothing. The symbol was never referenced, or
1136 was defined in some object file. Note that
1137 undefweak symbols are defined by PROVIDE. This
1138 is to support glibc use of __rela_iplt_start and
1139 similar weak references. */
1140 break;
1141 }
1142 }
1143
1144 expld.assign_name = tree->assign.dst;
1145 expld.assign_src = NULL;
1146 exp_fold_tree_1 (tree->assign.src);
1147 /* expld.assign_name remaining equal to tree->assign.dst
1148 below indicates the evaluation of tree->assign.src did
1149 not use the value of tree->assign.dst. We don't allow
1150 self assignment until the final phase for two reasons:
1151 1) Expressions are evaluated multiple times. With
1152 relaxation, the number of times may vary.
1153 2) Section relative symbol values cannot be correctly
1154 converted to absolute values, as is required by many
1155 expressions, until final section sizing is complete. */
1156 if (expld.phase == lang_final_phase_enum
1157 || expld.phase == lang_fixed_phase_enum
1158 || expld.assign_name != NULL)
1159 {
1160 if (tree->type.node_class == etree_provide)
1161 tree->type.node_class = etree_provided;
1162
1163 if (h == NULL)
1164 {
1165 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1166 TRUE, FALSE, TRUE);
1167 if (h == NULL)
1168 einfo (_("%F%P:%s: hash creation failed\n"),
1169 tree->assign.dst);
1170 }
1171
1172 /* If the expression is not valid then fake a zero value. In
1173 the final phase any errors will already have been raised,
1174 in earlier phases we want to create this definition so
1175 that it can be seen by other expressions. */
1176 if (!expld.result.valid_p
1177 && h->type == bfd_link_hash_new)
1178 {
1179 expld.result.value = 0;
1180 expld.result.section = NULL;
1181 expld.result.valid_p = TRUE;
1182 }
1183
1184 if (expld.result.valid_p)
1185 {
1186 if (expld.result.section == NULL)
1187 expld.result.section = expld.section;
1188 if (!update_definedness (tree->assign.dst, h) && 0)
1189 {
1190 /* Symbol was already defined. For now this error
1191 is disabled because it causes failures in the ld
1192 testsuite: ld-elf/var1, ld-scripts/defined5, and
1193 ld-scripts/pr14962. Some of these no doubt
1194 reflect scripts used in the wild. */
1195 (*link_info.callbacks->multiple_definition)
1196 (&link_info, h, link_info.output_bfd,
1197 expld.result.section, expld.result.value);
1198 }
1199 if (expld.phase == lang_fixed_phase_enum)
1200 {
1201 if (h->type == bfd_link_hash_defined)
1202 {
1203 expld.result.value = h->u.def.value;
1204 expld.result.section = h->u.def.section;
1205 }
1206 }
1207 else
1208 {
1209 h->type = bfd_link_hash_defined;
1210 h->u.def.value = expld.result.value;
1211 h->u.def.section = expld.result.section;
1212 h->linker_def = ! tree->assign.type.lineno;
1213 h->ldscript_def = 1;
1214 h->rel_from_abs = expld.rel_from_abs;
1215 if (tree->assign.hidden)
1216 bfd_link_hide_symbol (link_info.output_bfd,
1217 &link_info, h);
1218
1219 /* Copy the symbol type if this is an expression only
1220 referencing a single symbol. (If the expression
1221 contains ternary conditions, ignoring symbols on
1222 false branches.) */
1223 if (expld.assign_src != NULL
1224 && (expld.assign_src
1225 != (struct bfd_link_hash_entry *) -1))
1226 bfd_copy_link_hash_symbol_type (link_info.output_bfd,
1227 h, expld.assign_src);
1228 }
1229 }
1230 }
1231 if (expld.phase != lang_fixed_phase_enum)
1232 expld.assign_name = NULL;
1233 }
1234 break;
1235
1236 case etree_name:
1237 fold_name (tree);
1238 break;
1239
1240 default:
1241 FAIL ();
1242 memset (&expld.result, 0, sizeof (expld.result));
1243 break;
1244 }
1245 }
1246
1247 void
1248 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
1249 {
1250 expld.rel_from_abs = FALSE;
1251 expld.dot = *dotp;
1252 expld.dotp = dotp;
1253 expld.section = current_section;
1254 exp_fold_tree_1 (tree);
1255 }
1256
1257 void
1258 exp_fold_tree_no_dot (etree_type *tree)
1259 {
1260 expld.rel_from_abs = FALSE;
1261 expld.dot = 0;
1262 expld.dotp = NULL;
1263 expld.section = bfd_abs_section_ptr;
1264 exp_fold_tree_1 (tree);
1265 }
1266
1267 static void
1268 exp_value_fold (etree_type *tree)
1269 {
1270 exp_fold_tree_no_dot (tree);
1271 if (expld.result.valid_p)
1272 {
1273 tree->type.node_code = INT;
1274 tree->value.value = expld.result.value;
1275 tree->value.str = NULL;
1276 tree->type.node_class = etree_value;
1277 }
1278 }
1279
1280 #define MAX(a, b) ((a) > (b) ? (a) : (b))
1281
1282 etree_type *
1283 exp_binop (int code, etree_type *lhs, etree_type *rhs)
1284 {
1285 etree_type *new_e = stat_alloc (MAX (sizeof (new_e->binary),
1286 sizeof (new_e->value)));
1287 new_e->type.node_code = code;
1288 new_e->type.filename = lhs->type.filename;
1289 new_e->type.lineno = lhs->type.lineno;
1290 new_e->binary.lhs = lhs;
1291 new_e->binary.rhs = rhs;
1292 new_e->type.node_class = etree_binary;
1293 if (lhs->type.node_class == etree_value
1294 && rhs->type.node_class == etree_value
1295 && code != ALIGN_K
1296 && code != DATA_SEGMENT_ALIGN
1297 && code != DATA_SEGMENT_RELRO_END)
1298 exp_value_fold (new_e);
1299 return new_e;
1300 }
1301
1302 etree_type *
1303 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
1304 {
1305 etree_type *new_e = stat_alloc (MAX (sizeof (new_e->trinary),
1306 sizeof (new_e->value)));
1307 new_e->type.node_code = code;
1308 new_e->type.filename = cond->type.filename;
1309 new_e->type.lineno = cond->type.lineno;
1310 new_e->trinary.lhs = lhs;
1311 new_e->trinary.cond = cond;
1312 new_e->trinary.rhs = rhs;
1313 new_e->type.node_class = etree_trinary;
1314 if (cond->type.node_class == etree_value
1315 && lhs->type.node_class == etree_value
1316 && rhs->type.node_class == etree_value)
1317 exp_value_fold (new_e);
1318 return new_e;
1319 }
1320
1321 etree_type *
1322 exp_unop (int code, etree_type *child)
1323 {
1324 etree_type *new_e = stat_alloc (MAX (sizeof (new_e->unary),
1325 sizeof (new_e->value)));
1326 new_e->unary.type.node_code = code;
1327 new_e->unary.type.filename = child->type.filename;
1328 new_e->unary.type.lineno = child->type.lineno;
1329 new_e->unary.child = child;
1330 new_e->unary.type.node_class = etree_unary;
1331 if (child->type.node_class == etree_value
1332 && code != ALIGN_K
1333 && code != ABSOLUTE
1334 && code != NEXT
1335 && code != DATA_SEGMENT_END)
1336 exp_value_fold (new_e);
1337 return new_e;
1338 }
1339
1340 etree_type *
1341 exp_nameop (int code, const char *name)
1342 {
1343 etree_type *new_e = stat_alloc (sizeof (new_e->name));
1344
1345 new_e->name.type.node_code = code;
1346 new_e->name.type.filename = ldlex_filename ();
1347 new_e->name.type.lineno = lineno;
1348 new_e->name.name = name;
1349 new_e->name.type.node_class = etree_name;
1350 return new_e;
1351
1352 }
1353
1354 static etree_type *
1355 exp_assop (const char *dst,
1356 etree_type *src,
1357 enum node_tree_enum class,
1358 bfd_boolean hidden)
1359 {
1360 etree_type *n;
1361
1362 n = stat_alloc (sizeof (n->assign));
1363 n->assign.type.node_code = '=';
1364 n->assign.type.filename = src->type.filename;
1365 n->assign.type.lineno = src->type.lineno;
1366 n->assign.type.node_class = class;
1367 n->assign.src = src;
1368 n->assign.dst = dst;
1369 n->assign.hidden = hidden;
1370 return n;
1371 }
1372
1373 /* Handle linker script assignments and HIDDEN. */
1374
1375 etree_type *
1376 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1377 {
1378 return exp_assop (dst, src, etree_assign, hidden);
1379 }
1380
1381 /* Handle --defsym command-line option. */
1382
1383 etree_type *
1384 exp_defsym (const char *dst, etree_type *src)
1385 {
1386 return exp_assop (dst, src, etree_assign, FALSE);
1387 }
1388
1389 /* Handle PROVIDE. */
1390
1391 etree_type *
1392 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1393 {
1394 return exp_assop (dst, src, etree_provide, hidden);
1395 }
1396
1397 /* Handle ASSERT. */
1398
1399 etree_type *
1400 exp_assert (etree_type *exp, const char *message)
1401 {
1402 etree_type *n;
1403
1404 n = stat_alloc (sizeof (n->assert_s));
1405 n->assert_s.type.node_code = '!';
1406 n->assert_s.type.filename = exp->type.filename;
1407 n->assert_s.type.lineno = exp->type.lineno;
1408 n->assert_s.type.node_class = etree_assert;
1409 n->assert_s.child = exp;
1410 n->assert_s.message = message;
1411 return n;
1412 }
1413
1414 void
1415 exp_print_tree (etree_type *tree)
1416 {
1417 bfd_boolean function_like;
1418
1419 if (config.map_file == NULL)
1420 config.map_file = stderr;
1421
1422 if (tree == NULL)
1423 {
1424 minfo ("NULL TREE\n");
1425 return;
1426 }
1427
1428 switch (tree->type.node_class)
1429 {
1430 case etree_value:
1431 minfo ("0x%v", tree->value.value);
1432 return;
1433 case etree_rel:
1434 if (tree->rel.section->owner != NULL)
1435 minfo ("%pB:", tree->rel.section->owner);
1436 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1437 return;
1438 case etree_assign:
1439 fputs (tree->assign.dst, config.map_file);
1440 exp_print_token (tree->type.node_code, TRUE);
1441 exp_print_tree (tree->assign.src);
1442 break;
1443 case etree_provide:
1444 case etree_provided:
1445 fprintf (config.map_file, "PROVIDE (%s = ", tree->assign.dst);
1446 exp_print_tree (tree->assign.src);
1447 fputc (')', config.map_file);
1448 break;
1449 case etree_binary:
1450 function_like = FALSE;
1451 switch (tree->type.node_code)
1452 {
1453 case MAX_K:
1454 case MIN_K:
1455 case ALIGN_K:
1456 case DATA_SEGMENT_ALIGN:
1457 case DATA_SEGMENT_RELRO_END:
1458 function_like = TRUE;
1459 break;
1460 case SEGMENT_START:
1461 /* Special handling because arguments are in reverse order and
1462 the segment name is quoted. */
1463 exp_print_token (tree->type.node_code, FALSE);
1464 fputs (" (\"", config.map_file);
1465 exp_print_tree (tree->binary.rhs);
1466 fputs ("\", ", config.map_file);
1467 exp_print_tree (tree->binary.lhs);
1468 fputc (')', config.map_file);
1469 return;
1470 }
1471 if (function_like)
1472 {
1473 exp_print_token (tree->type.node_code, FALSE);
1474 fputc (' ', config.map_file);
1475 }
1476 fputc ('(', config.map_file);
1477 exp_print_tree (tree->binary.lhs);
1478 if (function_like)
1479 fprintf (config.map_file, ", ");
1480 else
1481 exp_print_token (tree->type.node_code, TRUE);
1482 exp_print_tree (tree->binary.rhs);
1483 fputc (')', config.map_file);
1484 break;
1485 case etree_trinary:
1486 exp_print_tree (tree->trinary.cond);
1487 fputc ('?', config.map_file);
1488 exp_print_tree (tree->trinary.lhs);
1489 fputc (':', config.map_file);
1490 exp_print_tree (tree->trinary.rhs);
1491 break;
1492 case etree_unary:
1493 exp_print_token (tree->unary.type.node_code, FALSE);
1494 if (tree->unary.child)
1495 {
1496 fprintf (config.map_file, " (");
1497 exp_print_tree (tree->unary.child);
1498 fputc (')', config.map_file);
1499 }
1500 break;
1501
1502 case etree_assert:
1503 fprintf (config.map_file, "ASSERT (");
1504 exp_print_tree (tree->assert_s.child);
1505 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1506 break;
1507
1508 case etree_name:
1509 if (tree->type.node_code == NAME)
1510 fputs (tree->name.name, config.map_file);
1511 else
1512 {
1513 exp_print_token (tree->type.node_code, FALSE);
1514 if (tree->name.name)
1515 fprintf (config.map_file, " (%s)", tree->name.name);
1516 }
1517 break;
1518 default:
1519 FAIL ();
1520 break;
1521 }
1522 }
1523
1524 bfd_vma
1525 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1526 {
1527 if (tree != NULL)
1528 {
1529 exp_fold_tree_no_dot (tree);
1530 if (expld.result.valid_p)
1531 return expld.result.value;
1532 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1533 einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1534 tree, name);
1535 }
1536 return def;
1537 }
1538
1539 /* Return the smallest non-negative integer such that two raised to
1540 that power is at least as large as the vma evaluated at TREE, if
1541 TREE is a non-NULL expression that can be resolved. If TREE is
1542 NULL or cannot be resolved, return -1. */
1543
1544 int
1545 exp_get_power (etree_type *tree, char *name)
1546 {
1547 bfd_vma x = exp_get_vma (tree, -1, name);
1548 bfd_vma p2;
1549 int n;
1550
1551 if (x == (bfd_vma) -1)
1552 return -1;
1553
1554 for (n = 0, p2 = 1; p2 < x; ++n, p2 <<= 1)
1555 if (p2 == 0)
1556 break;
1557
1558 return n;
1559 }
1560
1561 fill_type *
1562 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1563 {
1564 fill_type *fill;
1565 size_t len;
1566 unsigned int val;
1567
1568 if (tree == NULL)
1569 return def;
1570
1571 exp_fold_tree_no_dot (tree);
1572 if (!expld.result.valid_p)
1573 {
1574 if (name != NULL && expld.phase != lang_mark_phase_enum)
1575 einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1576 tree, name);
1577 return def;
1578 }
1579
1580 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1581 {
1582 unsigned char *dst;
1583 unsigned char *s;
1584 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1585 fill->size = (len + 1) / 2;
1586 dst = fill->data;
1587 s = (unsigned char *) expld.result.str;
1588 val = 0;
1589 do
1590 {
1591 unsigned int digit;
1592
1593 digit = *s++ - '0';
1594 if (digit > 9)
1595 digit = (digit - 'A' + '0' + 10) & 0xf;
1596 val <<= 4;
1597 val += digit;
1598 --len;
1599 if ((len & 1) == 0)
1600 {
1601 *dst++ = val;
1602 val = 0;
1603 }
1604 }
1605 while (len != 0);
1606 }
1607 else
1608 {
1609 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1610 val = expld.result.value;
1611 fill->data[0] = (val >> 24) & 0xff;
1612 fill->data[1] = (val >> 16) & 0xff;
1613 fill->data[2] = (val >> 8) & 0xff;
1614 fill->data[3] = (val >> 0) & 0xff;
1615 fill->size = 4;
1616 }
1617 return fill;
1618 }
1619
1620 bfd_vma
1621 exp_get_abs_int (etree_type *tree, int def, char *name)
1622 {
1623 if (tree != NULL)
1624 {
1625 exp_fold_tree_no_dot (tree);
1626
1627 if (expld.result.valid_p)
1628 {
1629 if (expld.result.section != NULL)
1630 expld.result.value += expld.result.section->vma;
1631 return expld.result.value;
1632 }
1633 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1634 {
1635 einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1636 tree, name);
1637 }
1638 }
1639 return def;
1640 }
1641
1642 static bfd_vma
1643 align_n (bfd_vma value, bfd_vma align)
1644 {
1645 if (align <= 1)
1646 return value;
1647
1648 value = (value + align - 1) / align;
1649 return value * align;
1650 }
1651
1652 void
1653 ldexp_init (void)
1654 {
1655 /* The value "13" is ad-hoc, somewhat related to the expected number of
1656 assignments in a linker script. */
1657 if (!bfd_hash_table_init_n (&definedness_table,
1658 definedness_newfunc,
1659 sizeof (struct definedness_hash_entry),
1660 13))
1661 einfo (_("%F%P: can not create hash table: %E\n"));
1662 }
1663
1664 /* Convert absolute symbols defined by a script from "dot" (also
1665 SEGMENT_START or ORIGIN) outside of an output section statement,
1666 to section relative. */
1667
1668 static bfd_boolean
1669 set_sym_sections (struct bfd_hash_entry *bh, void *inf ATTRIBUTE_UNUSED)
1670 {
1671 struct definedness_hash_entry *def = (struct definedness_hash_entry *) bh;
1672 if (def->final_sec != bfd_abs_section_ptr)
1673 {
1674 struct bfd_link_hash_entry *h;
1675 h = bfd_link_hash_lookup (link_info.hash, bh->string,
1676 FALSE, FALSE, TRUE);
1677 if (h != NULL
1678 && h->type == bfd_link_hash_defined
1679 && h->u.def.section == bfd_abs_section_ptr)
1680 {
1681 h->u.def.value -= def->final_sec->vma;
1682 h->u.def.section = def->final_sec;
1683 }
1684 }
1685 return TRUE;
1686 }
1687
1688 void
1689 ldexp_finalize_syms (void)
1690 {
1691 bfd_hash_traverse (&definedness_table, set_sym_sections, NULL);
1692 }
1693
1694 void
1695 ldexp_finish (void)
1696 {
1697 bfd_hash_table_free (&definedness_table);
1698 }
This page took 0.085571 seconds and 4 git commands to generate.