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