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