Remove trailing spaces in ld
[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)
e0a3af22 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 367 make_abs ();
e0a3af22 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 577 expld.dataseg.phase = exp_dataseg_align_seen;
4ac0c898
AM
578 expld.dataseg.base = expld.result.value;
579 expld.dataseg.pagesize = commonpage;
580 expld.dataseg.maxpagesize = maxpage;
581 expld.dataseg.relro_end = 0;
2d20f7bf 582 }
ea7c2e6c
AM
583 else
584 expld.result.valid_p = FALSE;
2d20f7bf 585 }
4ac0c898 586 }
4ac0c898 587 break;
e9ee469a 588
4ac0c898 589 case DATA_SEGMENT_RELRO_END:
6c1aca3e
AM
590 /* Operands swapped! DATA_SEGMENT_RELRO_END(offset,exp)
591 has offset in expld.result and exp in lhs. */
4ac0c898 592 expld.dataseg.relro = exp_dataseg_relro_end;
0e5fabeb 593 expld.dataseg.relro_offset = expld.result.value;
ea7c2e6c
AM
594 if (expld.phase == lang_first_phase_enum
595 || expld.section != bfd_abs_section_ptr)
596 expld.result.valid_p = FALSE;
597 else if (expld.dataseg.phase == exp_dataseg_align_seen
598 || expld.dataseg.phase == exp_dataseg_adjust
599 || expld.dataseg.phase == exp_dataseg_relro_adjust
600 || expld.dataseg.phase == exp_dataseg_done)
4ac0c898
AM
601 {
602 if (expld.dataseg.phase == exp_dataseg_align_seen
603 || expld.dataseg.phase == exp_dataseg_relro_adjust)
604 expld.dataseg.relro_end = lhs.value + expld.result.value;
e9ee469a 605
4ac0c898
AM
606 if (expld.dataseg.phase == exp_dataseg_relro_adjust
607 && (expld.dataseg.relro_end
608 & (expld.dataseg.pagesize - 1)))
609 {
610 expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
611 expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
612 expld.result.value = (expld.dataseg.relro_end
613 - expld.result.value);
a4f5ad88
JJ
614 }
615 else
4ac0c898 616 expld.result.value = lhs.value;
a4f5ad88 617
4ac0c898
AM
618 if (expld.dataseg.phase == exp_dataseg_align_seen)
619 expld.dataseg.phase = exp_dataseg_relro_seen;
252b5132 620 }
4ac0c898
AM
621 else
622 expld.result.valid_p = FALSE;
623 break;
624
625 default:
626 FAIL ();
252b5132 627 }
252b5132 628 }
252b5132
RH
629}
630
e9ee469a
AM
631static void
632fold_trinary (etree_type *tree)
0ae1cf52 633{
e9ee469a
AM
634 exp_fold_tree_1 (tree->trinary.cond);
635 if (expld.result.valid_p)
636 exp_fold_tree_1 (expld.result.value
637 ? tree->trinary.lhs
638 : tree->trinary.rhs);
0ae1cf52
AM
639}
640
e9ee469a
AM
641static void
642fold_name (etree_type *tree)
252b5132 643{
e9ee469a 644 memset (&expld.result, 0, sizeof (expld.result));
c468c8bc 645
4de2d33d 646 switch (tree->type.node_code)
8c95a62e
KH
647 {
648 case SIZEOF_HEADERS:
e9ee469a
AM
649 if (expld.phase != lang_first_phase_enum)
650 {
651 bfd_vma hdr_size = 0;
652 /* Don't find the real header size if only marking sections;
653 The bfd function may cache incorrect data. */
654 if (expld.phase != lang_mark_phase_enum)
f13a99db 655 hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
7542af2a 656 new_number (hdr_size);
e9ee469a 657 }
8c95a62e 658 break;
67469e1f 659
8c95a62e 660 case DEFINED:
fa72205c 661 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
662 {
663 struct bfd_link_hash_entry *h;
18d6a79d 664 struct definedness_hash_entry *def;
8c95a62e 665
f13a99db
AM
666 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
667 &link_info,
8c95a62e 668 tree->name.name,
b34976b6 669 FALSE, FALSE, TRUE);
7542af2a
AM
670 new_number (h != NULL
671 && (h->type == bfd_link_hash_defined
672 || h->type == bfd_link_hash_defweak
673 || h->type == bfd_link_hash_common)
18d6a79d 674 && ((def = symbol_defined (tree->name.name)) == NULL
fa72205c
AM
675 || def->by_object
676 || def->iteration == (lang_statement_iteration & 1)));
8c95a62e
KH
677 }
678 break;
67469e1f 679
8c95a62e 680 case NAME:
4194268f
AM
681 if (expld.assign_name != NULL
682 && strcmp (expld.assign_name, tree->name.name) == 0)
fa72205c
AM
683 {
684 /* Self-assignment is only allowed for absolute symbols
685 defined in a linker script. */
686 struct bfd_link_hash_entry *h;
18d6a79d 687 struct definedness_hash_entry *def;
fa72205c
AM
688
689 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
690 &link_info,
691 tree->name.name,
692 FALSE, FALSE, TRUE);
693 if (!(h != NULL
694 && (h->type == bfd_link_hash_defined
695 || h->type == bfd_link_hash_defweak)
696 && h->u.def.section == bfd_abs_section_ptr
18d6a79d 697 && (def = symbol_defined (tree->name.name)) != NULL
fa72205c
AM
698 && def->iteration == (lang_statement_iteration & 1)))
699 expld.assign_name = NULL;
700 }
e9ee469a
AM
701 if (expld.phase == lang_first_phase_enum)
702 ;
703 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
704 new_rel_from_abs (expld.dot);
705 else
8c95a62e
KH
706 {
707 struct bfd_link_hash_entry *h;
708
f13a99db
AM
709 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
710 &link_info,
8c95a62e 711 tree->name.name,
1b493742
NS
712 TRUE, FALSE, TRUE);
713 if (!h)
714 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
715 else if (h->type == bfd_link_hash_defined
716 || h->type == bfd_link_hash_defweak)
8c95a62e 717 {
7542af2a 718 asection *output_section;
8c95a62e 719
7542af2a
AM
720 output_section = h->u.def.section->output_section;
721 if (output_section == NULL)
722 {
2aa9aad9
NC
723 if (expld.phase == lang_mark_phase_enum)
724 new_rel (h->u.def.value, h->u.def.section);
725 else
7542af2a
AM
726 einfo (_("%X%S: unresolvable symbol `%s'"
727 " referenced in expression\n"),
dab69f68 728 tree, tree->name.name);
8c95a62e 729 }
5c3049d2
AM
730 else if (output_section == bfd_abs_section_ptr
731 && (expld.section != bfd_abs_section_ptr
01554a74 732 || config.sane_expr))
abf4be64 733 new_number (h->u.def.value + h->u.def.section->output_offset);
7542af2a
AM
734 else
735 new_rel (h->u.def.value + h->u.def.section->output_offset,
736 output_section);
8c95a62e 737 }
e9ee469a 738 else if (expld.phase == lang_final_phase_enum
ec8460b5
AM
739 || (expld.phase != lang_mark_phase_enum
740 && expld.assigning_to_dot))
dab69f68
AM
741 einfo (_("%F%S: undefined symbol `%s'"
742 " referenced in expression\n"),
743 tree, tree->name.name);
1b493742
NS
744 else if (h->type == bfd_link_hash_new)
745 {
746 h->type = bfd_link_hash_undefined;
747 h->u.undef.abfd = NULL;
3eda52aa 748 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
a010d60f 749 bfd_link_add_undef (link_info.hash, h);
1b493742 750 }
8c95a62e
KH
751 }
752 break;
753
754 case ADDR:
e9ee469a 755 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
756 {
757 lang_output_section_statement_type *os;
758
759 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
760 if (os == NULL)
761 {
762 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
763 einfo (_("%F%S: undefined section `%s'"
764 " referenced in expression\n"),
765 tree, tree->name.name);
cc3e2771
NS
766 }
767 else if (os->processed_vma)
5942515f 768 new_rel (0, os->bfd_section);
8c95a62e 769 }
8c95a62e
KH
770 break;
771
772 case LOADADDR:
e9ee469a 773 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
774 {
775 lang_output_section_statement_type *os;
776
777 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
778 if (os == NULL)
779 {
780 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
781 einfo (_("%F%S: undefined section `%s'"
782 " referenced in expression\n"),
783 tree, tree->name.name);
cc3e2771
NS
784 }
785 else if (os->processed_lma)
1b493742 786 {
e9ee469a 787 if (os->load_base == NULL)
3e23777d 788 new_abs (os->bfd_section->lma);
e9ee469a 789 else
67469e1f
AM
790 {
791 exp_fold_tree_1 (os->load_base);
819da74e
AM
792 if (expld.result.valid_p)
793 make_abs ();
67469e1f 794 }
1b493742 795 }
8c95a62e 796 }
8c95a62e
KH
797 break;
798
799 case SIZEOF:
362c1d1a 800 case ALIGNOF:
e9ee469a 801 if (expld.phase != lang_first_phase_enum)
8c95a62e 802 {
8c95a62e
KH
803 lang_output_section_statement_type *os;
804
805 os = lang_output_section_find (tree->name.name);
5397b1fe 806 if (os == NULL)
cc3e2771
NS
807 {
808 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
809 einfo (_("%F%S: undefined section `%s'"
810 " referenced in expression\n"),
811 tree, tree->name.name);
7542af2a 812 new_number (0);
cc3e2771 813 }
17d6eea5 814 else if (os->bfd_section != NULL)
362c1d1a
NS
815 {
816 bfd_vma val;
817
818 if (tree->type.node_code == SIZEOF)
f13a99db
AM
819 val = (os->bfd_section->size
820 / bfd_octets_per_byte (link_info.output_bfd));
362c1d1a
NS
821 else
822 val = (bfd_vma)1 << os->bfd_section->alignment_power;
e4492aa0 823
7542af2a 824 new_number (val);
362c1d1a 825 }
17d6eea5
L
826 else
827 new_number (0);
8c95a62e 828 }
8c95a62e
KH
829 break;
830
3ec57632
NC
831 case LENGTH:
832 {
cc9ad334
SKS
833 if (expld.phase != lang_first_phase_enum)
834 {
835 lang_memory_region_type *mem;
836
837 mem = lang_memory_region_lookup (tree->name.name, FALSE);
838 if (mem != NULL)
839 new_number (mem->length);
840 else
841 einfo (_("%F%S: undefined MEMORY region `%s'"
842 " referenced in expression\n"),
843 tree, tree->name.name);
844 }
3ec57632
NC
845 }
846 break;
847
848 case ORIGIN:
7542af2a
AM
849 if (expld.phase != lang_first_phase_enum)
850 {
851 lang_memory_region_type *mem;
e4492aa0
L
852
853 mem = lang_memory_region_lookup (tree->name.name, FALSE);
854 if (mem != NULL)
7542af2a 855 new_rel_from_abs (mem->origin);
e4492aa0 856 else
7542af2a 857 einfo (_("%F%S: undefined MEMORY region `%s'"
dab69f68
AM
858 " referenced in expression\n"),
859 tree, tree->name.name);
7542af2a 860 }
3ec57632
NC
861 break;
862
24718e3b
L
863 case CONSTANT:
864 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
7542af2a 865 new_number (config.maxpagesize);
24718e3b 866 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
7542af2a 867 new_number (config.commonpagesize);
24718e3b
L
868 else
869 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
dab69f68 870 tree, tree->name.name);
24718e3b
L
871 break;
872
8c95a62e
KH
873 default:
874 FAIL ();
875 break;
876 }
252b5132 877}
8c95a62e 878
2edab91c 879/* Return true if TREE is '.'. */
995da1ff 880
2edab91c
AM
881static bfd_boolean
882is_dot (const etree_type *tree)
883{
884 return (tree->type.node_class == etree_name
885 && tree->type.node_code == NAME
886 && tree->name.name[0] == '.'
887 && tree->name.name[1] == 0);
888}
889
890/* Return true if TREE is a constant equal to VAL. */
891
892static bfd_boolean
893is_value (const etree_type *tree, bfd_vma val)
894{
895 return (tree->type.node_class == etree_value
896 && tree->value.value == val);
897}
898
899/* Return true if TREE is an absolute symbol equal to VAL defined in
900 a linker script. */
901
902static bfd_boolean
903is_sym_value (const etree_type *tree, bfd_vma val)
904{
905 struct bfd_link_hash_entry *h;
18d6a79d 906 struct definedness_hash_entry *def;
2edab91c
AM
907
908 return (tree->type.node_class == etree_name
909 && tree->type.node_code == NAME
18d6a79d 910 && (def = symbol_defined (tree->name.name)) != NULL
2edab91c
AM
911 && def->by_script
912 && def->iteration == (lang_statement_iteration & 1)
913 && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
914 &link_info,
915 tree->name.name,
916 FALSE, FALSE, TRUE)) != NULL
917 && h->type == bfd_link_hash_defined
918 && h->u.def.section == bfd_abs_section_ptr
919 && h->u.def.value == val);
920}
921
922/* Return true if TREE is ". != 0". */
923
924static bfd_boolean
925is_dot_ne_0 (const etree_type *tree)
926{
927 return (tree->type.node_class == etree_binary
928 && tree->type.node_code == NE
929 && is_dot (tree->binary.lhs)
930 && is_value (tree->binary.rhs, 0));
931}
932
933/* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an
934 absolute constant with value 0 defined in a linker script. */
935
936static bfd_boolean
937is_dot_plus_0 (const etree_type *tree)
938{
939 return (tree->type.node_class == etree_binary
940 && tree->type.node_code == '+'
941 && is_dot (tree->binary.lhs)
942 && (is_value (tree->binary.rhs, 0)
943 || is_sym_value (tree->binary.rhs, 0)));
944}
945
e0a3af22 946/* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)". */
2edab91c
AM
947
948static bfd_boolean
949is_align_conditional (const etree_type *tree)
950{
e0a3af22
AM
951 if (tree->type.node_class == etree_unary
952 && tree->type.node_code == ALIGN_K)
953 {
954 tree = tree->unary.child;
955 return (tree->type.node_class == etree_trinary
956 && is_dot_ne_0 (tree->trinary.cond)
957 && is_value (tree->trinary.rhs, 1));
958 }
959 return 0;
2edab91c
AM
960}
961
e9ee469a
AM
962static void
963exp_fold_tree_1 (etree_type *tree)
252b5132 964{
252b5132
RH
965 if (tree == NULL)
966 {
e9ee469a
AM
967 memset (&expld.result, 0, sizeof (expld.result));
968 return;
252b5132
RH
969 }
970
4de2d33d 971 switch (tree->type.node_class)
252b5132
RH
972 {
973 case etree_value:
5c3049d2 974 if (expld.section == bfd_abs_section_ptr
01554a74 975 && !config.sane_expr)
5c3049d2
AM
976 new_abs (tree->value.value);
977 else
978 new_number (tree->value.value);
5942515f 979 expld.result.str = tree->value.str;
252b5132
RH
980 break;
981
982 case etree_rel:
e9ee469a
AM
983 if (expld.phase != lang_first_phase_enum)
984 {
985 asection *output_section = tree->rel.section->output_section;
986 new_rel (tree->rel.value + tree->rel.section->output_offset,
5942515f 987 output_section);
e9ee469a 988 }
252b5132 989 else
e9ee469a 990 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
991 break;
992
993 case etree_assert:
e9ee469a 994 exp_fold_tree_1 (tree->assert_s.child);
5397b1fe
AM
995 if (expld.phase == lang_final_phase_enum && !expld.result.value)
996 einfo ("%X%P: %s\n", tree->assert_s.message);
252b5132
RH
997 break;
998
999 case etree_unary:
e9ee469a 1000 fold_unary (tree);
252b5132
RH
1001 break;
1002
1003 case etree_binary:
e9ee469a 1004 fold_binary (tree);
252b5132 1005 break;
0ae1cf52
AM
1006
1007 case etree_trinary:
e9ee469a 1008 fold_trinary (tree);
0ae1cf52 1009 break;
252b5132
RH
1010
1011 case etree_assign:
1012 case etree_provide:
b46a87b1 1013 case etree_provided:
252b5132
RH
1014 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
1015 {
b46a87b1 1016 if (tree->type.node_class != etree_assign)
dab69f68
AM
1017 einfo (_("%F%S can not PROVIDE assignment to"
1018 " location counter\n"), tree);
ec8460b5 1019 if (expld.phase != lang_first_phase_enum)
252b5132 1020 {
fbbb9ac5 1021 /* Notify the folder that this is an assignment to dot. */
e9ee469a
AM
1022 expld.assigning_to_dot = TRUE;
1023 exp_fold_tree_1 (tree->assign.src);
1024 expld.assigning_to_dot = FALSE;
1025
e0a3af22
AM
1026 /* If we are assigning to dot inside an output section
1027 arrange to keep the section, except for certain
1028 expressions that evaluate to zero. We ignore . = 0,
1029 . = . + 0, and . = ALIGN (. != 0 ? expr : 1).
1030 We can't ignore all expressions that evaluate to zero
1031 because an otherwise empty section might have padding
1032 added by an alignment expression that changes with
1033 relaxation. Such a section might have zero size
1034 before relaxation and so be stripped incorrectly. */
1035 if (expld.phase == lang_mark_phase_enum
1036 && expld.section != bfd_abs_section_ptr
1037 && !(expld.result.valid_p
1038 && expld.result.value == 0
1039 && (is_value (tree->assign.src, 0)
1040 || is_sym_value (tree->assign.src, 0)
1041 || is_dot_plus_0 (tree->assign.src)
1042 || is_align_conditional (tree->assign.src))))
1043 expld.section->flags |= SEC_KEEP;
1044
e9ee469a
AM
1045 if (!expld.result.valid_p)
1046 {
1047 if (expld.phase != lang_mark_phase_enum)
dab69f68
AM
1048 einfo (_("%F%S invalid assignment to"
1049 " location counter\n"), tree);
e9ee469a
AM
1050 }
1051 else if (expld.dotp == NULL)
1052 einfo (_("%F%S assignment to location counter"
ec8460b5
AM
1053 " invalid outside of SECTIONS\n"), tree);
1054
1055 /* After allocation, assignment to dot should not be
1056 done inside an output section since allocation adds a
1057 padding statement that effectively duplicates the
1058 assignment. */
1059 else if (expld.phase <= lang_allocating_phase_enum
1060 || expld.section == bfd_abs_section_ptr)
252b5132 1061 {
e9ee469a
AM
1062 bfd_vma nextdot;
1063
7542af2a
AM
1064 nextdot = expld.result.value;
1065 if (expld.result.section != NULL)
1066 nextdot += expld.result.section->vma;
1067 else
1068 nextdot += expld.section->vma;
e9ee469a
AM
1069 if (nextdot < expld.dot
1070 && expld.section != bfd_abs_section_ptr)
1071 einfo (_("%F%S cannot move location counter backwards"
dab69f68
AM
1072 " (from %V to %V)\n"),
1073 tree, expld.dot, nextdot);
252b5132
RH
1074 else
1075 {
e9ee469a
AM
1076 expld.dot = nextdot;
1077 *expld.dotp = nextdot;
252b5132
RH
1078 }
1079 }
1080 }
8b3d8fa8 1081 else
e9ee469a 1082 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
1083 }
1084 else
1085 {
e9ee469a 1086 struct bfd_link_hash_entry *h = NULL;
252b5132 1087
e9ee469a
AM
1088 if (tree->type.node_class == etree_provide)
1089 {
252b5132 1090 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
e9ee469a
AM
1091 FALSE, FALSE, TRUE);
1092 if (h == NULL
4cc2bf08
AM
1093 || !(h->type == bfd_link_hash_new
1094 || h->type == bfd_link_hash_undefined
12b2843a 1095 || h->linker_def))
e9ee469a 1096 {
4cc2bf08
AM
1097 /* Do nothing. The symbol was never referenced, or
1098 was defined in some object file. Undefined weak
1099 symbols stay undefined. */
e9ee469a
AM
1100 break;
1101 }
1102 }
1103
4194268f 1104 expld.assign_name = tree->assign.dst;
e9ee469a 1105 exp_fold_tree_1 (tree->assign.src);
4194268f
AM
1106 /* expld.assign_name remaining equal to tree->assign.dst
1107 below indicates the evaluation of tree->assign.src did
1108 not use the value of tree->assign.dst. We don't allow
1109 self assignment until the final phase for two reasons:
1110 1) Expressions are evaluated multiple times. With
1111 relaxation, the number of times may vary.
1112 2) Section relative symbol values cannot be correctly
1113 converted to absolute values, as is required by many
1114 expressions, until final section sizing is complete. */
1115 if ((expld.result.valid_p
1116 && (expld.phase == lang_final_phase_enum
1117 || expld.assign_name != NULL))
2aa9aad9 1118 || (expld.phase <= lang_mark_phase_enum
01554a74 1119 && tree->type.node_class == etree_assign
eb8476a6 1120 && tree->assign.defsym))
e9ee469a 1121 {
1579bae1 1122 if (h == NULL)
67010b46 1123 {
e9ee469a
AM
1124 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1125 TRUE, FALSE, TRUE);
1126 if (h == NULL)
67010b46
NC
1127 einfo (_("%P%F:%s: hash creation failed\n"),
1128 tree->assign.dst);
1129 }
e9ee469a 1130
7542af2a
AM
1131 if (expld.result.section == NULL)
1132 expld.result.section = expld.section;
422f1c65
AM
1133 if (!update_definedness (tree->assign.dst, h) && 0)
1134 {
1135 /* Symbol was already defined. For now this error
1136 is disabled because it causes failures in the ld
1137 testsuite: ld-elf/var1, ld-scripts/defined5, and
1138 ld-scripts/pr14962. Some of these no doubt
1139 reflect scripts used in the wild. */
1140 (*link_info.callbacks->multiple_definition)
1141 (&link_info, h, link_info.output_bfd,
1142 expld.result.section, expld.result.value);
1143 }
1144 h->type = bfd_link_hash_defined;
1145 h->u.def.value = expld.result.value;
e9ee469a
AM
1146 h->u.def.section = expld.result.section;
1147 if (tree->type.node_class == etree_provide)
1148 tree->type.node_class = etree_provided;
1338dd10
PB
1149
1150 /* Copy the symbol type if this is a simple assignment of
422f1c65 1151 one symbol to another. This could be more general
f37a7048 1152 (e.g. a ?: operator with NAMEs in each branch). */
1338dd10
PB
1153 if (tree->assign.src->type.node_class == etree_name)
1154 {
1155 struct bfd_link_hash_entry *hsrc;
1156
1157 hsrc = bfd_link_hash_lookup (link_info.hash,
1158 tree->assign.src->name.name,
1159 FALSE, FALSE, TRUE);
1160 if (hsrc)
1161 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
1162 hsrc);
1163 }
252b5132 1164 }
e092cb30
AM
1165 else if (expld.phase == lang_final_phase_enum)
1166 {
1167 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1168 FALSE, FALSE, TRUE);
1169 if (h != NULL
1170 && h->type == bfd_link_hash_new)
1171 h->type = bfd_link_hash_undefined;
1172 }
4194268f 1173 expld.assign_name = NULL;
252b5132
RH
1174 }
1175 break;
1176
1177 case etree_name:
e9ee469a 1178 fold_name (tree);
252b5132
RH
1179 break;
1180
1181 default:
1182 FAIL ();
e9ee469a 1183 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
1184 break;
1185 }
252b5132
RH
1186}
1187
e9ee469a
AM
1188void
1189exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
75ff4589 1190{
e9ee469a
AM
1191 expld.dot = *dotp;
1192 expld.dotp = dotp;
1193 expld.section = current_section;
1194 exp_fold_tree_1 (tree);
75ff4589
L
1195}
1196
e759c116 1197void
e9ee469a 1198exp_fold_tree_no_dot (etree_type *tree)
252b5132 1199{
e9ee469a
AM
1200 expld.dot = 0;
1201 expld.dotp = NULL;
1202 expld.section = bfd_abs_section_ptr;
1203 exp_fold_tree_1 (tree);
252b5132
RH
1204}
1205
1206etree_type *
1579bae1 1207exp_binop (int code, etree_type *lhs, etree_type *rhs)
252b5132 1208{
d3ce72d0 1209 etree_type value, *new_e;
252b5132
RH
1210
1211 value.type.node_code = code;
dab69f68 1212 value.type.filename = lhs->type.filename;
f856040a 1213 value.type.lineno = lhs->type.lineno;
252b5132
RH
1214 value.binary.lhs = lhs;
1215 value.binary.rhs = rhs;
1216 value.type.node_class = etree_binary;
e9ee469a
AM
1217 exp_fold_tree_no_dot (&value);
1218 if (expld.result.valid_p)
1219 return exp_intop (expld.result.value);
1220
d3ce72d0
NC
1221 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
1222 memcpy (new_e, &value, sizeof (new_e->binary));
1223 return new_e;
252b5132
RH
1224}
1225
1226etree_type *
1579bae1 1227exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
252b5132 1228{
d3ce72d0 1229 etree_type value, *new_e;
e9ee469a 1230
252b5132 1231 value.type.node_code = code;
dab69f68
AM
1232 value.type.filename = cond->type.filename;
1233 value.type.lineno = cond->type.lineno;
252b5132
RH
1234 value.trinary.lhs = lhs;
1235 value.trinary.cond = cond;
1236 value.trinary.rhs = rhs;
1237 value.type.node_class = etree_trinary;
e9ee469a
AM
1238 exp_fold_tree_no_dot (&value);
1239 if (expld.result.valid_p)
1240 return exp_intop (expld.result.value);
c7d701b0 1241
d3ce72d0
NC
1242 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1243 memcpy (new_e, &value, sizeof (new_e->trinary));
1244 return new_e;
252b5132
RH
1245}
1246
252b5132 1247etree_type *
1579bae1 1248exp_unop (int code, etree_type *child)
252b5132 1249{
d3ce72d0 1250 etree_type value, *new_e;
252b5132 1251
252b5132 1252 value.unary.type.node_code = code;
dab69f68 1253 value.unary.type.filename = child->type.filename;
f856040a 1254 value.unary.type.lineno = child->type.lineno;
252b5132
RH
1255 value.unary.child = child;
1256 value.unary.type.node_class = etree_unary;
e9ee469a
AM
1257 exp_fold_tree_no_dot (&value);
1258 if (expld.result.valid_p)
1259 return exp_intop (expld.result.value);
c7d701b0 1260
d3ce72d0
NC
1261 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1262 memcpy (new_e, &value, sizeof (new_e->unary));
1263 return new_e;
252b5132
RH
1264}
1265
252b5132 1266etree_type *
1579bae1 1267exp_nameop (int code, const char *name)
252b5132 1268{
d3ce72d0 1269 etree_type value, *new_e;
e9ee469a 1270
252b5132 1271 value.name.type.node_code = code;
dab69f68 1272 value.name.type.filename = ldlex_filename ();
f856040a 1273 value.name.type.lineno = lineno;
252b5132
RH
1274 value.name.name = name;
1275 value.name.type.node_class = etree_name;
1276
e9ee469a
AM
1277 exp_fold_tree_no_dot (&value);
1278 if (expld.result.valid_p)
1279 return exp_intop (expld.result.value);
c7d701b0 1280
d3ce72d0
NC
1281 new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1282 memcpy (new_e, &value, sizeof (new_e->name));
1283 return new_e;
252b5132
RH
1284
1285}
1286
2e57b2af
AM
1287static etree_type *
1288exp_assop (const char *dst,
1289 etree_type *src,
1290 enum node_tree_enum class,
eb8476a6 1291 bfd_boolean defsym,
2e57b2af 1292 bfd_boolean hidden)
252b5132
RH
1293{
1294 etree_type *n;
1295
1e9cc1c2 1296 n = (etree_type *) stat_alloc (sizeof (n->assign));
252b5132 1297 n->assign.type.node_code = '=';
dab69f68 1298 n->assign.type.filename = src->type.filename;
f856040a 1299 n->assign.type.lineno = src->type.lineno;
2e57b2af 1300 n->assign.type.node_class = class;
252b5132
RH
1301 n->assign.src = src;
1302 n->assign.dst = dst;
eb8476a6 1303 n->assign.defsym = defsym;
7af8e998 1304 n->assign.hidden = hidden;
252b5132
RH
1305 return n;
1306}
1307
eb8476a6
MR
1308/* Handle linker script assignments and HIDDEN. */
1309
2e57b2af 1310etree_type *
eb8476a6 1311exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
2e57b2af 1312{
eb8476a6 1313 return exp_assop (dst, src, etree_assign, FALSE, hidden);
2e57b2af
AM
1314}
1315
eb8476a6
MR
1316/* Handle --defsym command-line option. */
1317
2e57b2af
AM
1318etree_type *
1319exp_defsym (const char *dst, etree_type *src)
1320{
eb8476a6 1321 return exp_assop (dst, src, etree_assign, TRUE, FALSE);
2e57b2af
AM
1322}
1323
1324/* Handle PROVIDE. */
1325
1326etree_type *
1327exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1328{
eb8476a6 1329 return exp_assop (dst, src, etree_provide, FALSE, hidden);
2e57b2af
AM
1330}
1331
252b5132
RH
1332/* Handle ASSERT. */
1333
1334etree_type *
1579bae1 1335exp_assert (etree_type *exp, const char *message)
252b5132
RH
1336{
1337 etree_type *n;
1338
1e9cc1c2 1339 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
252b5132 1340 n->assert_s.type.node_code = '!';
dab69f68 1341 n->assert_s.type.filename = exp->type.filename;
f856040a 1342 n->assert_s.type.lineno = exp->type.lineno;
252b5132
RH
1343 n->assert_s.type.node_class = etree_assert;
1344 n->assert_s.child = exp;
1345 n->assert_s.message = message;
1346 return n;
1347}
1348
4de2d33d 1349void
1579bae1 1350exp_print_tree (etree_type *tree)
252b5132 1351{
ae78bbeb
AM
1352 bfd_boolean function_like;
1353
c7d701b0
NC
1354 if (config.map_file == NULL)
1355 config.map_file = stderr;
b7a26f91 1356
c7d701b0
NC
1357 if (tree == NULL)
1358 {
1359 minfo ("NULL TREE\n");
1360 return;
1361 }
b7a26f91 1362
8c95a62e
KH
1363 switch (tree->type.node_class)
1364 {
1365 case etree_value:
1366 minfo ("0x%v", tree->value.value);
1367 return;
1368 case etree_rel:
1369 if (tree->rel.section->owner != NULL)
1370 minfo ("%B:", tree->rel.section->owner);
1371 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1372 return;
1373 case etree_assign:
ae78bbeb 1374 fputs (tree->assign.dst, config.map_file);
b34976b6 1375 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
1376 exp_print_tree (tree->assign.src);
1377 break;
1378 case etree_provide:
b46a87b1 1379 case etree_provided:
8c95a62e
KH
1380 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1381 exp_print_tree (tree->assign.src);
ae78bbeb 1382 fputc (')', config.map_file);
8c95a62e
KH
1383 break;
1384 case etree_binary:
ae78bbeb
AM
1385 function_like = FALSE;
1386 switch (tree->type.node_code)
1387 {
1388 case MAX_K:
1389 case MIN_K:
1390 case ALIGN_K:
1391 case DATA_SEGMENT_ALIGN:
1392 case DATA_SEGMENT_RELRO_END:
1393 function_like = TRUE;
67baf8c4
TG
1394 break;
1395 case SEGMENT_START:
1396 /* Special handling because arguments are in reverse order and
1397 the segment name is quoted. */
1398 exp_print_token (tree->type.node_code, FALSE);
1399 fputs (" (\"", config.map_file);
1400 exp_print_tree (tree->binary.rhs);
1401 fputs ("\", ", config.map_file);
1402 exp_print_tree (tree->binary.lhs);
1403 fputc (')', config.map_file);
1404 return;
ae78bbeb
AM
1405 }
1406 if (function_like)
1407 {
1408 exp_print_token (tree->type.node_code, FALSE);
1409 fputc (' ', config.map_file);
1410 }
1411 fputc ('(', config.map_file);
8c95a62e 1412 exp_print_tree (tree->binary.lhs);
ae78bbeb
AM
1413 if (function_like)
1414 fprintf (config.map_file, ", ");
1415 else
1416 exp_print_token (tree->type.node_code, TRUE);
8c95a62e 1417 exp_print_tree (tree->binary.rhs);
ae78bbeb 1418 fputc (')', config.map_file);
8c95a62e
KH
1419 break;
1420 case etree_trinary:
1421 exp_print_tree (tree->trinary.cond);
ae78bbeb 1422 fputc ('?', config.map_file);
8c95a62e 1423 exp_print_tree (tree->trinary.lhs);
ae78bbeb 1424 fputc (':', config.map_file);
8c95a62e
KH
1425 exp_print_tree (tree->trinary.rhs);
1426 break;
1427 case etree_unary:
b34976b6 1428 exp_print_token (tree->unary.type.node_code, FALSE);
8c95a62e
KH
1429 if (tree->unary.child)
1430 {
7b17f854 1431 fprintf (config.map_file, " (");
8c95a62e 1432 exp_print_tree (tree->unary.child);
ae78bbeb 1433 fputc (')', config.map_file);
8c95a62e
KH
1434 }
1435 break;
1436
1437 case etree_assert:
1438 fprintf (config.map_file, "ASSERT (");
1439 exp_print_tree (tree->assert_s.child);
1440 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1441 break;
1442
8c95a62e
KH
1443 case etree_name:
1444 if (tree->type.node_code == NAME)
ae78bbeb 1445 fputs (tree->name.name, config.map_file);
8c95a62e
KH
1446 else
1447 {
b34976b6 1448 exp_print_token (tree->type.node_code, FALSE);
8c95a62e 1449 if (tree->name.name)
7b17f854 1450 fprintf (config.map_file, " (%s)", tree->name.name);
8c95a62e
KH
1451 }
1452 break;
1453 default:
1454 FAIL ();
1455 break;
252b5132 1456 }
252b5132
RH
1457}
1458
1459bfd_vma
e9ee469a 1460exp_get_vma (etree_type *tree, bfd_vma def, char *name)
252b5132 1461{
252b5132
RH
1462 if (tree != NULL)
1463 {
e9ee469a
AM
1464 exp_fold_tree_no_dot (tree);
1465 if (expld.result.valid_p)
1466 return expld.result.value;
1467 else if (name != NULL && expld.phase != lang_mark_phase_enum)
dab69f68
AM
1468 einfo (_("%F%S: nonconstant expression for %s\n"),
1469 tree, name);
252b5132 1470 }
e9ee469a 1471 return def;
252b5132
RH
1472}
1473
4de2d33d 1474int
e9ee469a 1475exp_get_value_int (etree_type *tree, int def, char *name)
252b5132 1476{
e9ee469a 1477 return exp_get_vma (tree, def, name);
252b5132
RH
1478}
1479
2c382fb6 1480fill_type *
e9ee469a 1481exp_get_fill (etree_type *tree, fill_type *def, char *name)
2c382fb6
AM
1482{
1483 fill_type *fill;
2c382fb6
AM
1484 size_t len;
1485 unsigned int val;
1486
1487 if (tree == NULL)
1488 return def;
1489
e9ee469a
AM
1490 exp_fold_tree_no_dot (tree);
1491 if (!expld.result.valid_p)
1492 {
1493 if (name != NULL && expld.phase != lang_mark_phase_enum)
dab69f68
AM
1494 einfo (_("%F%S: nonconstant expression for %s\n"),
1495 tree, name);
e9ee469a
AM
1496 return def;
1497 }
2c382fb6 1498
e9ee469a 1499 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
2c382fb6
AM
1500 {
1501 unsigned char *dst;
1502 unsigned char *s;
1e9cc1c2 1503 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
2c382fb6
AM
1504 fill->size = (len + 1) / 2;
1505 dst = fill->data;
e9ee469a 1506 s = (unsigned char *) expld.result.str;
2c382fb6
AM
1507 val = 0;
1508 do
1509 {
1510 unsigned int digit;
1511
1512 digit = *s++ - '0';
1513 if (digit > 9)
1514 digit = (digit - 'A' + '0' + 10) & 0xf;
1515 val <<= 4;
1516 val += digit;
1517 --len;
1518 if ((len & 1) == 0)
1519 {
1520 *dst++ = val;
1521 val = 0;
1522 }
1523 }
1524 while (len != 0);
1525 }
1526 else
1527 {
1e9cc1c2 1528 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
e9ee469a 1529 val = expld.result.value;
2c382fb6
AM
1530 fill->data[0] = (val >> 24) & 0xff;
1531 fill->data[1] = (val >> 16) & 0xff;
1532 fill->data[2] = (val >> 8) & 0xff;
1533 fill->data[3] = (val >> 0) & 0xff;
1534 fill->size = 4;
1535 }
1536 return fill;
1537}
1538
252b5132 1539bfd_vma
e9ee469a 1540exp_get_abs_int (etree_type *tree, int def, char *name)
252b5132 1541{
e9ee469a
AM
1542 if (tree != NULL)
1543 {
1544 exp_fold_tree_no_dot (tree);
c7d701b0 1545
e9ee469a
AM
1546 if (expld.result.valid_p)
1547 {
7542af2a
AM
1548 if (expld.result.section != NULL)
1549 expld.result.value += expld.result.section->vma;
e9ee469a
AM
1550 return expld.result.value;
1551 }
1552 else if (name != NULL && expld.phase != lang_mark_phase_enum)
f856040a 1553 {
dab69f68
AM
1554 einfo (_("%F%S: nonconstant expression for %s\n"),
1555 tree, name);
f856040a 1556 }
e9ee469a
AM
1557 }
1558 return def;
252b5132 1559}
c553bb91 1560
e5caa5e0
AM
1561static bfd_vma
1562align_n (bfd_vma value, bfd_vma align)
c553bb91
AM
1563{
1564 if (align <= 1)
1565 return value;
1566
1567 value = (value + align - 1) / align;
1568 return value * align;
1569}
18d6a79d
AM
1570
1571void
1572ldexp_init (void)
1573{
1574 /* The value "13" is ad-hoc, somewhat related to the expected number of
1575 assignments in a linker script. */
1576 if (!bfd_hash_table_init_n (&definedness_table,
1577 definedness_newfunc,
1578 sizeof (struct definedness_hash_entry),
1579 13))
1580 einfo (_("%P%F: can not create hash table: %E\n"));
1581}
1582
1583void
1584ldexp_finish (void)
1585{
1586 bfd_hash_table_free (&definedness_table);
1587}
This page took 0.747014 seconds and 4 git commands to generate.