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