2010-07-31 Paul Pluzhnikov <ppluzhnikov@google.com>
[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,
aa820537 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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
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{
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,
564 NULL, 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)
e9ee469a 594 new_rel (0, NULL, 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:
e9ee469a 707 new_rel (tree->value.value, tree->value.str, expld.section);
252b5132
RH
708 break;
709
710 case etree_rel:
e9ee469a
AM
711 if (expld.phase != lang_first_phase_enum)
712 {
713 asection *output_section = tree->rel.section->output_section;
714 new_rel (tree->rel.value + tree->rel.section->output_offset,
715 NULL, output_section);
716 }
252b5132 717 else
e9ee469a 718 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
719 break;
720
721 case etree_assert:
e9ee469a 722 exp_fold_tree_1 (tree->assert_s.child);
5397b1fe
AM
723 if (expld.phase == lang_final_phase_enum && !expld.result.value)
724 einfo ("%X%P: %s\n", tree->assert_s.message);
252b5132
RH
725 break;
726
727 case etree_unary:
e9ee469a 728 fold_unary (tree);
252b5132
RH
729 break;
730
731 case etree_binary:
e9ee469a 732 fold_binary (tree);
252b5132 733 break;
0ae1cf52
AM
734
735 case etree_trinary:
e9ee469a 736 fold_trinary (tree);
0ae1cf52 737 break;
252b5132
RH
738
739 case etree_assign:
740 case etree_provide:
b46a87b1 741 case etree_provided:
252b5132
RH
742 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
743 {
c7d701b0 744 /* Assignment to dot can only be done during allocation. */
b46a87b1 745 if (tree->type.node_class != etree_assign)
252b5132 746 einfo (_("%F%S can not PROVIDE assignment to location counter\n"));
e9ee469a
AM
747 if (expld.phase == lang_mark_phase_enum
748 || expld.phase == lang_allocating_phase_enum
749 || (expld.phase == lang_final_phase_enum
750 && expld.section == bfd_abs_section_ptr))
252b5132 751 {
fbbb9ac5 752 /* Notify the folder that this is an assignment to dot. */
e9ee469a
AM
753 expld.assigning_to_dot = TRUE;
754 exp_fold_tree_1 (tree->assign.src);
755 expld.assigning_to_dot = FALSE;
756
757 if (!expld.result.valid_p)
758 {
759 if (expld.phase != lang_mark_phase_enum)
760 einfo (_("%F%S invalid assignment to location counter\n"));
761 }
762 else if (expld.dotp == NULL)
763 einfo (_("%F%S assignment to location counter"
764 " invalid outside of SECTION\n"));
252b5132
RH
765 else
766 {
e9ee469a
AM
767 bfd_vma nextdot;
768
769 nextdot = expld.result.value + expld.section->vma;
770 if (nextdot < expld.dot
771 && expld.section != bfd_abs_section_ptr)
772 einfo (_("%F%S cannot move location counter backwards"
773 " (from %V to %V)\n"), expld.dot, nextdot);
252b5132
RH
774 else
775 {
e9ee469a
AM
776 expld.dot = nextdot;
777 *expld.dotp = nextdot;
252b5132
RH
778 }
779 }
780 }
8b3d8fa8 781 else
e9ee469a 782 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
783 }
784 else
785 {
e9ee469a 786 struct bfd_link_hash_entry *h = NULL;
252b5132 787
e9ee469a
AM
788 if (tree->type.node_class == etree_provide)
789 {
252b5132 790 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
e9ee469a
AM
791 FALSE, FALSE, TRUE);
792 if (h == NULL
793 || (h->type != bfd_link_hash_new
794 && h->type != bfd_link_hash_undefined
795 && h->type != bfd_link_hash_common))
796 {
797 /* Do nothing. The symbol was never referenced, or was
798 defined by some object. */
799 break;
800 }
801 }
802
803 exp_fold_tree_1 (tree->assign.src);
804 if (expld.result.valid_p)
805 {
1579bae1 806 if (h == NULL)
67010b46 807 {
e9ee469a
AM
808 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
809 TRUE, FALSE, TRUE);
810 if (h == NULL)
67010b46
NC
811 einfo (_("%P%F:%s: hash creation failed\n"),
812 tree->assign.dst);
813 }
e9ee469a
AM
814
815 /* FIXME: Should we worry if the symbol is already
816 defined? */
817 lang_update_definedness (tree->assign.dst, h);
818 h->type = bfd_link_hash_defined;
819 h->u.def.value = expld.result.value;
820 h->u.def.section = expld.result.section;
821 if (tree->type.node_class == etree_provide)
822 tree->type.node_class = etree_provided;
1338dd10
PB
823
824 /* Copy the symbol type if this is a simple assignment of
825 one symbol to annother. */
826 if (tree->assign.src->type.node_class == etree_name)
827 {
828 struct bfd_link_hash_entry *hsrc;
829
830 hsrc = bfd_link_hash_lookup (link_info.hash,
831 tree->assign.src->name.name,
832 FALSE, FALSE, TRUE);
833 if (hsrc)
834 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
835 hsrc);
836 }
252b5132 837 }
e092cb30
AM
838 else if (expld.phase == lang_final_phase_enum)
839 {
840 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
841 FALSE, FALSE, TRUE);
842 if (h != NULL
843 && h->type == bfd_link_hash_new)
844 h->type = bfd_link_hash_undefined;
845 }
252b5132
RH
846 }
847 break;
848
849 case etree_name:
e9ee469a 850 fold_name (tree);
252b5132
RH
851 break;
852
853 default:
854 FAIL ();
e9ee469a 855 memset (&expld.result, 0, sizeof (expld.result));
252b5132
RH
856 break;
857 }
252b5132
RH
858}
859
e9ee469a
AM
860void
861exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
75ff4589 862{
e9ee469a
AM
863 expld.dot = *dotp;
864 expld.dotp = dotp;
865 expld.section = current_section;
866 exp_fold_tree_1 (tree);
75ff4589
L
867}
868
e9ee469a
AM
869static void
870exp_fold_tree_no_dot (etree_type *tree)
252b5132 871{
e9ee469a
AM
872 expld.dot = 0;
873 expld.dotp = NULL;
874 expld.section = bfd_abs_section_ptr;
875 exp_fold_tree_1 (tree);
252b5132
RH
876}
877
878etree_type *
1579bae1 879exp_binop (int code, etree_type *lhs, etree_type *rhs)
252b5132 880{
d3ce72d0 881 etree_type value, *new_e;
252b5132
RH
882
883 value.type.node_code = code;
f856040a 884 value.type.lineno = lhs->type.lineno;
252b5132
RH
885 value.binary.lhs = lhs;
886 value.binary.rhs = rhs;
887 value.type.node_class = etree_binary;
e9ee469a
AM
888 exp_fold_tree_no_dot (&value);
889 if (expld.result.valid_p)
890 return exp_intop (expld.result.value);
891
d3ce72d0
NC
892 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
893 memcpy (new_e, &value, sizeof (new_e->binary));
894 return new_e;
252b5132
RH
895}
896
897etree_type *
1579bae1 898exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
252b5132 899{
d3ce72d0 900 etree_type value, *new_e;
e9ee469a 901
252b5132 902 value.type.node_code = code;
f856040a 903 value.type.lineno = lhs->type.lineno;
252b5132
RH
904 value.trinary.lhs = lhs;
905 value.trinary.cond = cond;
906 value.trinary.rhs = rhs;
907 value.type.node_class = etree_trinary;
e9ee469a
AM
908 exp_fold_tree_no_dot (&value);
909 if (expld.result.valid_p)
910 return exp_intop (expld.result.value);
c7d701b0 911
d3ce72d0
NC
912 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
913 memcpy (new_e, &value, sizeof (new_e->trinary));
914 return new_e;
252b5132
RH
915}
916
252b5132 917etree_type *
1579bae1 918exp_unop (int code, etree_type *child)
252b5132 919{
d3ce72d0 920 etree_type value, *new_e;
252b5132 921
252b5132 922 value.unary.type.node_code = code;
f856040a 923 value.unary.type.lineno = child->type.lineno;
252b5132
RH
924 value.unary.child = child;
925 value.unary.type.node_class = etree_unary;
e9ee469a
AM
926 exp_fold_tree_no_dot (&value);
927 if (expld.result.valid_p)
928 return exp_intop (expld.result.value);
c7d701b0 929
d3ce72d0
NC
930 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
931 memcpy (new_e, &value, sizeof (new_e->unary));
932 return new_e;
252b5132
RH
933}
934
252b5132 935etree_type *
1579bae1 936exp_nameop (int code, const char *name)
252b5132 937{
d3ce72d0 938 etree_type value, *new_e;
e9ee469a 939
252b5132 940 value.name.type.node_code = code;
f856040a 941 value.name.type.lineno = lineno;
252b5132
RH
942 value.name.name = name;
943 value.name.type.node_class = etree_name;
944
e9ee469a
AM
945 exp_fold_tree_no_dot (&value);
946 if (expld.result.valid_p)
947 return exp_intop (expld.result.value);
c7d701b0 948
d3ce72d0
NC
949 new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
950 memcpy (new_e, &value, sizeof (new_e->name));
951 return new_e;
252b5132
RH
952
953}
954
252b5132 955etree_type *
1579bae1 956exp_assop (int code, const char *dst, etree_type *src)
252b5132 957{
d3ce72d0
NC
958 etree_type *new_e;
959
960 new_e = (etree_type *) stat_alloc (sizeof (new_e->assign));
961 new_e->type.node_code = code;
962 new_e->type.lineno = src->type.lineno;
963 new_e->type.node_class = etree_assign;
964 new_e->assign.src = src;
965 new_e->assign.dst = dst;
966 return new_e;
252b5132
RH
967}
968
969/* Handle PROVIDE. */
970
971etree_type *
7af8e998 972exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
252b5132
RH
973{
974 etree_type *n;
975
1e9cc1c2 976 n = (etree_type *) stat_alloc (sizeof (n->assign));
252b5132 977 n->assign.type.node_code = '=';
f856040a 978 n->assign.type.lineno = src->type.lineno;
252b5132
RH
979 n->assign.type.node_class = etree_provide;
980 n->assign.src = src;
981 n->assign.dst = dst;
7af8e998 982 n->assign.hidden = hidden;
252b5132
RH
983 return n;
984}
985
986/* Handle ASSERT. */
987
988etree_type *
1579bae1 989exp_assert (etree_type *exp, const char *message)
252b5132
RH
990{
991 etree_type *n;
992
1e9cc1c2 993 n = (etree_type *) stat_alloc (sizeof (n->assert_s));
252b5132 994 n->assert_s.type.node_code = '!';
f856040a 995 n->assert_s.type.lineno = exp->type.lineno;
252b5132
RH
996 n->assert_s.type.node_class = etree_assert;
997 n->assert_s.child = exp;
998 n->assert_s.message = message;
999 return n;
1000}
1001
4de2d33d 1002void
1579bae1 1003exp_print_tree (etree_type *tree)
252b5132 1004{
ae78bbeb
AM
1005 bfd_boolean function_like;
1006
c7d701b0
NC
1007 if (config.map_file == NULL)
1008 config.map_file = stderr;
b7a26f91 1009
c7d701b0
NC
1010 if (tree == NULL)
1011 {
1012 minfo ("NULL TREE\n");
1013 return;
1014 }
b7a26f91 1015
8c95a62e
KH
1016 switch (tree->type.node_class)
1017 {
1018 case etree_value:
1019 minfo ("0x%v", tree->value.value);
1020 return;
1021 case etree_rel:
1022 if (tree->rel.section->owner != NULL)
1023 minfo ("%B:", tree->rel.section->owner);
1024 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1025 return;
1026 case etree_assign:
ae78bbeb 1027 fputs (tree->assign.dst, config.map_file);
b34976b6 1028 exp_print_token (tree->type.node_code, TRUE);
8c95a62e
KH
1029 exp_print_tree (tree->assign.src);
1030 break;
1031 case etree_provide:
b46a87b1 1032 case etree_provided:
8c95a62e
KH
1033 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1034 exp_print_tree (tree->assign.src);
ae78bbeb 1035 fputc (')', config.map_file);
8c95a62e
KH
1036 break;
1037 case etree_binary:
ae78bbeb
AM
1038 function_like = FALSE;
1039 switch (tree->type.node_code)
1040 {
1041 case MAX_K:
1042 case MIN_K:
1043 case ALIGN_K:
1044 case DATA_SEGMENT_ALIGN:
1045 case DATA_SEGMENT_RELRO_END:
1046 function_like = TRUE;
1047 }
1048 if (function_like)
1049 {
1050 exp_print_token (tree->type.node_code, FALSE);
1051 fputc (' ', config.map_file);
1052 }
1053 fputc ('(', config.map_file);
8c95a62e 1054 exp_print_tree (tree->binary.lhs);
ae78bbeb
AM
1055 if (function_like)
1056 fprintf (config.map_file, ", ");
1057 else
1058 exp_print_token (tree->type.node_code, TRUE);
8c95a62e 1059 exp_print_tree (tree->binary.rhs);
ae78bbeb 1060 fputc (')', config.map_file);
8c95a62e
KH
1061 break;
1062 case etree_trinary:
1063 exp_print_tree (tree->trinary.cond);
ae78bbeb 1064 fputc ('?', config.map_file);
8c95a62e 1065 exp_print_tree (tree->trinary.lhs);
ae78bbeb 1066 fputc (':', config.map_file);
8c95a62e
KH
1067 exp_print_tree (tree->trinary.rhs);
1068 break;
1069 case etree_unary:
b34976b6 1070 exp_print_token (tree->unary.type.node_code, FALSE);
8c95a62e
KH
1071 if (tree->unary.child)
1072 {
7b17f854 1073 fprintf (config.map_file, " (");
8c95a62e 1074 exp_print_tree (tree->unary.child);
ae78bbeb 1075 fputc (')', config.map_file);
8c95a62e
KH
1076 }
1077 break;
1078
1079 case etree_assert:
1080 fprintf (config.map_file, "ASSERT (");
1081 exp_print_tree (tree->assert_s.child);
1082 fprintf (config.map_file, ", %s)", tree->assert_s.message);
1083 break;
1084
8c95a62e
KH
1085 case etree_name:
1086 if (tree->type.node_code == NAME)
ae78bbeb 1087 fputs (tree->name.name, config.map_file);
8c95a62e
KH
1088 else
1089 {
b34976b6 1090 exp_print_token (tree->type.node_code, FALSE);
8c95a62e 1091 if (tree->name.name)
7b17f854 1092 fprintf (config.map_file, " (%s)", tree->name.name);
8c95a62e
KH
1093 }
1094 break;
1095 default:
1096 FAIL ();
1097 break;
252b5132 1098 }
252b5132
RH
1099}
1100
1101bfd_vma
e9ee469a 1102exp_get_vma (etree_type *tree, bfd_vma def, char *name)
252b5132 1103{
252b5132
RH
1104 if (tree != NULL)
1105 {
e9ee469a
AM
1106 exp_fold_tree_no_dot (tree);
1107 if (expld.result.valid_p)
1108 return expld.result.value;
1109 else if (name != NULL && expld.phase != lang_mark_phase_enum)
c58dea77 1110 einfo (_("%F%S: nonconstant expression for %s\n"), name);
252b5132 1111 }
e9ee469a 1112 return def;
252b5132
RH
1113}
1114
4de2d33d 1115int
e9ee469a 1116exp_get_value_int (etree_type *tree, int def, char *name)
252b5132 1117{
e9ee469a 1118 return exp_get_vma (tree, def, name);
252b5132
RH
1119}
1120
2c382fb6 1121fill_type *
e9ee469a 1122exp_get_fill (etree_type *tree, fill_type *def, char *name)
2c382fb6
AM
1123{
1124 fill_type *fill;
2c382fb6
AM
1125 size_t len;
1126 unsigned int val;
1127
1128 if (tree == NULL)
1129 return def;
1130
e9ee469a
AM
1131 exp_fold_tree_no_dot (tree);
1132 if (!expld.result.valid_p)
1133 {
1134 if (name != NULL && expld.phase != lang_mark_phase_enum)
c58dea77 1135 einfo (_("%F%S: nonconstant expression for %s\n"), name);
e9ee469a
AM
1136 return def;
1137 }
2c382fb6 1138
e9ee469a 1139 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
2c382fb6
AM
1140 {
1141 unsigned char *dst;
1142 unsigned char *s;
1e9cc1c2 1143 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
2c382fb6
AM
1144 fill->size = (len + 1) / 2;
1145 dst = fill->data;
e9ee469a 1146 s = (unsigned char *) expld.result.str;
2c382fb6
AM
1147 val = 0;
1148 do
1149 {
1150 unsigned int digit;
1151
1152 digit = *s++ - '0';
1153 if (digit > 9)
1154 digit = (digit - 'A' + '0' + 10) & 0xf;
1155 val <<= 4;
1156 val += digit;
1157 --len;
1158 if ((len & 1) == 0)
1159 {
1160 *dst++ = val;
1161 val = 0;
1162 }
1163 }
1164 while (len != 0);
1165 }
1166 else
1167 {
1e9cc1c2 1168 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
e9ee469a 1169 val = expld.result.value;
2c382fb6
AM
1170 fill->data[0] = (val >> 24) & 0xff;
1171 fill->data[1] = (val >> 16) & 0xff;
1172 fill->data[2] = (val >> 8) & 0xff;
1173 fill->data[3] = (val >> 0) & 0xff;
1174 fill->size = 4;
1175 }
1176 return fill;
1177}
1178
252b5132 1179bfd_vma
e9ee469a 1180exp_get_abs_int (etree_type *tree, int def, char *name)
252b5132 1181{
e9ee469a
AM
1182 if (tree != NULL)
1183 {
1184 exp_fold_tree_no_dot (tree);
c7d701b0 1185
e9ee469a
AM
1186 if (expld.result.valid_p)
1187 {
1188 expld.result.value += expld.result.section->vma;
1189 return expld.result.value;
1190 }
1191 else if (name != NULL && expld.phase != lang_mark_phase_enum)
f856040a
L
1192 {
1193 lineno = tree->type.lineno;
1194 einfo (_("%F%S: nonconstant expression for %s\n"), name);
1195 }
e9ee469a
AM
1196 }
1197 return def;
252b5132 1198}
c553bb91 1199
e5caa5e0
AM
1200static bfd_vma
1201align_n (bfd_vma value, bfd_vma align)
c553bb91
AM
1202{
1203 if (align <= 1)
1204 return value;
1205
1206 value = (value + align - 1) / align;
1207 return value * align;
1208}
This page took 0.554963 seconds and 4 git commands to generate.