LD: Avoid a division by zero page size with SEGMENT_START handling
[external/binutils.git] / ld / ldexp.c
1 /* This module handles expression trees.
2    Copyright (C) 1991-2018 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       const char *segment_name;
538       segment_type *seg;
539
540       /* Check to see if the user has overridden the default
541          value.  */
542       segment_name = tree->binary.rhs->name.name;
543       for (seg = segments; seg; seg = seg->next)
544         if (strcmp (seg->name, segment_name) == 0)
545           {
546             if (!seg->used
547                 && config.magic_demand_paged
548                 && config.maxpagesize != 0
549                 && (seg->value % config.maxpagesize) != 0)
550               einfo (_("%P: warning: address of `%s' "
551                        "isn't multiple of maximum page size\n"),
552                      segment_name);
553             seg->used = TRUE;
554             new_rel_from_abs (seg->value);
555             break;
556           }
557       return;
558     }
559
560   lhs = expld.result;
561   exp_fold_tree_1 (tree->binary.rhs);
562   expld.result.valid_p &= lhs.valid_p;
563
564   if (expld.result.valid_p)
565     {
566       if (lhs.section != expld.result.section)
567         {
568           /* If the values are from different sections, and neither is
569              just a number, make both the source arguments absolute.  */
570           if (expld.result.section != NULL
571               && lhs.section != NULL)
572             {
573               make_abs ();
574               lhs.value += lhs.section->vma;
575               lhs.section = bfd_abs_section_ptr;
576             }
577
578           /* If the rhs is just a number, keep the lhs section.  */
579           else if (expld.result.section == NULL)
580             {
581               expld.result.section = lhs.section;
582               /* Make this NULL so that we know one of the operands
583                  was just a number, for later tests.  */
584               lhs.section = NULL;
585             }
586         }
587       /* At this point we know that both operands have the same
588          section, or at least one of them is a plain number.  */
589
590       switch (tree->type.node_code)
591         {
592 #define BOP(x, y) \
593         case x:                                                 \
594           expld.result.value = lhs.value y expld.result.value;  \
595           arith_result_section (&lhs);                          \
596           break;
597
598           /* Comparison operators, logical AND, and logical OR always
599              return a plain number.  */
600 #define BOPN(x, y) \
601         case x:                                                 \
602           expld.result.value = lhs.value y expld.result.value;  \
603           expld.result.section = NULL;                          \
604           break;
605
606           BOP ('+', +);
607           BOP ('*', *);
608           BOP ('-', -);
609           BOP (LSHIFT, <<);
610           BOP (RSHIFT, >>);
611           BOP ('&', &);
612           BOP ('^', ^);
613           BOP ('|', |);
614           BOPN (EQ, ==);
615           BOPN (NE, !=);
616           BOPN ('<', <);
617           BOPN ('>', >);
618           BOPN (LE, <=);
619           BOPN (GE, >=);
620           BOPN (ANDAND, &&);
621           BOPN (OROR, ||);
622
623         case '%':
624           if (expld.result.value != 0)
625             expld.result.value = ((bfd_signed_vma) lhs.value
626                                   % (bfd_signed_vma) expld.result.value);
627           else if (expld.phase != lang_mark_phase_enum)
628             einfo (_("%F%P:%pS %% by zero\n"), tree->binary.rhs);
629           arith_result_section (&lhs);
630           break;
631
632         case '/':
633           if (expld.result.value != 0)
634             expld.result.value = ((bfd_signed_vma) lhs.value
635                                   / (bfd_signed_vma) expld.result.value);
636           else if (expld.phase != lang_mark_phase_enum)
637             einfo (_("%F%P:%pS / by zero\n"), tree->binary.rhs);
638           arith_result_section (&lhs);
639           break;
640
641         case MAX_K:
642           if (lhs.value > expld.result.value)
643             expld.result.value = lhs.value;
644           break;
645
646         case MIN_K:
647           if (lhs.value < expld.result.value)
648             expld.result.value = lhs.value;
649           break;
650
651         case ALIGN_K:
652           expld.result.value = align_n (lhs.value, expld.result.value);
653           break;
654
655         case DATA_SEGMENT_ALIGN:
656           fold_segment_align (&expld.dataseg, &lhs);
657           break;
658
659         case DATA_SEGMENT_RELRO_END:
660           fold_segment_relro_end (&expld.dataseg, &lhs);
661           break;
662
663         default:
664           FAIL ();
665         }
666     }
667 }
668
669 static void
670 fold_trinary (etree_type *tree)
671 {
672   struct bfd_link_hash_entry *save = expld.assign_src;
673
674   exp_fold_tree_1 (tree->trinary.cond);
675   expld.assign_src = save;
676   if (expld.result.valid_p)
677     exp_fold_tree_1 (expld.result.value
678                      ? tree->trinary.lhs
679                      : tree->trinary.rhs);
680 }
681
682 static void
683 fold_name (etree_type *tree)
684 {
685   struct bfd_link_hash_entry *h;
686   struct definedness_hash_entry *def;
687
688   memset (&expld.result, 0, sizeof (expld.result));
689
690   switch (tree->type.node_code)
691     {
692     case SIZEOF_HEADERS:
693       if (expld.phase != lang_first_phase_enum)
694         {
695           bfd_vma hdr_size = 0;
696           /* Don't find the real header size if only marking sections;
697              The bfd function may cache incorrect data.  */
698           if (expld.phase != lang_mark_phase_enum)
699             hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
700           new_number (hdr_size);
701         }
702       break;
703
704     case DEFINED:
705       h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
706                                         &link_info,
707                                         tree->name.name,
708                                         FALSE, FALSE, TRUE);
709       new_number (h != NULL
710                   && (h->type == bfd_link_hash_defined
711                       || h->type == bfd_link_hash_defweak
712                       || h->type == bfd_link_hash_common)
713                   && (!h->ldscript_def
714                       || (def = symbol_defined (tree->name.name)) == NULL
715                       || def->by_object
716                       || def->iteration == (lang_statement_iteration & 255)));
717       break;
718
719     case NAME:
720       if (expld.assign_name != NULL
721           && strcmp (expld.assign_name, tree->name.name) == 0)
722         {
723           /* Self-assignment is only allowed for absolute symbols
724              defined in a linker script.  */
725           h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
726                                             &link_info,
727                                             tree->name.name,
728                                             FALSE, FALSE, TRUE);
729           if (!(h != NULL
730                 && (h->type == bfd_link_hash_defined
731                     || h->type == bfd_link_hash_defweak)
732                 && h->u.def.section == bfd_abs_section_ptr
733                 && (def = symbol_defined (tree->name.name)) != NULL
734                 && def->iteration == (lang_statement_iteration & 255)))
735             expld.assign_name = NULL;
736         }
737       if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
738         new_rel_from_abs (expld.dot);
739       else
740         {
741           h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
742                                             &link_info,
743                                             tree->name.name,
744                                             TRUE, FALSE, TRUE);
745           if (!h)
746             einfo (_("%F%P: bfd_link_hash_lookup failed: %E\n"));
747           else if (h->type == bfd_link_hash_defined
748                    || h->type == bfd_link_hash_defweak)
749             {
750               asection *output_section;
751
752               output_section = h->u.def.section->output_section;
753               if (output_section == NULL)
754                 {
755                   if (expld.phase <= lang_mark_phase_enum)
756                     new_rel (h->u.def.value, h->u.def.section);
757                   else
758                     einfo (_("%X%P:%pS: unresolvable symbol `%s'"
759                              " referenced in expression\n"),
760                            tree, tree->name.name);
761                 }
762               else if (output_section == bfd_abs_section_ptr
763                        && (expld.section != bfd_abs_section_ptr
764                            || config.sane_expr))
765                 new_number (h->u.def.value + h->u.def.section->output_offset);
766               else
767                 new_rel (h->u.def.value + h->u.def.section->output_offset,
768                          output_section);
769             }
770           else if (expld.phase == lang_final_phase_enum
771                    || (expld.phase != lang_mark_phase_enum
772                        && expld.assigning_to_dot))
773             einfo (_("%F%P:%pS: undefined symbol `%s'"
774                      " referenced in expression\n"),
775                    tree, tree->name.name);
776           else if (h->type == bfd_link_hash_new)
777             {
778               h->type = bfd_link_hash_undefined;
779               h->u.undef.abfd = NULL;
780               if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
781                 bfd_link_add_undef (link_info.hash, h);
782             }
783           if (expld.assign_src == NULL)
784             expld.assign_src = h;
785           else
786             expld.assign_src = (struct bfd_link_hash_entry *) - 1;
787         }
788       break;
789
790     case ADDR:
791       if (expld.phase != lang_first_phase_enum)
792         {
793           lang_output_section_statement_type *os;
794
795           os = lang_output_section_find (tree->name.name);
796           if (os == NULL)
797             {
798               if (expld.phase == lang_final_phase_enum)
799                 einfo (_("%F%P:%pS: undefined section `%s'"
800                          " referenced in expression\n"),
801                        tree, tree->name.name);
802             }
803           else if (os->processed_vma)
804             new_rel (0, os->bfd_section);
805         }
806       break;
807
808     case LOADADDR:
809       if (expld.phase != lang_first_phase_enum)
810         {
811           lang_output_section_statement_type *os;
812
813           os = lang_output_section_find (tree->name.name);
814           if (os == NULL)
815             {
816               if (expld.phase == lang_final_phase_enum)
817                 einfo (_("%F%P:%pS: undefined section `%s'"
818                          " referenced in expression\n"),
819                        tree, tree->name.name);
820             }
821           else if (os->processed_lma)
822             {
823               if (os->load_base == NULL)
824                 new_abs (os->bfd_section->lma);
825               else
826                 {
827                   exp_fold_tree_1 (os->load_base);
828                   if (expld.result.valid_p)
829                     make_abs ();
830                 }
831             }
832         }
833       break;
834
835     case SIZEOF:
836     case ALIGNOF:
837       if (expld.phase != lang_first_phase_enum)
838         {
839           lang_output_section_statement_type *os;
840
841           os = lang_output_section_find (tree->name.name);
842           if (os == NULL)
843             {
844               if (expld.phase == lang_final_phase_enum)
845                 einfo (_("%F%P:%pS: undefined section `%s'"
846                          " referenced in expression\n"),
847                        tree, tree->name.name);
848               new_number (0);
849             }
850           else if (os->bfd_section != NULL)
851             {
852               bfd_vma val;
853
854               if (tree->type.node_code == SIZEOF)
855                 val = (os->bfd_section->size
856                        / bfd_octets_per_byte (link_info.output_bfd));
857               else
858                 val = (bfd_vma)1 << os->bfd_section->alignment_power;
859
860               new_number (val);
861             }
862           else
863             new_number (0);
864         }
865       break;
866
867     case LENGTH:
868       {
869       if (expld.phase != lang_first_phase_enum)
870         {
871           lang_memory_region_type *mem;
872
873           mem = lang_memory_region_lookup (tree->name.name, FALSE);
874           if (mem != NULL)
875             new_number (mem->length);
876           else
877             einfo (_("%F%P:%pS: undefined MEMORY region `%s'"
878                      " referenced in expression\n"),
879                    tree, tree->name.name);
880         }
881       }
882       break;
883
884     case ORIGIN:
885       if (expld.phase != lang_first_phase_enum)
886         {
887           lang_memory_region_type *mem;
888
889           mem = lang_memory_region_lookup (tree->name.name, FALSE);
890           if (mem != NULL)
891             new_rel_from_abs (mem->origin);
892           else
893             einfo (_("%F%P:%pS: undefined MEMORY region `%s'"
894                      " referenced in expression\n"),
895                    tree, tree->name.name);
896         }
897       break;
898
899     case CONSTANT:
900       if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
901         new_number (config.maxpagesize);
902       else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
903         new_number (config.commonpagesize);
904       else
905         einfo (_("%F%P:%pS: unknown constant `%s' referenced in expression\n"),
906                tree, tree->name.name);
907       break;
908
909     default:
910       FAIL ();
911       break;
912     }
913 }
914
915 /* Return true if TREE is '.'.  */
916
917 static bfd_boolean
918 is_dot (const etree_type *tree)
919 {
920   return (tree->type.node_class == etree_name
921           && tree->type.node_code == NAME
922           && tree->name.name[0] == '.'
923           && tree->name.name[1] == 0);
924 }
925
926 /* Return true if TREE is a constant equal to VAL.  */
927
928 static bfd_boolean
929 is_value (const etree_type *tree, bfd_vma val)
930 {
931   return (tree->type.node_class == etree_value
932           && tree->value.value == val);
933 }
934
935 /* Return true if TREE is an absolute symbol equal to VAL defined in
936    a linker script.  */
937
938 static bfd_boolean
939 is_sym_value (const etree_type *tree, bfd_vma val)
940 {
941   struct bfd_link_hash_entry *h;
942   struct definedness_hash_entry *def;
943
944   return (tree->type.node_class == etree_name
945           && tree->type.node_code == NAME
946           && (def = symbol_defined (tree->name.name)) != NULL
947           && def->iteration == (lang_statement_iteration & 255)
948           && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
949                                                 &link_info,
950                                                 tree->name.name,
951                                                 FALSE, FALSE, TRUE)) != NULL
952           && h->ldscript_def
953           && h->type == bfd_link_hash_defined
954           && h->u.def.section == bfd_abs_section_ptr
955           && h->u.def.value == val);
956 }
957
958 /* Return true if TREE is ". != 0".  */
959
960 static bfd_boolean
961 is_dot_ne_0 (const etree_type *tree)
962 {
963   return (tree->type.node_class == etree_binary
964           && tree->type.node_code == NE
965           && is_dot (tree->binary.lhs)
966           && is_value (tree->binary.rhs, 0));
967 }
968
969 /* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an
970    absolute constant with value 0 defined in a linker script.  */
971
972 static bfd_boolean
973 is_dot_plus_0 (const etree_type *tree)
974 {
975   return (tree->type.node_class == etree_binary
976           && tree->type.node_code == '+'
977           && is_dot (tree->binary.lhs)
978           && (is_value (tree->binary.rhs, 0)
979               || is_sym_value (tree->binary.rhs, 0)));
980 }
981
982 /* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)".  */
983
984 static bfd_boolean
985 is_align_conditional (const etree_type *tree)
986 {
987   if (tree->type.node_class == etree_unary
988       && tree->type.node_code == ALIGN_K)
989     {
990       tree = tree->unary.child;
991       return (tree->type.node_class == etree_trinary
992               && is_dot_ne_0 (tree->trinary.cond)
993               && is_value (tree->trinary.rhs, 1));
994     }
995   return FALSE;
996 }
997
998 static void
999 exp_fold_tree_1 (etree_type *tree)
1000 {
1001   if (tree == NULL)
1002     {
1003       memset (&expld.result, 0, sizeof (expld.result));
1004       return;
1005     }
1006
1007   switch (tree->type.node_class)
1008     {
1009     case etree_value:
1010       if (expld.section == bfd_abs_section_ptr
1011           && !config.sane_expr)
1012         new_abs (tree->value.value);
1013       else
1014         new_number (tree->value.value);
1015       expld.result.str = tree->value.str;
1016       break;
1017
1018     case etree_rel:
1019       if (expld.phase != lang_first_phase_enum)
1020         {
1021           asection *output_section = tree->rel.section->output_section;
1022           new_rel (tree->rel.value + tree->rel.section->output_offset,
1023                    output_section);
1024         }
1025       else
1026         memset (&expld.result, 0, sizeof (expld.result));
1027       break;
1028
1029     case etree_assert:
1030       exp_fold_tree_1 (tree->assert_s.child);
1031       if (expld.phase == lang_final_phase_enum && !expld.result.value)
1032         einfo ("%X%P: %s\n", tree->assert_s.message);
1033       break;
1034
1035     case etree_unary:
1036       fold_unary (tree);
1037       break;
1038
1039     case etree_binary:
1040       fold_binary (tree);
1041       break;
1042
1043     case etree_trinary:
1044       fold_trinary (tree);
1045       break;
1046
1047     case etree_assign:
1048     case etree_provide:
1049     case etree_provided:
1050       if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
1051         {
1052           if (tree->type.node_class != etree_assign)
1053             einfo (_("%F%P:%pS can not PROVIDE assignment to"
1054                      " location counter\n"), tree);
1055           if (expld.phase != lang_first_phase_enum)
1056             {
1057               /* Notify the folder that this is an assignment to dot.  */
1058               expld.assigning_to_dot = TRUE;
1059               exp_fold_tree_1 (tree->assign.src);
1060               expld.assigning_to_dot = FALSE;
1061
1062               /* If we are assigning to dot inside an output section
1063                  arrange to keep the section, except for certain
1064                  expressions that evaluate to zero.  We ignore . = 0,
1065                  . = . + 0, and . = ALIGN (. != 0 ? expr : 1).
1066                  We can't ignore all expressions that evaluate to zero
1067                  because an otherwise empty section might have padding
1068                  added by an alignment expression that changes with
1069                  relaxation.  Such a section might have zero size
1070                  before relaxation and so be stripped incorrectly.  */
1071               if (expld.phase == lang_mark_phase_enum
1072                   && expld.section != bfd_abs_section_ptr
1073                   && expld.section != bfd_und_section_ptr
1074                   && !(expld.result.valid_p
1075                        && expld.result.value == 0
1076                        && (is_value (tree->assign.src, 0)
1077                            || is_sym_value (tree->assign.src, 0)
1078                            || is_dot_plus_0 (tree->assign.src)
1079                            || is_align_conditional (tree->assign.src))))
1080                 expld.section->flags |= SEC_KEEP;
1081
1082               if (!expld.result.valid_p
1083                   || expld.section == bfd_und_section_ptr)
1084                 {
1085                   if (expld.phase != lang_mark_phase_enum)
1086                     einfo (_("%F%P:%pS invalid assignment to"
1087                              " location counter\n"), tree);
1088                 }
1089               else if (expld.dotp == NULL)
1090                 einfo (_("%F%P:%pS assignment to location counter"
1091                          " invalid outside of SECTIONS\n"), tree);
1092
1093               /* After allocation, assignment to dot should not be
1094                  done inside an output section since allocation adds a
1095                  padding statement that effectively duplicates the
1096                  assignment.  */
1097               else if (expld.phase <= lang_allocating_phase_enum
1098                        || expld.section == bfd_abs_section_ptr)
1099                 {
1100                   bfd_vma nextdot;
1101
1102                   nextdot = expld.result.value;
1103                   if (expld.result.section != NULL)
1104                     nextdot += expld.result.section->vma;
1105                   else
1106                     nextdot += expld.section->vma;
1107                   if (nextdot < expld.dot
1108                       && expld.section != bfd_abs_section_ptr)
1109                     einfo (_("%F%P:%pS cannot move location counter backwards"
1110                              " (from %V to %V)\n"),
1111                            tree, expld.dot, nextdot);
1112                   else
1113                     {
1114                       expld.dot = nextdot;
1115                       *expld.dotp = nextdot;
1116                     }
1117                 }
1118             }
1119           else
1120             memset (&expld.result, 0, sizeof (expld.result));
1121         }
1122       else
1123         {
1124           struct bfd_link_hash_entry *h = NULL;
1125
1126           if (tree->type.node_class == etree_provide)
1127             {
1128               h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1129                                         FALSE, FALSE, TRUE);
1130               if (h == NULL
1131                   || !(h->type == bfd_link_hash_new
1132                        || h->type == bfd_link_hash_undefined
1133                        || h->type == bfd_link_hash_undefweak
1134                        || h->linker_def))
1135                 {
1136                   /* Do nothing.  The symbol was never referenced, or
1137                      was defined in some object file.  Note that
1138                      undefweak symbols are defined by PROVIDE.  This
1139                      is to support glibc use of __rela_iplt_start and
1140                      similar weak references.  */
1141                   break;
1142                 }
1143             }
1144
1145           expld.assign_name = tree->assign.dst;
1146           expld.assign_src = NULL;
1147           exp_fold_tree_1 (tree->assign.src);
1148           /* expld.assign_name remaining equal to tree->assign.dst
1149              below indicates the evaluation of tree->assign.src did
1150              not use the value of tree->assign.dst.  We don't allow
1151              self assignment until the final phase for two reasons:
1152              1) Expressions are evaluated multiple times.  With
1153              relaxation, the number of times may vary.
1154              2) Section relative symbol values cannot be correctly
1155              converted to absolute values, as is required by many
1156              expressions, until final section sizing is complete.  */
1157           if (expld.phase == lang_final_phase_enum
1158               || expld.assign_name != NULL)
1159             {
1160               if (tree->type.node_class == etree_provide)
1161                 tree->type.node_class = etree_provided;
1162
1163               if (h == NULL)
1164                 {
1165                   h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
1166                                             TRUE, FALSE, TRUE);
1167                   if (h == NULL)
1168                     einfo (_("%F%P:%s: hash creation failed\n"),
1169                            tree->assign.dst);
1170                 }
1171
1172               /* If the expression is not valid then fake a zero value.  In
1173                  the final phase any errors will already have been raised,
1174                  in earlier phases we want to create this definition so
1175                  that it can be seen by other expressions.  */
1176               if (!expld.result.valid_p
1177                   && h->type == bfd_link_hash_new)
1178                 {
1179                   expld.result.value = 0;
1180                   expld.result.section = NULL;
1181                   expld.result.valid_p = TRUE;
1182                 }
1183
1184               if (expld.result.valid_p)
1185                 {
1186                   if (expld.result.section == NULL)
1187                     expld.result.section = expld.section;
1188                   if (!update_definedness (tree->assign.dst, h) && 0)
1189                     {
1190                       /* Symbol was already defined.  For now this error
1191                          is disabled because it causes failures in the ld
1192                          testsuite: ld-elf/var1, ld-scripts/defined5, and
1193                          ld-scripts/pr14962.  Some of these no doubt
1194                          reflect scripts used in the wild.  */
1195                       (*link_info.callbacks->multiple_definition)
1196                         (&link_info, h, link_info.output_bfd,
1197                          expld.result.section, expld.result.value);
1198                     }
1199                   h->type = bfd_link_hash_defined;
1200                   h->u.def.value = expld.result.value;
1201                   h->u.def.section = expld.result.section;
1202                   h->linker_def = ! tree->assign.type.lineno;
1203                   h->ldscript_def = 1;
1204                   h->rel_from_abs = expld.rel_from_abs;
1205                   if (tree->assign.hidden)
1206                     bfd_link_hide_symbol (link_info.output_bfd,
1207                                           &link_info, h);
1208
1209                   /* Copy the symbol type if this is an expression only
1210                      referencing a single symbol.  (If the expression
1211                      contains ternary conditions, ignoring symbols on
1212                      false branches.)  */
1213                   if (expld.assign_src != NULL
1214                       && (expld.assign_src
1215                           != (struct bfd_link_hash_entry *) -1))
1216                     bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
1217                                                     expld.assign_src);
1218                 }
1219             }
1220           expld.assign_name = NULL;
1221         }
1222       break;
1223
1224     case etree_name:
1225       fold_name (tree);
1226       break;
1227
1228     default:
1229       FAIL ();
1230       memset (&expld.result, 0, sizeof (expld.result));
1231       break;
1232     }
1233 }
1234
1235 void
1236 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
1237 {
1238   expld.rel_from_abs = FALSE;
1239   expld.dot = *dotp;
1240   expld.dotp = dotp;
1241   expld.section = current_section;
1242   exp_fold_tree_1 (tree);
1243 }
1244
1245 void
1246 exp_fold_tree_no_dot (etree_type *tree)
1247 {
1248   expld.rel_from_abs = FALSE;
1249   expld.dot = 0;
1250   expld.dotp = NULL;
1251   expld.section = bfd_abs_section_ptr;
1252   exp_fold_tree_1 (tree);
1253 }
1254
1255 static void
1256 exp_value_fold (etree_type *tree)
1257 {
1258   exp_fold_tree_no_dot (tree);
1259   if (expld.result.valid_p)
1260     {
1261       tree->type.node_code = INT;
1262       tree->value.value = expld.result.value;
1263       tree->value.str = NULL;
1264       tree->type.node_class = etree_value;
1265     }
1266 }
1267
1268 #define MAX(a, b) ((a) > (b) ? (a) : (b))
1269
1270 etree_type *
1271 exp_binop (int code, etree_type *lhs, etree_type *rhs)
1272 {
1273   etree_type *new_e = (etree_type *) stat_alloc (MAX (sizeof (new_e->binary),
1274                                                       sizeof (new_e->value)));
1275   new_e->type.node_code = code;
1276   new_e->type.filename = lhs->type.filename;
1277   new_e->type.lineno = lhs->type.lineno;
1278   new_e->binary.lhs = lhs;
1279   new_e->binary.rhs = rhs;
1280   new_e->type.node_class = etree_binary;
1281   if (lhs->type.node_class == etree_value
1282       && rhs->type.node_class == etree_value
1283       && code != ALIGN_K
1284       && code != DATA_SEGMENT_ALIGN
1285       && code != DATA_SEGMENT_RELRO_END)
1286     exp_value_fold (new_e);
1287   return new_e;
1288 }
1289
1290 etree_type *
1291 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
1292 {
1293   etree_type *new_e = (etree_type *) stat_alloc (MAX (sizeof (new_e->trinary),
1294                                                       sizeof (new_e->value)));
1295   new_e->type.node_code = code;
1296   new_e->type.filename = cond->type.filename;
1297   new_e->type.lineno = cond->type.lineno;
1298   new_e->trinary.lhs = lhs;
1299   new_e->trinary.cond = cond;
1300   new_e->trinary.rhs = rhs;
1301   new_e->type.node_class = etree_trinary;
1302   if (cond->type.node_class == etree_value
1303       && lhs->type.node_class == etree_value
1304       && rhs->type.node_class == etree_value)
1305     exp_value_fold (new_e);
1306   return new_e;
1307 }
1308
1309 etree_type *
1310 exp_unop (int code, etree_type *child)
1311 {
1312   etree_type *new_e = (etree_type *) stat_alloc (MAX (sizeof (new_e->unary),
1313                                                       sizeof (new_e->value)));
1314   new_e->unary.type.node_code = code;
1315   new_e->unary.type.filename = child->type.filename;
1316   new_e->unary.type.lineno = child->type.lineno;
1317   new_e->unary.child = child;
1318   new_e->unary.type.node_class = etree_unary;
1319   if (child->type.node_class == etree_value
1320       && code != ALIGN_K
1321       && code != ABSOLUTE
1322       && code != NEXT
1323       && code != DATA_SEGMENT_END)
1324     exp_value_fold (new_e);
1325   return new_e;
1326 }
1327
1328 etree_type *
1329 exp_nameop (int code, const char *name)
1330 {
1331   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1332
1333   new_e->name.type.node_code = code;
1334   new_e->name.type.filename = ldlex_filename ();
1335   new_e->name.type.lineno = lineno;
1336   new_e->name.name = name;
1337   new_e->name.type.node_class = etree_name;
1338   return new_e;
1339
1340 }
1341
1342 static etree_type *
1343 exp_assop (const char *dst,
1344            etree_type *src,
1345            enum node_tree_enum class,
1346            bfd_boolean hidden)
1347 {
1348   etree_type *n;
1349
1350   n = (etree_type *) stat_alloc (sizeof (n->assign));
1351   n->assign.type.node_code = '=';
1352   n->assign.type.filename = src->type.filename;
1353   n->assign.type.lineno = src->type.lineno;
1354   n->assign.type.node_class = class;
1355   n->assign.src = src;
1356   n->assign.dst = dst;
1357   n->assign.hidden = hidden;
1358   return n;
1359 }
1360
1361 /* Handle linker script assignments and HIDDEN.  */
1362
1363 etree_type *
1364 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1365 {
1366   return exp_assop (dst, src, etree_assign, hidden);
1367 }
1368
1369 /* Handle --defsym command-line option.  */
1370
1371 etree_type *
1372 exp_defsym (const char *dst, etree_type *src)
1373 {
1374   return exp_assop (dst, src, etree_assign, FALSE);
1375 }
1376
1377 /* Handle PROVIDE.  */
1378
1379 etree_type *
1380 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1381 {
1382   return exp_assop (dst, src, etree_provide, hidden);
1383 }
1384
1385 /* Handle ASSERT.  */
1386
1387 etree_type *
1388 exp_assert (etree_type *exp, const char *message)
1389 {
1390   etree_type *n;
1391
1392   n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1393   n->assert_s.type.node_code = '!';
1394   n->assert_s.type.filename = exp->type.filename;
1395   n->assert_s.type.lineno = exp->type.lineno;
1396   n->assert_s.type.node_class = etree_assert;
1397   n->assert_s.child = exp;
1398   n->assert_s.message = message;
1399   return n;
1400 }
1401
1402 void
1403 exp_print_tree (etree_type *tree)
1404 {
1405   bfd_boolean function_like;
1406
1407   if (config.map_file == NULL)
1408     config.map_file = stderr;
1409
1410   if (tree == NULL)
1411     {
1412       minfo ("NULL TREE\n");
1413       return;
1414     }
1415
1416   switch (tree->type.node_class)
1417     {
1418     case etree_value:
1419       minfo ("0x%v", tree->value.value);
1420       return;
1421     case etree_rel:
1422       if (tree->rel.section->owner != NULL)
1423         minfo ("%pB:", tree->rel.section->owner);
1424       minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1425       return;
1426     case etree_assign:
1427       fputs (tree->assign.dst, config.map_file);
1428       exp_print_token (tree->type.node_code, TRUE);
1429       exp_print_tree (tree->assign.src);
1430       break;
1431     case etree_provide:
1432     case etree_provided:
1433       fprintf (config.map_file, "PROVIDE (%s = ", tree->assign.dst);
1434       exp_print_tree (tree->assign.src);
1435       fputc (')', config.map_file);
1436       break;
1437     case etree_binary:
1438       function_like = FALSE;
1439       switch (tree->type.node_code)
1440         {
1441         case MAX_K:
1442         case MIN_K:
1443         case ALIGN_K:
1444         case DATA_SEGMENT_ALIGN:
1445         case DATA_SEGMENT_RELRO_END:
1446           function_like = TRUE;
1447           break;
1448         case SEGMENT_START:
1449           /* Special handling because arguments are in reverse order and
1450              the segment name is quoted.  */
1451           exp_print_token (tree->type.node_code, FALSE);
1452           fputs (" (\"", config.map_file);
1453           exp_print_tree (tree->binary.rhs);
1454           fputs ("\", ", config.map_file);
1455           exp_print_tree (tree->binary.lhs);
1456           fputc (')', config.map_file);
1457           return;
1458         }
1459       if (function_like)
1460         {
1461           exp_print_token (tree->type.node_code, FALSE);
1462           fputc (' ', config.map_file);
1463         }
1464       fputc ('(', config.map_file);
1465       exp_print_tree (tree->binary.lhs);
1466       if (function_like)
1467         fprintf (config.map_file, ", ");
1468       else
1469         exp_print_token (tree->type.node_code, TRUE);
1470       exp_print_tree (tree->binary.rhs);
1471       fputc (')', config.map_file);
1472       break;
1473     case etree_trinary:
1474       exp_print_tree (tree->trinary.cond);
1475       fputc ('?', config.map_file);
1476       exp_print_tree (tree->trinary.lhs);
1477       fputc (':', config.map_file);
1478       exp_print_tree (tree->trinary.rhs);
1479       break;
1480     case etree_unary:
1481       exp_print_token (tree->unary.type.node_code, FALSE);
1482       if (tree->unary.child)
1483         {
1484           fprintf (config.map_file, " (");
1485           exp_print_tree (tree->unary.child);
1486           fputc (')', config.map_file);
1487         }
1488       break;
1489
1490     case etree_assert:
1491       fprintf (config.map_file, "ASSERT (");
1492       exp_print_tree (tree->assert_s.child);
1493       fprintf (config.map_file, ", %s)", tree->assert_s.message);
1494       break;
1495
1496     case etree_name:
1497       if (tree->type.node_code == NAME)
1498         fputs (tree->name.name, config.map_file);
1499       else
1500         {
1501           exp_print_token (tree->type.node_code, FALSE);
1502           if (tree->name.name)
1503             fprintf (config.map_file, " (%s)", tree->name.name);
1504         }
1505       break;
1506     default:
1507       FAIL ();
1508       break;
1509     }
1510 }
1511
1512 bfd_vma
1513 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1514 {
1515   if (tree != NULL)
1516     {
1517       exp_fold_tree_no_dot (tree);
1518       if (expld.result.valid_p)
1519         return expld.result.value;
1520       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1521         einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1522                tree, name);
1523     }
1524   return def;
1525 }
1526
1527 /* Return the smallest non-negative integer such that two raised to
1528    that power is at least as large as the vma evaluated at TREE, if
1529    TREE is a non-NULL expression that can be resolved.  If TREE is
1530    NULL or cannot be resolved, return -1.  */
1531
1532 int
1533 exp_get_power (etree_type *tree, char *name)
1534 {
1535   bfd_vma x = exp_get_vma (tree, -1, name);
1536   bfd_vma p2;
1537   int n;
1538
1539   if (x == (bfd_vma) -1)
1540     return -1;
1541
1542   for (n = 0, p2 = 1; p2 < x; ++n, p2 <<= 1)
1543     if (p2 == 0)
1544       break;
1545
1546   return n;
1547 }
1548
1549 fill_type *
1550 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1551 {
1552   fill_type *fill;
1553   size_t len;
1554   unsigned int val;
1555
1556   if (tree == NULL)
1557     return def;
1558
1559   exp_fold_tree_no_dot (tree);
1560   if (!expld.result.valid_p)
1561     {
1562       if (name != NULL && expld.phase != lang_mark_phase_enum)
1563         einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1564                tree, name);
1565       return def;
1566     }
1567
1568   if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1569     {
1570       unsigned char *dst;
1571       unsigned char *s;
1572       fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1573       fill->size = (len + 1) / 2;
1574       dst = fill->data;
1575       s = (unsigned char *) expld.result.str;
1576       val = 0;
1577       do
1578         {
1579           unsigned int digit;
1580
1581           digit = *s++ - '0';
1582           if (digit > 9)
1583             digit = (digit - 'A' + '0' + 10) & 0xf;
1584           val <<= 4;
1585           val += digit;
1586           --len;
1587           if ((len & 1) == 0)
1588             {
1589               *dst++ = val;
1590               val = 0;
1591             }
1592         }
1593       while (len != 0);
1594     }
1595   else
1596     {
1597       fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1598       val = expld.result.value;
1599       fill->data[0] = (val >> 24) & 0xff;
1600       fill->data[1] = (val >> 16) & 0xff;
1601       fill->data[2] = (val >>  8) & 0xff;
1602       fill->data[3] = (val >>  0) & 0xff;
1603       fill->size = 4;
1604     }
1605   return fill;
1606 }
1607
1608 bfd_vma
1609 exp_get_abs_int (etree_type *tree, int def, char *name)
1610 {
1611   if (tree != NULL)
1612     {
1613       exp_fold_tree_no_dot (tree);
1614
1615       if (expld.result.valid_p)
1616         {
1617           if (expld.result.section != NULL)
1618             expld.result.value += expld.result.section->vma;
1619           return expld.result.value;
1620         }
1621       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1622         {
1623           einfo (_("%F%P:%pS: nonconstant expression for %s\n"),
1624                  tree, name);
1625         }
1626     }
1627   return def;
1628 }
1629
1630 static bfd_vma
1631 align_n (bfd_vma value, bfd_vma align)
1632 {
1633   if (align <= 1)
1634     return value;
1635
1636   value = (value + align - 1) / align;
1637   return value * align;
1638 }
1639
1640 void
1641 ldexp_init (void)
1642 {
1643   /* The value "13" is ad-hoc, somewhat related to the expected number of
1644      assignments in a linker script.  */
1645   if (!bfd_hash_table_init_n (&definedness_table,
1646                               definedness_newfunc,
1647                               sizeof (struct definedness_hash_entry),
1648                               13))
1649     einfo (_("%F%P: can not create hash table: %E\n"));
1650 }
1651
1652 /* Convert absolute symbols defined by a script from "dot" (also
1653    SEGMENT_START or ORIGIN) outside of an output section statement,
1654    to section relative.  */
1655
1656 static bfd_boolean
1657 set_sym_sections (struct bfd_hash_entry *bh, void *inf ATTRIBUTE_UNUSED)
1658 {
1659   struct definedness_hash_entry *def = (struct definedness_hash_entry *) bh;
1660   if (def->final_sec != bfd_abs_section_ptr)
1661     {
1662       struct bfd_link_hash_entry *h;
1663       h = bfd_link_hash_lookup (link_info.hash, bh->string,
1664                                 FALSE, FALSE, TRUE);
1665       if (h != NULL
1666           && h->type == bfd_link_hash_defined
1667           && h->u.def.section == bfd_abs_section_ptr)
1668         {
1669           h->u.def.value -= def->final_sec->vma;
1670           h->u.def.section = def->final_sec;
1671         }
1672     }
1673   return TRUE;
1674 }
1675
1676 void
1677 ldexp_finalize_syms (void)
1678 {
1679   bfd_hash_traverse (&definedness_table, set_sym_sections, NULL);
1680 }
1681
1682 void
1683 ldexp_finish (void)
1684 {
1685   bfd_hash_table_free (&definedness_table);
1686 }