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