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