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