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