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