2012-03-08 Luis Machado <lgustavo@codesourcery.com>
[deliverable/binutils-gdb.git] / ld / ldexp.c
1 /* This module handles expression trees.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
4 Free Software Foundation, Inc.
5 Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
6
7 This file is part of the GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
23
24
25 /* This module is in charge of working out the contents of expressions.
26
27 It has to keep track of the relative/absness of a symbol etc. This
28 is done by keeping all values in a struct (an etree_value_type)
29 which contains a value, a section to which it is relative and a
30 valid bit. */
31
32 #include "sysdep.h"
33 #include "bfd.h"
34 #include "bfdlink.h"
35
36 #include "ld.h"
37 #include "ldmain.h"
38 #include "ldmisc.h"
39 #include "ldexp.h"
40 #include "ldlex.h"
41 #include <ldgram.h>
42 #include "ldlang.h"
43 #include "libiberty.h"
44 #include "safe-ctype.h"
45
46 static void exp_fold_tree_1 (etree_type *);
47 static bfd_vma align_n (bfd_vma, bfd_vma);
48
49 segment_type *segments;
50
51 struct ldexp_control expld;
52
53 /* Print the string representation of the given token. Surround it
54 with spaces if INFIX_P is TRUE. */
55
56 static void
57 exp_print_token (token_code_type code, int infix_p)
58 {
59 static const struct
60 {
61 token_code_type code;
62 const char * name;
63 }
64 table[] =
65 {
66 { INT, "int" },
67 { NAME, "NAME" },
68 { PLUSEQ, "+=" },
69 { MINUSEQ, "-=" },
70 { MULTEQ, "*=" },
71 { DIVEQ, "/=" },
72 { LSHIFTEQ, "<<=" },
73 { RSHIFTEQ, ">>=" },
74 { ANDEQ, "&=" },
75 { OREQ, "|=" },
76 { OROR, "||" },
77 { ANDAND, "&&" },
78 { EQ, "==" },
79 { NE, "!=" },
80 { LE, "<=" },
81 { GE, ">=" },
82 { LSHIFT, "<<" },
83 { RSHIFT, ">>" },
84 { ALIGN_K, "ALIGN" },
85 { BLOCK, "BLOCK" },
86 { QUAD, "QUAD" },
87 { SQUAD, "SQUAD" },
88 { LONG, "LONG" },
89 { SHORT, "SHORT" },
90 { BYTE, "BYTE" },
91 { SECTIONS, "SECTIONS" },
92 { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
93 { MEMORY, "MEMORY" },
94 { DEFINED, "DEFINED" },
95 { TARGET_K, "TARGET" },
96 { SEARCH_DIR, "SEARCH_DIR" },
97 { MAP, "MAP" },
98 { ENTRY, "ENTRY" },
99 { NEXT, "NEXT" },
100 { ALIGNOF, "ALIGNOF" },
101 { SIZEOF, "SIZEOF" },
102 { ADDR, "ADDR" },
103 { LOADADDR, "LOADADDR" },
104 { CONSTANT, "CONSTANT" },
105 { ABSOLUTE, "ABSOLUTE" },
106 { MAX_K, "MAX" },
107 { MIN_K, "MIN" },
108 { ASSERT_K, "ASSERT" },
109 { REL, "relocatable" },
110 { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
111 { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
112 { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
113 { ORIGIN, "ORIGIN" },
114 { LENGTH, "LENGTH" },
115 { SEGMENT_START, "SEGMENT_START" }
116 };
117 unsigned int idx;
118
119 for (idx = 0; idx < ARRAY_SIZE (table); idx++)
120 if (table[idx].code == code)
121 break;
122
123 if (infix_p)
124 fputc (' ', config.map_file);
125
126 if (idx < ARRAY_SIZE (table))
127 fputs (table[idx].name, config.map_file);
128 else if (code < 127)
129 fputc (code, config.map_file);
130 else
131 fprintf (config.map_file, "<code %d>", code);
132
133 if (infix_p)
134 fputc (' ', config.map_file);
135 }
136
137 static void
138 make_abs (void)
139 {
140 if (expld.result.section != NULL)
141 expld.result.value += expld.result.section->vma;
142 expld.result.section = bfd_abs_section_ptr;
143 }
144
145 static void
146 new_abs (bfd_vma value)
147 {
148 expld.result.valid_p = TRUE;
149 expld.result.section = bfd_abs_section_ptr;
150 expld.result.value = value;
151 expld.result.str = NULL;
152 }
153
154 etree_type *
155 exp_intop (bfd_vma value)
156 {
157 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
158 new_e->type.node_code = INT;
159 new_e->type.filename = ldlex_filename ();
160 new_e->type.lineno = lineno;
161 new_e->value.value = value;
162 new_e->value.str = NULL;
163 new_e->type.node_class = etree_value;
164 return new_e;
165 }
166
167 etree_type *
168 exp_bigintop (bfd_vma value, char *str)
169 {
170 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
171 new_e->type.node_code = INT;
172 new_e->type.filename = ldlex_filename ();
173 new_e->type.lineno = lineno;
174 new_e->value.value = value;
175 new_e->value.str = str;
176 new_e->type.node_class = etree_value;
177 return new_e;
178 }
179
180 /* Build an expression representing an unnamed relocatable value. */
181
182 etree_type *
183 exp_relop (asection *section, bfd_vma value)
184 {
185 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->rel));
186 new_e->type.node_code = REL;
187 new_e->type.filename = ldlex_filename ();
188 new_e->type.lineno = lineno;
189 new_e->type.node_class = etree_rel;
190 new_e->rel.section = section;
191 new_e->rel.value = value;
192 return new_e;
193 }
194
195 static void
196 new_number (bfd_vma value)
197 {
198 expld.result.valid_p = TRUE;
199 expld.result.value = value;
200 expld.result.str = NULL;
201 expld.result.section = NULL;
202 }
203
204 static void
205 new_rel (bfd_vma value, asection *section)
206 {
207 expld.result.valid_p = TRUE;
208 expld.result.value = value;
209 expld.result.str = NULL;
210 expld.result.section = section;
211 }
212
213 static void
214 new_rel_from_abs (bfd_vma value)
215 {
216 expld.result.valid_p = TRUE;
217 expld.result.value = value - expld.section->vma;
218 expld.result.str = NULL;
219 expld.result.section = expld.section;
220 }
221
222 static void
223 fold_unary (etree_type *tree)
224 {
225 exp_fold_tree_1 (tree->unary.child);
226 if (expld.result.valid_p)
227 {
228 switch (tree->type.node_code)
229 {
230 case ALIGN_K:
231 if (expld.phase != lang_first_phase_enum)
232 new_rel_from_abs (align_n (expld.dot, expld.result.value));
233 else
234 expld.result.valid_p = FALSE;
235 break;
236
237 case ABSOLUTE:
238 make_abs ();
239 break;
240
241 case '~':
242 expld.result.value = ~expld.result.value;
243 break;
244
245 case '!':
246 expld.result.value = !expld.result.value;
247 break;
248
249 case '-':
250 expld.result.value = -expld.result.value;
251 break;
252
253 case NEXT:
254 /* Return next place aligned to value. */
255 if (expld.phase != lang_first_phase_enum)
256 {
257 make_abs ();
258 expld.result.value = align_n (expld.dot, expld.result.value);
259 }
260 else
261 expld.result.valid_p = FALSE;
262 break;
263
264 case DATA_SEGMENT_END:
265 if (expld.phase == lang_first_phase_enum
266 || expld.section != bfd_abs_section_ptr)
267 {
268 expld.result.valid_p = FALSE;
269 }
270 else if (expld.dataseg.phase == exp_dataseg_align_seen
271 || expld.dataseg.phase == exp_dataseg_relro_seen)
272 {
273 expld.dataseg.phase = exp_dataseg_end_seen;
274 expld.dataseg.end = expld.result.value;
275 }
276 else if (expld.dataseg.phase == exp_dataseg_done
277 || expld.dataseg.phase == exp_dataseg_adjust
278 || expld.dataseg.phase == exp_dataseg_relro_adjust)
279 {
280 /* OK. */
281 }
282 else
283 expld.result.valid_p = FALSE;
284 break;
285
286 default:
287 FAIL ();
288 break;
289 }
290 }
291 }
292
293 static void
294 fold_binary (etree_type *tree)
295 {
296 etree_value_type lhs;
297 exp_fold_tree_1 (tree->binary.lhs);
298
299 /* The SEGMENT_START operator is special because its first
300 operand is a string, not the name of a symbol. Note that the
301 operands have been swapped, so binary.lhs is second (default)
302 operand, binary.rhs is first operand. */
303 if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
304 {
305 const char *segment_name;
306 segment_type *seg;
307
308 /* Check to see if the user has overridden the default
309 value. */
310 segment_name = tree->binary.rhs->name.name;
311 for (seg = segments; seg; seg = seg->next)
312 if (strcmp (seg->name, segment_name) == 0)
313 {
314 if (!seg->used
315 && config.magic_demand_paged
316 && (seg->value % config.maxpagesize) != 0)
317 einfo (_("%P: warning: address of `%s' isn't multiple of maximum page size\n"),
318 segment_name);
319 seg->used = TRUE;
320 new_rel_from_abs (seg->value);
321 break;
322 }
323 return;
324 }
325
326 lhs = expld.result;
327 exp_fold_tree_1 (tree->binary.rhs);
328 expld.result.valid_p &= lhs.valid_p;
329
330 if (expld.result.valid_p)
331 {
332 if (lhs.section != expld.result.section)
333 {
334 /* If the values are from different sections, and neither is
335 just a number, make both the source arguments absolute. */
336 if (expld.result.section != NULL
337 && lhs.section != NULL)
338 {
339 make_abs ();
340 lhs.value += lhs.section->vma;
341 lhs.section = bfd_abs_section_ptr;
342 }
343
344 /* If the rhs is just a number, keep the lhs section. */
345 else if (expld.result.section == NULL)
346 {
347 expld.result.section = lhs.section;
348 /* Make this NULL so that we know one of the operands
349 was just a number, for later tests. */
350 lhs.section = NULL;
351 }
352 }
353 /* At this point we know that both operands have the same
354 section, or at least one of them is a plain number. */
355
356 switch (tree->type.node_code)
357 {
358 /* Arithmetic operators, bitwise AND, bitwise OR and XOR
359 keep the section of one of their operands only when the
360 other operand is a plain number. Losing the section when
361 operating on two symbols, ie. a result of a plain number,
362 is required for subtraction and XOR. It's justifiable
363 for the other operations on the grounds that adding,
364 multiplying etc. two section relative values does not
365 really make sense unless they are just treated as
366 numbers.
367 The same argument could be made for many expressions
368 involving one symbol and a number. For example,
369 "1 << x" and "100 / x" probably should not be given the
370 section of x. The trouble is that if we fuss about such
371 things the rules become complex and it is onerous to
372 document ld expression evaluation. */
373 #define BOP(x, y) \
374 case x: \
375 expld.result.value = lhs.value y expld.result.value; \
376 if (expld.result.section == lhs.section) \
377 expld.result.section = NULL; \
378 break;
379
380 /* Comparison operators, logical AND, and logical OR always
381 return a plain number. */
382 #define BOPN(x, y) \
383 case x: \
384 expld.result.value = lhs.value y expld.result.value; \
385 expld.result.section = NULL; \
386 break;
387
388 BOP ('+', +);
389 BOP ('*', *);
390 BOP ('-', -);
391 BOP (LSHIFT, <<);
392 BOP (RSHIFT, >>);
393 BOP ('&', &);
394 BOP ('^', ^);
395 BOP ('|', |);
396 BOPN (EQ, ==);
397 BOPN (NE, !=);
398 BOPN ('<', <);
399 BOPN ('>', >);
400 BOPN (LE, <=);
401 BOPN (GE, >=);
402 BOPN (ANDAND, &&);
403 BOPN (OROR, ||);
404
405 case '%':
406 if (expld.result.value != 0)
407 expld.result.value = ((bfd_signed_vma) lhs.value
408 % (bfd_signed_vma) expld.result.value);
409 else if (expld.phase != lang_mark_phase_enum)
410 einfo (_("%F%S %% by zero\n"), tree->binary.rhs);
411 if (expld.result.section == lhs.section)
412 expld.result.section = NULL;
413 break;
414
415 case '/':
416 if (expld.result.value != 0)
417 expld.result.value = ((bfd_signed_vma) lhs.value
418 / (bfd_signed_vma) expld.result.value);
419 else if (expld.phase != lang_mark_phase_enum)
420 einfo (_("%F%S / by zero\n"), tree->binary.rhs);
421 if (expld.result.section == lhs.section)
422 expld.result.section = NULL;
423 break;
424
425 case MAX_K:
426 if (lhs.value > expld.result.value)
427 expld.result.value = lhs.value;
428 break;
429
430 case MIN_K:
431 if (lhs.value < expld.result.value)
432 expld.result.value = lhs.value;
433 break;
434
435 case ALIGN_K:
436 expld.result.value = align_n (lhs.value, expld.result.value);
437 break;
438
439 case DATA_SEGMENT_ALIGN:
440 expld.dataseg.relro = exp_dataseg_relro_start;
441 if (expld.phase == lang_first_phase_enum
442 || expld.section != bfd_abs_section_ptr)
443 expld.result.valid_p = FALSE;
444 else
445 {
446 bfd_vma maxpage = lhs.value;
447 bfd_vma commonpage = expld.result.value;
448
449 expld.result.value = align_n (expld.dot, maxpage);
450 if (expld.dataseg.phase == exp_dataseg_relro_adjust)
451 expld.result.value = expld.dataseg.base;
452 else if (expld.dataseg.phase == exp_dataseg_adjust)
453 {
454 if (commonpage < maxpage)
455 expld.result.value += ((expld.dot + commonpage - 1)
456 & (maxpage - commonpage));
457 }
458 else
459 {
460 expld.result.value += expld.dot & (maxpage - 1);
461 if (expld.dataseg.phase == exp_dataseg_done)
462 {
463 /* OK. */
464 }
465 else if (expld.dataseg.phase == exp_dataseg_none)
466 {
467 expld.dataseg.phase = exp_dataseg_align_seen;
468 expld.dataseg.min_base = expld.dot;
469 expld.dataseg.base = expld.result.value;
470 expld.dataseg.pagesize = commonpage;
471 expld.dataseg.maxpagesize = maxpage;
472 expld.dataseg.relro_end = 0;
473 }
474 else
475 expld.result.valid_p = FALSE;
476 }
477 }
478 break;
479
480 case DATA_SEGMENT_RELRO_END:
481 expld.dataseg.relro = exp_dataseg_relro_end;
482 if (expld.phase == lang_first_phase_enum
483 || expld.section != bfd_abs_section_ptr)
484 expld.result.valid_p = FALSE;
485 else if (expld.dataseg.phase == exp_dataseg_align_seen
486 || expld.dataseg.phase == exp_dataseg_adjust
487 || expld.dataseg.phase == exp_dataseg_relro_adjust
488 || expld.dataseg.phase == exp_dataseg_done)
489 {
490 if (expld.dataseg.phase == exp_dataseg_align_seen
491 || expld.dataseg.phase == exp_dataseg_relro_adjust)
492 expld.dataseg.relro_end = lhs.value + expld.result.value;
493
494 if (expld.dataseg.phase == exp_dataseg_relro_adjust
495 && (expld.dataseg.relro_end
496 & (expld.dataseg.pagesize - 1)))
497 {
498 expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
499 expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
500 expld.result.value = (expld.dataseg.relro_end
501 - expld.result.value);
502 }
503 else
504 expld.result.value = lhs.value;
505
506 if (expld.dataseg.phase == exp_dataseg_align_seen)
507 expld.dataseg.phase = exp_dataseg_relro_seen;
508 }
509 else
510 expld.result.valid_p = FALSE;
511 break;
512
513 default:
514 FAIL ();
515 }
516 }
517 }
518
519 static void
520 fold_trinary (etree_type *tree)
521 {
522 exp_fold_tree_1 (tree->trinary.cond);
523 if (expld.result.valid_p)
524 exp_fold_tree_1 (expld.result.value
525 ? tree->trinary.lhs
526 : tree->trinary.rhs);
527 }
528
529 static void
530 fold_name (etree_type *tree)
531 {
532 memset (&expld.result, 0, sizeof (expld.result));
533
534 switch (tree->type.node_code)
535 {
536 case SIZEOF_HEADERS:
537 if (expld.phase != lang_first_phase_enum)
538 {
539 bfd_vma hdr_size = 0;
540 /* Don't find the real header size if only marking sections;
541 The bfd function may cache incorrect data. */
542 if (expld.phase != lang_mark_phase_enum)
543 hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
544 new_number (hdr_size);
545 }
546 break;
547
548 case DEFINED:
549 if (expld.phase == lang_first_phase_enum)
550 lang_track_definedness (tree->name.name);
551 else
552 {
553 struct bfd_link_hash_entry *h;
554 int def_iteration
555 = lang_symbol_definition_iteration (tree->name.name);
556
557 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
558 &link_info,
559 tree->name.name,
560 FALSE, FALSE, TRUE);
561 new_number (h != NULL
562 && (h->type == bfd_link_hash_defined
563 || h->type == bfd_link_hash_defweak
564 || h->type == bfd_link_hash_common)
565 && (def_iteration == lang_statement_iteration
566 || def_iteration == -1));
567 }
568 break;
569
570 case NAME:
571 if (expld.phase == lang_first_phase_enum)
572 ;
573 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
574 new_rel_from_abs (expld.dot);
575 else
576 {
577 struct bfd_link_hash_entry *h;
578
579 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
580 &link_info,
581 tree->name.name,
582 TRUE, FALSE, TRUE);
583 if (!h)
584 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
585 else if (h->type == bfd_link_hash_defined
586 || h->type == bfd_link_hash_defweak)
587 {
588 asection *output_section;
589
590 output_section = h->u.def.section->output_section;
591 if (output_section == NULL)
592 {
593 if (expld.phase == lang_mark_phase_enum)
594 new_rel (h->u.def.value, h->u.def.section);
595 else
596 einfo (_("%X%S: unresolvable symbol `%s'"
597 " referenced in expression\n"),
598 tree, tree->name.name);
599 }
600 else if (output_section == bfd_abs_section_ptr
601 && (expld.section != bfd_abs_section_ptr
602 || config.sane_expr))
603 new_number (h->u.def.value + h->u.def.section->output_offset);
604 else
605 new_rel (h->u.def.value + h->u.def.section->output_offset,
606 output_section);
607 }
608 else if (expld.phase == lang_final_phase_enum
609 || expld.assigning_to_dot)
610 einfo (_("%F%S: undefined symbol `%s'"
611 " referenced in expression\n"),
612 tree, tree->name.name);
613 else if (h->type == bfd_link_hash_new)
614 {
615 h->type = bfd_link_hash_undefined;
616 h->u.undef.abfd = NULL;
617 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
618 bfd_link_add_undef (link_info.hash, h);
619 }
620 }
621 break;
622
623 case ADDR:
624 if (expld.phase != lang_first_phase_enum)
625 {
626 lang_output_section_statement_type *os;
627
628 os = lang_output_section_find (tree->name.name);
629 if (os == NULL)
630 {
631 if (expld.phase == lang_final_phase_enum)
632 einfo (_("%F%S: undefined section `%s'"
633 " referenced in expression\n"),
634 tree, tree->name.name);
635 }
636 else if (os->processed_vma)
637 new_rel (0, os->bfd_section);
638 }
639 break;
640
641 case LOADADDR:
642 if (expld.phase != lang_first_phase_enum)
643 {
644 lang_output_section_statement_type *os;
645
646 os = lang_output_section_find (tree->name.name);
647 if (os == NULL)
648 {
649 if (expld.phase == lang_final_phase_enum)
650 einfo (_("%F%S: undefined section `%s'"
651 " referenced in expression\n"),
652 tree, tree->name.name);
653 }
654 else if (os->processed_lma)
655 {
656 if (os->load_base == NULL)
657 new_abs (os->bfd_section->lma);
658 else
659 {
660 exp_fold_tree_1 (os->load_base);
661 if (expld.result.valid_p)
662 make_abs ();
663 }
664 }
665 }
666 break;
667
668 case SIZEOF:
669 case ALIGNOF:
670 if (expld.phase != lang_first_phase_enum)
671 {
672 lang_output_section_statement_type *os;
673
674 os = lang_output_section_find (tree->name.name);
675 if (os == NULL)
676 {
677 if (expld.phase == lang_final_phase_enum)
678 einfo (_("%F%S: undefined section `%s'"
679 " referenced in expression\n"),
680 tree, tree->name.name);
681 new_number (0);
682 }
683 else if (os->processed_vma)
684 {
685 bfd_vma val;
686
687 if (tree->type.node_code == SIZEOF)
688 val = (os->bfd_section->size
689 / bfd_octets_per_byte (link_info.output_bfd));
690 else
691 val = (bfd_vma)1 << os->bfd_section->alignment_power;
692
693 new_number (val);
694 }
695 }
696 break;
697
698 case LENGTH:
699 {
700 lang_memory_region_type *mem;
701
702 mem = lang_memory_region_lookup (tree->name.name, FALSE);
703 if (mem != NULL)
704 new_number (mem->length);
705 else
706 einfo (_("%F%S: undefined MEMORY region `%s'"
707 " referenced in expression\n"),
708 tree, tree->name.name);
709 }
710 break;
711
712 case ORIGIN:
713 if (expld.phase != lang_first_phase_enum)
714 {
715 lang_memory_region_type *mem;
716
717 mem = lang_memory_region_lookup (tree->name.name, FALSE);
718 if (mem != NULL)
719 new_rel_from_abs (mem->origin);
720 else
721 einfo (_("%F%S: undefined MEMORY region `%s'"
722 " referenced in expression\n"),
723 tree, tree->name.name);
724 }
725 break;
726
727 case CONSTANT:
728 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
729 new_number (config.maxpagesize);
730 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
731 new_number (config.commonpagesize);
732 else
733 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
734 tree, tree->name.name);
735 break;
736
737 default:
738 FAIL ();
739 break;
740 }
741 }
742
743 static void
744 exp_fold_tree_1 (etree_type *tree)
745 {
746 if (tree == NULL)
747 {
748 memset (&expld.result, 0, sizeof (expld.result));
749 return;
750 }
751
752 switch (tree->type.node_class)
753 {
754 case etree_value:
755 if (expld.section == bfd_abs_section_ptr
756 && !config.sane_expr)
757 new_abs (tree->value.value);
758 else
759 new_number (tree->value.value);
760 expld.result.str = tree->value.str;
761 break;
762
763 case etree_rel:
764 if (expld.phase != lang_first_phase_enum)
765 {
766 asection *output_section = tree->rel.section->output_section;
767 new_rel (tree->rel.value + tree->rel.section->output_offset,
768 output_section);
769 }
770 else
771 memset (&expld.result, 0, sizeof (expld.result));
772 break;
773
774 case etree_assert:
775 exp_fold_tree_1 (tree->assert_s.child);
776 if (expld.phase == lang_final_phase_enum && !expld.result.value)
777 einfo ("%X%P: %s\n", tree->assert_s.message);
778 break;
779
780 case etree_unary:
781 fold_unary (tree);
782 break;
783
784 case etree_binary:
785 fold_binary (tree);
786 break;
787
788 case etree_trinary:
789 fold_trinary (tree);
790 break;
791
792 case etree_assign:
793 case etree_provide:
794 case etree_provided:
795 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
796 {
797 if (tree->type.node_class != etree_assign)
798 einfo (_("%F%S can not PROVIDE assignment to"
799 " location counter\n"), tree);
800 /* After allocation, assignment to dot should not be done inside
801 an output section since allocation adds a padding statement
802 that effectively duplicates the assignment. */
803 if (expld.phase == lang_mark_phase_enum
804 || expld.phase == lang_allocating_phase_enum
805 || ((expld.phase == lang_assigning_phase_enum
806 || expld.phase == lang_final_phase_enum)
807 && expld.section == bfd_abs_section_ptr))
808 {
809 /* Notify the folder that this is an assignment to dot. */
810 expld.assigning_to_dot = TRUE;
811 exp_fold_tree_1 (tree->assign.src);
812 expld.assigning_to_dot = FALSE;
813
814 if (!expld.result.valid_p)
815 {
816 if (expld.phase != lang_mark_phase_enum)
817 einfo (_("%F%S invalid assignment to"
818 " location counter\n"), tree);
819 }
820 else if (expld.dotp == NULL)
821 einfo (_("%F%S assignment to location counter"
822 " invalid outside of SECTION\n"), tree);
823 else
824 {
825 bfd_vma nextdot;
826
827 nextdot = expld.result.value;
828 if (expld.result.section != NULL)
829 nextdot += expld.result.section->vma;
830 else
831 nextdot += expld.section->vma;
832 if (nextdot < expld.dot
833 && expld.section != bfd_abs_section_ptr)
834 einfo (_("%F%S cannot move location counter backwards"
835 " (from %V to %V)\n"),
836 tree, expld.dot, nextdot);
837 else
838 {
839 expld.dot = nextdot;
840 *expld.dotp = nextdot;
841 }
842 }
843 }
844 else
845 memset (&expld.result, 0, sizeof (expld.result));
846 }
847 else
848 {
849 etree_type *name;
850
851 struct bfd_link_hash_entry *h = NULL;
852
853 if (tree->type.node_class == etree_provide)
854 {
855 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
856 FALSE, FALSE, TRUE);
857 if (h == NULL
858 || (h->type != bfd_link_hash_new
859 && h->type != bfd_link_hash_undefined
860 && h->type != bfd_link_hash_common))
861 {
862 /* Do nothing. The symbol was never referenced, or was
863 defined by some object. */
864 break;
865 }
866 }
867
868 name = tree->assign.src;
869 if (name->type.node_class == etree_trinary)
870 {
871 exp_fold_tree_1 (name->trinary.cond);
872 if (expld.result.valid_p)
873 name = (expld.result.value
874 ? name->trinary.lhs : name->trinary.rhs);
875 }
876
877 if (name->type.node_class == etree_name
878 && name->type.node_code == NAME
879 && strcmp (tree->assign.dst, name->name.name) == 0)
880 /* Leave it alone. Do not replace a symbol with its own
881 output address, in case there is another section sizing
882 pass. Folding does not preserve input sections. */
883 break;
884
885 exp_fold_tree_1 (tree->assign.src);
886 if (expld.result.valid_p
887 || (expld.phase <= lang_mark_phase_enum
888 && tree->type.node_class == etree_assign
889 && tree->assign.hidden))
890 {
891 if (h == NULL)
892 {
893 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
894 TRUE, FALSE, TRUE);
895 if (h == NULL)
896 einfo (_("%P%F:%s: hash creation failed\n"),
897 tree->assign.dst);
898 }
899
900 /* FIXME: Should we worry if the symbol is already
901 defined? */
902 lang_update_definedness (tree->assign.dst, h);
903 h->type = bfd_link_hash_defined;
904 h->u.def.value = expld.result.value;
905 if (expld.result.section == NULL)
906 expld.result.section = expld.section;
907 h->u.def.section = expld.result.section;
908 if (tree->type.node_class == etree_provide)
909 tree->type.node_class = etree_provided;
910
911 /* Copy the symbol type if this is a simple assignment of
912 one symbol to another. This could be more general
913 (e.g. a ?: operator with NAMEs in each branch). */
914 if (tree->assign.src->type.node_class == etree_name)
915 {
916 struct bfd_link_hash_entry *hsrc;
917
918 hsrc = bfd_link_hash_lookup (link_info.hash,
919 tree->assign.src->name.name,
920 FALSE, FALSE, TRUE);
921 if (hsrc)
922 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
923 hsrc);
924 }
925 }
926 else if (expld.phase == lang_final_phase_enum)
927 {
928 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
929 FALSE, FALSE, TRUE);
930 if (h != NULL
931 && h->type == bfd_link_hash_new)
932 h->type = bfd_link_hash_undefined;
933 }
934 }
935 break;
936
937 case etree_name:
938 fold_name (tree);
939 break;
940
941 default:
942 FAIL ();
943 memset (&expld.result, 0, sizeof (expld.result));
944 break;
945 }
946 }
947
948 void
949 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
950 {
951 expld.dot = *dotp;
952 expld.dotp = dotp;
953 expld.section = current_section;
954 exp_fold_tree_1 (tree);
955 }
956
957 void
958 exp_fold_tree_no_dot (etree_type *tree)
959 {
960 expld.dot = 0;
961 expld.dotp = NULL;
962 expld.section = bfd_abs_section_ptr;
963 exp_fold_tree_1 (tree);
964 }
965
966 etree_type *
967 exp_binop (int code, etree_type *lhs, etree_type *rhs)
968 {
969 etree_type value, *new_e;
970
971 value.type.node_code = code;
972 value.type.filename = lhs->type.filename;
973 value.type.lineno = lhs->type.lineno;
974 value.binary.lhs = lhs;
975 value.binary.rhs = rhs;
976 value.type.node_class = etree_binary;
977 exp_fold_tree_no_dot (&value);
978 if (expld.result.valid_p)
979 return exp_intop (expld.result.value);
980
981 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
982 memcpy (new_e, &value, sizeof (new_e->binary));
983 return new_e;
984 }
985
986 etree_type *
987 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
988 {
989 etree_type value, *new_e;
990
991 value.type.node_code = code;
992 value.type.filename = cond->type.filename;
993 value.type.lineno = cond->type.lineno;
994 value.trinary.lhs = lhs;
995 value.trinary.cond = cond;
996 value.trinary.rhs = rhs;
997 value.type.node_class = etree_trinary;
998 exp_fold_tree_no_dot (&value);
999 if (expld.result.valid_p)
1000 return exp_intop (expld.result.value);
1001
1002 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1003 memcpy (new_e, &value, sizeof (new_e->trinary));
1004 return new_e;
1005 }
1006
1007 etree_type *
1008 exp_unop (int code, etree_type *child)
1009 {
1010 etree_type value, *new_e;
1011
1012 value.unary.type.node_code = code;
1013 value.unary.type.filename = child->type.filename;
1014 value.unary.type.lineno = child->type.lineno;
1015 value.unary.child = child;
1016 value.unary.type.node_class = etree_unary;
1017 exp_fold_tree_no_dot (&value);
1018 if (expld.result.valid_p)
1019 return exp_intop (expld.result.value);
1020
1021 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1022 memcpy (new_e, &value, sizeof (new_e->unary));
1023 return new_e;
1024 }
1025
1026 etree_type *
1027 exp_nameop (int code, const char *name)
1028 {
1029 etree_type value, *new_e;
1030
1031 value.name.type.node_code = code;
1032 value.name.type.filename = ldlex_filename ();
1033 value.name.type.lineno = lineno;
1034 value.name.name = name;
1035 value.name.type.node_class = etree_name;
1036
1037 exp_fold_tree_no_dot (&value);
1038 if (expld.result.valid_p)
1039 return exp_intop (expld.result.value);
1040
1041 new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1042 memcpy (new_e, &value, sizeof (new_e->name));
1043 return new_e;
1044
1045 }
1046
1047 static etree_type *
1048 exp_assop (const char *dst,
1049 etree_type *src,
1050 enum node_tree_enum class,
1051 bfd_boolean hidden)
1052 {
1053 etree_type *n;
1054
1055 n = (etree_type *) stat_alloc (sizeof (n->assign));
1056 n->assign.type.node_code = '=';
1057 n->assign.type.filename = src->type.filename;
1058 n->assign.type.lineno = src->type.lineno;
1059 n->assign.type.node_class = class;
1060 n->assign.src = src;
1061 n->assign.dst = dst;
1062 n->assign.hidden = hidden;
1063 return n;
1064 }
1065
1066 etree_type *
1067 exp_assign (const char *dst, etree_type *src)
1068 {
1069 return exp_assop (dst, src, etree_assign, FALSE);
1070 }
1071
1072 etree_type *
1073 exp_defsym (const char *dst, etree_type *src)
1074 {
1075 return exp_assop (dst, src, etree_assign, TRUE);
1076 }
1077
1078 /* Handle PROVIDE. */
1079
1080 etree_type *
1081 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1082 {
1083 return exp_assop (dst, src, etree_provide, hidden);
1084 }
1085
1086 /* Handle ASSERT. */
1087
1088 etree_type *
1089 exp_assert (etree_type *exp, const char *message)
1090 {
1091 etree_type *n;
1092
1093 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1094 n->assert_s.type.node_code = '!';
1095 n->assert_s.type.filename = exp->type.filename;
1096 n->assert_s.type.lineno = exp->type.lineno;
1097 n->assert_s.type.node_class = etree_assert;
1098 n->assert_s.child = exp;
1099 n->assert_s.message = message;
1100 return n;
1101 }
1102
1103 void
1104 exp_print_tree (etree_type *tree)
1105 {
1106 bfd_boolean function_like;
1107
1108 if (config.map_file == NULL)
1109 config.map_file = stderr;
1110
1111 if (tree == NULL)
1112 {
1113 minfo ("NULL TREE\n");
1114 return;
1115 }
1116
1117 switch (tree->type.node_class)
1118 {
1119 case etree_value:
1120 minfo ("0x%v", tree->value.value);
1121 return;
1122 case etree_rel:
1123 if (tree->rel.section->owner != NULL)
1124 minfo ("%B:", tree->rel.section->owner);
1125 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1126 return;
1127 case etree_assign:
1128 fputs (tree->assign.dst, config.map_file);
1129 exp_print_token (tree->type.node_code, TRUE);
1130 exp_print_tree (tree->assign.src);
1131 break;
1132 case etree_provide:
1133 case etree_provided:
1134 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1135 exp_print_tree (tree->assign.src);
1136 fputc (')', config.map_file);
1137 break;
1138 case etree_binary:
1139 function_like = FALSE;
1140 switch (tree->type.node_code)
1141 {
1142 case MAX_K:
1143 case MIN_K:
1144 case ALIGN_K:
1145 case DATA_SEGMENT_ALIGN:
1146 case DATA_SEGMENT_RELRO_END:
1147 function_like = TRUE;
1148 break;
1149 case SEGMENT_START:
1150 /* Special handling because arguments are in reverse order and
1151 the segment name is quoted. */
1152 exp_print_token (tree->type.node_code, FALSE);
1153 fputs (" (\"", config.map_file);
1154 exp_print_tree (tree->binary.rhs);
1155 fputs ("\", ", config.map_file);
1156 exp_print_tree (tree->binary.lhs);
1157 fputc (')', config.map_file);
1158 return;
1159 }
1160 if (function_like)
1161 {
1162 exp_print_token (tree->type.node_code, FALSE);
1163 fputc (' ', config.map_file);
1164 }
1165 fputc ('(', config.map_file);
1166 exp_print_tree (tree->binary.lhs);
1167 if (function_like)
1168 fprintf (config.map_file, ", ");
1169 else
1170 exp_print_token (tree->type.node_code, TRUE);
1171 exp_print_tree (tree->binary.rhs);
1172 fputc (')', config.map_file);
1173 break;
1174 case etree_trinary:
1175 exp_print_tree (tree->trinary.cond);
1176 fputc ('?', config.map_file);
1177 exp_print_tree (tree->trinary.lhs);
1178 fputc (':', config.map_file);
1179 exp_print_tree (tree->trinary.rhs);
1180 break;
1181 case etree_unary:
1182 exp_print_token (tree->unary.type.node_code, FALSE);
1183 if (tree->unary.child)
1184 {
1185 fprintf (config.map_file, " (");
1186 exp_print_tree (tree->unary.child);
1187 fputc (')', config.map_file);
1188 }
1189 break;
1190
1191 case etree_assert:
1192 fprintf (config.map_file, "ASSERT (");
1193 exp_print_tree (tree->assert_s.child);
1194 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1195 break;
1196
1197 case etree_name:
1198 if (tree->type.node_code == NAME)
1199 fputs (tree->name.name, config.map_file);
1200 else
1201 {
1202 exp_print_token (tree->type.node_code, FALSE);
1203 if (tree->name.name)
1204 fprintf (config.map_file, " (%s)", tree->name.name);
1205 }
1206 break;
1207 default:
1208 FAIL ();
1209 break;
1210 }
1211 }
1212
1213 bfd_vma
1214 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1215 {
1216 if (tree != NULL)
1217 {
1218 exp_fold_tree_no_dot (tree);
1219 if (expld.result.valid_p)
1220 return expld.result.value;
1221 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1222 einfo (_("%F%S: nonconstant expression for %s\n"),
1223 tree, name);
1224 }
1225 return def;
1226 }
1227
1228 int
1229 exp_get_value_int (etree_type *tree, int def, char *name)
1230 {
1231 return exp_get_vma (tree, def, name);
1232 }
1233
1234 fill_type *
1235 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1236 {
1237 fill_type *fill;
1238 size_t len;
1239 unsigned int val;
1240
1241 if (tree == NULL)
1242 return def;
1243
1244 exp_fold_tree_no_dot (tree);
1245 if (!expld.result.valid_p)
1246 {
1247 if (name != NULL && expld.phase != lang_mark_phase_enum)
1248 einfo (_("%F%S: nonconstant expression for %s\n"),
1249 tree, name);
1250 return def;
1251 }
1252
1253 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1254 {
1255 unsigned char *dst;
1256 unsigned char *s;
1257 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1258 fill->size = (len + 1) / 2;
1259 dst = fill->data;
1260 s = (unsigned char *) expld.result.str;
1261 val = 0;
1262 do
1263 {
1264 unsigned int digit;
1265
1266 digit = *s++ - '0';
1267 if (digit > 9)
1268 digit = (digit - 'A' + '0' + 10) & 0xf;
1269 val <<= 4;
1270 val += digit;
1271 --len;
1272 if ((len & 1) == 0)
1273 {
1274 *dst++ = val;
1275 val = 0;
1276 }
1277 }
1278 while (len != 0);
1279 }
1280 else
1281 {
1282 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1283 val = expld.result.value;
1284 fill->data[0] = (val >> 24) & 0xff;
1285 fill->data[1] = (val >> 16) & 0xff;
1286 fill->data[2] = (val >> 8) & 0xff;
1287 fill->data[3] = (val >> 0) & 0xff;
1288 fill->size = 4;
1289 }
1290 return fill;
1291 }
1292
1293 bfd_vma
1294 exp_get_abs_int (etree_type *tree, int def, char *name)
1295 {
1296 if (tree != NULL)
1297 {
1298 exp_fold_tree_no_dot (tree);
1299
1300 if (expld.result.valid_p)
1301 {
1302 if (expld.result.section != NULL)
1303 expld.result.value += expld.result.section->vma;
1304 return expld.result.value;
1305 }
1306 else if (name != NULL && expld.phase != lang_mark_phase_enum)
1307 {
1308 einfo (_("%F%S: nonconstant expression for %s\n"),
1309 tree, name);
1310 }
1311 }
1312 return def;
1313 }
1314
1315 static bfd_vma
1316 align_n (bfd_vma value, bfd_vma align)
1317 {
1318 if (align <= 1)
1319 return value;
1320
1321 value = (value + align - 1) / align;
1322 return value * align;
1323 }
This page took 0.059049 seconds and 4 git commands to generate.