]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/ldexp.c
2012-02-22 Gary Benson <gbenson@redhat.com>
[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;
c7d701b0
NC
62 char * name;
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{
e9ee469a
AM
216 expld.result.valid_p = TRUE;
217 expld.result.value = value - expld.section->vma;
218 expld.result.str = NULL;
219 expld.result.section = expld.section;
252b5132
RH
220}
221
e9ee469a
AM
222static void
223fold_unary (etree_type *tree)
0ae1cf52 224{
e9ee469a
AM
225 exp_fold_tree_1 (tree->unary.child);
226 if (expld.result.valid_p)
0ae1cf52
AM
227 {
228 switch (tree->type.node_code)
229 {
230 case ALIGN_K:
e9ee469a 231 if (expld.phase != lang_first_phase_enum)
dea2f0a8 232 new_rel_from_abs (align_n (expld.dot, expld.result.value));
0ae1cf52 233 else
e9ee469a 234 expld.result.valid_p = FALSE;
0ae1cf52
AM
235 break;
236
237 case ABSOLUTE:
e9ee469a 238 make_abs ();
0ae1cf52
AM
239 break;
240
241 case '~':
e9ee469a 242 expld.result.value = ~expld.result.value;
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 NEXT:
254 /* Return next place aligned to value. */
e9ee469a 255 if (expld.phase != lang_first_phase_enum)
0ae1cf52 256 {
e9ee469a
AM
257 make_abs ();
258 expld.result.value = align_n (expld.dot, expld.result.value);
0ae1cf52
AM
259 }
260 else
e9ee469a 261 expld.result.valid_p = FALSE;
0ae1cf52
AM
262 break;
263
264 case DATA_SEGMENT_END:
ea7c2e6c
AM
265 if (expld.phase == lang_first_phase_enum
266 || expld.section != bfd_abs_section_ptr)
0ae1cf52 267 {
ea7c2e6c
AM
268 expld.result.valid_p = FALSE;
269 }
270 else if (expld.dataseg.phase == exp_dataseg_align_seen
271 || expld.dataseg.phase == exp_dataseg_relro_seen)
272 {
273 expld.dataseg.phase = exp_dataseg_end_seen;
274 expld.dataseg.end = expld.result.value;
275 }
276 else if (expld.dataseg.phase == exp_dataseg_done
277 || expld.dataseg.phase == exp_dataseg_adjust
278 || expld.dataseg.phase == exp_dataseg_relro_adjust)
279 {
280 /* OK. */
0ae1cf52
AM
281 }
282 else
e9ee469a 283 expld.result.valid_p = FALSE;
0ae1cf52
AM
284 break;
285
286 default:
287 FAIL ();
288 break;
289 }
290 }
0ae1cf52
AM
291}
292
e9ee469a
AM
293static void
294fold_binary (etree_type *tree)
252b5132 295{
4ac0c898 296 etree_value_type lhs;
e9ee469a 297 exp_fold_tree_1 (tree->binary.lhs);
ba916c8a
MM
298
299 /* The SEGMENT_START operator is special because its first
8c0848b5
AM
300 operand is a string, not the name of a symbol. Note that the
301 operands have been swapped, so binary.lhs is second (default)
302 operand, binary.rhs is first operand. */
e9ee469a 303 if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
ba916c8a
MM
304 {
305 const char *segment_name;
306 segment_type *seg;
7542af2a 307
ba916c8a
MM
308 /* Check to see if the user has overridden the default
309 value. */
310 segment_name = tree->binary.rhs->name.name;
311 for (seg = segments; seg; seg = seg->next)
312 if (strcmp (seg->name, segment_name) == 0)
313 {
c8ce5710
L
314 if (!seg->used
315 && config.magic_demand_paged
316 && (seg->value % config.maxpagesize) != 0)
317 einfo (_("%P: warning: address of `%s' isn't multiple of maximum page size\n"),
318 segment_name);
ba916c8a 319 seg->used = TRUE;
7542af2a 320 new_rel_from_abs (seg->value);
ba916c8a
MM
321 break;
322 }
4ac0c898 323 return;
ba916c8a 324 }
252b5132 325
4ac0c898
AM
326 lhs = expld.result;
327 exp_fold_tree_1 (tree->binary.rhs);
328 expld.result.valid_p &= lhs.valid_p;
329
330 if (expld.result.valid_p)
331 {
7542af2a 332 if (lhs.section != expld.result.section)
252b5132 333 {
7542af2a
AM
334 /* If the values are from different sections, and neither is
335 just a number, make both the source arguments absolute. */
336 if (expld.result.section != NULL
337 && lhs.section != NULL)
338 {
339 make_abs ();
340 lhs.value += lhs.section->vma;
9bc8bb33 341 lhs.section = bfd_abs_section_ptr;
7542af2a
AM
342 }
343
344 /* If the rhs is just a number, keep the lhs section. */
345 else if (expld.result.section == NULL)
9bc8bb33
AM
346 {
347 expld.result.section = lhs.section;
348 /* Make this NULL so that we know one of the operands
349 was just a number, for later tests. */
350 lhs.section = NULL;
351 }
4ac0c898 352 }
9bc8bb33
AM
353 /* At this point we know that both operands have the same
354 section, or at least one of them is a plain number. */
252b5132 355
4ac0c898
AM
356 switch (tree->type.node_code)
357 {
9bc8bb33
AM
358 /* Arithmetic operators, bitwise AND, bitwise OR and XOR
359 keep the section of one of their operands only when the
360 other operand is a plain number. Losing the section when
361 operating on two symbols, ie. a result of a plain number,
362 is required for subtraction and XOR. It's justifiable
363 for the other operations on the grounds that adding,
364 multiplying etc. two section relative values does not
365 really make sense unless they are just treated as
366 numbers.
367 The same argument could be made for many expressions
368 involving one symbol and a number. For example,
369 "1 << x" and "100 / x" probably should not be given the
370 section of x. The trouble is that if we fuss about such
371 things the rules become complex and it is onerous to
372 document ld expression evaluation. */
e9ee469a 373#define BOP(x, y) \
7542af2a
AM
374 case x: \
375 expld.result.value = lhs.value y expld.result.value; \
9bc8bb33
AM
376 if (expld.result.section == lhs.section) \
377 expld.result.section = NULL; \
7542af2a
AM
378 break;
379
9bc8bb33
AM
380 /* Comparison operators, logical AND, and logical OR always
381 return a plain number. */
7542af2a
AM
382#define BOPN(x, y) \
383 case x: \
384 expld.result.value = lhs.value y expld.result.value; \
385 expld.result.section = NULL; \
386 break;
e9ee469a 387
4ac0c898
AM
388 BOP ('+', +);
389 BOP ('*', *);
390 BOP ('-', -);
391 BOP (LSHIFT, <<);
392 BOP (RSHIFT, >>);
4ac0c898
AM
393 BOP ('&', &);
394 BOP ('^', ^);
395 BOP ('|', |);
7542af2a
AM
396 BOPN (EQ, ==);
397 BOPN (NE, !=);
398 BOPN ('<', <);
399 BOPN ('>', >);
400 BOPN (LE, <=);
401 BOPN (GE, >=);
402 BOPN (ANDAND, &&);
403 BOPN (OROR, ||);
4ac0c898 404
9bc8bb33
AM
405 case '%':
406 if (expld.result.value != 0)
407 expld.result.value = ((bfd_signed_vma) lhs.value
408 % (bfd_signed_vma) expld.result.value);
409 else if (expld.phase != lang_mark_phase_enum)
dab69f68 410 einfo (_("%F%S %% by zero\n"), tree->binary.rhs);
9bc8bb33
AM
411 if (expld.result.section == lhs.section)
412 expld.result.section = NULL;
413 break;
414
415 case '/':
416 if (expld.result.value != 0)
417 expld.result.value = ((bfd_signed_vma) lhs.value
418 / (bfd_signed_vma) expld.result.value);
419 else if (expld.phase != lang_mark_phase_enum)
dab69f68 420 einfo (_("%F%S / by zero\n"), tree->binary.rhs);
9bc8bb33
AM
421 if (expld.result.section == lhs.section)
422 expld.result.section = NULL;
423 break;
424
4ac0c898
AM
425 case MAX_K:
426 if (lhs.value > expld.result.value)
427 expld.result.value = lhs.value;
428 break;
252b5132 429
4ac0c898
AM
430 case MIN_K:
431 if (lhs.value < expld.result.value)
432 expld.result.value = lhs.value;
433 break;
252b5132 434
4ac0c898
AM
435 case ALIGN_K:
436 expld.result.value = align_n (lhs.value, expld.result.value);
437 break;
c468c8bc 438
4ac0c898
AM
439 case DATA_SEGMENT_ALIGN:
440 expld.dataseg.relro = exp_dataseg_relro_start;
ea7c2e6c
AM
441 if (expld.phase == lang_first_phase_enum
442 || expld.section != bfd_abs_section_ptr)
443 expld.result.valid_p = FALSE;
444 else
4ac0c898
AM
445 {
446 bfd_vma maxpage = lhs.value;
447 bfd_vma commonpage = expld.result.value;
2d20f7bf 448
4ac0c898
AM
449 expld.result.value = align_n (expld.dot, maxpage);
450 if (expld.dataseg.phase == exp_dataseg_relro_adjust)
451 expld.result.value = expld.dataseg.base;
ea7c2e6c
AM
452 else if (expld.dataseg.phase == exp_dataseg_adjust)
453 {
454 if (commonpage < maxpage)
455 expld.result.value += ((expld.dot + commonpage - 1)
456 & (maxpage - commonpage));
457 }
458 else
4ac0c898
AM
459 {
460 expld.result.value += expld.dot & (maxpage - 1);
ea7c2e6c
AM
461 if (expld.dataseg.phase == exp_dataseg_done)
462 {
463 /* OK. */
464 }
465 else if (expld.dataseg.phase == exp_dataseg_none)
2d20f7bf 466 {
4ac0c898
AM
467 expld.dataseg.phase = exp_dataseg_align_seen;
468 expld.dataseg.min_base = expld.dot;
469 expld.dataseg.base = expld.result.value;
470 expld.dataseg.pagesize = commonpage;
471 expld.dataseg.maxpagesize = maxpage;
472 expld.dataseg.relro_end = 0;
2d20f7bf 473 }
ea7c2e6c
AM
474 else
475 expld.result.valid_p = FALSE;
2d20f7bf 476 }
4ac0c898 477 }
4ac0c898 478 break;
e9ee469a 479
4ac0c898
AM
480 case DATA_SEGMENT_RELRO_END:
481 expld.dataseg.relro = exp_dataseg_relro_end;
ea7c2e6c
AM
482 if (expld.phase == lang_first_phase_enum
483 || expld.section != bfd_abs_section_ptr)
484 expld.result.valid_p = FALSE;
485 else if (expld.dataseg.phase == exp_dataseg_align_seen
486 || expld.dataseg.phase == exp_dataseg_adjust
487 || expld.dataseg.phase == exp_dataseg_relro_adjust
488 || expld.dataseg.phase == exp_dataseg_done)
4ac0c898
AM
489 {
490 if (expld.dataseg.phase == exp_dataseg_align_seen
491 || expld.dataseg.phase == exp_dataseg_relro_adjust)
492 expld.dataseg.relro_end = lhs.value + expld.result.value;
e9ee469a 493
4ac0c898
AM
494 if (expld.dataseg.phase == exp_dataseg_relro_adjust
495 && (expld.dataseg.relro_end
496 & (expld.dataseg.pagesize - 1)))
497 {
498 expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
499 expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
500 expld.result.value = (expld.dataseg.relro_end
501 - expld.result.value);
a4f5ad88
JJ
502 }
503 else
4ac0c898 504 expld.result.value = lhs.value;
a4f5ad88 505
4ac0c898
AM
506 if (expld.dataseg.phase == exp_dataseg_align_seen)
507 expld.dataseg.phase = exp_dataseg_relro_seen;
252b5132 508 }
4ac0c898
AM
509 else
510 expld.result.valid_p = FALSE;
511 break;
512
513 default:
514 FAIL ();
252b5132 515 }
252b5132 516 }
252b5132
RH
517}
518
e9ee469a
AM
519static void
520fold_trinary (etree_type *tree)
0ae1cf52 521{
e9ee469a
AM
522 exp_fold_tree_1 (tree->trinary.cond);
523 if (expld.result.valid_p)
524 exp_fold_tree_1 (expld.result.value
525 ? tree->trinary.lhs
526 : tree->trinary.rhs);
0ae1cf52
AM
527}
528
e9ee469a
AM
529static void
530fold_name (etree_type *tree)
252b5132 531{
e9ee469a 532 memset (&expld.result, 0, sizeof (expld.result));
c468c8bc 533
4de2d33d 534 switch (tree->type.node_code)
8c95a62e
KH
535 {
536 case SIZEOF_HEADERS:
e9ee469a
AM
537 if (expld.phase != lang_first_phase_enum)
538 {
539 bfd_vma hdr_size = 0;
540 /* Don't find the real header size if only marking sections;
541 The bfd function may cache incorrect data. */
542 if (expld.phase != lang_mark_phase_enum)
f13a99db 543 hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
7542af2a 544 new_number (hdr_size);
e9ee469a 545 }
8c95a62e 546 break;
67469e1f 547
8c95a62e 548 case DEFINED:
e9ee469a 549 if (expld.phase == lang_first_phase_enum)
1b493742 550 lang_track_definedness (tree->name.name);
8c95a62e
KH
551 else
552 {
553 struct bfd_link_hash_entry *h;
420e579c
HPN
554 int def_iteration
555 = lang_symbol_definition_iteration (tree->name.name);
8c95a62e 556
f13a99db
AM
557 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
558 &link_info,
8c95a62e 559 tree->name.name,
b34976b6 560 FALSE, FALSE, TRUE);
7542af2a
AM
561 new_number (h != NULL
562 && (h->type == bfd_link_hash_defined
563 || h->type == bfd_link_hash_defweak
564 || h->type == bfd_link_hash_common)
565 && (def_iteration == lang_statement_iteration
566 || def_iteration == -1));
8c95a62e
KH
567 }
568 break;
67469e1f 569
8c95a62e 570 case NAME:
e9ee469a
AM
571 if (expld.phase == lang_first_phase_enum)
572 ;
573 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
574 new_rel_from_abs (expld.dot);
575 else
8c95a62e
KH
576 {
577 struct bfd_link_hash_entry *h;
578
f13a99db
AM
579 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
580 &link_info,
8c95a62e 581 tree->name.name,
1b493742
NS
582 TRUE, FALSE, TRUE);
583 if (!h)
584 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
585 else if (h->type == bfd_link_hash_defined
586 || h->type == bfd_link_hash_defweak)
8c95a62e 587 {
7542af2a 588 asection *output_section;
8c95a62e 589
7542af2a
AM
590 output_section = h->u.def.section->output_section;
591 if (output_section == NULL)
592 {
593 if (expld.phase != lang_mark_phase_enum)
594 einfo (_("%X%S: unresolvable symbol `%s'"
595 " referenced in expression\n"),
dab69f68 596 tree, tree->name.name);
8c95a62e 597 }
5c3049d2
AM
598 else if (output_section == bfd_abs_section_ptr
599 && (expld.section != bfd_abs_section_ptr
01554a74 600 || config.sane_expr))
abf4be64 601 new_number (h->u.def.value + h->u.def.section->output_offset);
7542af2a
AM
602 else
603 new_rel (h->u.def.value + h->u.def.section->output_offset,
604 output_section);
8c95a62e 605 }
e9ee469a
AM
606 else if (expld.phase == lang_final_phase_enum
607 || expld.assigning_to_dot)
dab69f68
AM
608 einfo (_("%F%S: undefined symbol `%s'"
609 " referenced in expression\n"),
610 tree, tree->name.name);
1b493742
NS
611 else if (h->type == bfd_link_hash_new)
612 {
613 h->type = bfd_link_hash_undefined;
614 h->u.undef.abfd = NULL;
3eda52aa 615 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
a010d60f 616 bfd_link_add_undef (link_info.hash, h);
1b493742 617 }
8c95a62e
KH
618 }
619 break;
620
621 case ADDR:
e9ee469a 622 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
623 {
624 lang_output_section_statement_type *os;
625
626 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
627 if (os == NULL)
628 {
629 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
630 einfo (_("%F%S: undefined section `%s'"
631 " referenced in expression\n"),
632 tree, tree->name.name);
cc3e2771
NS
633 }
634 else if (os->processed_vma)
5942515f 635 new_rel (0, os->bfd_section);
8c95a62e 636 }
8c95a62e
KH
637 break;
638
639 case LOADADDR:
e9ee469a 640 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
641 {
642 lang_output_section_statement_type *os;
643
644 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
645 if (os == NULL)
646 {
647 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
648 einfo (_("%F%S: undefined section `%s'"
649 " referenced in expression\n"),
650 tree, tree->name.name);
cc3e2771
NS
651 }
652 else if (os->processed_lma)
1b493742 653 {
e9ee469a 654 if (os->load_base == NULL)
3e23777d 655 new_abs (os->bfd_section->lma);
e9ee469a 656 else
67469e1f
AM
657 {
658 exp_fold_tree_1 (os->load_base);
819da74e
AM
659 if (expld.result.valid_p)
660 make_abs ();
67469e1f 661 }
1b493742 662 }
8c95a62e 663 }
8c95a62e
KH
664 break;
665
666 case SIZEOF:
362c1d1a 667 case ALIGNOF:
e9ee469a 668 if (expld.phase != lang_first_phase_enum)
8c95a62e 669 {
8c95a62e
KH
670 lang_output_section_statement_type *os;
671
672 os = lang_output_section_find (tree->name.name);
5397b1fe 673 if (os == NULL)
cc3e2771
NS
674 {
675 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
676 einfo (_("%F%S: undefined section `%s'"
677 " referenced in expression\n"),
678 tree, tree->name.name);
7542af2a 679 new_number (0);
cc3e2771 680 }
cde9e0be 681 else if (os->processed_vma)
362c1d1a
NS
682 {
683 bfd_vma val;
684
685 if (tree->type.node_code == SIZEOF)
f13a99db
AM
686 val = (os->bfd_section->size
687 / bfd_octets_per_byte (link_info.output_bfd));
362c1d1a
NS
688 else
689 val = (bfd_vma)1 << os->bfd_section->alignment_power;
690
7542af2a 691 new_number (val);
362c1d1a 692 }
8c95a62e 693 }
8c95a62e
KH
694 break;
695
3ec57632
NC
696 case LENGTH:
697 {
698 lang_memory_region_type *mem;
699
700 mem = lang_memory_region_lookup (tree->name.name, FALSE);
701 if (mem != NULL)
7542af2a 702 new_number (mem->length);
3ec57632 703 else
e9ee469a 704 einfo (_("%F%S: undefined MEMORY region `%s'"
dab69f68
AM
705 " referenced in expression\n"),
706 tree, tree->name.name);
3ec57632
NC
707 }
708 break;
709
710 case ORIGIN:
7542af2a
AM
711 if (expld.phase != lang_first_phase_enum)
712 {
713 lang_memory_region_type *mem;
3ec57632 714
7542af2a
AM
715 mem = lang_memory_region_lookup (tree->name.name, FALSE);
716 if (mem != NULL)
717 new_rel_from_abs (mem->origin);
718 else
719 einfo (_("%F%S: undefined MEMORY region `%s'"
dab69f68
AM
720 " referenced in expression\n"),
721 tree, tree->name.name);
7542af2a 722 }
3ec57632
NC
723 break;
724
24718e3b
L
725 case CONSTANT:
726 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
7542af2a 727 new_number (config.maxpagesize);
24718e3b 728 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
7542af2a 729 new_number (config.commonpagesize);
24718e3b
L
730 else
731 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
dab69f68 732 tree, tree->name.name);
24718e3b
L
733 break;
734
8c95a62e
KH
735 default:
736 FAIL ();
737 break;
738 }
252b5132 739}
8c95a62e 740
e9ee469a
AM
741static void
742exp_fold_tree_1 (etree_type *tree)
252b5132 743{
252b5132
RH
744 if (tree == NULL)
745 {
e9ee469a
AM
746 memset (&expld.result, 0, sizeof (expld.result));
747 return;
252b5132
RH
748 }
749
4de2d33d 750 switch (tree->type.node_class)
252b5132
RH
751 {
752 case etree_value:
5c3049d2 753 if (expld.section == bfd_abs_section_ptr
01554a74 754 && !config.sane_expr)
5c3049d2
AM
755 new_abs (tree->value.value);
756 else
757 new_number (tree->value.value);
5942515f 758 expld.result.str = tree->value.str;
252b5132
RH
759 break;
760
761 case etree_rel:
e9ee469a
AM
762 if (expld.phase != lang_first_phase_enum)
763 {
764 asection *output_section = tree->rel.section->output_section;
765 new_rel (tree->rel.value + tree->rel.section->output_offset,
5942515f 766 output_section);
e9ee469a 767 }
252b5132 768 else
e9ee469a 769 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
770 break;
771
772 case etree_assert:
e9ee469a 773 exp_fold_tree_1 (tree->assert_s.child);
5397b1fe
AM
774 if (expld.phase == lang_final_phase_enum && !expld.result.value)
775 einfo ("%X%P: %s\n", tree->assert_s.message);
252b5132
RH
776 break;
777
778 case etree_unary:
e9ee469a 779 fold_unary (tree);
252b5132
RH
780 break;
781
782 case etree_binary:
e9ee469a 783 fold_binary (tree);
252b5132 784 break;
0ae1cf52
AM
785
786 case etree_trinary:
e9ee469a 787 fold_trinary (tree);
0ae1cf52 788 break;
252b5132
RH
789
790 case etree_assign:
791 case etree_provide:
b46a87b1 792 case etree_provided:
252b5132
RH
793 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
794 {
b46a87b1 795 if (tree->type.node_class != etree_assign)
dab69f68
AM
796 einfo (_("%F%S can not PROVIDE assignment to"
797 " location counter\n"), tree);
2f65ac72
AM
798 /* After allocation, assignment to dot should not be done inside
799 an output section since allocation adds a padding statement
800 that effectively duplicates the assignment. */
e9ee469a
AM
801 if (expld.phase == lang_mark_phase_enum
802 || expld.phase == lang_allocating_phase_enum
2f65ac72
AM
803 || ((expld.phase == lang_assigning_phase_enum
804 || expld.phase == lang_final_phase_enum)
e9ee469a 805 && expld.section == bfd_abs_section_ptr))
252b5132 806 {
fbbb9ac5 807 /* Notify the folder that this is an assignment to dot. */
e9ee469a
AM
808 expld.assigning_to_dot = TRUE;
809 exp_fold_tree_1 (tree->assign.src);
810 expld.assigning_to_dot = FALSE;
811
812 if (!expld.result.valid_p)
813 {
814 if (expld.phase != lang_mark_phase_enum)
dab69f68
AM
815 einfo (_("%F%S invalid assignment to"
816 " location counter\n"), tree);
e9ee469a
AM
817 }
818 else if (expld.dotp == NULL)
819 einfo (_("%F%S assignment to location counter"
dab69f68 820 " invalid outside of SECTION\n"), tree);
252b5132
RH
821 else
822 {
e9ee469a
AM
823 bfd_vma nextdot;
824
7542af2a
AM
825 nextdot = expld.result.value;
826 if (expld.result.section != NULL)
827 nextdot += expld.result.section->vma;
828 else
829 nextdot += expld.section->vma;
e9ee469a
AM
830 if (nextdot < expld.dot
831 && expld.section != bfd_abs_section_ptr)
832 einfo (_("%F%S cannot move location counter backwards"
dab69f68
AM
833 " (from %V to %V)\n"),
834 tree, expld.dot, nextdot);
252b5132
RH
835 else
836 {
e9ee469a
AM
837 expld.dot = nextdot;
838 *expld.dotp = nextdot;
252b5132
RH
839 }
840 }
841 }
8b3d8fa8 842 else
e9ee469a 843 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
844 }
845 else
846 {
f37a7048
NS
847 etree_type *name;
848
e9ee469a 849 struct bfd_link_hash_entry *h = NULL;
252b5132 850
e9ee469a
AM
851 if (tree->type.node_class == etree_provide)
852 {
252b5132 853 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
e9ee469a
AM
854 FALSE, FALSE, TRUE);
855 if (h == NULL
856 || (h->type != bfd_link_hash_new
857 && h->type != bfd_link_hash_undefined
858 && h->type != bfd_link_hash_common))
859 {
860 /* Do nothing. The symbol was never referenced, or was
861 defined by some object. */
862 break;
863 }
864 }
865
f37a7048
NS
866 name = tree->assign.src;
867 if (name->type.node_class == etree_trinary)
868 {
869 exp_fold_tree_1 (name->trinary.cond);
870 if (expld.result.valid_p)
871 name = (expld.result.value
872 ? name->trinary.lhs : name->trinary.rhs);
873 }
874
875 if (name->type.node_class == etree_name
876 && name->type.node_code == NAME
877 && strcmp (tree->assign.dst, name->name.name) == 0)
878 /* Leave it alone. Do not replace a symbol with its own
879 output address, in case there is another section sizing
880 pass. Folding does not preserve input sections. */
881 break;
882
e9ee469a 883 exp_fold_tree_1 (tree->assign.src);
e759c116
AM
884 if (expld.result.valid_p
885 || (expld.phase == lang_first_phase_enum
01554a74
AM
886 && tree->type.node_class == etree_assign
887 && tree->assign.hidden))
e9ee469a 888 {
1579bae1 889 if (h == NULL)
67010b46 890 {
e9ee469a
AM
891 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
892 TRUE, FALSE, TRUE);
893 if (h == NULL)
67010b46
NC
894 einfo (_("%P%F:%s: hash creation failed\n"),
895 tree->assign.dst);
896 }
e9ee469a
AM
897
898 /* FIXME: Should we worry if the symbol is already
899 defined? */
900 lang_update_definedness (tree->assign.dst, h);
901 h->type = bfd_link_hash_defined;
902 h->u.def.value = expld.result.value;
7542af2a
AM
903 if (expld.result.section == NULL)
904 expld.result.section = expld.section;
e9ee469a
AM
905 h->u.def.section = expld.result.section;
906 if (tree->type.node_class == etree_provide)
907 tree->type.node_class = etree_provided;
1338dd10
PB
908
909 /* Copy the symbol type if this is a simple assignment of
f37a7048
NS
910 one symbol to another. This could be more general
911 (e.g. a ?: operator with NAMEs in each branch). */
1338dd10
PB
912 if (tree->assign.src->type.node_class == etree_name)
913 {
914 struct bfd_link_hash_entry *hsrc;
915
916 hsrc = bfd_link_hash_lookup (link_info.hash,
917 tree->assign.src->name.name,
918 FALSE, FALSE, TRUE);
919 if (hsrc)
920 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
921 hsrc);
922 }
252b5132 923 }
e092cb30
AM
924 else if (expld.phase == lang_final_phase_enum)
925 {
926 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
927 FALSE, FALSE, TRUE);
928 if (h != NULL
929 && h->type == bfd_link_hash_new)
930 h->type = bfd_link_hash_undefined;
931 }
252b5132
RH
932 }
933 break;
934
935 case etree_name:
e9ee469a 936 fold_name (tree);
252b5132
RH
937 break;
938
939 default:
940 FAIL ();
e9ee469a 941 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
942 break;
943 }
252b5132
RH
944}
945
e9ee469a
AM
946void
947exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
75ff4589 948{
e9ee469a
AM
949 expld.dot = *dotp;
950 expld.dotp = dotp;
951 expld.section = current_section;
952 exp_fold_tree_1 (tree);
75ff4589
L
953}
954
e759c116 955void
e9ee469a 956exp_fold_tree_no_dot (etree_type *tree)
252b5132 957{
e9ee469a
AM
958 expld.dot = 0;
959 expld.dotp = NULL;
960 expld.section = bfd_abs_section_ptr;
961 exp_fold_tree_1 (tree);
252b5132
RH
962}
963
964etree_type *
1579bae1 965exp_binop (int code, etree_type *lhs, etree_type *rhs)
252b5132 966{
d3ce72d0 967 etree_type value, *new_e;
252b5132
RH
968
969 value.type.node_code = code;
dab69f68 970 value.type.filename = lhs->type.filename;
f856040a 971 value.type.lineno = lhs->type.lineno;
252b5132
RH
972 value.binary.lhs = lhs;
973 value.binary.rhs = rhs;
974 value.type.node_class = etree_binary;
e9ee469a
AM
975 exp_fold_tree_no_dot (&value);
976 if (expld.result.valid_p)
977 return exp_intop (expld.result.value);
978
d3ce72d0
NC
979 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
980 memcpy (new_e, &value, sizeof (new_e->binary));
981 return new_e;
252b5132
RH
982}
983
984etree_type *
1579bae1 985exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
252b5132 986{
d3ce72d0 987 etree_type value, *new_e;
e9ee469a 988
252b5132 989 value.type.node_code = code;
dab69f68
AM
990 value.type.filename = cond->type.filename;
991 value.type.lineno = cond->type.lineno;
252b5132
RH
992 value.trinary.lhs = lhs;
993 value.trinary.cond = cond;
994 value.trinary.rhs = rhs;
995 value.type.node_class = etree_trinary;
e9ee469a
AM
996 exp_fold_tree_no_dot (&value);
997 if (expld.result.valid_p)
998 return exp_intop (expld.result.value);
c7d701b0 999
d3ce72d0
NC
1000 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1001 memcpy (new_e, &value, sizeof (new_e->trinary));
1002 return new_e;
252b5132
RH
1003}
1004
252b5132 1005etree_type *
1579bae1 1006exp_unop (int code, etree_type *child)
252b5132 1007{
d3ce72d0 1008 etree_type value, *new_e;
252b5132 1009
252b5132 1010 value.unary.type.node_code = code;
dab69f68 1011 value.unary.type.filename = child->type.filename;
f856040a 1012 value.unary.type.lineno = child->type.lineno;
252b5132
RH
1013 value.unary.child = child;
1014 value.unary.type.node_class = etree_unary;
e9ee469a
AM
1015 exp_fold_tree_no_dot (&value);
1016 if (expld.result.valid_p)
1017 return exp_intop (expld.result.value);
c7d701b0 1018
d3ce72d0
NC
1019 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1020 memcpy (new_e, &value, sizeof (new_e->unary));
1021 return new_e;
252b5132
RH
1022}
1023
252b5132 1024etree_type *
1579bae1 1025exp_nameop (int code, const char *name)
252b5132 1026{
d3ce72d0 1027 etree_type value, *new_e;
e9ee469a 1028
252b5132 1029 value.name.type.node_code = code;
dab69f68 1030 value.name.type.filename = ldlex_filename ();
f856040a 1031 value.name.type.lineno = lineno;
252b5132
RH
1032 value.name.name = name;
1033 value.name.type.node_class = etree_name;
1034
e9ee469a
AM
1035 exp_fold_tree_no_dot (&value);
1036 if (expld.result.valid_p)
1037 return exp_intop (expld.result.value);
c7d701b0 1038
d3ce72d0
NC
1039 new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1040 memcpy (new_e, &value, sizeof (new_e->name));
1041 return new_e;
252b5132
RH
1042
1043}
1044
2e57b2af
AM
1045static etree_type *
1046exp_assop (const char *dst,
1047 etree_type *src,
1048 enum node_tree_enum class,
1049 bfd_boolean hidden)
252b5132
RH
1050{
1051 etree_type *n;
1052
1e9cc1c2 1053 n = (etree_type *) stat_alloc (sizeof (n->assign));
252b5132 1054 n->assign.type.node_code = '=';
dab69f68 1055 n->assign.type.filename = src->type.filename;
f856040a 1056 n->assign.type.lineno = src->type.lineno;
2e57b2af 1057 n->assign.type.node_class = class;
252b5132
RH
1058 n->assign.src = src;
1059 n->assign.dst = dst;
7af8e998 1060 n->assign.hidden = hidden;
252b5132
RH
1061 return n;
1062}
1063
2e57b2af
AM
1064etree_type *
1065exp_assign (const char *dst, etree_type *src)
1066{
1067 return exp_assop (dst, src, etree_assign, FALSE);
1068}
1069
1070etree_type *
1071exp_defsym (const char *dst, etree_type *src)
1072{
1073 return exp_assop (dst, src, etree_assign, TRUE);
1074}
1075
1076/* Handle PROVIDE. */
1077
1078etree_type *
1079exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1080{
1081 return exp_assop (dst, src, etree_provide, hidden);
1082}
1083
252b5132
RH
1084/* Handle ASSERT. */
1085
1086etree_type *
1579bae1 1087exp_assert (etree_type *exp, const char *message)
252b5132
RH
1088{
1089 etree_type *n;
1090
1e9cc1c2 1091 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
252b5132 1092 n->assert_s.type.node_code = '!';
dab69f68 1093 n->assert_s.type.filename = exp->type.filename;
f856040a 1094 n->assert_s.type.lineno = exp->type.lineno;
252b5132
RH
1095 n->assert_s.type.node_class = etree_assert;
1096 n->assert_s.child = exp;
1097 n->assert_s.message = message;
1098 return n;
1099}
1100
4de2d33d 1101void
1579bae1 1102exp_print_tree (etree_type *tree)
252b5132 1103{
ae78bbeb
AM
1104 bfd_boolean function_like;
1105
c7d701b0
NC
1106 if (config.map_file == NULL)
1107 config.map_file = stderr;
b7a26f91 1108
c7d701b0
NC
1109 if (tree == NULL)
1110 {
1111 minfo ("NULL TREE\n");
1112 return;
1113 }
b7a26f91 1114
8c95a62e
KH
1115 switch (tree->type.node_class)
1116 {
1117 case etree_value:
1118 minfo ("0x%v", tree->value.value);
1119 return;
1120 case etree_rel:
1121 if (tree->rel.section->owner != NULL)
1122 minfo ("%B:", tree->rel.section->owner);
1123 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1124 return;
1125 case etree_assign:
ae78bbeb 1126 fputs (tree->assign.dst, config.map_file);
b34976b6 1127 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
1128 exp_print_tree (tree->assign.src);
1129 break;
1130 case etree_provide:
b46a87b1 1131 case etree_provided:
8c95a62e
KH
1132 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1133 exp_print_tree (tree->assign.src);
ae78bbeb 1134 fputc (')', config.map_file);
8c95a62e
KH
1135 break;
1136 case etree_binary:
ae78bbeb
AM
1137 function_like = FALSE;
1138 switch (tree->type.node_code)
1139 {
1140 case MAX_K:
1141 case MIN_K:
1142 case ALIGN_K:
1143 case DATA_SEGMENT_ALIGN:
1144 case DATA_SEGMENT_RELRO_END:
1145 function_like = TRUE;
1146 }
1147 if (function_like)
1148 {
1149 exp_print_token (tree->type.node_code, FALSE);
1150 fputc (' ', config.map_file);
1151 }
1152 fputc ('(', config.map_file);
8c95a62e 1153 exp_print_tree (tree->binary.lhs);
ae78bbeb
AM
1154 if (function_like)
1155 fprintf (config.map_file, ", ");
1156 else
1157 exp_print_token (tree->type.node_code, TRUE);
8c95a62e 1158 exp_print_tree (tree->binary.rhs);
ae78bbeb 1159 fputc (')', config.map_file);
8c95a62e
KH
1160 break;
1161 case etree_trinary:
1162 exp_print_tree (tree->trinary.cond);
ae78bbeb 1163 fputc ('?', config.map_file);
8c95a62e 1164 exp_print_tree (tree->trinary.lhs);
ae78bbeb 1165 fputc (':', config.map_file);
8c95a62e
KH
1166 exp_print_tree (tree->trinary.rhs);
1167 break;
1168 case etree_unary:
b34976b6 1169 exp_print_token (tree->unary.type.node_code, FALSE);
8c95a62e
KH
1170 if (tree->unary.child)
1171 {
7b17f854 1172 fprintf (config.map_file, " (");
8c95a62e 1173 exp_print_tree (tree->unary.child);
ae78bbeb 1174 fputc (')', config.map_file);
8c95a62e
KH
1175 }
1176 break;
1177
1178 case etree_assert:
1179 fprintf (config.map_file, "ASSERT (");
1180 exp_print_tree (tree->assert_s.child);
1181 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1182 break;
1183
8c95a62e
KH
1184 case etree_name:
1185 if (tree->type.node_code == NAME)
ae78bbeb 1186 fputs (tree->name.name, config.map_file);
8c95a62e
KH
1187 else
1188 {
b34976b6 1189 exp_print_token (tree->type.node_code, FALSE);
8c95a62e 1190 if (tree->name.name)
7b17f854 1191 fprintf (config.map_file, " (%s)", tree->name.name);
8c95a62e
KH
1192 }
1193 break;
1194 default:
1195 FAIL ();
1196 break;
252b5132 1197 }
252b5132
RH
1198}
1199
1200bfd_vma
e9ee469a 1201exp_get_vma (etree_type *tree, bfd_vma def, char *name)
252b5132 1202{
252b5132
RH
1203 if (tree != NULL)
1204 {
e9ee469a
AM
1205 exp_fold_tree_no_dot (tree);
1206 if (expld.result.valid_p)
1207 return expld.result.value;
1208 else if (name != NULL && expld.phase != lang_mark_phase_enum)
dab69f68
AM
1209 einfo (_("%F%S: nonconstant expression for %s\n"),
1210 tree, name);
252b5132 1211 }
e9ee469a 1212 return def;
252b5132
RH
1213}
1214
4de2d33d 1215int
e9ee469a 1216exp_get_value_int (etree_type *tree, int def, char *name)
252b5132 1217{
e9ee469a 1218 return exp_get_vma (tree, def, name);
252b5132
RH
1219}
1220
2c382fb6 1221fill_type *
e9ee469a 1222exp_get_fill (etree_type *tree, fill_type *def, char *name)
2c382fb6
AM
1223{
1224 fill_type *fill;
2c382fb6
AM
1225 size_t len;
1226 unsigned int val;
1227
1228 if (tree == NULL)
1229 return def;
1230
e9ee469a
AM
1231 exp_fold_tree_no_dot (tree);
1232 if (!expld.result.valid_p)
1233 {
1234 if (name != NULL && expld.phase != lang_mark_phase_enum)
dab69f68
AM
1235 einfo (_("%F%S: nonconstant expression for %s\n"),
1236 tree, name);
e9ee469a
AM
1237 return def;
1238 }
2c382fb6 1239
e9ee469a 1240 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
2c382fb6
AM
1241 {
1242 unsigned char *dst;
1243 unsigned char *s;
1e9cc1c2 1244 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
2c382fb6
AM
1245 fill->size = (len + 1) / 2;
1246 dst = fill->data;
e9ee469a 1247 s = (unsigned char *) expld.result.str;
2c382fb6
AM
1248 val = 0;
1249 do
1250 {
1251 unsigned int digit;
1252
1253 digit = *s++ - '0';
1254 if (digit > 9)
1255 digit = (digit - 'A' + '0' + 10) & 0xf;
1256 val <<= 4;
1257 val += digit;
1258 --len;
1259 if ((len & 1) == 0)
1260 {
1261 *dst++ = val;
1262 val = 0;
1263 }
1264 }
1265 while (len != 0);
1266 }
1267 else
1268 {
1e9cc1c2 1269 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
e9ee469a 1270 val = expld.result.value;
2c382fb6
AM
1271 fill->data[0] = (val >> 24) & 0xff;
1272 fill->data[1] = (val >> 16) & 0xff;
1273 fill->data[2] = (val >> 8) & 0xff;
1274 fill->data[3] = (val >> 0) & 0xff;
1275 fill->size = 4;
1276 }
1277 return fill;
1278}
1279
252b5132 1280bfd_vma
e9ee469a 1281exp_get_abs_int (etree_type *tree, int def, char *name)
252b5132 1282{
e9ee469a
AM
1283 if (tree != NULL)
1284 {
1285 exp_fold_tree_no_dot (tree);
c7d701b0 1286
e9ee469a
AM
1287 if (expld.result.valid_p)
1288 {
7542af2a
AM
1289 if (expld.result.section != NULL)
1290 expld.result.value += expld.result.section->vma;
e9ee469a
AM
1291 return expld.result.value;
1292 }
1293 else if (name != NULL && expld.phase != lang_mark_phase_enum)
f856040a 1294 {
dab69f68
AM
1295 einfo (_("%F%S: nonconstant expression for %s\n"),
1296 tree, name);
f856040a 1297 }
e9ee469a
AM
1298 }
1299 return def;
252b5132 1300}
c553bb91 1301
e5caa5e0
AM
1302static bfd_vma
1303align_n (bfd_vma value, bfd_vma align)
c553bb91
AM
1304{
1305 if (align <= 1)
1306 return value;
1307
1308 value = (value + align - 1) / align;
1309 return value * align;
1310}