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