bfd/
[deliverable/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
AM
894 && tree->type.node_class == etree_assign
895 && tree->assign.hidden))
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,
1057 bfd_boolean hidden)
252b5132
RH
1058{
1059 etree_type *n;
1060
1e9cc1c2 1061 n = (etree_type *) stat_alloc (sizeof (n->assign));
252b5132 1062 n->assign.type.node_code = '=';
dab69f68 1063 n->assign.type.filename = src->type.filename;
f856040a 1064 n->assign.type.lineno = src->type.lineno;
2e57b2af 1065 n->assign.type.node_class = class;
252b5132
RH
1066 n->assign.src = src;
1067 n->assign.dst = dst;
7af8e998 1068 n->assign.hidden = hidden;
252b5132
RH
1069 return n;
1070}
1071
2e57b2af
AM
1072etree_type *
1073exp_assign (const char *dst, etree_type *src)
1074{
1075 return exp_assop (dst, src, etree_assign, FALSE);
1076}
1077
1078etree_type *
1079exp_defsym (const char *dst, etree_type *src)
1080{
1081 return exp_assop (dst, src, etree_assign, TRUE);
1082}
1083
1084/* Handle PROVIDE. */
1085
1086etree_type *
1087exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1088{
1089 return exp_assop (dst, src, etree_provide, hidden);
1090}
1091
252b5132
RH
1092/* Handle ASSERT. */
1093
1094etree_type *
1579bae1 1095exp_assert (etree_type *exp, const char *message)
252b5132
RH
1096{
1097 etree_type *n;
1098
1e9cc1c2 1099 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
252b5132 1100 n->assert_s.type.node_code = '!';
dab69f68 1101 n->assert_s.type.filename = exp->type.filename;
f856040a 1102 n->assert_s.type.lineno = exp->type.lineno;
252b5132
RH
1103 n->assert_s.type.node_class = etree_assert;
1104 n->assert_s.child = exp;
1105 n->assert_s.message = message;
1106 return n;
1107}
1108
4de2d33d 1109void
1579bae1 1110exp_print_tree (etree_type *tree)
252b5132 1111{
ae78bbeb
AM
1112 bfd_boolean function_like;
1113
c7d701b0
NC
1114 if (config.map_file == NULL)
1115 config.map_file = stderr;
b7a26f91 1116
c7d701b0
NC
1117 if (tree == NULL)
1118 {
1119 minfo ("NULL TREE\n");
1120 return;
1121 }
b7a26f91 1122
8c95a62e
KH
1123 switch (tree->type.node_class)
1124 {
1125 case etree_value:
1126 minfo ("0x%v", tree->value.value);
1127 return;
1128 case etree_rel:
1129 if (tree->rel.section->owner != NULL)
1130 minfo ("%B:", tree->rel.section->owner);
1131 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1132 return;
1133 case etree_assign:
ae78bbeb 1134 fputs (tree->assign.dst, config.map_file);
b34976b6 1135 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
1136 exp_print_tree (tree->assign.src);
1137 break;
1138 case etree_provide:
b46a87b1 1139 case etree_provided:
8c95a62e
KH
1140 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1141 exp_print_tree (tree->assign.src);
ae78bbeb 1142 fputc (')', config.map_file);
8c95a62e
KH
1143 break;
1144 case etree_binary:
ae78bbeb
AM
1145 function_like = FALSE;
1146 switch (tree->type.node_code)
1147 {
1148 case MAX_K:
1149 case MIN_K:
1150 case ALIGN_K:
1151 case DATA_SEGMENT_ALIGN:
1152 case DATA_SEGMENT_RELRO_END:
1153 function_like = TRUE;
67baf8c4
TG
1154 break;
1155 case SEGMENT_START:
1156 /* Special handling because arguments are in reverse order and
1157 the segment name is quoted. */
1158 exp_print_token (tree->type.node_code, FALSE);
1159 fputs (" (\"", config.map_file);
1160 exp_print_tree (tree->binary.rhs);
1161 fputs ("\", ", config.map_file);
1162 exp_print_tree (tree->binary.lhs);
1163 fputc (')', config.map_file);
1164 return;
ae78bbeb
AM
1165 }
1166 if (function_like)
1167 {
1168 exp_print_token (tree->type.node_code, FALSE);
1169 fputc (' ', config.map_file);
1170 }
1171 fputc ('(', config.map_file);
8c95a62e 1172 exp_print_tree (tree->binary.lhs);
ae78bbeb
AM
1173 if (function_like)
1174 fprintf (config.map_file, ", ");
1175 else
1176 exp_print_token (tree->type.node_code, TRUE);
8c95a62e 1177 exp_print_tree (tree->binary.rhs);
ae78bbeb 1178 fputc (')', config.map_file);
8c95a62e
KH
1179 break;
1180 case etree_trinary:
1181 exp_print_tree (tree->trinary.cond);
ae78bbeb 1182 fputc ('?', config.map_file);
8c95a62e 1183 exp_print_tree (tree->trinary.lhs);
ae78bbeb 1184 fputc (':', config.map_file);
8c95a62e
KH
1185 exp_print_tree (tree->trinary.rhs);
1186 break;
1187 case etree_unary:
b34976b6 1188 exp_print_token (tree->unary.type.node_code, FALSE);
8c95a62e
KH
1189 if (tree->unary.child)
1190 {
7b17f854 1191 fprintf (config.map_file, " (");
8c95a62e 1192 exp_print_tree (tree->unary.child);
ae78bbeb 1193 fputc (')', config.map_file);
8c95a62e
KH
1194 }
1195 break;
1196
1197 case etree_assert:
1198 fprintf (config.map_file, "ASSERT (");
1199 exp_print_tree (tree->assert_s.child);
1200 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1201 break;
1202
8c95a62e
KH
1203 case etree_name:
1204 if (tree->type.node_code == NAME)
ae78bbeb 1205 fputs (tree->name.name, config.map_file);
8c95a62e
KH
1206 else
1207 {
b34976b6 1208 exp_print_token (tree->type.node_code, FALSE);
8c95a62e 1209 if (tree->name.name)
7b17f854 1210 fprintf (config.map_file, " (%s)", tree->name.name);
8c95a62e
KH
1211 }
1212 break;
1213 default:
1214 FAIL ();
1215 break;
252b5132 1216 }
252b5132
RH
1217}
1218
1219bfd_vma
e9ee469a 1220exp_get_vma (etree_type *tree, bfd_vma def, char *name)
252b5132 1221{
252b5132
RH
1222 if (tree != NULL)
1223 {
e9ee469a
AM
1224 exp_fold_tree_no_dot (tree);
1225 if (expld.result.valid_p)
1226 return expld.result.value;
1227 else if (name != NULL && expld.phase != lang_mark_phase_enum)
dab69f68
AM
1228 einfo (_("%F%S: nonconstant expression for %s\n"),
1229 tree, name);
252b5132 1230 }
e9ee469a 1231 return def;
252b5132
RH
1232}
1233
4de2d33d 1234int
e9ee469a 1235exp_get_value_int (etree_type *tree, int def, char *name)
252b5132 1236{
e9ee469a 1237 return exp_get_vma (tree, def, name);
252b5132
RH
1238}
1239
2c382fb6 1240fill_type *
e9ee469a 1241exp_get_fill (etree_type *tree, fill_type *def, char *name)
2c382fb6
AM
1242{
1243 fill_type *fill;
2c382fb6
AM
1244 size_t len;
1245 unsigned int val;
1246
1247 if (tree == NULL)
1248 return def;
1249
e9ee469a
AM
1250 exp_fold_tree_no_dot (tree);
1251 if (!expld.result.valid_p)
1252 {
1253 if (name != NULL && expld.phase != lang_mark_phase_enum)
dab69f68
AM
1254 einfo (_("%F%S: nonconstant expression for %s\n"),
1255 tree, name);
e9ee469a
AM
1256 return def;
1257 }
2c382fb6 1258
e9ee469a 1259 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
2c382fb6
AM
1260 {
1261 unsigned char *dst;
1262 unsigned char *s;
1e9cc1c2 1263 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
2c382fb6
AM
1264 fill->size = (len + 1) / 2;
1265 dst = fill->data;
e9ee469a 1266 s = (unsigned char *) expld.result.str;
2c382fb6
AM
1267 val = 0;
1268 do
1269 {
1270 unsigned int digit;
1271
1272 digit = *s++ - '0';
1273 if (digit > 9)
1274 digit = (digit - 'A' + '0' + 10) & 0xf;
1275 val <<= 4;
1276 val += digit;
1277 --len;
1278 if ((len & 1) == 0)
1279 {
1280 *dst++ = val;
1281 val = 0;
1282 }
1283 }
1284 while (len != 0);
1285 }
1286 else
1287 {
1e9cc1c2 1288 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
e9ee469a 1289 val = expld.result.value;
2c382fb6
AM
1290 fill->data[0] = (val >> 24) & 0xff;
1291 fill->data[1] = (val >> 16) & 0xff;
1292 fill->data[2] = (val >> 8) & 0xff;
1293 fill->data[3] = (val >> 0) & 0xff;
1294 fill->size = 4;
1295 }
1296 return fill;
1297}
1298
252b5132 1299bfd_vma
e9ee469a 1300exp_get_abs_int (etree_type *tree, int def, char *name)
252b5132 1301{
e9ee469a
AM
1302 if (tree != NULL)
1303 {
1304 exp_fold_tree_no_dot (tree);
c7d701b0 1305
e9ee469a
AM
1306 if (expld.result.valid_p)
1307 {
7542af2a
AM
1308 if (expld.result.section != NULL)
1309 expld.result.value += expld.result.section->vma;
e9ee469a
AM
1310 return expld.result.value;
1311 }
1312 else if (name != NULL && expld.phase != lang_mark_phase_enum)
f856040a 1313 {
dab69f68
AM
1314 einfo (_("%F%S: nonconstant expression for %s\n"),
1315 tree, name);
f856040a 1316 }
e9ee469a
AM
1317 }
1318 return def;
252b5132 1319}
c553bb91 1320
e5caa5e0
AM
1321static bfd_vma
1322align_n (bfd_vma value, bfd_vma align)
c553bb91
AM
1323{
1324 if (align <= 1)
1325 return value;
1326
1327 value = (value + align - 1) / align;
1328 return value * align;
1329}
This page took 0.630309 seconds and 4 git commands to generate.