Make stap-probe.c:stap_parse_register_operand's "regname" an std::string
[external/binutils.git] / ld / ldexp.c
1 /* This module handles expression trees.
2    Copyright (C) 1991-2019 Free Software Foundation, Inc.
3    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
4
5    This file is part of the GNU Binutils.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22
23 /* This module is in charge of working out the contents of expressions.
24
25    It has to keep track of the relative/absness of a symbol etc. This
26    is done by keeping all values in a struct (an etree_value_type)
27    which contains a value, a section to which it is relative and a
28    valid bit.  */
29
30 #include "sysdep.h"
31 #include "bfd.h"
32 #include "bfdlink.h"
33
34 #include "ld.h"
35 #include "ldmain.h"
36 #include "ldmisc.h"
37 #include "ldexp.h"
38 #include "ldlex.h"
39 #include <ldgram.h>
40 #include "ldlang.h"
41 #include "libiberty.h"
42 #include "safe-ctype.h"
43
44 static void exp_fold_tree_1 (etree_type *);
45 static bfd_vma align_n (bfd_vma, bfd_vma);
46
47 segment_type *segments;
48
49 struct ldexp_control expld;
50
51 /* This structure records symbols for which we need to keep track of
52    definedness for use in the DEFINED () test.  It is also used in
53    making absolute symbols section relative late in the link.   */
54
55 struct definedness_hash_entry
56 {
57   struct bfd_hash_entry root;
58
59   /* If this symbol was assigned from "dot" outside of an output
60      section statement, the section we'd like it relative to.  */
61   asection *final_sec;
62
63   /* Low bits of iteration count.  Symbols with matching iteration have
64      been defined in this pass over the script.  */
65   unsigned int iteration : 8;
66
67   /* Symbol was defined by an object file.  */
68   unsigned int by_object : 1;
69 };
70
71 static struct bfd_hash_table definedness_table;
72
73 /* Print the string representation of the given token.  Surround it
74    with spaces if INFIX_P is TRUE.  */
75
76 static void
77 exp_print_token (token_code_type code, int infix_p)
78 {
79   static const struct
80   {
81     token_code_type code;
82     const char *name;
83   }
84   table[] =
85   {
86     { INT, "int" },
87     { NAME, "NAME" },
88     { PLUSEQ, "+=" },
89     { MINUSEQ, "-=" },
90     { MULTEQ, "*=" },
91     { DIVEQ, "/=" },
92     { LSHIFTEQ, "<<=" },
93     { RSHIFTEQ, ">>=" },
94     { ANDEQ, "&=" },
95     { OREQ, "|=" },
96     { OROR, "||" },
97     { ANDAND, "&&" },
98     { EQ, "==" },
99     { NE, "!=" },
100     { LE, "<=" },
101     { GE, ">=" },
102     { LSHIFT, "<<" },
103     { RSHIFT, ">>" },
104     { LOG2CEIL, "LOG2CEIL" },
105     { ALIGN_K, "ALIGN" },
106     { BLOCK, "BLOCK" },
107     { QUAD, "QUAD" },
108     { SQUAD, "SQUAD" },
109     { LONG, "LONG" },
110     { SHORT, "SHORT" },
111     { BYTE, "BYTE" },
112     { SECTIONS, "SECTIONS" },
113     { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
114     { MEMORY, "MEMORY" },
115     { DEFINED, "DEFINED" },
116     { TARGET_K, "TARGET" },
117     { SEARCH_DIR, "SEARCH_DIR" },
118     { MAP, "MAP" },
119     { ENTRY, "ENTRY" },
120     { NEXT, "NEXT" },
121     { ALIGNOF, "ALIGNOF" },
122     { SIZEOF, "SIZEOF" },
123     { ADDR, "ADDR" },
124     { LOADADDR, "LOADADDR" },
125     { CONSTANT, "CONSTANT" },
126     { ABSOLUTE, "ABSOLUTE" },
127     { MAX_K, "MAX" },
128     { MIN_K, "MIN" },
129     { ASSERT_K, "ASSERT" },
130     { REL, "relocatable" },
131     { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
132     { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
133     { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
134     { ORIGIN, "ORIGIN" },
135     { LENGTH, "LENGTH" },
136     { SEGMENT_START, "SEGMENT_START" }
137   };
138   unsigned int idx;
139
140   for (idx = 0; idx < ARRAY_SIZE (table); idx++)
141     if (table[idx].code == code)
142       break;
143
144   if (infix_p)
145     fputc (' ', config.map_file);
146
147   if (idx < ARRAY_SIZE (table))
148     fputs (table[idx].name, config.map_file);
149   else if (code < 127)
150     fputc (code, config.map_file);
151   else
152     fprintf (config.map_file, "<code %d>", code);
153
154   if (infix_p)
155     fputc (' ', config.map_file);
156 }
157
158 static void
159 make_log2ceil (void)
160 {
161   bfd_vma value = expld.result.value;
162   bfd_vma result = -1;
163   bfd_boolean round_up = FALSE;
164
165   do
166     {
167       result++;
168       /* If more than one bit is set in the value we will need to round up.  */
169       if ((value > 1) && (value & 1))
170         round_up = TRUE;
171     }
172   while (value >>= 1);
173
174   if (round_up)
175     result += 1;
176   expld.result.section = NULL;
177   expld.result.value = result;
178 }
179
180 static void
181 make_abs (void)
182 {
183   if (expld.result.section != NULL)
184     expld.result.value += expld.result.section->vma;
185   expld.result.section = bfd_abs_section_ptr;
186   expld.rel_from_abs = FALSE;
187 }
188
189 static void
190 new_abs (bfd_vma value)
191 {
192   expld.result.valid_p = TRUE;
193   expld.result.section = bfd_abs_section_ptr;
194   expld.result.value = value;
195   expld.result.str = NULL;
196 }
197
198 etree_type *
199 exp_intop (bfd_vma value)
200 {
201   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
202   new_e->type.node_code = INT;
203   new_e->type.filename = ldlex_filename ();
204   new_e->type.lineno = lineno;
205   new_e->value.value = value;
206   new_e->value.str = NULL;
207   new_e->type.node_class = etree_value;
208   return new_e;
209 }
210
211 etree_type *
212 exp_bigintop (bfd_vma value, char *str)
213 {
214   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
215   new_e->type.node_code = INT;
216   new_e->type.filename = ldlex_filename ();
217   new_e->type.lineno = lineno;
218   new_e->value.value = value;
219   new_e->value.str = str;
220   new_e->type.node_class = etree_value;
221   return new_e;
222 }
223
224 /* Build an expression representing an unnamed relocatable value.  */
225
226 etree_type *
227 exp_relop (asection *section, bfd_vma value)
228 {
229   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->rel));
230   new_e->type.node_code = REL;
231   new_e->type.filename = ldlex_filename ();
232   new_e->type.lineno = lineno;
233   new_e->type.node_class = etree_rel;
234   new_e->rel.section = section;
235   new_e->rel.value = value;
236   return new_e;
237 }
238
239 static void
240 new_number (bfd_vma value)
241 {
242   expld.result.valid_p = TRUE;
243   expld.result.value = value;
244   expld.result.str = NULL;
245   expld.result.section = NULL;
246 }
247
248 static void
249 new_rel (bfd_vma value, asection *section)
250 {
251   expld.result.valid_p = TRUE;
252   expld.result.value = value;
253   expld.result.str = NULL;
254   expld.result.section = section;
255 }
256
257 static void
258 new_rel_from_abs (bfd_vma value)
259 {
260   asection *s = expld.section;
261
262   expld.rel_from_abs = TRUE;
263   expld.result.valid_p = TRUE;
264   expld.result.value = value - s->vma;
265   expld.result.str = NULL;
266   expld.result.section = s;
267 }
268
269 /* New-function for the definedness hash table.  */
270
271 static struct bfd_hash_entry *
272 definedness_newfunc (struct bfd_hash_entry *entry,
273                      struct bfd_hash_table *table ATTRIBUTE_UNUSED,
274                      const char *name ATTRIBUTE_UNUSED)
275 {
276   struct definedness_hash_entry *ret = (struct definedness_hash_entry *) entry;
277
278   if (ret == NULL)
279     ret = (struct definedness_hash_entry *)
280       bfd_hash_allocate (table, sizeof (struct definedness_hash_entry));
281
282   if (ret == NULL)
283     einfo (_("%F%P: bfd_hash_allocate failed creating symbol %s\n"), name);
284
285   ret->by_object = 0;
286   ret->iteration = 0;
287   return &ret->root;
288 }
289
290 /* Called during processing of linker script script expressions.
291    For symbols assigned in a linker script, return a struct describing
292    where the symbol is defined relative to the current expression,
293    otherwise return NULL.  */
294
295 static struct definedness_hash_entry *
296 symbol_defined (const char *name)
297 {
298   return ((struct definedness_hash_entry *)
299           bfd_hash_lookup (&definedness_table, name, FALSE, FALSE));
300 }
301
302 /* Update the definedness state of NAME.  Return FALSE if script symbol
303    is multiply defining a strong symbol in an object.  */
304
305 static bfd_boolean
306 update_definedness (const char *name, struct bfd_link_hash_entry *h)
307 {
308   bfd_boolean ret;
309   struct definedness_hash_entry *defentry
310     = (struct definedness_hash_entry *)
311     bfd_hash_lookup (&definedness_table, name, TRUE, FALSE);
312
313   if (defentry == NULL)
314     einfo (_("%F%P: bfd_hash_lookup failed creating symbol %s\n"), name);
315
316   /* If the symbol was already defined, and not by a script, then it
317      must be defined by an object file or by the linker target code.  */
318   ret = TRUE;
319   if (!h->ldscript_def
320       && (h->type == bfd_link_hash_defined
321           || h->type == bfd_link_hash_defweak
322           || h->type == bfd_link_hash_common))
323     {
324       defentry->by_object = 1;
325       if (h->type == bfd_link_hash_defined
326           && h->u.def.section->output_section != NULL
327           && !h->linker_def)
328         ret = FALSE;
329     }
330
331   defentry->iteration = lang_statement_iteration;
332   defentry->final_sec = bfd_abs_section_ptr;
333   if (expld.phase == lang_final_phase_enum
334       && expld.rel_from_abs
335       && expld.result.section == bfd_abs_section_ptr)
336     defentry->final_sec = section_for_dot ();
337   return ret;
338 }
339
340 static void
341 fold_segment_end (seg_align_type *seg)
342 {
343   if (expld.phase == lang_first_phase_enum
344       || expld.section != bfd_abs_section_ptr)
345     {
346       expld.result.valid_p = FALSE;
347     }
348   else if (seg->phase == exp_seg_align_seen
349            || seg->phase == exp_seg_relro_seen)
350     {
351       seg->phase = exp_seg_end_seen;
352       seg->end = expld.result.value;
353     }
354   else if (seg->phase == exp_seg_done
355            || seg->phase == exp_seg_adjust
356            || seg->phase == exp_seg_relro_adjust)
357     {
358       /* OK.  */
359     }
360   else
361     expld.result.valid_p = FALSE;
362 }
363
364 static void
365 fold_unary (etree_type *tree)
366 {
367   exp_fold_tree_1 (tree->unary.child);
368   if (expld.result.valid_p)
369     {
370       switch (tree->type.node_code)
371         {
372         case ALIGN_K:
373           if (expld.phase != lang_first_phase_enum)
374             new_rel_from_abs (align_n (expld.dot, expld.result.value));
375           else
376             expld.result.valid_p = FALSE;
377           break;
378
379         case ABSOLUTE:
380           make_abs ();
381           break;
382
383         case LOG2CEIL:
384           make_log2ceil ();
385           break;
386
387         case '~':
388           expld.result.value = ~expld.result.value;
389           break;
390
391         case '!':
392           expld.result.value = !expld.result.value;
393           break;
394
395         case '-':
396           expld.result.value = -expld.result.value;
397           break;
398
399         case NEXT:
400           /* Return next place aligned to value.  */
401           if (expld.phase != lang_first_phase_enum)
402             {
403               make_abs ();
404               expld.result.value = align_n (expld.dot, expld.result.value);
405             }
406           else
407             expld.result.valid_p = FALSE;
408           break;
409
410         case DATA_SEGMENT_END:
411           fold_segment_end (&expld.dataseg);
412           break;
413
414         default:
415           FAIL ();
416           break;
417         }
418     }
419 }
420
421 /* Arithmetic operators, bitwise AND, bitwise OR and XOR keep the
422    section of one of their operands only when the other operand is a
423    plain number.  Losing the section when operating on two symbols,
424    ie. a result of a plain number, is required for subtraction and
425    XOR.  It's justifiable for the other operations on the grounds that
426    adding, multiplying etc. two section relative values does not
427    really make sense unless they are just treated as numbers.
428    The same argument could be made for many expressions involving one
429    symbol and a number.  For example, "1 << x" and "100 / x" probably
430    should not be given the section of x.  The trouble is that if we
431    fuss about such things the rules become complex and it is onerous
432    to document ld expression evaluation.  */
433 static void
434 arith_result_section (const etree_value_type *lhs)
435 {
436   if (expld.result.section == lhs->section)
437     {
438       if (expld.section == bfd_abs_section_ptr
439           && !config.sane_expr)
440         /* Duplicate the insanity in exp_fold_tree_1 case etree_value.  */
441         expld.result.section = bfd_abs_section_ptr;
442       else
443         expld.result.section = NULL;
444     }
445 }
446
447 static void
448 fold_segment_align (seg_align_type *seg, etree_value_type *lhs)
449 {
450   seg->relro = exp_seg_relro_start;
451   if (expld.phase == lang_first_phase_enum
452       || expld.section != bfd_abs_section_ptr)
453     expld.result.valid_p = FALSE;
454   else
455     {
456       bfd_vma maxpage = lhs->value;
457       bfd_vma commonpage = expld.result.value;
458
459       expld.result.value = align_n (expld.dot, maxpage);
460       if (seg->phase == exp_seg_relro_adjust)
461         expld.result.value = seg->base;
462       else if (seg->phase == exp_seg_adjust)
463         {
464           if (commonpage < maxpage)
465             expld.result.value += ((expld.dot + commonpage - 1)
466                                    & (maxpage - commonpage));
467         }
468       else
469         {
470           expld.result.value += expld.dot & (maxpage - 1);
471           if (seg->phase == exp_seg_done)
472             {
473               /* OK.  */
474             }
475           else if (seg->phase == exp_seg_none)
476             {
477               seg->phase = exp_seg_align_seen;
478               seg->base = expld.result.value;
479               seg->pagesize = commonpage;
480               seg->maxpagesize = maxpage;
481               seg->relro_end = 0;
482             }
483           else
484             expld.result.valid_p = FALSE;
485         }
486     }
487 }
488
489 static void
490 fold_segment_relro_end (seg_align_type *seg, etree_value_type *lhs)
491 {
492   /* Operands swapped!  XXX_SEGMENT_RELRO_END(offset,exp) has offset
493      in expld.result and exp in lhs.  */
494   seg->relro = exp_seg_relro_end;
495   seg->relro_offset = expld.result.value;
496   if (expld.phase == lang_first_phase_enum
497       || expld.section != bfd_abs_section_ptr)
498     expld.result.valid_p = FALSE;
499   else if (seg->phase == exp_seg_align_seen
500            || seg->phase == exp_seg_adjust
501            || seg->phase == exp_seg_relro_adjust
502            || seg->phase == exp_seg_done)
503     {
504       if (seg->phase == exp_seg_align_seen
505           || seg->phase == exp_seg_relro_adjust)
506         seg->relro_end = lhs->value + expld.result.value;
507
508       if (seg->phase == exp_seg_relro_adjust
509           && (seg->relro_end & (seg->pagesize - 1)))
510         {
511           seg->relro_end += seg->pagesize - 1;
512           seg->relro_end &= ~(seg->pagesize - 1);
513           expld.result.value = seg->relro_end - expld.result.value;
514         }
515       else
516         expld.result.value = lhs->value;
517
518       if (seg->phase == exp_seg_align_seen)
519         seg->phase = exp_seg_relro_seen;
520     }
521   else
522     expld.result.valid_p = FALSE;
523 }
524
525 static void
526 fold_binary (etree_type *tree)
527 {
528   etree_value_type lhs;
529   exp_fold_tree_1 (tree->binary.lhs);
530
531   /* The SEGMENT_START operator is special because its first
532      operand is a string, not the name of a symbol.  Note that the
533      operands have been swapped, so binary.lhs is second (default)
534      operand, binary.rhs is first operand.  */
535   if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
536     {
537       bfd_vma value = expld.result.value;
538       const char *segment_name;
539       segment_type *seg;
540
541       /* Check to see if the user has overridden the default
542          value.  */
543       segment_name = tree->binary.rhs->name.name;
544       for (seg = segments; seg; seg = seg->next)
545         if (strcmp (seg->name, segment_name) == 0)
546           {
547             if (!seg->used
548                 && config.magic_demand_paged
549                 && config.maxpagesize != 0
550                 && (seg->value % config.maxpagesize) != 0)
551               einfo (_("%P: warning: address of `%s' "
552                        "isn't multiple of maximum page size\n"),
553                      segment_name);
554             seg->used = TRUE;
555             value = seg->value;
556             break;
557           }
558       new_rel_from_abs (value);
559       return;
560     }
561
562   lhs = expld.result;
563   exp_fold_tree_1 (tree->binary.rhs);
564   expld.result.valid_p &= lhs.valid_p;
565
566   if (expld.result.valid_p)
567     {
568       if (lhs.section != expld.result.section)
569         {
570           /* If the values are from different sections, and neither is
571              just a number, make both the source arguments absolute.  */
572           if (expld.result.section != NULL
573               && lhs.section != NULL)
574             {
575               make_abs ();
576               lhs.value += lhs.section->vma;
577               lhs.section = bfd_abs_section_ptr;
578             }
579
580           /* If the rhs is just a number, keep the lhs section.  */
581           else if (expld.result.section == NULL)
582             {
583               expld.result.section = lhs.section;
584               /* Make this NULL so that we know one of the operands
585                  was just a number, for later tests.  */
586               lhs.section = NULL;
587             }
588         }
589       /* At this point we know that both operands have the same
590          section, or at least one of them is a plain number.  */
591
592       switch (tree->type.node_code)
593         {
594 #define BOP(x, y) \
595         case x:                                                 \
596           expld.result.value = lhs.value y expld.result.value;  \
597           arith_result_section (&lhs);                          \
598           break;
599
600           /* Comparison operators, logical AND, and logical OR always
601              return a plain number.  */
602 #define BOPN(x, y) \
603         case x:                                                 \
604           expld.result.value = lhs.value y expld.result.value;  \
605           expld.result.section = NULL;                          \
606           break;
607
608           BOP ('+', +);
609           BOP ('*', *);
610           BOP ('-', -);
611           BOP (LSHIFT, <<);
612           BOP (RSHIFT, >>);
613           BOP ('&', &);
614           BOP ('^', ^);
615           BOP ('|', |);
616           BOPN (EQ, ==);
617           BOPN (NE, !=);
618           BOPN ('<', <);
619           BOPN ('>', >);
620           BOPN (LE, <=);
621           BOPN (GE, >=);
622           BOPN (ANDAND, &&);
623           BOPN (OROR, ||);
624
625         case '%':
626           if (expld.result.value != 0)
627             expld.result.value = ((bfd_signed_vma) lhs.value
628                                   % (bfd_signed_vma) expld.result.value);
629           else if (expld.phase != lang_mark_phase_enum)
630             einfo (_("%F%P:%pS %% by zero\n"), tree->binary.rhs);
631           arith_result_section (&lhs);
632           break;
633
634         case '/':
635           if (expld.result.value != 0)
636             expld.result.value = ((bfd_signed_vma) lhs.value
637                                   / (bfd_signed_vma) expld.result.value);
638           else if (expld.phase != lang_mark_phase_enum)
639             einfo (_("%F%P:%pS / by zero\n"), tree->binary.rhs);
640           arith_result_section (&lhs);
641           break;
642
643         case MAX_K:
644           if (lhs.value > expld.result.value)
645             expld.result.value = lhs.value;
646           break;
647
648         case MIN_K:
649           if (lhs.value < expld.result.value)
650             expld.result.value = lhs.value;
651           break;
652
653         case ALIGN_K:
654           expld.result.value = align_n (lhs.value, expld.result.value);
655           break;
656
657         case DATA_SEGMENT_ALIGN:
658           fold_segment_align (&expld.dataseg, &lhs);
659           break;
660
661         case DATA_SEGMENT_RELRO_END:
662           fold_segment_relro_end (&expld.dataseg, &lhs);
663           break;
664
665         default:
666           FAIL ();
667         }
668     }
669 }
670
671 static void
672 fold_trinary (etree_type *tree)
673 {
674   struct bfd_link_hash_entry *save = expld.assign_src;
675
676   exp_fold_tree_1 (tree->trinary.cond);
677   expld.assign_src = save;
678   if (expld.result.valid_p)
679     exp_fold_tree_1 (expld.result.value
680                      ? tree->trinary.lhs
681                      : tree->trinary.rhs);
682 }
683
684 static void
685 fold_name (etree_type *tree)
686 {
687   struct bfd_link_hash_entry *h;
688   struct definedness_hash_entry *def;
689
690   memset (&expld.result, 0, sizeof (expld.result));
691
692   switch (tree->type.node_code)
693     {
694     case SIZEOF_HEADERS:
695       link_info.load_phdrs = 1;
696       if (expld.phase != lang_first_phase_enum)
697         {
698           bfd_vma hdr_size = 0;
699           /* Don't find the real header size if only marking sections;
700              The bfd function may cache incorrect data.  */
701           if (expld.phase != lang_mark_phase_enum)
702             hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
703           new_number (hdr_size);
704         }
705       break;
706
707     case DEFINED:
708       h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
709                                         &link_info,
710                                         tree->name.name,
711                                         FALSE, FALSE, TRUE);
712       new_number (h != NULL
713                   && (h->type == bfd_link_hash_defined
714                       || h->type == bfd_link_hash_defweak
715                       || h->type == bfd_link_hash_common)
716                   && (!h->ldscript_def
717                       || (def = symbol_defined (tree->name.name)) == NULL
718                       || def->by_object
719                       || def->iteration == (lang_statement_iteration & 255)));
720       break;
721
722     case NAME:
723       if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
724         new_rel_from_abs (expld.dot);
725       else
726         {
727           h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
728                                             &link_info,
729                                             tree->name.name,
730                                             TRUE, FALSE, TRUE);
731           if (!h)
732             einfo (_("%F%P: bfd_link_hash_lookup failed: %E\n"));
733           else if (h->type == bfd_link_hash_defined
734                    || h->type == bfd_link_hash_defweak)
735             {
736               asection *output_section;
737
738               output_section = h->u.def.section->output_section;
739               if (output_section == NULL)
740                 {
741                   if (expld.phase <= lang_mark_phase_enum)
742                     new_rel (h->u.def.value, h->u.def.section);
743                   else
744                     einfo (_("%X%P:%pS: unresolvable symbol `%s'"
745                              " referenced in expression\n"),
746                            tree, tree->name.name);
747                 }
748               else if (output_section == bfd_abs_section_ptr
749                        && (expld.section != bfd_abs_section_ptr
750                            || config.sane_expr))
751                 new_number (h->u.def.value + h->u.def.section->output_offset);
752               else
753                 new_rel (h->u.def.value + h->u.def.section->output_offset,
754                          output_section);
755             }
756           else if (expld.phase == lang_final_phase_enum
757                    || (expld.phase != lang_mark_phase_enum
758                        && expld.assigning_to_dot))
759             einfo (_("%F%P:%pS: undefined symbol `%s'"
760                      " referenced in expression\n"),
761                    tree, tree->name.name);
762           else if (h->type == bfd_link_hash_new)
763             {
764               h->type = bfd_link_hash_undefined;
765               h->u.undef.abfd = NULL;
766               if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
767                 bfd_link_add_undef (link_info.hash, h);
768             }
769           if (expld.assign_src == NULL)
770             expld.assign_src = h;
771           else
772             expld.assign_src = (struct bfd_link_hash_entry *) - 1;
773
774           /* Self-assignment is only allowed for absolute symbols
775              defined in a linker script.  */
776           if (expld.assign_name != NULL
777               && strcmp (expld.assign_name, tree->name.name) == 0
778               && !(h != NULL
779                    && (h->type == bfd_link_hash_defined
780                        || h->type == bfd_link_hash_defweak)
781                    && h->u.def.section == bfd_abs_section_ptr
782                    && (def = symbol_defined (tree->name.name)) != NULL
783                    && def->iteration == (lang_statement_iteration & 255)))
784             expld.assign_name = NULL;
785         }
786       break;
787
788     case ADDR:
789       if (expld.phase != lang_first_phase_enum)
790         {
791           lang_output_section_statement_type *os;
792
793           os = lang_output_section_find (tree->name.name);
794           if (os == NULL)
795             {
796               if (expld.phase == lang_final_phase_enum)
797                 einfo (_("%F%P:%pS: undefined section `%s'"
798                          " referenced in expression\n"),
799                        tree, tree->name.name);
800             }
801           else if (os->processed_vma)
802             new_rel (0, os->bfd_section);
803         }
804       break;
805
806     case LOADADDR:
807       if (expld.phase != lang_first_phase_enum)
808         {
809           lang_output_section_statement_type *os;
810
811           os = lang_output_section_find (tree->name.name);
812           if (os == NULL)
813             {
814               if (expld.phase == lang_final_phase_enum)
815                 einfo (_("%F%P:%pS: undefined section `%s'"
816                          " referenced in expression\n"),
817                        tree, tree->name.name);
818             }
819           else if (os->processed_lma)
820             {
821               if (os->load_base == NULL)
822                 new_abs (os->bfd_section->lma);
823               else
824                 {
825                   exp_fold_tree_1 (os->load_base);
826                   if (expld.result.valid_p)
827                     make_abs ();
828                 }
829             }
830         }
831       break;
832
833     case SIZEOF:
834     case ALIGNOF:
835       if (expld.phase != lang_first_phase_enum)
836         {
837           lang_output_section_statement_type *os;
838
839           os = lang_output_section_find (tree->name.name);
840           if (os == NULL)
841             {
842               if (expld.phase == lang_final_phase_enum)
843                 einfo (_("%F%P:%pS: undefined section `%s'"
844                          " referenced in expression\n"),
845                        tree, tree->name.name);
846               new_number (0);
847             }
848           else if (os->bfd_section != NULL)
849             {
850               bfd_vma val;
851
852               if (tree->type.node_code == SIZEOF)
853                 val = (os->bfd_section->size
854                        / bfd_octets_per_byte (link_info.output_bfd));
855               else
856                 val = (bfd_vma)1 << os->bfd_section->alignment_power;
857
858               new_number (val);
859             }
860           else
861             new_number (0);
862         }
863       break;
864
865     case LENGTH:
866       {
867       if (expld.phase != lang_first_phase_enum)
868         {
869           lang_memory_region_type *mem;
870
871           mem = lang_memory_region_lookup (tree->name.name, FALSE);
872           if (mem != NULL)
873             new_number (mem->length);
874           else
875             einfo (_("%F%P:%pS: undefined MEMORY region `%s'"
876                      " referenced in expression\n"),
877                    tree, tree->name.name);
878         }
879       }
880       break;
881
882     case ORIGIN:
883       if (expld.phase != lang_first_phase_enum)
884         {
885           lang_memory_region_type *mem;
886
887           mem = lang_memory_region_lookup (tree->name.name, FALSE);
888           if (mem != NULL)
889             new_rel_from_abs (mem->origin);
890           else
891             einfo (_("%F%P:%pS: undefined MEMORY region `%s'"
892                      " referenced in expression\n"),
893                    tree, tree->name.name);
894         }
895       break;
896
897     case CONSTANT:
898       if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
899         new_number (config.maxpagesize);
900       else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
901         new_number (config.commonpagesize);
902       else
903         einfo (_("%F%P:%pS: unknown constant `%s' referenced in expression\n"),
904                tree, tree->name.name);
905       break;
906
907     default:
908       FAIL ();
909       break;
910     }
911 }
912
913 /* Return true if TREE is '.'.  */
914
915 static bfd_boolean
916 is_dot (const etree_type *tree)
917 {
918   return (tree->type.node_class == etree_name
919           && tree->type.node_code == NAME
920           && tree->name.name[0] == '.'
921           && tree->name.name[1] == 0);
922 }
923
924 /* Return true if TREE is a constant equal to VAL.  */
925
926 static bfd_boolean
927 is_value (const etree_type *tree, bfd_vma val)
928 {
929   return (tree->type.node_class == etree_value
930           && tree->value.value == val);
931 }
932
933 /* Return true if TREE is an absolute symbol equal to VAL defined in
934    a linker script.  */
935
936 static bfd_boolean
937 is_sym_value (const etree_type *tree, bfd_vma val)
938 {
939   struct bfd_link_hash_entry *h;
940   struct definedness_hash_entry *def;
941
942   return (tree->type.node_class == etree_name
943           && tree->type.node_code == NAME
944           && (def = symbol_defined (tree->name.name)) != NULL
945           && def->iteration == (lang_statement_iteration & 255)
946           && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
947                                                 &link_info,
948                                                 tree->name.name,
949                                                 FALSE, FALSE, TRUE)) != NULL
950           && h->ldscript_def
951           && h->type == bfd_link_hash_defined
952           && h->u.def.section == bfd_abs_section_ptr
953           && h->u.def.value == val);
954 }
955
956 /* Return true if TREE is ". != 0".  */
957
958 static bfd_boolean
959 is_dot_ne_0 (const etree_type *tree)
960 {
961   return (tree->type.node_class == etree_binary
962           && tree->type.node_code == NE
963           && is_dot (tree->binary.lhs)
964           && is_value (tree->binary.rhs, 0));
965 }
966
967 /* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an
968    absolute constant with value 0 defined in a linker script.  */
969
970 static bfd_boolean
971 is_dot_plus_0 (const etree_type *tree)
972 {
973   return (tree->type.node_class == etree_binary
974           && tree->type.node_code == '+'
975           && is_dot (tree->binary.lhs)
976           && (is_value (tree->binary.rhs, 0)
977               || is_sym_value (tree->binary.rhs, 0)));
978 }
979
980 /* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)".  */
981
982 static bfd_boolean
983 is_align_conditional (const etree_type *tree)
984 {
985   if (tree->type.node_class == etree_unary
986       && tree->type.node_code == ALIGN_K)
987     {
988       tree = tree->unary.child;
989       return (tree->type.node_class == etree_trinary
990               && is_dot_ne_0 (tree->trinary.cond)
991               && is_value (tree->trinary.rhs, 1));
992     }
993   return FALSE;
994 }
995
996 static void
997 exp_fold_tree_1 (etree_type *tree)
998 {
999   if (tree == NULL)
1000     {
1001       memset (&expld.result, 0, sizeof (expld.result));
1002       return;
1003     }
1004
1005   switch (tree->type.node_class)
1006     {
1007     case etree_value:
1008       if (expld.section == bfd_abs_section_ptr
1009           && !config.sane_expr)
1010         new_abs (tree->value.value);
1011       else
1012         new_number (tree->value.value);
1013       expld.result.str = tree->value.str;
1014       break;
1015
1016     case etree_rel:
1017       if (expld.phase != lang_first_phase_enum)
1018         {
1019           asection *output_section = tree->rel.section->output_section;
1020           new_rel (tree->rel.value + tree->rel.section->output_offset,
1021                    output_section);
1022         }
1023       else
1024         memset (&expld.result, 0, sizeof (expld.result));
1025       break;
1026
1027     case etree_assert:
1028       exp_fold_tree_1 (tree->assert_s.child);
1029       if (expld.phase == lang_final_phase_enum && !expld.result.value)
1030         einfo ("%X%P: %s\n", tree->assert_s.message);
1031       break;
1032
1033     case etree_unary:
1034       fold_unary (tree);
1035       break;
1036
1037     case etree_binary:
1038       fold_binary (tree);
1039       break;
1040
1041     case etree_trinary:
1042       fold_trinary (tree);
1043       break;
1044
1045     case etree_assign:
1046     case etree_provide:
1047     case etree_provided:
1048       if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
1049         {
1050           if (tree->type.node_class != etree_assign)
1051             einfo (_("%F%P:%pS can not PROVIDE assignment to"
1052                      " location counter\n"), tree);
1053           if (expld.phase != lang_first_phase_enum)
1054             {
1055               /* Notify the folder that this is an assignment to dot.  */
1056               expld.assigning_to_dot = TRUE;
1057               exp_fold_tree_1 (tree->assign.src);
1058               expld.assigning_to_dot = FALSE;
1059
1060               /* If we are assigning to dot inside an output section
1061                  arrange to keep the section, except for certain
1062                  expressions that evaluate to zero.  We ignore . = 0,
1063                  . = . + 0, and . = ALIGN (. != 0 ? expr : 1).
1064                  We can't ignore all expressions that evaluate to zero
1065                  because an otherwise empty section might have padding
1066                  added by an alignment expression that changes with
1067                  relaxation.  Such a section might have zero size
1068                  before relaxation and so be stripped incorrectly.  */
1069               if (expld.phase == lang_mark_phase_enum
1070                   && expld.section != bfd_abs_section_ptr
1071                   && expld.section != bfd_und_section_ptr
1072                   && !(expld.result.valid_p
1073                        && expld.result.value == 0
1074                        && (is_value (tree->assign.src, 0)
1075                            || is_sym_value (tree->assign.src, 0)
1076                            || is_dot_plus_0 (tree->assign.src)
1077                            || is_align_conditional (tree->assign.src))))
1078                 expld.section->flags |= SEC_KEEP;
1079
1080               if (!expld.result.valid_p
1081                   || expld.section == bfd_und_section_ptr)
1082                 {
1083                   if (expld.phase != lang_mark_phase_enum)
1084                     einfo (_("%F%P:%pS invalid assignment to"
1085                              " location counter\n"), tree);
1086                 }
1087               else if (expld.dotp == NULL)
1088                 einfo (_("%F%P:%pS assignment to location counter"
1089                          " invalid outside of SECTIONS\n"), tree);
1090
1091               /* After allocation, assignment to dot should not be
1092                  done inside an output section since allocation adds a
1093                  padding statement that effectively duplicates the
1094                  assignment.  */
1095               else if (expld.phase <= lang_allocating_phase_enum
1096                        || expld.section == bfd_abs_section_ptr)
1097                 {
1098                   bfd_vma nextdot;
1099
1100                   nextdot = expld.result.value;
1101                   if (expld.result.section != NULL)
1102                     nextdot += expld.result.section->vma;
1103                   else
1104                     nextdot += expld.section->vma;
1105                   if (nextdot < expld.dot
1106                       && expld.section != bfd_abs_section_ptr)
1107                     einfo (_("%F%P:%pS cannot move location counter backwards"
1108                              " (from %V to %V)\n"),
1109                            tree, expld.dot, nextdot);
1110                   else
1111                     {
1112                       expld.dot = nextdot;
1113                       *expld.dotp = nextdot;
1114                     }
1115                 }
1116             }
1117           else
1118             memset (&expld.result, 0, sizeof (expld.result));
1119         }
1120       else
1121         {
1122           struct bfd_link_hash_entry *h = NULL;
1123
1124           if (tree->type.node_class == etree_provide)
1125             {
1126               h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1127                                         FALSE, FALSE, TRUE);
1128               if (h == NULL
1129                   || !(h->type == bfd_link_hash_new
1130                        || h->type == bfd_link_hash_undefined
1131                        || h->type == bfd_link_hash_undefweak
1132                        || h->linker_def))
1133                 {
1134                   /* Do nothing.  The symbol was never referenced, or
1135                      was defined in some object file.  Note that
1136                      undefweak symbols are defined by PROVIDE.  This
1137                      is to support glibc use of __rela_iplt_start and
1138                      similar weak references.  */
1139                   break;
1140                 }
1141             }
1142
1143           expld.assign_name = tree->assign.dst;
1144           expld.assign_src = NULL;
1145           exp_fold_tree_1 (tree->assign.src);
1146           /* expld.assign_name remaining equal to tree->assign.dst
1147              below indicates the evaluation of tree->assign.src did
1148              not use the value of tree->assign.dst.  We don't allow
1149              self assignment until the final phase for two reasons:
1150              1) Expressions are evaluated multiple times.  With
1151              relaxation, the number of times may vary.
1152              2) Section relative symbol values cannot be correctly
1153              converted to absolute values, as is required by many
1154              expressions, until final section sizing is complete.  */
1155           if (expld.phase == lang_final_phase_enum
1156               || expld.phase == lang_fixed_phase_enum
1157               || expld.assign_name != NULL)
1158             {
1159               if (tree->type.node_class == etree_provide)
1160                 tree->type.node_class = etree_provided;
1161
1162               if (h == NULL)
1163                 {
1164                   h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1165                                             TRUE, FALSE, TRUE);
1166                   if (h == NULL)
1167                     einfo (_("%F%P:%s: hash creation failed\n"),
1168                            tree->assign.dst);
1169                 }
1170
1171               /* If the expression is not valid then fake a zero value.  In
1172                  the final phase any errors will already have been raised,
1173                  in earlier phases we want to create this definition so
1174                  that it can be seen by other expressions.  */
1175               if (!expld.result.valid_p
1176                   && h->type == bfd_link_hash_new)
1177                 {
1178                   expld.result.value = 0;
1179                   expld.result.section = NULL;
1180                   expld.result.valid_p = TRUE;
1181                 }
1182
1183               if (expld.result.valid_p)
1184                 {
1185                   if (expld.result.section == NULL)
1186                     expld.result.section = expld.section;
1187                   if (!update_definedness (tree->assign.dst, h) && 0)
1188                     {
1189                       /* Symbol was already defined.  For now this error
1190                          is disabled because it causes failures in the ld
1191                          testsuite: ld-elf/var1, ld-scripts/defined5, and
1192                          ld-scripts/pr14962.  Some of these no doubt
1193                          reflect scripts used in the wild.  */
1194                       (*link_info.callbacks->multiple_definition)
1195                         (&link_info, h, link_info.output_bfd,
1196                          expld.result.section, expld.result.value);
1197                     }
1198                   if (expld.phase == lang_fixed_phase_enum)
1199                     {
1200                       if (h->type == bfd_link_hash_defined)
1201                         {
1202                           expld.result.value = h->u.def.value;
1203                           expld.result.section = h->u.def.section;
1204                         }
1205                     }
1206                   else
1207                     {
1208                       h->type = bfd_link_hash_defined;
1209                       h->u.def.value = expld.result.value;
1210                       h->u.def.section = expld.result.section;
1211                       h->linker_def = ! tree->assign.type.lineno;
1212                       h->ldscript_def = 1;
1213                       h->rel_from_abs = expld.rel_from_abs;
1214                       if (tree->assign.hidden)
1215                         bfd_link_hide_symbol (link_info.output_bfd,
1216                                               &link_info, h);
1217
1218                       /* Copy the symbol type if this is an expression only
1219                          referencing a single symbol.  (If the expression
1220                          contains ternary conditions, ignoring symbols on
1221                          false branches.)  */
1222                       if (expld.assign_src != NULL
1223                           && (expld.assign_src
1224                               != (struct bfd_link_hash_entry *) -1))
1225                         bfd_copy_link_hash_symbol_type (link_info.output_bfd,
1226                                                         h, expld.assign_src);
1227                     }
1228                 }
1229             }
1230           if (expld.phase != lang_fixed_phase_enum)
1231             expld.assign_name = NULL;
1232         }
1233       break;
1234
1235     case etree_name:
1236       fold_name (tree);
1237       break;
1238
1239     default:
1240       FAIL ();
1241       memset (&expld.result, 0, sizeof (expld.result));
1242       break;
1243     }
1244 }
1245
1246 void
1247 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
1248 {
1249   expld.rel_from_abs = FALSE;
1250   expld.dot = *dotp;
1251   expld.dotp = dotp;
1252   expld.section = current_section;
1253   exp_fold_tree_1 (tree);
1254 }
1255
1256 void
1257 exp_fold_tree_no_dot (etree_type *tree)
1258 {
1259   expld.rel_from_abs = FALSE;
1260   expld.dot = 0;
1261   expld.dotp = NULL;
1262   expld.section = bfd_abs_section_ptr;
1263   exp_fold_tree_1 (tree);
1264 }
1265
1266 static void
1267 exp_value_fold (etree_type *tree)
1268 {
1269   exp_fold_tree_no_dot (tree);
1270   if (expld.result.valid_p)
1271     {
1272       tree->type.node_code = INT;
1273       tree->value.value = expld.result.value;
1274       tree->value.str = NULL;
1275       tree->type.node_class = etree_value;
1276     }
1277 }
1278
1279 #define MAX(a, b) ((a) > (b) ? (a) : (b))
1280
1281 etree_type *
1282 exp_binop (int code, etree_type *lhs, etree_type *rhs)
1283 {
1284   etree_type *new_e = (etree_type *) stat_alloc (MAX (sizeof (new_e->binary),
1285                                                       sizeof (new_e->value)));
1286   new_e->type.node_code = code;
1287   new_e->type.filename = lhs->type.filename;
1288   new_e->type.lineno = lhs->type.lineno;
1289   new_e->binary.lhs = lhs;
1290   new_e->binary.rhs = rhs;
1291   new_e->type.node_class = etree_binary;
1292   if (lhs->type.node_class == etree_value
1293       && rhs->type.node_class == etree_value
1294       && code != ALIGN_K
1295       && code != DATA_SEGMENT_ALIGN
1296       && code != DATA_SEGMENT_RELRO_END)
1297     exp_value_fold (new_e);
1298   return new_e;
1299 }
1300
1301 etree_type *
1302 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
1303 {
1304   etree_type *new_e = (etree_type *) stat_alloc (MAX (sizeof (new_e->trinary),
1305                                                       sizeof (new_e->value)));
1306   new_e->type.node_code = code;
1307   new_e->type.filename = cond->type.filename;
1308   new_e->type.lineno = cond->type.lineno;
1309   new_e->trinary.lhs = lhs;
1310   new_e->trinary.cond = cond;
1311   new_e->trinary.rhs = rhs;
1312   new_e->type.node_class = etree_trinary;
1313   if (cond->type.node_class == etree_value
1314       && lhs->type.node_class == etree_value
1315       && rhs->type.node_class == etree_value)
1316     exp_value_fold (new_e);
1317   return new_e;
1318 }
1319
1320 etree_type *
1321 exp_unop (int code, etree_type *child)
1322 {
1323   etree_type *new_e = (etree_type *) stat_alloc (MAX (sizeof (new_e->unary),
1324                                                       sizeof (new_e->value)));
1325   new_e->unary.type.node_code = code;
1326   new_e->unary.type.filename = child->type.filename;
1327   new_e->unary.type.lineno = child->type.lineno;
1328   new_e->unary.child = child;
1329   new_e->unary.type.node_class = etree_unary;
1330   if (child->type.node_class == etree_value
1331       && code != ALIGN_K
1332       && code != ABSOLUTE
1333       && code != NEXT
1334       && code != DATA_SEGMENT_END)
1335     exp_value_fold (new_e);
1336   return new_e;
1337 }
1338
1339 etree_type *
1340 exp_nameop (int code, const char *name)
1341 {
1342   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1343
1344   new_e->name.type.node_code = code;
1345   new_e->name.type.filename = ldlex_filename ();
1346   new_e->name.type.lineno = lineno;
1347   new_e->name.name = name;
1348   new_e->name.type.node_class = etree_name;
1349   return new_e;
1350
1351 }
1352
1353 static etree_type *
1354 exp_assop (const char *dst,
1355            etree_type *src,
1356            enum node_tree_enum class,
1357            bfd_boolean hidden)
1358 {
1359   etree_type *n;
1360
1361   n = (etree_type *) stat_alloc (sizeof (n->assign));
1362   n->assign.type.node_code = '=';
1363   n->assign.type.filename = src->type.filename;
1364   n->assign.type.lineno = src->type.lineno;
1365   n->assign.type.node_class = class;
1366   n->assign.src = src;
1367   n->assign.dst = dst;
1368   n->assign.hidden = hidden;
1369   return n;
1370 }
1371
1372 /* Handle linker script assignments and HIDDEN.  */
1373
1374 etree_type *
1375 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1376 {
1377   return exp_assop (dst, src, etree_assign, hidden);
1378 }
1379
1380 /* Handle --defsym command-line option.  */
1381
1382 etree_type *
1383 exp_defsym (const char *dst, etree_type *src)
1384 {
1385   return exp_assop (dst, src, etree_assign, FALSE);
1386 }
1387
1388 /* Handle PROVIDE.  */
1389
1390 etree_type *
1391 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1392 {
1393   return exp_assop (dst, src, etree_provide, hidden);
1394 }
1395
1396 /* Handle ASSERT.  */
1397
1398 etree_type *
1399 exp_assert (etree_type *exp, const char *message)
1400 {
1401   etree_type *n;
1402
1403   n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1404   n->assert_s.type.node_code = '!';
1405   n->assert_s.type.filename = exp->type.filename;
1406   n->assert_s.type.lineno = exp->type.lineno;
1407   n->assert_s.type.node_class = etree_assert;
1408   n->assert_s.child = exp;
1409   n->assert_s.message = message;
1410   return n;
1411 }
1412
1413 void
1414 exp_print_tree (etree_type *tree)
1415 {
1416   bfd_boolean function_like;
1417
1418   if (config.map_file == NULL)
1419     config.map_file = stderr;
1420
1421   if (tree == NULL)
1422     {
1423       minfo ("NULL TREE\n");
1424       return;
1425     }
1426
1427   switch (tree->type.node_class)
1428     {
1429     case etree_value:
1430       minfo ("0x%v", tree->value.value);
1431       return;
1432     case etree_rel:
1433       if (tree->rel.section->owner != NULL)
1434         minfo ("%pB:", tree->rel.section->owner);
1435       minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1436       return;
1437     case etree_assign:
1438       fputs (tree->assign.dst, config.map_file);
1439       exp_print_token (tree->type.node_code, TRUE);
1440       exp_print_tree (tree->assign.src);
1441       break;
1442     case etree_provide:
1443     case etree_provided:
1444       fprintf (config.map_file, "PROVIDE (%s = ", tree->assign.dst);
1445       exp_print_tree (tree->assign.src);
1446       fputc (')', config.map_file);
1447       break;
1448     case etree_binary:
1449       function_like = FALSE;
1450       switch (tree->type.node_code)
1451         {
1452         case MAX_K:
1453         case MIN_K:
1454         case ALIGN_K:
1455         case DATA_SEGMENT_ALIGN:
1456         case DATA_SEGMENT_RELRO_END:
1457           function_like = TRUE;
1458           break;
1459         case SEGMENT_START:
1460           /* Special handling because arguments are in reverse order and
1461              the segment name is quoted.  */
1462           exp_print_token (tree->type.node_code, FALSE);
1463           fputs (" (\"", config.map_file);
1464           exp_print_tree (tree->binary.rhs);
1465           fputs ("\", ", config.map_file);
1466           exp_print_tree (tree->binary.lhs);
1467           fputc (')', config.map_file);
1468           return;
1469         }
1470       if (function_like)
1471         {
1472           exp_print_token (tree->type.node_code, FALSE);
1473           fputc (' ', config.map_file);
1474         }
1475       fputc ('(', config.map_file);
1476       exp_print_tree (tree->binary.lhs);
1477       if (function_like)
1478         fprintf (config.map_file, ", ");
1479       else
1480         exp_print_token (tree->type.node_code, TRUE);
1481       exp_print_tree (tree->binary.rhs);
1482       fputc (')', config.map_file);
1483       break;
1484     case etree_trinary:
1485       exp_print_tree (tree->trinary.cond);
1486       fputc ('?', config.map_file);
1487       exp_print_tree (tree->trinary.lhs);
1488       fputc (':', config.map_file);
1489       exp_print_tree (tree->trinary.rhs);
1490       break;
1491     case etree_unary:
1492       exp_print_token (tree->unary.type.node_code, FALSE);
1493       if (tree->unary.child)
1494         {
1495           fprintf (config.map_file, " (");
1496           exp_print_tree (tree->unary.child);
1497           fputc (')', config.map_file);
1498         }
1499       break;
1500
1501     case etree_assert:
1502       fprintf (config.map_file, "ASSERT (");
1503       exp_print_tree (tree->assert_s.child);
1504       fprintf (config.map_file, ", %s)", tree->assert_s.message);
1505       break;
1506
1507     case etree_name:
1508       if (tree->type.node_code == NAME)
1509         fputs (tree->name.name, config.map_file);
1510       else
1511         {
1512           exp_print_token (tree->type.node_code, FALSE);
1513           if (tree->name.name)
1514             fprintf (config.map_file, " (%s)", tree->name.name);
1515         }
1516       break;
1517     default:
1518       FAIL ();
1519       break;
1520     }
1521 }
1522
1523 bfd_vma
1524 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1525 {
1526   if (tree != NULL)
1527     {
1528       exp_fold_tree_no_dot (tree);
1529       if (expld.result.valid_p)
1530         return expld.result.value;
1531       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1532         einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1533                tree, name);
1534     }
1535   return def;
1536 }
1537
1538 /* Return the smallest non-negative integer such that two raised to
1539    that power is at least as large as the vma evaluated at TREE, if
1540    TREE is a non-NULL expression that can be resolved.  If TREE is
1541    NULL or cannot be resolved, return -1.  */
1542
1543 int
1544 exp_get_power (etree_type *tree, char *name)
1545 {
1546   bfd_vma x = exp_get_vma (tree, -1, name);
1547   bfd_vma p2;
1548   int n;
1549
1550   if (x == (bfd_vma) -1)
1551     return -1;
1552
1553   for (n = 0, p2 = 1; p2 < x; ++n, p2 <<= 1)
1554     if (p2 == 0)
1555       break;
1556
1557   return n;
1558 }
1559
1560 fill_type *
1561 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1562 {
1563   fill_type *fill;
1564   size_t len;
1565   unsigned int val;
1566
1567   if (tree == NULL)
1568     return def;
1569
1570   exp_fold_tree_no_dot (tree);
1571   if (!expld.result.valid_p)
1572     {
1573       if (name != NULL && expld.phase != lang_mark_phase_enum)
1574         einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1575                tree, name);
1576       return def;
1577     }
1578
1579   if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1580     {
1581       unsigned char *dst;
1582       unsigned char *s;
1583       fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1584       fill->size = (len + 1) / 2;
1585       dst = fill->data;
1586       s = (unsigned char *) expld.result.str;
1587       val = 0;
1588       do
1589         {
1590           unsigned int digit;
1591
1592           digit = *s++ - '0';
1593           if (digit > 9)
1594             digit = (digit - 'A' + '0' + 10) & 0xf;
1595           val <<= 4;
1596           val += digit;
1597           --len;
1598           if ((len & 1) == 0)
1599             {
1600               *dst++ = val;
1601               val = 0;
1602             }
1603         }
1604       while (len != 0);
1605     }
1606   else
1607     {
1608       fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1609       val = expld.result.value;
1610       fill->data[0] = (val >> 24) & 0xff;
1611       fill->data[1] = (val >> 16) & 0xff;
1612       fill->data[2] = (val >>  8) & 0xff;
1613       fill->data[3] = (val >>  0) & 0xff;
1614       fill->size = 4;
1615     }
1616   return fill;
1617 }
1618
1619 bfd_vma
1620 exp_get_abs_int (etree_type *tree, int def, char *name)
1621 {
1622   if (tree != NULL)
1623     {
1624       exp_fold_tree_no_dot (tree);
1625
1626       if (expld.result.valid_p)
1627         {
1628           if (expld.result.section != NULL)
1629             expld.result.value += expld.result.section->vma;
1630           return expld.result.value;
1631         }
1632       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1633         {
1634           einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1635                  tree, name);
1636         }
1637     }
1638   return def;
1639 }
1640
1641 static bfd_vma
1642 align_n (bfd_vma value, bfd_vma align)
1643 {
1644   if (align <= 1)
1645     return value;
1646
1647   value = (value + align - 1) / align;
1648   return value * align;
1649 }
1650
1651 void
1652 ldexp_init (void)
1653 {
1654   /* The value "13" is ad-hoc, somewhat related to the expected number of
1655      assignments in a linker script.  */
1656   if (!bfd_hash_table_init_n (&definedness_table,
1657                               definedness_newfunc,
1658                               sizeof (struct definedness_hash_entry),
1659                               13))
1660     einfo (_("%F%P: can not create hash table: %E\n"));
1661 }
1662
1663 /* Convert absolute symbols defined by a script from "dot" (also
1664    SEGMENT_START or ORIGIN) outside of an output section statement,
1665    to section relative.  */
1666
1667 static bfd_boolean
1668 set_sym_sections (struct bfd_hash_entry *bh, void *inf ATTRIBUTE_UNUSED)
1669 {
1670   struct definedness_hash_entry *def = (struct definedness_hash_entry *) bh;
1671   if (def->final_sec != bfd_abs_section_ptr)
1672     {
1673       struct bfd_link_hash_entry *h;
1674       h = bfd_link_hash_lookup (link_info.hash, bh->string,
1675                                 FALSE, FALSE, TRUE);
1676       if (h != NULL
1677           && h->type == bfd_link_hash_defined
1678           && h->u.def.section == bfd_abs_section_ptr)
1679         {
1680           h->u.def.value -= def->final_sec->vma;
1681           h->u.def.section = def->final_sec;
1682         }
1683     }
1684   return TRUE;
1685 }
1686
1687 void
1688 ldexp_finalize_syms (void)
1689 {
1690   bfd_hash_traverse (&definedness_table, set_sym_sections, NULL);
1691 }
1692
1693 void
1694 ldexp_finish (void)
1695 {
1696   bfd_hash_table_free (&definedness_table);
1697 }