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