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