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