]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/ldexp.c
* Makefile.am: Add eelf32_spu.o rule.
[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,
67469e1f 3 2001, 2002, 2003, 2004, 2005, 2006, 2007
87f2a346 4 Free Software Foundation, Inc.
8c95a62e 5 Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
252b5132 6
3ec57632 7 This file is part of GLD, the Gnu Linker.
252b5132 8
3ec57632
NC
9 GLD is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
252b5132 13
3ec57632
NC
14 GLD is distributed in the hope that it will be useful,
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
NC
19 You should have received a copy of the GNU General Public License
20 along with GLD; see the file COPYING. If not, write to the Free
75be928b
NC
21 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
252b5132 23
8c95a62e 24/* This module is in charge of working out the contents of expressions.
252b5132 25
8c95a62e
KH
26 It has to keep track of the relative/absness of a symbol etc. This
27 is done by keeping all values in a struct (an etree_value_type)
28 which contains a value, a section to which it is relative and a
29 valid bit. */
252b5132 30
252b5132 31#include "sysdep.h"
3db64b00 32#include "bfd.h"
252b5132
RH
33#include "bfdlink.h"
34
35#include "ld.h"
36#include "ldmain.h"
37#include "ldmisc.h"
38#include "ldexp.h"
f856040a 39#include "ldlex.h"
df2a7313 40#include <ldgram.h>
252b5132 41#include "ldlang.h"
c7d701b0 42#include "libiberty.h"
2c382fb6 43#include "safe-ctype.h"
252b5132 44
e9ee469a
AM
45static void exp_fold_tree_1 (etree_type *);
46static void exp_fold_tree_no_dot (etree_type *);
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
NC
99 { NEXT, "NEXT" },
100 { SIZEOF, "SIZEOF" },
101 { ADDR, "ADDR" },
102 { LOADADDR, "LOADADDR" },
24718e3b 103 { CONSTANT, "CONSTANT" },
c7d701b0 104 { MAX_K, "MAX_K" },
1049f94e 105 { REL, "relocatable" },
2d20f7bf 106 { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
8c37241b 107 { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
ba916c8a 108 { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
3ec57632
NC
109 { ORIGIN, "ORIGIN" },
110 { LENGTH, "LENGTH" },
ba916c8a 111 { SEGMENT_START, "SEGMENT_START" }
8c95a62e 112 };
252b5132
RH
113 unsigned int idx;
114
7b17f854
RS
115 for (idx = 0; idx < ARRAY_SIZE (table); idx++)
116 if (table[idx].code == code)
117 break;
c7d701b0 118
7b17f854
RS
119 if (infix_p)
120 fputc (' ', config.map_file);
121
122 if (idx < ARRAY_SIZE (table))
123 fputs (table[idx].name, config.map_file);
124 else if (code < 127)
125 fputc (code, config.map_file);
c7d701b0 126 else
7b17f854
RS
127 fprintf (config.map_file, "<code %d>", code);
128
129 if (infix_p)
130 fputc (' ', config.map_file);
252b5132
RH
131}
132
4de2d33d 133static void
e9ee469a 134make_abs (void)
252b5132 135{
e9ee469a
AM
136 expld.result.value += expld.result.section->vma;
137 expld.result.section = bfd_abs_section_ptr;
252b5132
RH
138}
139
e9ee469a 140static void
1579bae1 141new_abs (bfd_vma value)
252b5132 142{
e9ee469a
AM
143 expld.result.valid_p = TRUE;
144 expld.result.section = bfd_abs_section_ptr;
145 expld.result.value = value;
146 expld.result.str = NULL;
252b5132
RH
147}
148
252b5132 149etree_type *
1579bae1 150exp_intop (bfd_vma value)
252b5132 151{
1579bae1 152 etree_type *new = stat_alloc (sizeof (new->value));
252b5132 153 new->type.node_code = INT;
f856040a 154 new->type.lineno = lineno;
252b5132 155 new->value.value = value;
2c382fb6 156 new->value.str = NULL;
252b5132
RH
157 new->type.node_class = etree_value;
158 return new;
2c382fb6 159}
252b5132 160
2c382fb6 161etree_type *
1579bae1 162exp_bigintop (bfd_vma value, char *str)
2c382fb6 163{
1579bae1 164 etree_type *new = stat_alloc (sizeof (new->value));
2c382fb6 165 new->type.node_code = INT;
f856040a 166 new->type.lineno = lineno;
2c382fb6
AM
167 new->value.value = value;
168 new->value.str = str;
169 new->type.node_class = etree_value;
170 return new;
252b5132
RH
171}
172
1049f94e 173/* Build an expression representing an unnamed relocatable value. */
252b5132
RH
174
175etree_type *
1579bae1 176exp_relop (asection *section, bfd_vma value)
252b5132 177{
1579bae1 178 etree_type *new = stat_alloc (sizeof (new->rel));
252b5132 179 new->type.node_code = REL;
f856040a 180 new->type.lineno = lineno;
252b5132
RH
181 new->type.node_class = etree_rel;
182 new->rel.section = section;
183 new->rel.value = value;
184 return new;
185}
186
e9ee469a
AM
187static void
188new_rel (bfd_vma value, char *str, asection *section)
252b5132 189{
e9ee469a
AM
190 expld.result.valid_p = TRUE;
191 expld.result.value = value;
192 expld.result.str = str;
193 expld.result.section = section;
252b5132
RH
194}
195
e9ee469a
AM
196static void
197new_rel_from_abs (bfd_vma value)
252b5132 198{
e9ee469a
AM
199 expld.result.valid_p = TRUE;
200 expld.result.value = value - expld.section->vma;
201 expld.result.str = NULL;
202 expld.result.section = expld.section;
252b5132
RH
203}
204
e9ee469a
AM
205static void
206fold_unary (etree_type *tree)
0ae1cf52 207{
e9ee469a
AM
208 exp_fold_tree_1 (tree->unary.child);
209 if (expld.result.valid_p)
0ae1cf52
AM
210 {
211 switch (tree->type.node_code)
212 {
213 case ALIGN_K:
e9ee469a 214 if (expld.phase != lang_first_phase_enum)
dea2f0a8 215 new_rel_from_abs (align_n (expld.dot, expld.result.value));
0ae1cf52 216 else
e9ee469a 217 expld.result.valid_p = FALSE;
0ae1cf52
AM
218 break;
219
220 case ABSOLUTE:
e9ee469a 221 make_abs ();
0ae1cf52
AM
222 break;
223
224 case '~':
e9ee469a
AM
225 make_abs ();
226 expld.result.value = ~expld.result.value;
0ae1cf52
AM
227 break;
228
229 case '!':
e9ee469a
AM
230 make_abs ();
231 expld.result.value = !expld.result.value;
0ae1cf52
AM
232 break;
233
234 case '-':
e9ee469a
AM
235 make_abs ();
236 expld.result.value = -expld.result.value;
0ae1cf52
AM
237 break;
238
239 case NEXT:
240 /* Return next place aligned to value. */
e9ee469a 241 if (expld.phase != lang_first_phase_enum)
0ae1cf52 242 {
e9ee469a
AM
243 make_abs ();
244 expld.result.value = align_n (expld.dot, expld.result.value);
0ae1cf52
AM
245 }
246 else
e9ee469a 247 expld.result.valid_p = FALSE;
0ae1cf52
AM
248 break;
249
250 case DATA_SEGMENT_END:
e9ee469a
AM
251 if (expld.phase != lang_first_phase_enum
252 && expld.section == bfd_abs_section_ptr
253 && (expld.dataseg.phase == exp_dataseg_align_seen
254 || expld.dataseg.phase == exp_dataseg_relro_seen
255 || expld.dataseg.phase == exp_dataseg_adjust
256 || expld.dataseg.phase == exp_dataseg_relro_adjust
257 || expld.phase == lang_final_phase_enum))
0ae1cf52 258 {
e9ee469a
AM
259 if (expld.dataseg.phase == exp_dataseg_align_seen
260 || expld.dataseg.phase == exp_dataseg_relro_seen)
0ae1cf52 261 {
e9ee469a
AM
262 expld.dataseg.phase = exp_dataseg_end_seen;
263 expld.dataseg.end = expld.result.value;
0ae1cf52
AM
264 }
265 }
266 else
e9ee469a 267 expld.result.valid_p = FALSE;
0ae1cf52
AM
268 break;
269
270 default:
271 FAIL ();
272 break;
273 }
274 }
0ae1cf52
AM
275}
276
e9ee469a
AM
277static void
278fold_binary (etree_type *tree)
252b5132 279{
e9ee469a 280 exp_fold_tree_1 (tree->binary.lhs);
ba916c8a
MM
281
282 /* The SEGMENT_START operator is special because its first
283 operand is a string, not the name of a symbol. */
e9ee469a 284 if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
ba916c8a
MM
285 {
286 const char *segment_name;
287 segment_type *seg;
288 /* Check to see if the user has overridden the default
289 value. */
290 segment_name = tree->binary.rhs->name.name;
291 for (seg = segments; seg; seg = seg->next)
292 if (strcmp (seg->name, segment_name) == 0)
293 {
294 seg->used = TRUE;
e9ee469a
AM
295 expld.result.value = seg->value;
296 expld.result.str = NULL;
297 expld.result.section = NULL;
ba916c8a
MM
298 break;
299 }
300 }
e9ee469a 301 else if (expld.result.valid_p)
252b5132 302 {
e9ee469a 303 etree_value_type lhs = expld.result;
252b5132 304
e9ee469a
AM
305 exp_fold_tree_1 (tree->binary.rhs);
306 if (expld.result.valid_p)
252b5132
RH
307 {
308 /* If the values are from different sections, or this is an
309 absolute expression, make both the source arguments
310 absolute. However, adding or subtracting an absolute
311 value from a relative value is meaningful, and is an
312 exception. */
e9ee469a
AM
313 if (expld.section != bfd_abs_section_ptr
314 && lhs.section == bfd_abs_section_ptr
315 && tree->type.node_code == '+')
316 {
317 /* Keep the section of the rhs term. */
318 expld.result.value = lhs.value + expld.result.value;
319 return;
320 }
321 else if (expld.section != bfd_abs_section_ptr
322 && expld.result.section == bfd_abs_section_ptr
252b5132
RH
323 && (tree->type.node_code == '+'
324 || tree->type.node_code == '-'))
325 {
e9ee469a
AM
326 /* Keep the section of the lhs term. */
327 expld.result.section = lhs.section;
252b5132 328 }
e9ee469a
AM
329 else if (expld.result.section != lhs.section
330 || expld.section == bfd_abs_section_ptr)
252b5132 331 {
e9ee469a
AM
332 make_abs ();
333 lhs.value += lhs.section->vma;
252b5132
RH
334 }
335
4de2d33d 336 switch (tree->type.node_code)
252b5132
RH
337 {
338 case '%':
e9ee469a
AM
339 if (expld.result.value != 0)
340 expld.result.value = ((bfd_signed_vma) lhs.value
341 % (bfd_signed_vma) expld.result.value);
342 else if (expld.phase != lang_mark_phase_enum)
252b5132 343 einfo (_("%F%S %% by zero\n"));
252b5132
RH
344 break;
345
346 case '/':
e9ee469a
AM
347 if (expld.result.value != 0)
348 expld.result.value = ((bfd_signed_vma) lhs.value
349 / (bfd_signed_vma) expld.result.value);
350 else if (expld.phase != lang_mark_phase_enum)
252b5132 351 einfo (_("%F%S / by zero\n"));
252b5132
RH
352 break;
353
e9ee469a
AM
354#define BOP(x, y) \
355 case x: \
356 expld.result.value = lhs.value y expld.result.value; \
357 break;
358
8c95a62e
KH
359 BOP ('+', +);
360 BOP ('*', *);
361 BOP ('-', -);
362 BOP (LSHIFT, <<);
363 BOP (RSHIFT, >>);
364 BOP (EQ, ==);
365 BOP (NE, !=);
366 BOP ('<', <);
367 BOP ('>', >);
368 BOP (LE, <=);
369 BOP (GE, >=);
370 BOP ('&', &);
371 BOP ('^', ^);
372 BOP ('|', |);
373 BOP (ANDAND, &&);
374 BOP (OROR, ||);
252b5132
RH
375
376 case MAX_K:
e9ee469a
AM
377 if (lhs.value > expld.result.value)
378 expld.result.value = lhs.value;
252b5132
RH
379 break;
380
381 case MIN_K:
e9ee469a
AM
382 if (lhs.value < expld.result.value)
383 expld.result.value = lhs.value;
252b5132
RH
384 break;
385
876f4090 386 case ALIGN_K:
e9ee469a 387 expld.result.value = align_n (lhs.value, expld.result.value);
876f4090 388 break;
c468c8bc 389
2d20f7bf 390 case DATA_SEGMENT_ALIGN:
e9ee469a
AM
391 if (expld.phase != lang_first_phase_enum
392 && expld.section == bfd_abs_section_ptr
393 && (expld.dataseg.phase == exp_dataseg_none
394 || expld.dataseg.phase == exp_dataseg_adjust
395 || expld.dataseg.phase == exp_dataseg_relro_adjust
396 || expld.phase == lang_final_phase_enum))
2d20f7bf 397 {
e9ee469a
AM
398 bfd_vma maxpage = lhs.value;
399 bfd_vma commonpage = expld.result.value;
2d20f7bf 400
e9ee469a
AM
401 expld.result.value = align_n (expld.dot, maxpage);
402 if (expld.dataseg.phase == exp_dataseg_relro_adjust)
403 expld.result.value = expld.dataseg.base;
404 else if (expld.dataseg.phase != exp_dataseg_adjust)
2d20f7bf 405 {
e9ee469a
AM
406 expld.result.value += expld.dot & (maxpage - 1);
407 if (expld.phase == lang_allocating_phase_enum)
2d20f7bf 408 {
e9ee469a
AM
409 expld.dataseg.phase = exp_dataseg_align_seen;
410 expld.dataseg.min_base = align_n (expld.dot, maxpage);
411 expld.dataseg.base = expld.result.value;
412 expld.dataseg.pagesize = commonpage;
413 expld.dataseg.maxpagesize = maxpage;
414 expld.dataseg.relro_end = 0;
2d20f7bf
JJ
415 }
416 }
e9ee469a
AM
417 else if (commonpage < maxpage)
418 expld.result.value += ((expld.dot + commonpage - 1)
419 & (maxpage - commonpage));
2d20f7bf
JJ
420 }
421 else
e9ee469a 422 expld.result.valid_p = FALSE;
2d20f7bf
JJ
423 break;
424
a4f5ad88 425 case DATA_SEGMENT_RELRO_END:
e9ee469a
AM
426 if (expld.phase != lang_first_phase_enum
427 && (expld.dataseg.phase == exp_dataseg_align_seen
428 || expld.dataseg.phase == exp_dataseg_adjust
429 || expld.dataseg.phase == exp_dataseg_relro_adjust
430 || expld.phase == lang_final_phase_enum))
a4f5ad88 431 {
e9ee469a
AM
432 if (expld.dataseg.phase == exp_dataseg_align_seen
433 || expld.dataseg.phase == exp_dataseg_relro_adjust)
434 expld.dataseg.relro_end = lhs.value + expld.result.value;
435
436 if (expld.dataseg.phase == exp_dataseg_relro_adjust
437 && (expld.dataseg.relro_end
438 & (expld.dataseg.pagesize - 1)))
a4f5ad88 439 {
e9ee469a
AM
440 expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
441 expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
442 expld.result.value = (expld.dataseg.relro_end
443 - expld.result.value);
a4f5ad88 444 }
e9ee469a
AM
445 else
446 expld.result.value = lhs.value;
447
448 if (expld.dataseg.phase == exp_dataseg_align_seen)
449 expld.dataseg.phase = exp_dataseg_relro_seen;
a4f5ad88
JJ
450 }
451 else
e9ee469a 452 expld.result.valid_p = FALSE;
a4f5ad88
JJ
453 break;
454
252b5132 455 default:
8c95a62e 456 FAIL ();
252b5132
RH
457 }
458 }
459 else
e9ee469a 460 expld.result.valid_p = FALSE;
252b5132 461 }
252b5132
RH
462}
463
e9ee469a
AM
464static void
465fold_trinary (etree_type *tree)
0ae1cf52 466{
e9ee469a
AM
467 exp_fold_tree_1 (tree->trinary.cond);
468 if (expld.result.valid_p)
469 exp_fold_tree_1 (expld.result.value
470 ? tree->trinary.lhs
471 : tree->trinary.rhs);
0ae1cf52
AM
472}
473
e9ee469a
AM
474static void
475fold_name (etree_type *tree)
252b5132 476{
e9ee469a 477 memset (&expld.result, 0, sizeof (expld.result));
c468c8bc 478
4de2d33d 479 switch (tree->type.node_code)
8c95a62e
KH
480 {
481 case SIZEOF_HEADERS:
e9ee469a
AM
482 if (expld.phase != lang_first_phase_enum)
483 {
484 bfd_vma hdr_size = 0;
485 /* Don't find the real header size if only marking sections;
486 The bfd function may cache incorrect data. */
487 if (expld.phase != lang_mark_phase_enum)
a6b96beb 488 hdr_size = bfd_sizeof_headers (output_bfd, &link_info);
e9ee469a
AM
489 new_abs (hdr_size);
490 }
8c95a62e 491 break;
67469e1f 492
8c95a62e 493 case DEFINED:
e9ee469a 494 if (expld.phase == lang_first_phase_enum)
1b493742 495 lang_track_definedness (tree->name.name);
8c95a62e
KH
496 else
497 {
498 struct bfd_link_hash_entry *h;
420e579c
HPN
499 int def_iteration
500 = lang_symbol_definition_iteration (tree->name.name);
8c95a62e
KH
501
502 h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info,
503 tree->name.name,
b34976b6 504 FALSE, FALSE, TRUE);
e9ee469a
AM
505 expld.result.value = (h != NULL
506 && (h->type == bfd_link_hash_defined
507 || h->type == bfd_link_hash_defweak
508 || h->type == bfd_link_hash_common)
509 && (def_iteration == lang_statement_iteration
510 || def_iteration == -1));
511 expld.result.section = bfd_abs_section_ptr;
512 expld.result.valid_p = TRUE;
8c95a62e
KH
513 }
514 break;
67469e1f 515
8c95a62e 516 case NAME:
e9ee469a
AM
517 if (expld.phase == lang_first_phase_enum)
518 ;
519 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
520 new_rel_from_abs (expld.dot);
521 else
8c95a62e
KH
522 {
523 struct bfd_link_hash_entry *h;
524
525 h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info,
526 tree->name.name,
1b493742
NS
527 TRUE, FALSE, TRUE);
528 if (!h)
529 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
530 else if (h->type == bfd_link_hash_defined
531 || h->type == bfd_link_hash_defweak)
8c95a62e
KH
532 {
533 if (bfd_is_abs_section (h->u.def.section))
e9ee469a
AM
534 new_abs (h->u.def.value);
535 else
8c95a62e
KH
536 {
537 asection *output_section;
538
539 output_section = h->u.def.section->output_section;
540 if (output_section == NULL)
8c95a62e 541 {
e9ee469a
AM
542 if (expld.phase != lang_mark_phase_enum)
543 einfo (_("%X%S: unresolvable symbol `%s'"
544 " referenced in expression\n"),
545 tree->name.name);
8c95a62e 546 }
e9ee469a
AM
547 else
548 new_rel (h->u.def.value + h->u.def.section->output_offset,
549 NULL, output_section);
8c95a62e
KH
550 }
551 }
e9ee469a
AM
552 else if (expld.phase == lang_final_phase_enum
553 || expld.assigning_to_dot)
8c95a62e
KH
554 einfo (_("%F%S: undefined symbol `%s' referenced in expression\n"),
555 tree->name.name);
1b493742
NS
556 else if (h->type == bfd_link_hash_new)
557 {
558 h->type = bfd_link_hash_undefined;
559 h->u.undef.abfd = NULL;
3eda52aa 560 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
a010d60f 561 bfd_link_add_undef (link_info.hash, h);
1b493742 562 }
8c95a62e
KH
563 }
564 break;
565
566 case ADDR:
e9ee469a 567 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
568 {
569 lang_output_section_statement_type *os;
570
571 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
572 if (os == NULL)
573 {
574 if (expld.phase == lang_final_phase_enum)
575 einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
576 tree->name.name);
577 }
578 else if (os->processed_vma)
e9ee469a 579 new_rel (0, NULL, os->bfd_section);
8c95a62e 580 }
8c95a62e
KH
581 break;
582
583 case LOADADDR:
e9ee469a 584 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
585 {
586 lang_output_section_statement_type *os;
587
588 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
589 if (os == NULL)
590 {
591 if (expld.phase == lang_final_phase_enum)
592 einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
593 tree->name.name);
594 }
595 else if (os->processed_lma)
1b493742 596 {
e9ee469a 597 if (os->load_base == NULL)
3e23777d 598 new_abs (os->bfd_section->lma);
e9ee469a 599 else
67469e1f
AM
600 {
601 exp_fold_tree_1 (os->load_base);
602 make_abs ();
603 }
1b493742 604 }
8c95a62e 605 }
8c95a62e
KH
606 break;
607
608 case SIZEOF:
e9ee469a 609 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
610 {
611 int opb = bfd_octets_per_byte (output_bfd);
612 lang_output_section_statement_type *os;
613
614 os = lang_output_section_find (tree->name.name);
5397b1fe 615 if (os == NULL)
cc3e2771
NS
616 {
617 if (expld.phase == lang_final_phase_enum)
618 einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
619 tree->name.name);
620 new_abs (0);
621 }
cde9e0be 622 else if (os->processed_vma)
e9ee469a 623 new_abs (os->bfd_section->size / opb);
8c95a62e 624 }
8c95a62e
KH
625 break;
626
3ec57632
NC
627 case LENGTH:
628 {
629 lang_memory_region_type *mem;
630
631 mem = lang_memory_region_lookup (tree->name.name, FALSE);
632 if (mem != NULL)
e9ee469a 633 new_abs (mem->length);
3ec57632 634 else
e9ee469a
AM
635 einfo (_("%F%S: undefined MEMORY region `%s'"
636 " referenced in expression\n"), tree->name.name);
3ec57632
NC
637 }
638 break;
639
640 case ORIGIN:
641 {
642 lang_memory_region_type *mem;
643
644 mem = lang_memory_region_lookup (tree->name.name, FALSE);
645 if (mem != NULL)
e9ee469a 646 new_abs (mem->origin);
3ec57632 647 else
e9ee469a
AM
648 einfo (_("%F%S: undefined MEMORY region `%s'"
649 " referenced in expression\n"), tree->name.name);
3ec57632
NC
650 }
651 break;
652
24718e3b
L
653 case CONSTANT:
654 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
655 new_abs (bfd_emul_get_maxpagesize (default_target));
656 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
657 new_abs (bfd_emul_get_commonpagesize (default_target));
658 else
659 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
660 tree->name.name);
661 break;
662
8c95a62e
KH
663 default:
664 FAIL ();
665 break;
666 }
252b5132 667}
8c95a62e 668
e9ee469a
AM
669static void
670exp_fold_tree_1 (etree_type *tree)
252b5132 671{
252b5132
RH
672 if (tree == NULL)
673 {
e9ee469a
AM
674 memset (&expld.result, 0, sizeof (expld.result));
675 return;
252b5132
RH
676 }
677
4de2d33d 678 switch (tree->type.node_class)
252b5132
RH
679 {
680 case etree_value:
e9ee469a 681 new_rel (tree->value.value, tree->value.str, expld.section);
252b5132
RH
682 break;
683
684 case etree_rel:
e9ee469a
AM
685 if (expld.phase != lang_first_phase_enum)
686 {
687 asection *output_section = tree->rel.section->output_section;
688 new_rel (tree->rel.value + tree->rel.section->output_offset,
689 NULL, output_section);
690 }
252b5132 691 else
e9ee469a 692 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
693 break;
694
695 case etree_assert:
e9ee469a 696 exp_fold_tree_1 (tree->assert_s.child);
5397b1fe
AM
697 if (expld.phase == lang_final_phase_enum && !expld.result.value)
698 einfo ("%X%P: %s\n", tree->assert_s.message);
252b5132
RH
699 break;
700
701 case etree_unary:
e9ee469a 702 fold_unary (tree);
252b5132
RH
703 break;
704
705 case etree_binary:
e9ee469a 706 fold_binary (tree);
252b5132 707 break;
0ae1cf52
AM
708
709 case etree_trinary:
e9ee469a 710 fold_trinary (tree);
0ae1cf52 711 break;
252b5132
RH
712
713 case etree_assign:
714 case etree_provide:
b46a87b1 715 case etree_provided:
252b5132
RH
716 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
717 {
c7d701b0 718 /* Assignment to dot can only be done during allocation. */
b46a87b1 719 if (tree->type.node_class != etree_assign)
252b5132 720 einfo (_("%F%S can not PROVIDE assignment to location counter\n"));
e9ee469a
AM
721 if (expld.phase == lang_mark_phase_enum
722 || expld.phase == lang_allocating_phase_enum
723 || (expld.phase == lang_final_phase_enum
724 && expld.section == bfd_abs_section_ptr))
252b5132 725 {
fbbb9ac5 726 /* Notify the folder that this is an assignment to dot. */
e9ee469a
AM
727 expld.assigning_to_dot = TRUE;
728 exp_fold_tree_1 (tree->assign.src);
729 expld.assigning_to_dot = FALSE;
730
731 if (!expld.result.valid_p)
732 {
733 if (expld.phase != lang_mark_phase_enum)
734 einfo (_("%F%S invalid assignment to location counter\n"));
735 }
736 else if (expld.dotp == NULL)
737 einfo (_("%F%S assignment to location counter"
738 " invalid outside of SECTION\n"));
252b5132
RH
739 else
740 {
e9ee469a
AM
741 bfd_vma nextdot;
742
743 nextdot = expld.result.value + expld.section->vma;
744 if (nextdot < expld.dot
745 && expld.section != bfd_abs_section_ptr)
746 einfo (_("%F%S cannot move location counter backwards"
747 " (from %V to %V)\n"), expld.dot, nextdot);
252b5132
RH
748 else
749 {
e9ee469a
AM
750 expld.dot = nextdot;
751 *expld.dotp = nextdot;
252b5132
RH
752 }
753 }
754 }
8b3d8fa8 755 else
e9ee469a 756 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
757 }
758 else
759 {
e9ee469a 760 struct bfd_link_hash_entry *h = NULL;
252b5132 761
e9ee469a
AM
762 if (tree->type.node_class == etree_provide)
763 {
252b5132 764 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
e9ee469a
AM
765 FALSE, FALSE, TRUE);
766 if (h == NULL
767 || (h->type != bfd_link_hash_new
768 && h->type != bfd_link_hash_undefined
769 && h->type != bfd_link_hash_common))
770 {
771 /* Do nothing. The symbol was never referenced, or was
772 defined by some object. */
773 break;
774 }
775 }
776
777 exp_fold_tree_1 (tree->assign.src);
778 if (expld.result.valid_p)
779 {
1579bae1 780 if (h == NULL)
67010b46 781 {
e9ee469a
AM
782 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
783 TRUE, FALSE, TRUE);
784 if (h == NULL)
67010b46
NC
785 einfo (_("%P%F:%s: hash creation failed\n"),
786 tree->assign.dst);
787 }
e9ee469a
AM
788
789 /* FIXME: Should we worry if the symbol is already
790 defined? */
791 lang_update_definedness (tree->assign.dst, h);
792 h->type = bfd_link_hash_defined;
793 h->u.def.value = expld.result.value;
794 h->u.def.section = expld.result.section;
795 if (tree->type.node_class == etree_provide)
796 tree->type.node_class = etree_provided;
252b5132
RH
797 }
798 }
799 break;
800
801 case etree_name:
e9ee469a 802 fold_name (tree);
252b5132
RH
803 break;
804
805 default:
806 FAIL ();
e9ee469a 807 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
808 break;
809 }
252b5132
RH
810}
811
e9ee469a
AM
812void
813exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
75ff4589 814{
e9ee469a
AM
815 expld.dot = *dotp;
816 expld.dotp = dotp;
817 expld.section = current_section;
818 exp_fold_tree_1 (tree);
75ff4589
L
819}
820
e9ee469a
AM
821static void
822exp_fold_tree_no_dot (etree_type *tree)
252b5132 823{
e9ee469a
AM
824 expld.dot = 0;
825 expld.dotp = NULL;
826 expld.section = bfd_abs_section_ptr;
827 exp_fold_tree_1 (tree);
252b5132
RH
828}
829
830etree_type *
1579bae1 831exp_binop (int code, etree_type *lhs, etree_type *rhs)
252b5132
RH
832{
833 etree_type value, *new;
252b5132
RH
834
835 value.type.node_code = code;
f856040a 836 value.type.lineno = lhs->type.lineno;
252b5132
RH
837 value.binary.lhs = lhs;
838 value.binary.rhs = rhs;
839 value.type.node_class = etree_binary;
e9ee469a
AM
840 exp_fold_tree_no_dot (&value);
841 if (expld.result.valid_p)
842 return exp_intop (expld.result.value);
843
1579bae1
AM
844 new = stat_alloc (sizeof (new->binary));
845 memcpy (new, &value, sizeof (new->binary));
252b5132
RH
846 return new;
847}
848
849etree_type *
1579bae1 850exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
252b5132
RH
851{
852 etree_type value, *new;
e9ee469a 853
252b5132 854 value.type.node_code = code;
f856040a 855 value.type.lineno = lhs->type.lineno;
252b5132
RH
856 value.trinary.lhs = lhs;
857 value.trinary.cond = cond;
858 value.trinary.rhs = rhs;
859 value.type.node_class = etree_trinary;
e9ee469a
AM
860 exp_fold_tree_no_dot (&value);
861 if (expld.result.valid_p)
862 return exp_intop (expld.result.value);
c7d701b0 863
1579bae1
AM
864 new = stat_alloc (sizeof (new->trinary));
865 memcpy (new, &value, sizeof (new->trinary));
252b5132
RH
866 return new;
867}
868
252b5132 869etree_type *
1579bae1 870exp_unop (int code, etree_type *child)
252b5132
RH
871{
872 etree_type value, *new;
873
252b5132 874 value.unary.type.node_code = code;
f856040a 875 value.unary.type.lineno = child->type.lineno;
252b5132
RH
876 value.unary.child = child;
877 value.unary.type.node_class = etree_unary;
e9ee469a
AM
878 exp_fold_tree_no_dot (&value);
879 if (expld.result.valid_p)
880 return exp_intop (expld.result.value);
c7d701b0 881
1579bae1
AM
882 new = stat_alloc (sizeof (new->unary));
883 memcpy (new, &value, sizeof (new->unary));
252b5132
RH
884 return new;
885}
886
252b5132 887etree_type *
1579bae1 888exp_nameop (int code, const char *name)
252b5132
RH
889{
890 etree_type value, *new;
e9ee469a 891
252b5132 892 value.name.type.node_code = code;
f856040a 893 value.name.type.lineno = lineno;
252b5132
RH
894 value.name.name = name;
895 value.name.type.node_class = etree_name;
896
e9ee469a
AM
897 exp_fold_tree_no_dot (&value);
898 if (expld.result.valid_p)
899 return exp_intop (expld.result.value);
c7d701b0 900
1579bae1
AM
901 new = stat_alloc (sizeof (new->name));
902 memcpy (new, &value, sizeof (new->name));
252b5132
RH
903 return new;
904
905}
906
252b5132 907etree_type *
1579bae1 908exp_assop (int code, const char *dst, etree_type *src)
252b5132 909{
e9ee469a 910 etree_type *new;
252b5132 911
1579bae1 912 new = stat_alloc (sizeof (new->assign));
e9ee469a 913 new->type.node_code = code;
f856040a 914 new->type.lineno = src->type.lineno;
e9ee469a
AM
915 new->type.node_class = etree_assign;
916 new->assign.src = src;
917 new->assign.dst = dst;
252b5132
RH
918 return new;
919}
920
921/* Handle PROVIDE. */
922
923etree_type *
7af8e998 924exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
252b5132
RH
925{
926 etree_type *n;
927
1579bae1 928 n = stat_alloc (sizeof (n->assign));
252b5132 929 n->assign.type.node_code = '=';
f856040a 930 n->assign.type.lineno = src->type.lineno;
252b5132
RH
931 n->assign.type.node_class = etree_provide;
932 n->assign.src = src;
933 n->assign.dst = dst;
7af8e998 934 n->assign.hidden = hidden;
252b5132
RH
935 return n;
936}
937
938/* Handle ASSERT. */
939
940etree_type *
1579bae1 941exp_assert (etree_type *exp, const char *message)
252b5132
RH
942{
943 etree_type *n;
944
1579bae1 945 n = stat_alloc (sizeof (n->assert_s));
252b5132 946 n->assert_s.type.node_code = '!';
f856040a 947 n->assert_s.type.lineno = exp->type.lineno;
252b5132
RH
948 n->assert_s.type.node_class = etree_assert;
949 n->assert_s.child = exp;
950 n->assert_s.message = message;
951 return n;
952}
953
4de2d33d 954void
1579bae1 955exp_print_tree (etree_type *tree)
252b5132 956{
c7d701b0
NC
957 if (config.map_file == NULL)
958 config.map_file = stderr;
b7a26f91 959
c7d701b0
NC
960 if (tree == NULL)
961 {
962 minfo ("NULL TREE\n");
963 return;
964 }
b7a26f91 965
8c95a62e
KH
966 switch (tree->type.node_class)
967 {
968 case etree_value:
969 minfo ("0x%v", tree->value.value);
970 return;
971 case etree_rel:
972 if (tree->rel.section->owner != NULL)
973 minfo ("%B:", tree->rel.section->owner);
974 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
975 return;
976 case etree_assign:
8c95a62e 977 fprintf (config.map_file, "%s", tree->assign.dst);
b34976b6 978 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
979 exp_print_tree (tree->assign.src);
980 break;
981 case etree_provide:
b46a87b1 982 case etree_provided:
8c95a62e
KH
983 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
984 exp_print_tree (tree->assign.src);
985 fprintf (config.map_file, ")");
986 break;
987 case etree_binary:
988 fprintf (config.map_file, "(");
989 exp_print_tree (tree->binary.lhs);
b34976b6 990 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
991 exp_print_tree (tree->binary.rhs);
992 fprintf (config.map_file, ")");
993 break;
994 case etree_trinary:
995 exp_print_tree (tree->trinary.cond);
996 fprintf (config.map_file, "?");
997 exp_print_tree (tree->trinary.lhs);
998 fprintf (config.map_file, ":");
999 exp_print_tree (tree->trinary.rhs);
1000 break;
1001 case etree_unary:
b34976b6 1002 exp_print_token (tree->unary.type.node_code, FALSE);
8c95a62e
KH
1003 if (tree->unary.child)
1004 {
7b17f854 1005 fprintf (config.map_file, " (");
8c95a62e
KH
1006 exp_print_tree (tree->unary.child);
1007 fprintf (config.map_file, ")");
1008 }
1009 break;
1010
1011 case etree_assert:
1012 fprintf (config.map_file, "ASSERT (");
1013 exp_print_tree (tree->assert_s.child);
1014 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1015 break;
1016
8c95a62e
KH
1017 case etree_name:
1018 if (tree->type.node_code == NAME)
1019 {
1020 fprintf (config.map_file, "%s", tree->name.name);
1021 }
1022 else
1023 {
b34976b6 1024 exp_print_token (tree->type.node_code, FALSE);
8c95a62e 1025 if (tree->name.name)
7b17f854 1026 fprintf (config.map_file, " (%s)", tree->name.name);
8c95a62e
KH
1027 }
1028 break;
1029 default:
1030 FAIL ();
1031 break;
252b5132 1032 }
252b5132
RH
1033}
1034
1035bfd_vma
e9ee469a 1036exp_get_vma (etree_type *tree, bfd_vma def, char *name)
252b5132 1037{
252b5132
RH
1038 if (tree != NULL)
1039 {
e9ee469a
AM
1040 exp_fold_tree_no_dot (tree);
1041 if (expld.result.valid_p)
1042 return expld.result.value;
1043 else if (name != NULL && expld.phase != lang_mark_phase_enum)
252b5132 1044 einfo (_("%F%S nonconstant expression for %s\n"), name);
252b5132 1045 }
e9ee469a 1046 return def;
252b5132
RH
1047}
1048
4de2d33d 1049int
e9ee469a 1050exp_get_value_int (etree_type *tree, int def, char *name)
252b5132 1051{
e9ee469a 1052 return exp_get_vma (tree, def, name);
252b5132
RH
1053}
1054
2c382fb6 1055fill_type *
e9ee469a 1056exp_get_fill (etree_type *tree, fill_type *def, char *name)
2c382fb6
AM
1057{
1058 fill_type *fill;
2c382fb6
AM
1059 size_t len;
1060 unsigned int val;
1061
1062 if (tree == NULL)
1063 return def;
1064
e9ee469a
AM
1065 exp_fold_tree_no_dot (tree);
1066 if (!expld.result.valid_p)
1067 {
1068 if (name != NULL && expld.phase != lang_mark_phase_enum)
1069 einfo (_("%F%S nonconstant expression for %s\n"), name);
1070 return def;
1071 }
2c382fb6 1072
e9ee469a 1073 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
2c382fb6
AM
1074 {
1075 unsigned char *dst;
1076 unsigned char *s;
1579bae1 1077 fill = xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
2c382fb6
AM
1078 fill->size = (len + 1) / 2;
1079 dst = fill->data;
e9ee469a 1080 s = (unsigned char *) expld.result.str;
2c382fb6
AM
1081 val = 0;
1082 do
1083 {
1084 unsigned int digit;
1085
1086 digit = *s++ - '0';
1087 if (digit > 9)
1088 digit = (digit - 'A' + '0' + 10) & 0xf;
1089 val <<= 4;
1090 val += digit;
1091 --len;
1092 if ((len & 1) == 0)
1093 {
1094 *dst++ = val;
1095 val = 0;
1096 }
1097 }
1098 while (len != 0);
1099 }
1100 else
1101 {
1579bae1 1102 fill = xmalloc (4 + sizeof (*fill) - 1);
e9ee469a 1103 val = expld.result.value;
2c382fb6
AM
1104 fill->data[0] = (val >> 24) & 0xff;
1105 fill->data[1] = (val >> 16) & 0xff;
1106 fill->data[2] = (val >> 8) & 0xff;
1107 fill->data[3] = (val >> 0) & 0xff;
1108 fill->size = 4;
1109 }
1110 return fill;
1111}
1112
252b5132 1113bfd_vma
e9ee469a 1114exp_get_abs_int (etree_type *tree, int def, char *name)
252b5132 1115{
e9ee469a
AM
1116 if (tree != NULL)
1117 {
1118 exp_fold_tree_no_dot (tree);
c7d701b0 1119
e9ee469a
AM
1120 if (expld.result.valid_p)
1121 {
1122 expld.result.value += expld.result.section->vma;
1123 return expld.result.value;
1124 }
1125 else if (name != NULL && expld.phase != lang_mark_phase_enum)
f856040a
L
1126 {
1127 lineno = tree->type.lineno;
1128 einfo (_("%F%S: nonconstant expression for %s\n"), name);
1129 }
e9ee469a
AM
1130 }
1131 return def;
252b5132 1132}
c553bb91 1133
e5caa5e0
AM
1134static bfd_vma
1135align_n (bfd_vma value, bfd_vma align)
c553bb91
AM
1136{
1137 if (align <= 1)
1138 return value;
1139
1140 value = (value + align - 1) / align;
1141 return value * align;
1142}