Don't hardcode .got.plt into DATA_SEGMENT_RELRO_END evaluation
[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{
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 {
2aa9aad9
NC
593 if (expld.phase == lang_mark_phase_enum)
594 new_rel (h->u.def.value, h->u.def.section);
595 else
7542af2a
AM
596 einfo (_("%X%S: unresolvable symbol `%s'"
597 " referenced in expression\n"),
dab69f68 598 tree, tree->name.name);
8c95a62e 599 }
5c3049d2
AM
600 else if (output_section == bfd_abs_section_ptr
601 && (expld.section != bfd_abs_section_ptr
01554a74 602 || config.sane_expr))
abf4be64 603 new_number (h->u.def.value + h->u.def.section->output_offset);
7542af2a
AM
604 else
605 new_rel (h->u.def.value + h->u.def.section->output_offset,
606 output_section);
8c95a62e 607 }
e9ee469a 608 else if (expld.phase == lang_final_phase_enum
ec8460b5
AM
609 || (expld.phase != lang_mark_phase_enum
610 && expld.assigning_to_dot))
dab69f68
AM
611 einfo (_("%F%S: undefined symbol `%s'"
612 " referenced in expression\n"),
613 tree, tree->name.name);
1b493742
NS
614 else if (h->type == bfd_link_hash_new)
615 {
616 h->type = bfd_link_hash_undefined;
617 h->u.undef.abfd = NULL;
3eda52aa 618 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
a010d60f 619 bfd_link_add_undef (link_info.hash, h);
1b493742 620 }
8c95a62e
KH
621 }
622 break;
623
624 case ADDR:
e9ee469a 625 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
626 {
627 lang_output_section_statement_type *os;
628
629 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
630 if (os == NULL)
631 {
632 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
633 einfo (_("%F%S: undefined section `%s'"
634 " referenced in expression\n"),
635 tree, tree->name.name);
cc3e2771
NS
636 }
637 else if (os->processed_vma)
5942515f 638 new_rel (0, os->bfd_section);
8c95a62e 639 }
8c95a62e
KH
640 break;
641
642 case LOADADDR:
e9ee469a 643 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
644 {
645 lang_output_section_statement_type *os;
646
647 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
648 if (os == NULL)
649 {
650 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
651 einfo (_("%F%S: undefined section `%s'"
652 " referenced in expression\n"),
653 tree, tree->name.name);
cc3e2771
NS
654 }
655 else if (os->processed_lma)
1b493742 656 {
e9ee469a 657 if (os->load_base == NULL)
3e23777d 658 new_abs (os->bfd_section->lma);
e9ee469a 659 else
67469e1f
AM
660 {
661 exp_fold_tree_1 (os->load_base);
819da74e
AM
662 if (expld.result.valid_p)
663 make_abs ();
67469e1f 664 }
1b493742 665 }
8c95a62e 666 }
8c95a62e
KH
667 break;
668
669 case SIZEOF:
362c1d1a 670 case ALIGNOF:
e9ee469a 671 if (expld.phase != lang_first_phase_enum)
8c95a62e 672 {
8c95a62e
KH
673 lang_output_section_statement_type *os;
674
675 os = lang_output_section_find (tree->name.name);
5397b1fe 676 if (os == NULL)
cc3e2771
NS
677 {
678 if (expld.phase == lang_final_phase_enum)
dab69f68
AM
679 einfo (_("%F%S: undefined section `%s'"
680 " referenced in expression\n"),
681 tree, tree->name.name);
7542af2a 682 new_number (0);
cc3e2771 683 }
17d6eea5 684 else if (os->bfd_section != NULL)
362c1d1a
NS
685 {
686 bfd_vma val;
687
688 if (tree->type.node_code == SIZEOF)
f13a99db
AM
689 val = (os->bfd_section->size
690 / bfd_octets_per_byte (link_info.output_bfd));
362c1d1a
NS
691 else
692 val = (bfd_vma)1 << os->bfd_section->alignment_power;
693
7542af2a 694 new_number (val);
362c1d1a 695 }
17d6eea5
L
696 else
697 new_number (0);
8c95a62e 698 }
8c95a62e
KH
699 break;
700
3ec57632
NC
701 case LENGTH:
702 {
703 lang_memory_region_type *mem;
704
705 mem = lang_memory_region_lookup (tree->name.name, FALSE);
706 if (mem != NULL)
7542af2a 707 new_number (mem->length);
3ec57632 708 else
e9ee469a 709 einfo (_("%F%S: undefined MEMORY region `%s'"
dab69f68
AM
710 " referenced in expression\n"),
711 tree, tree->name.name);
3ec57632
NC
712 }
713 break;
714
715 case ORIGIN:
7542af2a
AM
716 if (expld.phase != lang_first_phase_enum)
717 {
718 lang_memory_region_type *mem;
3ec57632 719
7542af2a
AM
720 mem = lang_memory_region_lookup (tree->name.name, FALSE);
721 if (mem != NULL)
722 new_rel_from_abs (mem->origin);
723 else
724 einfo (_("%F%S: undefined MEMORY region `%s'"
dab69f68
AM
725 " referenced in expression\n"),
726 tree, tree->name.name);
7542af2a 727 }
3ec57632
NC
728 break;
729
24718e3b
L
730 case CONSTANT:
731 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
7542af2a 732 new_number (config.maxpagesize);
24718e3b 733 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
7542af2a 734 new_number (config.commonpagesize);
24718e3b
L
735 else
736 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
dab69f68 737 tree, tree->name.name);
24718e3b
L
738 break;
739
8c95a62e
KH
740 default:
741 FAIL ();
742 break;
743 }
252b5132 744}
8c95a62e 745
e9ee469a
AM
746static void
747exp_fold_tree_1 (etree_type *tree)
252b5132 748{
252b5132
RH
749 if (tree == NULL)
750 {
e9ee469a
AM
751 memset (&expld.result, 0, sizeof (expld.result));
752 return;
252b5132
RH
753 }
754
4de2d33d 755 switch (tree->type.node_class)
252b5132
RH
756 {
757 case etree_value:
5c3049d2 758 if (expld.section == bfd_abs_section_ptr
01554a74 759 && !config.sane_expr)
5c3049d2
AM
760 new_abs (tree->value.value);
761 else
762 new_number (tree->value.value);
5942515f 763 expld.result.str = tree->value.str;
252b5132
RH
764 break;
765
766 case etree_rel:
e9ee469a
AM
767 if (expld.phase != lang_first_phase_enum)
768 {
769 asection *output_section = tree->rel.section->output_section;
770 new_rel (tree->rel.value + tree->rel.section->output_offset,
5942515f 771 output_section);
e9ee469a 772 }
252b5132 773 else
e9ee469a 774 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
775 break;
776
777 case etree_assert:
e9ee469a 778 exp_fold_tree_1 (tree->assert_s.child);
5397b1fe
AM
779 if (expld.phase == lang_final_phase_enum && !expld.result.value)
780 einfo ("%X%P: %s\n", tree->assert_s.message);
252b5132
RH
781 break;
782
783 case etree_unary:
e9ee469a 784 fold_unary (tree);
252b5132
RH
785 break;
786
787 case etree_binary:
e9ee469a 788 fold_binary (tree);
252b5132 789 break;
0ae1cf52
AM
790
791 case etree_trinary:
e9ee469a 792 fold_trinary (tree);
0ae1cf52 793 break;
252b5132
RH
794
795 case etree_assign:
796 case etree_provide:
b46a87b1 797 case etree_provided:
252b5132
RH
798 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
799 {
b46a87b1 800 if (tree->type.node_class != etree_assign)
dab69f68
AM
801 einfo (_("%F%S can not PROVIDE assignment to"
802 " location counter\n"), tree);
ec8460b5 803 if (expld.phase != lang_first_phase_enum)
252b5132 804 {
fbbb9ac5 805 /* Notify the folder that this is an assignment to dot. */
e9ee469a
AM
806 expld.assigning_to_dot = TRUE;
807 exp_fold_tree_1 (tree->assign.src);
808 expld.assigning_to_dot = FALSE;
809
810 if (!expld.result.valid_p)
811 {
812 if (expld.phase != lang_mark_phase_enum)
dab69f68
AM
813 einfo (_("%F%S invalid assignment to"
814 " location counter\n"), tree);
e9ee469a
AM
815 }
816 else if (expld.dotp == NULL)
817 einfo (_("%F%S assignment to location counter"
ec8460b5
AM
818 " invalid outside of SECTIONS\n"), tree);
819
820 /* After allocation, assignment to dot should not be
821 done inside an output section since allocation adds a
822 padding statement that effectively duplicates the
823 assignment. */
824 else if (expld.phase <= lang_allocating_phase_enum
825 || expld.section == bfd_abs_section_ptr)
252b5132 826 {
e9ee469a
AM
827 bfd_vma nextdot;
828
7542af2a
AM
829 nextdot = expld.result.value;
830 if (expld.result.section != NULL)
831 nextdot += expld.result.section->vma;
832 else
833 nextdot += expld.section->vma;
e9ee469a
AM
834 if (nextdot < expld.dot
835 && expld.section != bfd_abs_section_ptr)
836 einfo (_("%F%S cannot move location counter backwards"
dab69f68
AM
837 " (from %V to %V)\n"),
838 tree, expld.dot, nextdot);
252b5132
RH
839 else
840 {
e9ee469a
AM
841 expld.dot = nextdot;
842 *expld.dotp = nextdot;
252b5132
RH
843 }
844 }
845 }
8b3d8fa8 846 else
e9ee469a 847 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
848 }
849 else
850 {
f37a7048
NS
851 etree_type *name;
852
e9ee469a 853 struct bfd_link_hash_entry *h = NULL;
252b5132 854
e9ee469a
AM
855 if (tree->type.node_class == etree_provide)
856 {
252b5132 857 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
e9ee469a
AM
858 FALSE, FALSE, TRUE);
859 if (h == NULL
860 || (h->type != bfd_link_hash_new
861 && h->type != bfd_link_hash_undefined
862 && h->type != bfd_link_hash_common))
863 {
864 /* Do nothing. The symbol was never referenced, or was
865 defined by some object. */
866 break;
867 }
868 }
869
f37a7048
NS
870 name = tree->assign.src;
871 if (name->type.node_class == etree_trinary)
872 {
873 exp_fold_tree_1 (name->trinary.cond);
874 if (expld.result.valid_p)
875 name = (expld.result.value
876 ? name->trinary.lhs : name->trinary.rhs);
877 }
878
879 if (name->type.node_class == etree_name
880 && name->type.node_code == NAME
881 && strcmp (tree->assign.dst, name->name.name) == 0)
882 /* Leave it alone. Do not replace a symbol with its own
883 output address, in case there is another section sizing
884 pass. Folding does not preserve input sections. */
885 break;
886
e9ee469a 887 exp_fold_tree_1 (tree->assign.src);
e759c116 888 if (expld.result.valid_p
2aa9aad9 889 || (expld.phase <= lang_mark_phase_enum
01554a74
AM
890 && tree->type.node_class == etree_assign
891 && tree->assign.hidden))
e9ee469a 892 {
1579bae1 893 if (h == NULL)
67010b46 894 {
e9ee469a
AM
895 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
896 TRUE, FALSE, TRUE);
897 if (h == NULL)
67010b46
NC
898 einfo (_("%P%F:%s: hash creation failed\n"),
899 tree->assign.dst);
900 }
e9ee469a
AM
901
902 /* FIXME: Should we worry if the symbol is already
903 defined? */
904 lang_update_definedness (tree->assign.dst, h);
905 h->type = bfd_link_hash_defined;
906 h->u.def.value = expld.result.value;
7542af2a
AM
907 if (expld.result.section == NULL)
908 expld.result.section = expld.section;
e9ee469a
AM
909 h->u.def.section = expld.result.section;
910 if (tree->type.node_class == etree_provide)
911 tree->type.node_class = etree_provided;
1338dd10
PB
912
913 /* Copy the symbol type if this is a simple assignment of
f37a7048
NS
914 one symbol to another. This could be more general
915 (e.g. a ?: operator with NAMEs in each branch). */
1338dd10
PB
916 if (tree->assign.src->type.node_class == etree_name)
917 {
918 struct bfd_link_hash_entry *hsrc;
919
920 hsrc = bfd_link_hash_lookup (link_info.hash,
921 tree->assign.src->name.name,
922 FALSE, FALSE, TRUE);
923 if (hsrc)
924 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
925 hsrc);
926 }
252b5132 927 }
e092cb30
AM
928 else if (expld.phase == lang_final_phase_enum)
929 {
930 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
931 FALSE, FALSE, TRUE);
932 if (h != NULL
933 && h->type == bfd_link_hash_new)
934 h->type = bfd_link_hash_undefined;
935 }
252b5132
RH
936 }
937 break;
938
939 case etree_name:
e9ee469a 940 fold_name (tree);
252b5132
RH
941 break;
942
943 default:
944 FAIL ();
e9ee469a 945 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
946 break;
947 }
252b5132
RH
948}
949
e9ee469a
AM
950void
951exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
75ff4589 952{
e9ee469a
AM
953 expld.dot = *dotp;
954 expld.dotp = dotp;
955 expld.section = current_section;
956 exp_fold_tree_1 (tree);
75ff4589
L
957}
958
e759c116 959void
e9ee469a 960exp_fold_tree_no_dot (etree_type *tree)
252b5132 961{
e9ee469a
AM
962 expld.dot = 0;
963 expld.dotp = NULL;
964 expld.section = bfd_abs_section_ptr;
965 exp_fold_tree_1 (tree);
252b5132
RH
966}
967
968etree_type *
1579bae1 969exp_binop (int code, etree_type *lhs, etree_type *rhs)
252b5132 970{
d3ce72d0 971 etree_type value, *new_e;
252b5132
RH
972
973 value.type.node_code = code;
dab69f68 974 value.type.filename = lhs->type.filename;
f856040a 975 value.type.lineno = lhs->type.lineno;
252b5132
RH
976 value.binary.lhs = lhs;
977 value.binary.rhs = rhs;
978 value.type.node_class = etree_binary;
e9ee469a
AM
979 exp_fold_tree_no_dot (&value);
980 if (expld.result.valid_p)
981 return exp_intop (expld.result.value);
982
d3ce72d0
NC
983 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
984 memcpy (new_e, &value, sizeof (new_e->binary));
985 return new_e;
252b5132
RH
986}
987
988etree_type *
1579bae1 989exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
252b5132 990{
d3ce72d0 991 etree_type value, *new_e;
e9ee469a 992
252b5132 993 value.type.node_code = code;
dab69f68
AM
994 value.type.filename = cond->type.filename;
995 value.type.lineno = cond->type.lineno;
252b5132
RH
996 value.trinary.lhs = lhs;
997 value.trinary.cond = cond;
998 value.trinary.rhs = rhs;
999 value.type.node_class = etree_trinary;
e9ee469a
AM
1000 exp_fold_tree_no_dot (&value);
1001 if (expld.result.valid_p)
1002 return exp_intop (expld.result.value);
c7d701b0 1003
d3ce72d0
NC
1004 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1005 memcpy (new_e, &value, sizeof (new_e->trinary));
1006 return new_e;
252b5132
RH
1007}
1008
252b5132 1009etree_type *
1579bae1 1010exp_unop (int code, etree_type *child)
252b5132 1011{
d3ce72d0 1012 etree_type value, *new_e;
252b5132 1013
252b5132 1014 value.unary.type.node_code = code;
dab69f68 1015 value.unary.type.filename = child->type.filename;
f856040a 1016 value.unary.type.lineno = child->type.lineno;
252b5132
RH
1017 value.unary.child = child;
1018 value.unary.type.node_class = etree_unary;
e9ee469a
AM
1019 exp_fold_tree_no_dot (&value);
1020 if (expld.result.valid_p)
1021 return exp_intop (expld.result.value);
c7d701b0 1022
d3ce72d0
NC
1023 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1024 memcpy (new_e, &value, sizeof (new_e->unary));
1025 return new_e;
252b5132
RH
1026}
1027
252b5132 1028etree_type *
1579bae1 1029exp_nameop (int code, const char *name)
252b5132 1030{
d3ce72d0 1031 etree_type value, *new_e;
e9ee469a 1032
252b5132 1033 value.name.type.node_code = code;
dab69f68 1034 value.name.type.filename = ldlex_filename ();
f856040a 1035 value.name.type.lineno = lineno;
252b5132
RH
1036 value.name.name = name;
1037 value.name.type.node_class = etree_name;
1038
e9ee469a
AM
1039 exp_fold_tree_no_dot (&value);
1040 if (expld.result.valid_p)
1041 return exp_intop (expld.result.value);
c7d701b0 1042
d3ce72d0
NC
1043 new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1044 memcpy (new_e, &value, sizeof (new_e->name));
1045 return new_e;
252b5132
RH
1046
1047}
1048
2e57b2af
AM
1049static etree_type *
1050exp_assop (const char *dst,
1051 etree_type *src,
1052 enum node_tree_enum class,
1053 bfd_boolean hidden)
252b5132
RH
1054{
1055 etree_type *n;
1056
1e9cc1c2 1057 n = (etree_type *) stat_alloc (sizeof (n->assign));
252b5132 1058 n->assign.type.node_code = '=';
dab69f68 1059 n->assign.type.filename = src->type.filename;
f856040a 1060 n->assign.type.lineno = src->type.lineno;
2e57b2af 1061 n->assign.type.node_class = class;
252b5132
RH
1062 n->assign.src = src;
1063 n->assign.dst = dst;
7af8e998 1064 n->assign.hidden = hidden;
252b5132
RH
1065 return n;
1066}
1067
2e57b2af
AM
1068etree_type *
1069exp_assign (const char *dst, etree_type *src)
1070{
1071 return exp_assop (dst, src, etree_assign, FALSE);
1072}
1073
1074etree_type *
1075exp_defsym (const char *dst, etree_type *src)
1076{
1077 return exp_assop (dst, src, etree_assign, TRUE);
1078}
1079
1080/* Handle PROVIDE. */
1081
1082etree_type *
1083exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1084{
1085 return exp_assop (dst, src, etree_provide, hidden);
1086}
1087
252b5132
RH
1088/* Handle ASSERT. */
1089
1090etree_type *
1579bae1 1091exp_assert (etree_type *exp, const char *message)
252b5132
RH
1092{
1093 etree_type *n;
1094
1e9cc1c2 1095 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
252b5132 1096 n->assert_s.type.node_code = '!';
dab69f68 1097 n->assert_s.type.filename = exp->type.filename;
f856040a 1098 n->assert_s.type.lineno = exp->type.lineno;
252b5132
RH
1099 n->assert_s.type.node_class = etree_assert;
1100 n->assert_s.child = exp;
1101 n->assert_s.message = message;
1102 return n;
1103}
1104
4de2d33d 1105void
1579bae1 1106exp_print_tree (etree_type *tree)
252b5132 1107{
ae78bbeb
AM
1108 bfd_boolean function_like;
1109
c7d701b0
NC
1110 if (config.map_file == NULL)
1111 config.map_file = stderr;
b7a26f91 1112
c7d701b0
NC
1113 if (tree == NULL)
1114 {
1115 minfo ("NULL TREE\n");
1116 return;
1117 }
b7a26f91 1118
8c95a62e
KH
1119 switch (tree->type.node_class)
1120 {
1121 case etree_value:
1122 minfo ("0x%v", tree->value.value);
1123 return;
1124 case etree_rel:
1125 if (tree->rel.section->owner != NULL)
1126 minfo ("%B:", tree->rel.section->owner);
1127 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1128 return;
1129 case etree_assign:
ae78bbeb 1130 fputs (tree->assign.dst, config.map_file);
b34976b6 1131 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
1132 exp_print_tree (tree->assign.src);
1133 break;
1134 case etree_provide:
b46a87b1 1135 case etree_provided:
8c95a62e
KH
1136 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1137 exp_print_tree (tree->assign.src);
ae78bbeb 1138 fputc (')', config.map_file);
8c95a62e
KH
1139 break;
1140 case etree_binary:
ae78bbeb
AM
1141 function_like = FALSE;
1142 switch (tree->type.node_code)
1143 {
1144 case MAX_K:
1145 case MIN_K:
1146 case ALIGN_K:
1147 case DATA_SEGMENT_ALIGN:
1148 case DATA_SEGMENT_RELRO_END:
1149 function_like = TRUE;
67baf8c4
TG
1150 break;
1151 case SEGMENT_START:
1152 /* Special handling because arguments are in reverse order and
1153 the segment name is quoted. */
1154 exp_print_token (tree->type.node_code, FALSE);
1155 fputs (" (\"", config.map_file);
1156 exp_print_tree (tree->binary.rhs);
1157 fputs ("\", ", config.map_file);
1158 exp_print_tree (tree->binary.lhs);
1159 fputc (')', config.map_file);
1160 return;
ae78bbeb
AM
1161 }
1162 if (function_like)
1163 {
1164 exp_print_token (tree->type.node_code, FALSE);
1165 fputc (' ', config.map_file);
1166 }
1167 fputc ('(', config.map_file);
8c95a62e 1168 exp_print_tree (tree->binary.lhs);
ae78bbeb
AM
1169 if (function_like)
1170 fprintf (config.map_file, ", ");
1171 else
1172 exp_print_token (tree->type.node_code, TRUE);
8c95a62e 1173 exp_print_tree (tree->binary.rhs);
ae78bbeb 1174 fputc (')', config.map_file);
8c95a62e
KH
1175 break;
1176 case etree_trinary:
1177 exp_print_tree (tree->trinary.cond);
ae78bbeb 1178 fputc ('?', config.map_file);
8c95a62e 1179 exp_print_tree (tree->trinary.lhs);
ae78bbeb 1180 fputc (':', config.map_file);
8c95a62e
KH
1181 exp_print_tree (tree->trinary.rhs);
1182 break;
1183 case etree_unary:
b34976b6 1184 exp_print_token (tree->unary.type.node_code, FALSE);
8c95a62e
KH
1185 if (tree->unary.child)
1186 {
7b17f854 1187 fprintf (config.map_file, " (");
8c95a62e 1188 exp_print_tree (tree->unary.child);
ae78bbeb 1189 fputc (')', config.map_file);
8c95a62e
KH
1190 }
1191 break;
1192
1193 case etree_assert:
1194 fprintf (config.map_file, "ASSERT (");
1195 exp_print_tree (tree->assert_s.child);
1196 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1197 break;
1198
8c95a62e
KH
1199 case etree_name:
1200 if (tree->type.node_code == NAME)
ae78bbeb 1201 fputs (tree->name.name, config.map_file);
8c95a62e
KH
1202 else
1203 {
b34976b6 1204 exp_print_token (tree->type.node_code, FALSE);
8c95a62e 1205 if (tree->name.name)
7b17f854 1206 fprintf (config.map_file, " (%s)", tree->name.name);
8c95a62e
KH
1207 }
1208 break;
1209 default:
1210 FAIL ();
1211 break;
252b5132 1212 }
252b5132
RH
1213}
1214
1215bfd_vma
e9ee469a 1216exp_get_vma (etree_type *tree, bfd_vma def, char *name)
252b5132 1217{
252b5132
RH
1218 if (tree != NULL)
1219 {
e9ee469a
AM
1220 exp_fold_tree_no_dot (tree);
1221 if (expld.result.valid_p)
1222 return expld.result.value;
1223 else if (name != NULL && expld.phase != lang_mark_phase_enum)
dab69f68
AM
1224 einfo (_("%F%S: nonconstant expression for %s\n"),
1225 tree, name);
252b5132 1226 }
e9ee469a 1227 return def;
252b5132
RH
1228}
1229
4de2d33d 1230int
e9ee469a 1231exp_get_value_int (etree_type *tree, int def, char *name)
252b5132 1232{
e9ee469a 1233 return exp_get_vma (tree, def, name);
252b5132
RH
1234}
1235
2c382fb6 1236fill_type *
e9ee469a 1237exp_get_fill (etree_type *tree, fill_type *def, char *name)
2c382fb6
AM
1238{
1239 fill_type *fill;
2c382fb6
AM
1240 size_t len;
1241 unsigned int val;
1242
1243 if (tree == NULL)
1244 return def;
1245
e9ee469a
AM
1246 exp_fold_tree_no_dot (tree);
1247 if (!expld.result.valid_p)
1248 {
1249 if (name != NULL && expld.phase != lang_mark_phase_enum)
dab69f68
AM
1250 einfo (_("%F%S: nonconstant expression for %s\n"),
1251 tree, name);
e9ee469a
AM
1252 return def;
1253 }
2c382fb6 1254
e9ee469a 1255 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
2c382fb6
AM
1256 {
1257 unsigned char *dst;
1258 unsigned char *s;
1e9cc1c2 1259 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
2c382fb6
AM
1260 fill->size = (len + 1) / 2;
1261 dst = fill->data;
e9ee469a 1262 s = (unsigned char *) expld.result.str;
2c382fb6
AM
1263 val = 0;
1264 do
1265 {
1266 unsigned int digit;
1267
1268 digit = *s++ - '0';
1269 if (digit > 9)
1270 digit = (digit - 'A' + '0' + 10) & 0xf;
1271 val <<= 4;
1272 val += digit;
1273 --len;
1274 if ((len & 1) == 0)
1275 {
1276 *dst++ = val;
1277 val = 0;
1278 }
1279 }
1280 while (len != 0);
1281 }
1282 else
1283 {
1e9cc1c2 1284 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
e9ee469a 1285 val = expld.result.value;
2c382fb6
AM
1286 fill->data[0] = (val >> 24) & 0xff;
1287 fill->data[1] = (val >> 16) & 0xff;
1288 fill->data[2] = (val >> 8) & 0xff;
1289 fill->data[3] = (val >> 0) & 0xff;
1290 fill->size = 4;
1291 }
1292 return fill;
1293}
1294
252b5132 1295bfd_vma
e9ee469a 1296exp_get_abs_int (etree_type *tree, int def, char *name)
252b5132 1297{
e9ee469a
AM
1298 if (tree != NULL)
1299 {
1300 exp_fold_tree_no_dot (tree);
c7d701b0 1301
e9ee469a
AM
1302 if (expld.result.valid_p)
1303 {
7542af2a
AM
1304 if (expld.result.section != NULL)
1305 expld.result.value += expld.result.section->vma;
e9ee469a
AM
1306 return expld.result.value;
1307 }
1308 else if (name != NULL && expld.phase != lang_mark_phase_enum)
f856040a 1309 {
dab69f68
AM
1310 einfo (_("%F%S: nonconstant expression for %s\n"),
1311 tree, name);
f856040a 1312 }
e9ee469a
AM
1313 }
1314 return def;
252b5132 1315}
c553bb91 1316
e5caa5e0
AM
1317static bfd_vma
1318align_n (bfd_vma value, bfd_vma align)
c553bb91
AM
1319{
1320 if (align <= 1)
1321 return value;
1322
1323 value = (value + align - 1) / align;
1324 return value * align;
1325}
This page took 0.597291 seconds and 4 git commands to generate.