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