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