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