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