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