allinsn.exp misc.exp: New files: Test run scripts
[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,
f13a99db 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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:
b10a8ae0 393 expld.dataseg.relro = exp_dataseg_relro_start;
e9ee469a
AM
394 if (expld.phase != lang_first_phase_enum
395 && expld.section == bfd_abs_section_ptr
396 && (expld.dataseg.phase == exp_dataseg_none
397 || expld.dataseg.phase == exp_dataseg_adjust
398 || expld.dataseg.phase == exp_dataseg_relro_adjust
399 || expld.phase == lang_final_phase_enum))
2d20f7bf 400 {
e9ee469a
AM
401 bfd_vma maxpage = lhs.value;
402 bfd_vma commonpage = expld.result.value;
2d20f7bf 403
e9ee469a
AM
404 expld.result.value = align_n (expld.dot, maxpage);
405 if (expld.dataseg.phase == exp_dataseg_relro_adjust)
406 expld.result.value = expld.dataseg.base;
407 else if (expld.dataseg.phase != exp_dataseg_adjust)
2d20f7bf 408 {
e9ee469a
AM
409 expld.result.value += expld.dot & (maxpage - 1);
410 if (expld.phase == lang_allocating_phase_enum)
2d20f7bf 411 {
e9ee469a
AM
412 expld.dataseg.phase = exp_dataseg_align_seen;
413 expld.dataseg.min_base = align_n (expld.dot, maxpage);
414 expld.dataseg.base = expld.result.value;
415 expld.dataseg.pagesize = commonpage;
416 expld.dataseg.maxpagesize = maxpage;
417 expld.dataseg.relro_end = 0;
2d20f7bf
JJ
418 }
419 }
e9ee469a
AM
420 else if (commonpage < maxpage)
421 expld.result.value += ((expld.dot + commonpage - 1)
422 & (maxpage - commonpage));
2d20f7bf
JJ
423 }
424 else
e9ee469a 425 expld.result.valid_p = FALSE;
2d20f7bf
JJ
426 break;
427
a4f5ad88 428 case DATA_SEGMENT_RELRO_END:
b10a8ae0 429 expld.dataseg.relro = exp_dataseg_relro_end;
e9ee469a
AM
430 if (expld.phase != lang_first_phase_enum
431 && (expld.dataseg.phase == exp_dataseg_align_seen
432 || expld.dataseg.phase == exp_dataseg_adjust
433 || expld.dataseg.phase == exp_dataseg_relro_adjust
434 || expld.phase == lang_final_phase_enum))
a4f5ad88 435 {
e9ee469a
AM
436 if (expld.dataseg.phase == exp_dataseg_align_seen
437 || expld.dataseg.phase == exp_dataseg_relro_adjust)
438 expld.dataseg.relro_end = lhs.value + expld.result.value;
439
440 if (expld.dataseg.phase == exp_dataseg_relro_adjust
441 && (expld.dataseg.relro_end
442 & (expld.dataseg.pagesize - 1)))
a4f5ad88 443 {
e9ee469a
AM
444 expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
445 expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
446 expld.result.value = (expld.dataseg.relro_end
447 - expld.result.value);
a4f5ad88 448 }
e9ee469a
AM
449 else
450 expld.result.value = lhs.value;
451
452 if (expld.dataseg.phase == exp_dataseg_align_seen)
453 expld.dataseg.phase = exp_dataseg_relro_seen;
a4f5ad88
JJ
454 }
455 else
e9ee469a 456 expld.result.valid_p = FALSE;
a4f5ad88
JJ
457 break;
458
252b5132 459 default:
8c95a62e 460 FAIL ();
252b5132
RH
461 }
462 }
463 else
e9ee469a 464 expld.result.valid_p = FALSE;
252b5132 465 }
252b5132
RH
466}
467
e9ee469a
AM
468static void
469fold_trinary (etree_type *tree)
0ae1cf52 470{
e9ee469a
AM
471 exp_fold_tree_1 (tree->trinary.cond);
472 if (expld.result.valid_p)
473 exp_fold_tree_1 (expld.result.value
474 ? tree->trinary.lhs
475 : tree->trinary.rhs);
0ae1cf52
AM
476}
477
e9ee469a
AM
478static void
479fold_name (etree_type *tree)
252b5132 480{
e9ee469a 481 memset (&expld.result, 0, sizeof (expld.result));
c468c8bc 482
4de2d33d 483 switch (tree->type.node_code)
8c95a62e
KH
484 {
485 case SIZEOF_HEADERS:
e9ee469a
AM
486 if (expld.phase != lang_first_phase_enum)
487 {
488 bfd_vma hdr_size = 0;
489 /* Don't find the real header size if only marking sections;
490 The bfd function may cache incorrect data. */
491 if (expld.phase != lang_mark_phase_enum)
f13a99db 492 hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
e9ee469a
AM
493 new_abs (hdr_size);
494 }
8c95a62e 495 break;
67469e1f 496
8c95a62e 497 case DEFINED:
e9ee469a 498 if (expld.phase == lang_first_phase_enum)
1b493742 499 lang_track_definedness (tree->name.name);
8c95a62e
KH
500 else
501 {
502 struct bfd_link_hash_entry *h;
420e579c
HPN
503 int def_iteration
504 = lang_symbol_definition_iteration (tree->name.name);
8c95a62e 505
f13a99db
AM
506 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
507 &link_info,
8c95a62e 508 tree->name.name,
b34976b6 509 FALSE, FALSE, TRUE);
e9ee469a
AM
510 expld.result.value = (h != NULL
511 && (h->type == bfd_link_hash_defined
512 || h->type == bfd_link_hash_defweak
513 || h->type == bfd_link_hash_common)
514 && (def_iteration == lang_statement_iteration
515 || def_iteration == -1));
516 expld.result.section = bfd_abs_section_ptr;
517 expld.result.valid_p = TRUE;
8c95a62e
KH
518 }
519 break;
67469e1f 520
8c95a62e 521 case NAME:
e9ee469a
AM
522 if (expld.phase == lang_first_phase_enum)
523 ;
524 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
525 new_rel_from_abs (expld.dot);
526 else
8c95a62e
KH
527 {
528 struct bfd_link_hash_entry *h;
529
f13a99db
AM
530 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
531 &link_info,
8c95a62e 532 tree->name.name,
1b493742
NS
533 TRUE, FALSE, TRUE);
534 if (!h)
535 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
536 else if (h->type == bfd_link_hash_defined
537 || h->type == bfd_link_hash_defweak)
8c95a62e
KH
538 {
539 if (bfd_is_abs_section (h->u.def.section))
e9ee469a
AM
540 new_abs (h->u.def.value);
541 else
8c95a62e
KH
542 {
543 asection *output_section;
544
545 output_section = h->u.def.section->output_section;
546 if (output_section == NULL)
8c95a62e 547 {
e9ee469a
AM
548 if (expld.phase != lang_mark_phase_enum)
549 einfo (_("%X%S: unresolvable symbol `%s'"
550 " referenced in expression\n"),
551 tree->name.name);
8c95a62e 552 }
e9ee469a
AM
553 else
554 new_rel (h->u.def.value + h->u.def.section->output_offset,
555 NULL, output_section);
8c95a62e
KH
556 }
557 }
e9ee469a
AM
558 else if (expld.phase == lang_final_phase_enum
559 || expld.assigning_to_dot)
8c95a62e
KH
560 einfo (_("%F%S: undefined symbol `%s' referenced in expression\n"),
561 tree->name.name);
1b493742
NS
562 else if (h->type == bfd_link_hash_new)
563 {
564 h->type = bfd_link_hash_undefined;
565 h->u.undef.abfd = NULL;
3eda52aa 566 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
a010d60f 567 bfd_link_add_undef (link_info.hash, h);
1b493742 568 }
8c95a62e
KH
569 }
570 break;
571
572 case ADDR:
e9ee469a 573 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
574 {
575 lang_output_section_statement_type *os;
576
577 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
578 if (os == NULL)
579 {
580 if (expld.phase == lang_final_phase_enum)
581 einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
582 tree->name.name);
583 }
584 else if (os->processed_vma)
e9ee469a 585 new_rel (0, NULL, os->bfd_section);
8c95a62e 586 }
8c95a62e
KH
587 break;
588
589 case LOADADDR:
e9ee469a 590 if (expld.phase != lang_first_phase_enum)
8c95a62e
KH
591 {
592 lang_output_section_statement_type *os;
593
594 os = lang_output_section_find (tree->name.name);
cc3e2771
NS
595 if (os == NULL)
596 {
597 if (expld.phase == lang_final_phase_enum)
598 einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
599 tree->name.name);
600 }
601 else if (os->processed_lma)
1b493742 602 {
e9ee469a 603 if (os->load_base == NULL)
3e23777d 604 new_abs (os->bfd_section->lma);
e9ee469a 605 else
67469e1f
AM
606 {
607 exp_fold_tree_1 (os->load_base);
819da74e
AM
608 if (expld.result.valid_p)
609 make_abs ();
67469e1f 610 }
1b493742 611 }
8c95a62e 612 }
8c95a62e
KH
613 break;
614
615 case SIZEOF:
362c1d1a 616 case ALIGNOF:
e9ee469a 617 if (expld.phase != lang_first_phase_enum)
8c95a62e 618 {
8c95a62e
KH
619 lang_output_section_statement_type *os;
620
621 os = lang_output_section_find (tree->name.name);
5397b1fe 622 if (os == NULL)
cc3e2771
NS
623 {
624 if (expld.phase == lang_final_phase_enum)
625 einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
626 tree->name.name);
627 new_abs (0);
628 }
cde9e0be 629 else if (os->processed_vma)
362c1d1a
NS
630 {
631 bfd_vma val;
632
633 if (tree->type.node_code == SIZEOF)
f13a99db
AM
634 val = (os->bfd_section->size
635 / bfd_octets_per_byte (link_info.output_bfd));
362c1d1a
NS
636 else
637 val = (bfd_vma)1 << os->bfd_section->alignment_power;
638
639 new_abs (val);
640 }
8c95a62e 641 }
8c95a62e
KH
642 break;
643
3ec57632
NC
644 case LENGTH:
645 {
646 lang_memory_region_type *mem;
647
648 mem = lang_memory_region_lookup (tree->name.name, FALSE);
649 if (mem != NULL)
e9ee469a 650 new_abs (mem->length);
3ec57632 651 else
e9ee469a
AM
652 einfo (_("%F%S: undefined MEMORY region `%s'"
653 " referenced in expression\n"), tree->name.name);
3ec57632
NC
654 }
655 break;
656
657 case ORIGIN:
658 {
659 lang_memory_region_type *mem;
660
661 mem = lang_memory_region_lookup (tree->name.name, FALSE);
662 if (mem != NULL)
e9ee469a 663 new_abs (mem->origin);
3ec57632 664 else
e9ee469a
AM
665 einfo (_("%F%S: undefined MEMORY region `%s'"
666 " referenced in expression\n"), tree->name.name);
3ec57632
NC
667 }
668 break;
669
24718e3b
L
670 case CONSTANT:
671 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
672 new_abs (bfd_emul_get_maxpagesize (default_target));
673 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
674 new_abs (bfd_emul_get_commonpagesize (default_target));
675 else
676 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
677 tree->name.name);
678 break;
679
8c95a62e
KH
680 default:
681 FAIL ();
682 break;
683 }
252b5132 684}
8c95a62e 685
e9ee469a
AM
686static void
687exp_fold_tree_1 (etree_type *tree)
252b5132 688{
252b5132
RH
689 if (tree == NULL)
690 {
e9ee469a
AM
691 memset (&expld.result, 0, sizeof (expld.result));
692 return;
252b5132
RH
693 }
694
4de2d33d 695 switch (tree->type.node_class)
252b5132
RH
696 {
697 case etree_value:
e9ee469a 698 new_rel (tree->value.value, tree->value.str, expld.section);
252b5132
RH
699 break;
700
701 case etree_rel:
e9ee469a
AM
702 if (expld.phase != lang_first_phase_enum)
703 {
704 asection *output_section = tree->rel.section->output_section;
705 new_rel (tree->rel.value + tree->rel.section->output_offset,
706 NULL, output_section);
707 }
252b5132 708 else
e9ee469a 709 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
710 break;
711
712 case etree_assert:
e9ee469a 713 exp_fold_tree_1 (tree->assert_s.child);
5397b1fe
AM
714 if (expld.phase == lang_final_phase_enum && !expld.result.value)
715 einfo ("%X%P: %s\n", tree->assert_s.message);
252b5132
RH
716 break;
717
718 case etree_unary:
e9ee469a 719 fold_unary (tree);
252b5132
RH
720 break;
721
722 case etree_binary:
e9ee469a 723 fold_binary (tree);
252b5132 724 break;
0ae1cf52
AM
725
726 case etree_trinary:
e9ee469a 727 fold_trinary (tree);
0ae1cf52 728 break;
252b5132
RH
729
730 case etree_assign:
731 case etree_provide:
b46a87b1 732 case etree_provided:
252b5132
RH
733 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
734 {
c7d701b0 735 /* Assignment to dot can only be done during allocation. */
b46a87b1 736 if (tree->type.node_class != etree_assign)
252b5132 737 einfo (_("%F%S can not PROVIDE assignment to location counter\n"));
e9ee469a
AM
738 if (expld.phase == lang_mark_phase_enum
739 || expld.phase == lang_allocating_phase_enum
740 || (expld.phase == lang_final_phase_enum
741 && expld.section == bfd_abs_section_ptr))
252b5132 742 {
fbbb9ac5 743 /* Notify the folder that this is an assignment to dot. */
e9ee469a
AM
744 expld.assigning_to_dot = TRUE;
745 exp_fold_tree_1 (tree->assign.src);
746 expld.assigning_to_dot = FALSE;
747
748 if (!expld.result.valid_p)
749 {
750 if (expld.phase != lang_mark_phase_enum)
751 einfo (_("%F%S invalid assignment to location counter\n"));
752 }
753 else if (expld.dotp == NULL)
754 einfo (_("%F%S assignment to location counter"
755 " invalid outside of SECTION\n"));
252b5132
RH
756 else
757 {
e9ee469a
AM
758 bfd_vma nextdot;
759
760 nextdot = expld.result.value + expld.section->vma;
761 if (nextdot < expld.dot
762 && expld.section != bfd_abs_section_ptr)
763 einfo (_("%F%S cannot move location counter backwards"
764 " (from %V to %V)\n"), expld.dot, nextdot);
252b5132
RH
765 else
766 {
e9ee469a
AM
767 expld.dot = nextdot;
768 *expld.dotp = nextdot;
252b5132
RH
769 }
770 }
771 }
8b3d8fa8 772 else
e9ee469a 773 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
774 }
775 else
776 {
e9ee469a 777 struct bfd_link_hash_entry *h = NULL;
252b5132 778
e9ee469a
AM
779 if (tree->type.node_class == etree_provide)
780 {
252b5132 781 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
e9ee469a
AM
782 FALSE, FALSE, TRUE);
783 if (h == NULL
784 || (h->type != bfd_link_hash_new
785 && h->type != bfd_link_hash_undefined
786 && h->type != bfd_link_hash_common))
787 {
788 /* Do nothing. The symbol was never referenced, or was
789 defined by some object. */
790 break;
791 }
792 }
793
794 exp_fold_tree_1 (tree->assign.src);
795 if (expld.result.valid_p)
796 {
1579bae1 797 if (h == NULL)
67010b46 798 {
e9ee469a
AM
799 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
800 TRUE, FALSE, TRUE);
801 if (h == NULL)
67010b46
NC
802 einfo (_("%P%F:%s: hash creation failed\n"),
803 tree->assign.dst);
804 }
e9ee469a
AM
805
806 /* FIXME: Should we worry if the symbol is already
807 defined? */
808 lang_update_definedness (tree->assign.dst, h);
809 h->type = bfd_link_hash_defined;
810 h->u.def.value = expld.result.value;
811 h->u.def.section = expld.result.section;
812 if (tree->type.node_class == etree_provide)
813 tree->type.node_class = etree_provided;
252b5132
RH
814 }
815 }
816 break;
817
818 case etree_name:
e9ee469a 819 fold_name (tree);
252b5132
RH
820 break;
821
822 default:
823 FAIL ();
e9ee469a 824 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
825 break;
826 }
252b5132
RH
827}
828
e9ee469a
AM
829void
830exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
75ff4589 831{
e9ee469a
AM
832 expld.dot = *dotp;
833 expld.dotp = dotp;
834 expld.section = current_section;
835 exp_fold_tree_1 (tree);
75ff4589
L
836}
837
e9ee469a
AM
838static void
839exp_fold_tree_no_dot (etree_type *tree)
252b5132 840{
e9ee469a
AM
841 expld.dot = 0;
842 expld.dotp = NULL;
843 expld.section = bfd_abs_section_ptr;
844 exp_fold_tree_1 (tree);
252b5132
RH
845}
846
847etree_type *
1579bae1 848exp_binop (int code, etree_type *lhs, etree_type *rhs)
252b5132
RH
849{
850 etree_type value, *new;
252b5132
RH
851
852 value.type.node_code = code;
f856040a 853 value.type.lineno = lhs->type.lineno;
252b5132
RH
854 value.binary.lhs = lhs;
855 value.binary.rhs = rhs;
856 value.type.node_class = etree_binary;
e9ee469a
AM
857 exp_fold_tree_no_dot (&value);
858 if (expld.result.valid_p)
859 return exp_intop (expld.result.value);
860
1579bae1
AM
861 new = stat_alloc (sizeof (new->binary));
862 memcpy (new, &value, sizeof (new->binary));
252b5132
RH
863 return new;
864}
865
866etree_type *
1579bae1 867exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
252b5132
RH
868{
869 etree_type value, *new;
e9ee469a 870
252b5132 871 value.type.node_code = code;
f856040a 872 value.type.lineno = lhs->type.lineno;
252b5132
RH
873 value.trinary.lhs = lhs;
874 value.trinary.cond = cond;
875 value.trinary.rhs = rhs;
876 value.type.node_class = etree_trinary;
e9ee469a
AM
877 exp_fold_tree_no_dot (&value);
878 if (expld.result.valid_p)
879 return exp_intop (expld.result.value);
c7d701b0 880
1579bae1
AM
881 new = stat_alloc (sizeof (new->trinary));
882 memcpy (new, &value, sizeof (new->trinary));
252b5132
RH
883 return new;
884}
885
252b5132 886etree_type *
1579bae1 887exp_unop (int code, etree_type *child)
252b5132
RH
888{
889 etree_type value, *new;
890
252b5132 891 value.unary.type.node_code = code;
f856040a 892 value.unary.type.lineno = child->type.lineno;
252b5132
RH
893 value.unary.child = child;
894 value.unary.type.node_class = etree_unary;
e9ee469a
AM
895 exp_fold_tree_no_dot (&value);
896 if (expld.result.valid_p)
897 return exp_intop (expld.result.value);
c7d701b0 898
1579bae1
AM
899 new = stat_alloc (sizeof (new->unary));
900 memcpy (new, &value, sizeof (new->unary));
252b5132
RH
901 return new;
902}
903
252b5132 904etree_type *
1579bae1 905exp_nameop (int code, const char *name)
252b5132
RH
906{
907 etree_type value, *new;
e9ee469a 908
252b5132 909 value.name.type.node_code = code;
f856040a 910 value.name.type.lineno = lineno;
252b5132
RH
911 value.name.name = name;
912 value.name.type.node_class = etree_name;
913
e9ee469a
AM
914 exp_fold_tree_no_dot (&value);
915 if (expld.result.valid_p)
916 return exp_intop (expld.result.value);
c7d701b0 917
1579bae1
AM
918 new = stat_alloc (sizeof (new->name));
919 memcpy (new, &value, sizeof (new->name));
252b5132
RH
920 return new;
921
922}
923
252b5132 924etree_type *
1579bae1 925exp_assop (int code, const char *dst, etree_type *src)
252b5132 926{
e9ee469a 927 etree_type *new;
252b5132 928
1579bae1 929 new = stat_alloc (sizeof (new->assign));
e9ee469a 930 new->type.node_code = code;
f856040a 931 new->type.lineno = src->type.lineno;
e9ee469a
AM
932 new->type.node_class = etree_assign;
933 new->assign.src = src;
934 new->assign.dst = dst;
252b5132
RH
935 return new;
936}
937
938/* Handle PROVIDE. */
939
940etree_type *
7af8e998 941exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
252b5132
RH
942{
943 etree_type *n;
944
1579bae1 945 n = stat_alloc (sizeof (n->assign));
252b5132 946 n->assign.type.node_code = '=';
f856040a 947 n->assign.type.lineno = src->type.lineno;
252b5132
RH
948 n->assign.type.node_class = etree_provide;
949 n->assign.src = src;
950 n->assign.dst = dst;
7af8e998 951 n->assign.hidden = hidden;
252b5132
RH
952 return n;
953}
954
955/* Handle ASSERT. */
956
957etree_type *
1579bae1 958exp_assert (etree_type *exp, const char *message)
252b5132
RH
959{
960 etree_type *n;
961
1579bae1 962 n = stat_alloc (sizeof (n->assert_s));
252b5132 963 n->assert_s.type.node_code = '!';
f856040a 964 n->assert_s.type.lineno = exp->type.lineno;
252b5132
RH
965 n->assert_s.type.node_class = etree_assert;
966 n->assert_s.child = exp;
967 n->assert_s.message = message;
968 return n;
969}
970
4de2d33d 971void
1579bae1 972exp_print_tree (etree_type *tree)
252b5132 973{
c7d701b0
NC
974 if (config.map_file == NULL)
975 config.map_file = stderr;
b7a26f91 976
c7d701b0
NC
977 if (tree == NULL)
978 {
979 minfo ("NULL TREE\n");
980 return;
981 }
b7a26f91 982
8c95a62e
KH
983 switch (tree->type.node_class)
984 {
985 case etree_value:
986 minfo ("0x%v", tree->value.value);
987 return;
988 case etree_rel:
989 if (tree->rel.section->owner != NULL)
990 minfo ("%B:", tree->rel.section->owner);
991 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
992 return;
993 case etree_assign:
8c95a62e 994 fprintf (config.map_file, "%s", tree->assign.dst);
b34976b6 995 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
996 exp_print_tree (tree->assign.src);
997 break;
998 case etree_provide:
b46a87b1 999 case etree_provided:
8c95a62e
KH
1000 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1001 exp_print_tree (tree->assign.src);
1002 fprintf (config.map_file, ")");
1003 break;
1004 case etree_binary:
1005 fprintf (config.map_file, "(");
1006 exp_print_tree (tree->binary.lhs);
b34976b6 1007 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
1008 exp_print_tree (tree->binary.rhs);
1009 fprintf (config.map_file, ")");
1010 break;
1011 case etree_trinary:
1012 exp_print_tree (tree->trinary.cond);
1013 fprintf (config.map_file, "?");
1014 exp_print_tree (tree->trinary.lhs);
1015 fprintf (config.map_file, ":");
1016 exp_print_tree (tree->trinary.rhs);
1017 break;
1018 case etree_unary:
b34976b6 1019 exp_print_token (tree->unary.type.node_code, FALSE);
8c95a62e
KH
1020 if (tree->unary.child)
1021 {
7b17f854 1022 fprintf (config.map_file, " (");
8c95a62e
KH
1023 exp_print_tree (tree->unary.child);
1024 fprintf (config.map_file, ")");
1025 }
1026 break;
1027
1028 case etree_assert:
1029 fprintf (config.map_file, "ASSERT (");
1030 exp_print_tree (tree->assert_s.child);
1031 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1032 break;
1033
8c95a62e
KH
1034 case etree_name:
1035 if (tree->type.node_code == NAME)
1036 {
1037 fprintf (config.map_file, "%s", tree->name.name);
1038 }
1039 else
1040 {
b34976b6 1041 exp_print_token (tree->type.node_code, FALSE);
8c95a62e 1042 if (tree->name.name)
7b17f854 1043 fprintf (config.map_file, " (%s)", tree->name.name);
8c95a62e
KH
1044 }
1045 break;
1046 default:
1047 FAIL ();
1048 break;
252b5132 1049 }
252b5132
RH
1050}
1051
1052bfd_vma
e9ee469a 1053exp_get_vma (etree_type *tree, bfd_vma def, char *name)
252b5132 1054{
252b5132
RH
1055 if (tree != NULL)
1056 {
e9ee469a
AM
1057 exp_fold_tree_no_dot (tree);
1058 if (expld.result.valid_p)
1059 return expld.result.value;
1060 else if (name != NULL && expld.phase != lang_mark_phase_enum)
c58dea77 1061 einfo (_("%F%S: nonconstant expression for %s\n"), name);
252b5132 1062 }
e9ee469a 1063 return def;
252b5132
RH
1064}
1065
4de2d33d 1066int
e9ee469a 1067exp_get_value_int (etree_type *tree, int def, char *name)
252b5132 1068{
e9ee469a 1069 return exp_get_vma (tree, def, name);
252b5132
RH
1070}
1071
2c382fb6 1072fill_type *
e9ee469a 1073exp_get_fill (etree_type *tree, fill_type *def, char *name)
2c382fb6
AM
1074{
1075 fill_type *fill;
2c382fb6
AM
1076 size_t len;
1077 unsigned int val;
1078
1079 if (tree == NULL)
1080 return def;
1081
e9ee469a
AM
1082 exp_fold_tree_no_dot (tree);
1083 if (!expld.result.valid_p)
1084 {
1085 if (name != NULL && expld.phase != lang_mark_phase_enum)
c58dea77 1086 einfo (_("%F%S: nonconstant expression for %s\n"), name);
e9ee469a
AM
1087 return def;
1088 }
2c382fb6 1089
e9ee469a 1090 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
2c382fb6
AM
1091 {
1092 unsigned char *dst;
1093 unsigned char *s;
1579bae1 1094 fill = xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
2c382fb6
AM
1095 fill->size = (len + 1) / 2;
1096 dst = fill->data;
e9ee469a 1097 s = (unsigned char *) expld.result.str;
2c382fb6
AM
1098 val = 0;
1099 do
1100 {
1101 unsigned int digit;
1102
1103 digit = *s++ - '0';
1104 if (digit > 9)
1105 digit = (digit - 'A' + '0' + 10) & 0xf;
1106 val <<= 4;
1107 val += digit;
1108 --len;
1109 if ((len & 1) == 0)
1110 {
1111 *dst++ = val;
1112 val = 0;
1113 }
1114 }
1115 while (len != 0);
1116 }
1117 else
1118 {
1579bae1 1119 fill = xmalloc (4 + sizeof (*fill) - 1);
e9ee469a 1120 val = expld.result.value;
2c382fb6
AM
1121 fill->data[0] = (val >> 24) & 0xff;
1122 fill->data[1] = (val >> 16) & 0xff;
1123 fill->data[2] = (val >> 8) & 0xff;
1124 fill->data[3] = (val >> 0) & 0xff;
1125 fill->size = 4;
1126 }
1127 return fill;
1128}
1129
252b5132 1130bfd_vma
e9ee469a 1131exp_get_abs_int (etree_type *tree, int def, char *name)
252b5132 1132{
e9ee469a
AM
1133 if (tree != NULL)
1134 {
1135 exp_fold_tree_no_dot (tree);
c7d701b0 1136
e9ee469a
AM
1137 if (expld.result.valid_p)
1138 {
1139 expld.result.value += expld.result.section->vma;
1140 return expld.result.value;
1141 }
1142 else if (name != NULL && expld.phase != lang_mark_phase_enum)
f856040a
L
1143 {
1144 lineno = tree->type.lineno;
1145 einfo (_("%F%S: nonconstant expression for %s\n"), name);
1146 }
e9ee469a
AM
1147 }
1148 return def;
252b5132 1149}
c553bb91 1150
e5caa5e0
AM
1151static bfd_vma
1152align_n (bfd_vma value, bfd_vma align)
c553bb91
AM
1153{
1154 if (align <= 1)
1155 return value;
1156
1157 value = (value + align - 1) / align;
1158 return value * align;
1159}
This page took 0.428141 seconds and 4 git commands to generate.