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