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