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