* ldexp.c: Add LOG2CEIL() builtin function to linker script language
[external/binutils.git] / ld / ldexp.c
1 /* This module handles expression trees.
2    Copyright 1991-2013 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 /* Print the string representation of the given token.  Surround it
52    with spaces if INFIX_P is TRUE.  */
53
54 static void
55 exp_print_token (token_code_type code, int infix_p)
56 {
57   static const struct
58   {
59     token_code_type code;
60     const char * name;
61   }
62   table[] =
63   {
64     { INT, "int" },
65     { NAME, "NAME" },
66     { PLUSEQ, "+=" },
67     { MINUSEQ, "-=" },
68     { MULTEQ, "*=" },
69     { DIVEQ, "/=" },
70     { LSHIFTEQ, "<<=" },
71     { RSHIFTEQ, ">>=" },
72     { ANDEQ, "&=" },
73     { OREQ, "|=" },
74     { OROR, "||" },
75     { ANDAND, "&&" },
76     { EQ, "==" },
77     { NE, "!=" },
78     { LE, "<=" },
79     { GE, ">=" },
80     { LSHIFT, "<<" },
81     { RSHIFT, ">>" },
82     { LOG2CEIL, "LOG2CEIL" },
83     { ALIGN_K, "ALIGN" },
84     { BLOCK, "BLOCK" },
85     { QUAD, "QUAD" },
86     { SQUAD, "SQUAD" },
87     { LONG, "LONG" },
88     { SHORT, "SHORT" },
89     { BYTE, "BYTE" },
90     { SECTIONS, "SECTIONS" },
91     { SIZEOF_HEADERS, "SIZEOF_HEADERS" },
92     { MEMORY, "MEMORY" },
93     { DEFINED, "DEFINED" },
94     { TARGET_K, "TARGET" },
95     { SEARCH_DIR, "SEARCH_DIR" },
96     { MAP, "MAP" },
97     { ENTRY, "ENTRY" },
98     { NEXT, "NEXT" },
99     { ALIGNOF, "ALIGNOF" },
100     { SIZEOF, "SIZEOF" },
101     { ADDR, "ADDR" },
102     { LOADADDR, "LOADADDR" },
103     { CONSTANT, "CONSTANT" },
104     { ABSOLUTE, "ABSOLUTE" },
105     { MAX_K, "MAX" },
106     { MIN_K, "MIN" },
107     { ASSERT_K, "ASSERT" },
108     { REL, "relocatable" },
109     { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
110     { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
111     { DATA_SEGMENT_END, "DATA_SEGMENT_END" },
112     { ORIGIN, "ORIGIN" },
113     { LENGTH, "LENGTH" },
114     { SEGMENT_START, "SEGMENT_START" }
115   };
116   unsigned int idx;
117
118   for (idx = 0; idx < ARRAY_SIZE (table); idx++)
119     if (table[idx].code == code)
120       break;
121
122   if (infix_p)
123     fputc (' ', config.map_file);
124
125   if (idx < ARRAY_SIZE (table))
126     fputs (table[idx].name, config.map_file);
127   else if (code < 127)
128     fputc (code, config.map_file);
129   else
130     fprintf (config.map_file, "<code %d>", code);
131
132   if (infix_p)
133     fputc (' ', config.map_file);
134 }
135
136 static void
137 make_log2ceil (void)
138 {
139   bfd_vma value = expld.result.value;
140   bfd_vma result = -1;
141   bfd_boolean round_up = FALSE;
142
143   do
144     {
145       result++;
146       /* If more than one bit is set in the value we will need to round up.  */
147       if ((value > 1) && (value & 1))
148         round_up = TRUE;
149     }
150   while (value >>= 1);
151
152   if (round_up)
153     result += 1;
154   expld.result.section = NULL;
155   expld.result.value = result;
156 }
157
158 static void
159 make_abs (void)
160 {
161   if (expld.result.section != NULL)
162     expld.result.value += expld.result.section->vma;
163   expld.result.section = bfd_abs_section_ptr;
164 }
165
166 static void
167 new_abs (bfd_vma value)
168 {
169   expld.result.valid_p = TRUE;
170   expld.result.section = bfd_abs_section_ptr;
171   expld.result.value = value;
172   expld.result.str = NULL;
173 }
174
175 etree_type *
176 exp_intop (bfd_vma value)
177 {
178   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
179   new_e->type.node_code = INT;
180   new_e->type.filename = ldlex_filename ();
181   new_e->type.lineno = lineno;
182   new_e->value.value = value;
183   new_e->value.str = NULL;
184   new_e->type.node_class = etree_value;
185   return new_e;
186 }
187
188 etree_type *
189 exp_bigintop (bfd_vma value, char *str)
190 {
191   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
192   new_e->type.node_code = INT;
193   new_e->type.filename = ldlex_filename ();
194   new_e->type.lineno = lineno;
195   new_e->value.value = value;
196   new_e->value.str = str;
197   new_e->type.node_class = etree_value;
198   return new_e;
199 }
200
201 /* Build an expression representing an unnamed relocatable value.  */
202
203 etree_type *
204 exp_relop (asection *section, bfd_vma value)
205 {
206   etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->rel));
207   new_e->type.node_code = REL;
208   new_e->type.filename = ldlex_filename ();
209   new_e->type.lineno = lineno;
210   new_e->type.node_class = etree_rel;
211   new_e->rel.section = section;
212   new_e->rel.value = value;
213   return new_e;
214 }
215
216 static void
217 new_number (bfd_vma value)
218 {
219   expld.result.valid_p = TRUE;
220   expld.result.value = value;
221   expld.result.str = NULL;
222   expld.result.section = NULL;
223 }
224
225 static void
226 new_rel (bfd_vma value, asection *section)
227 {
228   expld.result.valid_p = TRUE;
229   expld.result.value = value;
230   expld.result.str = NULL;
231   expld.result.section = section;
232 }
233
234 static void
235 new_rel_from_abs (bfd_vma value)
236 {
237   asection *s = expld.section;
238
239   if (s == bfd_abs_section_ptr && expld.phase == lang_final_phase_enum)
240     s = section_for_dot ();
241   expld.result.valid_p = TRUE;
242   expld.result.value = value - s->vma;
243   expld.result.str = NULL;
244   expld.result.section = s;
245 }
246
247 static void
248 fold_unary (etree_type *tree)
249 {
250   exp_fold_tree_1 (tree->unary.child);
251   if (expld.result.valid_p)
252     {
253       switch (tree->type.node_code)
254         {
255         case ALIGN_K:
256           if (expld.phase != lang_first_phase_enum)
257             new_rel_from_abs (align_n (expld.dot, expld.result.value));
258           else
259             expld.result.valid_p = FALSE;
260           break;
261
262         case ABSOLUTE:
263           make_abs ();
264           break;
265
266         case LOG2CEIL:
267           make_log2ceil ();
268           break;
269
270         case '~':
271           expld.result.value = ~expld.result.value;
272           break;
273
274         case '!':
275           expld.result.value = !expld.result.value;
276           break;
277
278         case '-':
279           expld.result.value = -expld.result.value;
280           break;
281
282         case NEXT:
283           /* Return next place aligned to value.  */
284           if (expld.phase != lang_first_phase_enum)
285             {
286               make_abs ();
287               expld.result.value = align_n (expld.dot, expld.result.value);
288             }
289           else
290             expld.result.valid_p = FALSE;
291           break;
292
293         case DATA_SEGMENT_END:
294           if (expld.phase == lang_first_phase_enum
295               || expld.section != bfd_abs_section_ptr)
296             {
297               expld.result.valid_p = FALSE;
298             }
299           else if (expld.dataseg.phase == exp_dataseg_align_seen
300                    || expld.dataseg.phase == exp_dataseg_relro_seen)
301             {
302               expld.dataseg.phase = exp_dataseg_end_seen;
303               expld.dataseg.end = expld.result.value;
304             }
305           else if (expld.dataseg.phase == exp_dataseg_done
306                    || expld.dataseg.phase == exp_dataseg_adjust
307                    || expld.dataseg.phase == exp_dataseg_relro_adjust)
308             {
309               /* OK.  */
310             }
311           else
312             expld.result.valid_p = FALSE;
313           break;
314
315         default:
316           FAIL ();
317           break;
318         }
319     }
320 }
321
322 static void
323 fold_binary (etree_type *tree)
324 {
325   etree_value_type lhs;
326   exp_fold_tree_1 (tree->binary.lhs);
327
328   /* The SEGMENT_START operator is special because its first
329      operand is a string, not the name of a symbol.  Note that the
330      operands have been swapped, so binary.lhs is second (default)
331      operand, binary.rhs is first operand.  */
332   if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
333     {
334       const char *segment_name;
335       segment_type *seg;
336
337       /* Check to see if the user has overridden the default
338          value.  */
339       segment_name = tree->binary.rhs->name.name;
340       for (seg = segments; seg; seg = seg->next)
341         if (strcmp (seg->name, segment_name) == 0)
342           {
343             if (!seg->used
344                 && config.magic_demand_paged
345                 && (seg->value % config.maxpagesize) != 0)
346               einfo (_("%P: warning: address of `%s' isn't multiple of maximum page size\n"),
347                      segment_name);
348             seg->used = TRUE;
349             new_rel_from_abs (seg->value);
350             break;
351           }
352       return;
353     }
354
355   lhs = expld.result;
356   exp_fold_tree_1 (tree->binary.rhs);
357   expld.result.valid_p &= lhs.valid_p;
358
359   if (expld.result.valid_p)
360     {
361       if (lhs.section != expld.result.section)
362         {
363           /* If the values are from different sections, and neither is
364              just a number, make both the source arguments absolute.  */
365           if (expld.result.section != NULL
366               && lhs.section != NULL)
367             {
368               make_abs ();
369               lhs.value += lhs.section->vma;
370               lhs.section = bfd_abs_section_ptr;
371             }
372
373           /* If the rhs is just a number, keep the lhs section.  */
374           else if (expld.result.section == NULL)
375             {
376               expld.result.section = lhs.section;
377               /* Make this NULL so that we know one of the operands
378                  was just a number, for later tests.  */
379               lhs.section = NULL;
380             }
381         }
382       /* At this point we know that both operands have the same
383          section, or at least one of them is a plain number.  */
384
385       switch (tree->type.node_code)
386         {
387           /* Arithmetic operators, bitwise AND, bitwise OR and XOR
388              keep the section of one of their operands only when the
389              other operand is a plain number.  Losing the section when
390              operating on two symbols, ie. a result of a plain number,
391              is required for subtraction and XOR.  It's justifiable
392              for the other operations on the grounds that adding,
393              multiplying etc. two section relative values does not
394              really make sense unless they are just treated as
395              numbers.
396              The same argument could be made for many expressions
397              involving one symbol and a number.  For example,
398              "1 << x" and "100 / x" probably should not be given the
399              section of x.  The trouble is that if we fuss about such
400              things the rules become complex and it is onerous to
401              document ld expression evaluation.  */
402 #define BOP(x, y) \
403         case x:                                                 \
404           expld.result.value = lhs.value y expld.result.value;  \
405           if (expld.result.section == lhs.section)              \
406             expld.result.section = NULL;                        \
407           break;
408
409           /* Comparison operators, logical AND, and logical OR always
410              return a plain number.  */
411 #define BOPN(x, y) \
412         case x:                                                 \
413           expld.result.value = lhs.value y expld.result.value;  \
414           expld.result.section = NULL;                          \
415           break;
416
417           BOP ('+', +);
418           BOP ('*', *);
419           BOP ('-', -);
420           BOP (LSHIFT, <<);
421           BOP (RSHIFT, >>);
422           BOP ('&', &);
423           BOP ('^', ^);
424           BOP ('|', |);
425           BOPN (EQ, ==);
426           BOPN (NE, !=);
427           BOPN ('<', <);
428           BOPN ('>', >);
429           BOPN (LE, <=);
430           BOPN (GE, >=);
431           BOPN (ANDAND, &&);
432           BOPN (OROR, ||);
433
434         case '%':
435           if (expld.result.value != 0)
436             expld.result.value = ((bfd_signed_vma) lhs.value
437                                   % (bfd_signed_vma) expld.result.value);
438           else if (expld.phase != lang_mark_phase_enum)
439             einfo (_("%F%S %% by zero\n"), tree->binary.rhs);
440           if (expld.result.section == lhs.section)
441             expld.result.section = NULL;
442           break;
443
444         case '/':
445           if (expld.result.value != 0)
446             expld.result.value = ((bfd_signed_vma) lhs.value
447                                   / (bfd_signed_vma) expld.result.value);
448           else if (expld.phase != lang_mark_phase_enum)
449             einfo (_("%F%S / by zero\n"), tree->binary.rhs);
450           if (expld.result.section == lhs.section)
451             expld.result.section = NULL;
452           break;
453
454         case MAX_K:
455           if (lhs.value > expld.result.value)
456             expld.result.value = lhs.value;
457           break;
458
459         case MIN_K:
460           if (lhs.value < expld.result.value)
461             expld.result.value = lhs.value;
462           break;
463
464         case ALIGN_K:
465           expld.result.value = align_n (lhs.value, expld.result.value);
466           break;
467
468         case DATA_SEGMENT_ALIGN:
469           expld.dataseg.relro = exp_dataseg_relro_start;
470           if (expld.phase == lang_first_phase_enum
471               || expld.section != bfd_abs_section_ptr)
472             expld.result.valid_p = FALSE;
473           else
474             {
475               bfd_vma maxpage = lhs.value;
476               bfd_vma commonpage = expld.result.value;
477
478               expld.result.value = align_n (expld.dot, maxpage);
479               if (expld.dataseg.phase == exp_dataseg_relro_adjust)
480                 expld.result.value = expld.dataseg.base;
481               else if (expld.dataseg.phase == exp_dataseg_adjust)
482                 {
483                   if (commonpage < maxpage)
484                     expld.result.value += ((expld.dot + commonpage - 1)
485                                            & (maxpage - commonpage));
486                 }
487               else
488                 {
489                   expld.result.value += expld.dot & (maxpage - 1);
490                   if (expld.dataseg.phase == exp_dataseg_done)
491                     {
492                       /* OK.  */
493                     }
494                   else if (expld.dataseg.phase == exp_dataseg_none)
495                     {
496                       expld.dataseg.phase = exp_dataseg_align_seen;
497                       expld.dataseg.min_base = expld.dot;
498                       expld.dataseg.base = expld.result.value;
499                       expld.dataseg.pagesize = commonpage;
500                       expld.dataseg.maxpagesize = maxpage;
501                       expld.dataseg.relro_end = 0;
502                     }
503                   else
504                     expld.result.valid_p = FALSE;
505                 }
506             }
507           break;
508
509         case DATA_SEGMENT_RELRO_END:
510           expld.dataseg.relro = exp_dataseg_relro_end;
511           if (expld.phase == lang_first_phase_enum
512               || expld.section != bfd_abs_section_ptr)
513             expld.result.valid_p = FALSE;
514           else if (expld.dataseg.phase == exp_dataseg_align_seen
515                    || expld.dataseg.phase == exp_dataseg_adjust
516                    || expld.dataseg.phase == exp_dataseg_relro_adjust
517                    || expld.dataseg.phase == exp_dataseg_done)
518             {
519               if (expld.dataseg.phase == exp_dataseg_align_seen
520                   || expld.dataseg.phase == exp_dataseg_relro_adjust)
521                 expld.dataseg.relro_end = lhs.value + expld.result.value;
522
523               if (expld.dataseg.phase == exp_dataseg_relro_adjust
524                   && (expld.dataseg.relro_end
525                       & (expld.dataseg.pagesize - 1)))
526                 {
527                   expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
528                   expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
529                   expld.result.value = (expld.dataseg.relro_end
530                                         - expld.result.value);
531                 }
532               else
533                 expld.result.value = lhs.value;
534
535               if (expld.dataseg.phase == exp_dataseg_align_seen)
536                 expld.dataseg.phase = exp_dataseg_relro_seen;
537             }
538           else
539             expld.result.valid_p = FALSE;
540           break;
541
542         default:
543           FAIL ();
544         }
545     }
546 }
547
548 static void
549 fold_trinary (etree_type *tree)
550 {
551   exp_fold_tree_1 (tree->trinary.cond);
552   if (expld.result.valid_p)
553     exp_fold_tree_1 (expld.result.value
554                      ? tree->trinary.lhs
555                      : tree->trinary.rhs);
556 }
557
558 static void
559 fold_name (etree_type *tree)
560 {
561   memset (&expld.result, 0, sizeof (expld.result));
562
563   switch (tree->type.node_code)
564     {
565     case SIZEOF_HEADERS:
566       if (expld.phase != lang_first_phase_enum)
567         {
568           bfd_vma hdr_size = 0;
569           /* Don't find the real header size if only marking sections;
570              The bfd function may cache incorrect data.  */
571           if (expld.phase != lang_mark_phase_enum)
572             hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
573           new_number (hdr_size);
574         }
575       break;
576
577     case DEFINED:
578       if (expld.phase == lang_first_phase_enum)
579         lang_track_definedness (tree->name.name);
580       else
581         {
582           struct bfd_link_hash_entry *h;
583           int def_iteration
584             = lang_symbol_definition_iteration (tree->name.name);
585
586           h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
587                                             &link_info,
588                                             tree->name.name,
589                                             FALSE, FALSE, TRUE);
590           new_number (h != NULL
591                       && (h->type == bfd_link_hash_defined
592                           || h->type == bfd_link_hash_defweak
593                           || h->type == bfd_link_hash_common)
594                       && (def_iteration == lang_statement_iteration
595                           || def_iteration == -1));
596         }
597       break;
598
599     case NAME:
600       if (expld.assign_name != NULL
601           && strcmp (expld.assign_name, tree->name.name) == 0)
602         expld.assign_name = NULL;
603       if (expld.phase == lang_first_phase_enum)
604         ;
605       else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
606         new_rel_from_abs (expld.dot);
607       else
608         {
609           struct bfd_link_hash_entry *h;
610
611           h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
612                                             &link_info,
613                                             tree->name.name,
614                                             TRUE, FALSE, TRUE);
615           if (!h)
616             einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
617           else if (h->type == bfd_link_hash_defined
618                    || h->type == bfd_link_hash_defweak)
619             {
620               asection *output_section;
621
622               output_section = h->u.def.section->output_section;
623               if (output_section == NULL)
624                 {
625                   if (expld.phase == lang_mark_phase_enum)
626                     new_rel (h->u.def.value, h->u.def.section);
627                   else
628                     einfo (_("%X%S: unresolvable symbol `%s'"
629                              " referenced in expression\n"),
630                            tree, tree->name.name);
631                 }
632               else if (output_section == bfd_abs_section_ptr
633                        && (expld.section != bfd_abs_section_ptr
634                            || config.sane_expr))
635                 new_number (h->u.def.value + h->u.def.section->output_offset);
636               else
637                 new_rel (h->u.def.value + h->u.def.section->output_offset,
638                          output_section);
639             }
640           else if (expld.phase == lang_final_phase_enum
641                    || (expld.phase != lang_mark_phase_enum
642                        && expld.assigning_to_dot))
643             einfo (_("%F%S: undefined symbol `%s'"
644                      " referenced in expression\n"),
645                    tree, tree->name.name);
646           else if (h->type == bfd_link_hash_new)
647             {
648               h->type = bfd_link_hash_undefined;
649               h->u.undef.abfd = NULL;
650               if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
651                 bfd_link_add_undef (link_info.hash, h);
652             }
653         }
654       break;
655
656     case ADDR:
657       if (expld.phase != lang_first_phase_enum)
658         {
659           lang_output_section_statement_type *os;
660
661           os = lang_output_section_find (tree->name.name);
662           if (os == NULL)
663             {
664               if (expld.phase == lang_final_phase_enum)
665                 einfo (_("%F%S: undefined section `%s'"
666                          " referenced in expression\n"),
667                        tree, tree->name.name);
668             }
669           else if (os->processed_vma)
670             new_rel (0, os->bfd_section);
671         }
672       break;
673
674     case LOADADDR:
675       if (expld.phase != lang_first_phase_enum)
676         {
677           lang_output_section_statement_type *os;
678
679           os = lang_output_section_find (tree->name.name);
680           if (os == NULL)
681             {
682               if (expld.phase == lang_final_phase_enum)
683                 einfo (_("%F%S: undefined section `%s'"
684                          " referenced in expression\n"),
685                        tree, tree->name.name);
686             }
687           else if (os->processed_lma)
688             {
689               if (os->load_base == NULL)
690                 new_abs (os->bfd_section->lma);
691               else
692                 {
693                   exp_fold_tree_1 (os->load_base);
694                   if (expld.result.valid_p)
695                     make_abs ();
696                 }
697             }
698         }
699       break;
700
701     case SIZEOF:
702     case ALIGNOF:
703       if (expld.phase != lang_first_phase_enum)
704         {
705           lang_output_section_statement_type *os;
706
707           os = lang_output_section_find (tree->name.name);
708           if (os == NULL)
709             {
710               if (expld.phase == lang_final_phase_enum)
711                 einfo (_("%F%S: undefined section `%s'"
712                          " referenced in expression\n"),
713                        tree, tree->name.name);
714               new_number (0);
715             }
716           else if (os->bfd_section != NULL)
717             {
718               bfd_vma val;
719
720               if (tree->type.node_code == SIZEOF)
721                 val = (os->bfd_section->size
722                        / bfd_octets_per_byte (link_info.output_bfd));
723               else
724                 val = (bfd_vma)1 << os->bfd_section->alignment_power;
725
726               new_number (val);
727             }
728           else
729             new_number (0);
730         }
731       break;
732
733     case LENGTH:
734       {
735         lang_memory_region_type *mem;
736
737         mem = lang_memory_region_lookup (tree->name.name, FALSE);
738         if (mem != NULL)
739           new_number (mem->length);
740         else
741           einfo (_("%F%S: undefined MEMORY region `%s'"
742                    " referenced in expression\n"),
743                  tree, tree->name.name);
744       }
745       break;
746
747     case ORIGIN:
748       if (expld.phase != lang_first_phase_enum)
749         {
750           lang_memory_region_type *mem;
751
752           mem = lang_memory_region_lookup (tree->name.name, FALSE);
753           if (mem != NULL)
754             new_rel_from_abs (mem->origin);
755           else
756             einfo (_("%F%S: undefined MEMORY region `%s'"
757                      " referenced in expression\n"),
758                    tree, tree->name.name);
759         }
760       break;
761
762     case CONSTANT:
763       if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
764         new_number (config.maxpagesize);
765       else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
766         new_number (config.commonpagesize);
767       else
768         einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
769                tree, tree->name.name);
770       break;
771
772     default:
773       FAIL ();
774       break;
775     }
776 }
777
778 static void
779 exp_fold_tree_1 (etree_type *tree)
780 {
781   if (tree == NULL)
782     {
783       memset (&expld.result, 0, sizeof (expld.result));
784       return;
785     }
786
787   switch (tree->type.node_class)
788     {
789     case etree_value:
790       if (expld.section == bfd_abs_section_ptr
791           && !config.sane_expr)
792         new_abs (tree->value.value);
793       else
794         new_number (tree->value.value);
795       expld.result.str = tree->value.str;
796       break;
797
798     case etree_rel:
799       if (expld.phase != lang_first_phase_enum)
800         {
801           asection *output_section = tree->rel.section->output_section;
802           new_rel (tree->rel.value + tree->rel.section->output_offset,
803                    output_section);
804         }
805       else
806         memset (&expld.result, 0, sizeof (expld.result));
807       break;
808
809     case etree_assert:
810       exp_fold_tree_1 (tree->assert_s.child);
811       if (expld.phase == lang_final_phase_enum && !expld.result.value)
812         einfo ("%X%P: %s\n", tree->assert_s.message);
813       break;
814
815     case etree_unary:
816       fold_unary (tree);
817       break;
818
819     case etree_binary:
820       fold_binary (tree);
821       break;
822
823     case etree_trinary:
824       fold_trinary (tree);
825       break;
826
827     case etree_assign:
828     case etree_provide:
829     case etree_provided:
830       if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
831         {
832           if (tree->type.node_class != etree_assign)
833             einfo (_("%F%S can not PROVIDE assignment to"
834                      " location counter\n"), tree);
835           if (expld.phase != lang_first_phase_enum)
836             {
837               /* Notify the folder that this is an assignment to dot.  */
838               expld.assigning_to_dot = TRUE;
839               exp_fold_tree_1 (tree->assign.src);
840               expld.assigning_to_dot = FALSE;
841
842               if (!expld.result.valid_p)
843                 {
844                   if (expld.phase != lang_mark_phase_enum)
845                     einfo (_("%F%S invalid assignment to"
846                              " location counter\n"), tree);
847                 }
848               else if (expld.dotp == NULL)
849                 einfo (_("%F%S assignment to location counter"
850                          " invalid outside of SECTIONS\n"), tree);
851
852               /* After allocation, assignment to dot should not be
853                  done inside an output section since allocation adds a
854                  padding statement that effectively duplicates the
855                  assignment.  */
856               else if (expld.phase <= lang_allocating_phase_enum
857                        || expld.section == bfd_abs_section_ptr)
858                 {
859                   bfd_vma nextdot;
860
861                   nextdot = expld.result.value;
862                   if (expld.result.section != NULL)
863                     nextdot += expld.result.section->vma;
864                   else
865                     nextdot += expld.section->vma;
866                   if (nextdot < expld.dot
867                       && expld.section != bfd_abs_section_ptr)
868                     einfo (_("%F%S cannot move location counter backwards"
869                              " (from %V to %V)\n"),
870                            tree, expld.dot, nextdot);
871                   else
872                     {
873                       expld.dot = nextdot;
874                       *expld.dotp = nextdot;
875                     }
876                 }
877             }
878           else
879             memset (&expld.result, 0, sizeof (expld.result));
880         }
881       else
882         {
883           struct bfd_link_hash_entry *h = NULL;
884
885           if (tree->type.node_class == etree_provide)
886             {
887               h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
888                                         FALSE, FALSE, TRUE);
889               if (h == NULL
890                   || (h->type != bfd_link_hash_new
891                       && h->type != bfd_link_hash_undefined
892                       && h->type != bfd_link_hash_common))
893                 {
894                   /* Do nothing.  The symbol was never referenced, or was
895                      defined by some object.  */
896                   break;
897                 }
898             }
899
900           expld.assign_name = tree->assign.dst;
901           exp_fold_tree_1 (tree->assign.src);
902           /* expld.assign_name remaining equal to tree->assign.dst
903              below indicates the evaluation of tree->assign.src did
904              not use the value of tree->assign.dst.  We don't allow
905              self assignment until the final phase for two reasons:
906              1) Expressions are evaluated multiple times.  With
907              relaxation, the number of times may vary.
908              2) Section relative symbol values cannot be correctly
909              converted to absolute values, as is required by many
910              expressions, until final section sizing is complete.  */
911           if ((expld.result.valid_p
912                && (expld.phase == lang_final_phase_enum
913                    || expld.assign_name != NULL))
914               || (expld.phase <= lang_mark_phase_enum
915                   && tree->type.node_class == etree_assign
916                   && tree->assign.defsym))
917             {
918               if (h == NULL)
919                 {
920                   h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
921                                             TRUE, FALSE, TRUE);
922                   if (h == NULL)
923                     einfo (_("%P%F:%s: hash creation failed\n"),
924                            tree->assign.dst);
925                 }
926
927               /* FIXME: Should we worry if the symbol is already
928                  defined?  */
929               lang_update_definedness (tree->assign.dst, h);
930               h->type = bfd_link_hash_defined;
931               h->u.def.value = expld.result.value;
932               if (expld.result.section == NULL)
933                 expld.result.section = expld.section;
934               h->u.def.section = expld.result.section;
935               if (tree->type.node_class == etree_provide)
936                 tree->type.node_class = etree_provided;
937
938               /* Copy the symbol type if this is a simple assignment of
939                  one symbol to another.  This could be more general
940                  (e.g. a ?: operator with NAMEs in each branch).  */
941               if (tree->assign.src->type.node_class == etree_name)
942                 {
943                   struct bfd_link_hash_entry *hsrc;
944
945                   hsrc = bfd_link_hash_lookup (link_info.hash,
946                                                tree->assign.src->name.name,
947                                                FALSE, FALSE, TRUE);
948                   if (hsrc)
949                     bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
950                                                     hsrc);
951                 }
952             }
953           else if (expld.phase == lang_final_phase_enum)
954             {
955               h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
956                                         FALSE, FALSE, TRUE);
957               if (h != NULL
958                   && h->type == bfd_link_hash_new)
959                 h->type = bfd_link_hash_undefined;
960             }
961           expld.assign_name = NULL;
962         }
963       break;
964
965     case etree_name:
966       fold_name (tree);
967       break;
968
969     default:
970       FAIL ();
971       memset (&expld.result, 0, sizeof (expld.result));
972       break;
973     }
974 }
975
976 void
977 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
978 {
979   expld.dot = *dotp;
980   expld.dotp = dotp;
981   expld.section = current_section;
982   exp_fold_tree_1 (tree);
983 }
984
985 void
986 exp_fold_tree_no_dot (etree_type *tree)
987 {
988   expld.dot = 0;
989   expld.dotp = NULL;
990   expld.section = bfd_abs_section_ptr;
991   exp_fold_tree_1 (tree);
992 }
993
994 etree_type *
995 exp_binop (int code, etree_type *lhs, etree_type *rhs)
996 {
997   etree_type value, *new_e;
998
999   value.type.node_code = code;
1000   value.type.filename = lhs->type.filename;
1001   value.type.lineno = lhs->type.lineno;
1002   value.binary.lhs = lhs;
1003   value.binary.rhs = rhs;
1004   value.type.node_class = etree_binary;
1005   exp_fold_tree_no_dot (&value);
1006   if (expld.result.valid_p)
1007     return exp_intop (expld.result.value);
1008
1009   new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
1010   memcpy (new_e, &value, sizeof (new_e->binary));
1011   return new_e;
1012 }
1013
1014 etree_type *
1015 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
1016 {
1017   etree_type value, *new_e;
1018
1019   value.type.node_code = code;
1020   value.type.filename = cond->type.filename;
1021   value.type.lineno = cond->type.lineno;
1022   value.trinary.lhs = lhs;
1023   value.trinary.cond = cond;
1024   value.trinary.rhs = rhs;
1025   value.type.node_class = etree_trinary;
1026   exp_fold_tree_no_dot (&value);
1027   if (expld.result.valid_p)
1028     return exp_intop (expld.result.value);
1029
1030   new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1031   memcpy (new_e, &value, sizeof (new_e->trinary));
1032   return new_e;
1033 }
1034
1035 etree_type *
1036 exp_unop (int code, etree_type *child)
1037 {
1038   etree_type value, *new_e;
1039
1040   value.unary.type.node_code = code;
1041   value.unary.type.filename = child->type.filename;
1042   value.unary.type.lineno = child->type.lineno;
1043   value.unary.child = child;
1044   value.unary.type.node_class = etree_unary;
1045   exp_fold_tree_no_dot (&value);
1046   if (expld.result.valid_p)
1047     return exp_intop (expld.result.value);
1048
1049   new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1050   memcpy (new_e, &value, sizeof (new_e->unary));
1051   return new_e;
1052 }
1053
1054 etree_type *
1055 exp_nameop (int code, const char *name)
1056 {
1057   etree_type value, *new_e;
1058
1059   value.name.type.node_code = code;
1060   value.name.type.filename = ldlex_filename ();
1061   value.name.type.lineno = lineno;
1062   value.name.name = name;
1063   value.name.type.node_class = etree_name;
1064
1065   exp_fold_tree_no_dot (&value);
1066   if (expld.result.valid_p)
1067     return exp_intop (expld.result.value);
1068
1069   new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1070   memcpy (new_e, &value, sizeof (new_e->name));
1071   return new_e;
1072
1073 }
1074
1075 static etree_type *
1076 exp_assop (const char *dst,
1077            etree_type *src,
1078            enum node_tree_enum class,
1079            bfd_boolean defsym,
1080            bfd_boolean hidden)
1081 {
1082   etree_type *n;
1083
1084   n = (etree_type *) stat_alloc (sizeof (n->assign));
1085   n->assign.type.node_code = '=';
1086   n->assign.type.filename = src->type.filename;
1087   n->assign.type.lineno = src->type.lineno;
1088   n->assign.type.node_class = class;
1089   n->assign.src = src;
1090   n->assign.dst = dst;
1091   n->assign.defsym = defsym;
1092   n->assign.hidden = hidden;
1093   return n;
1094 }
1095
1096 /* Handle linker script assignments and HIDDEN.  */
1097
1098 etree_type *
1099 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1100 {
1101   return exp_assop (dst, src, etree_assign, FALSE, hidden);
1102 }
1103
1104 /* Handle --defsym command-line option.  */
1105
1106 etree_type *
1107 exp_defsym (const char *dst, etree_type *src)
1108 {
1109   return exp_assop (dst, src, etree_assign, TRUE, FALSE);
1110 }
1111
1112 /* Handle PROVIDE.  */
1113
1114 etree_type *
1115 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1116 {
1117   return exp_assop (dst, src, etree_provide, FALSE, hidden);
1118 }
1119
1120 /* Handle ASSERT.  */
1121
1122 etree_type *
1123 exp_assert (etree_type *exp, const char *message)
1124 {
1125   etree_type *n;
1126
1127   n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1128   n->assert_s.type.node_code = '!';
1129   n->assert_s.type.filename = exp->type.filename;
1130   n->assert_s.type.lineno = exp->type.lineno;
1131   n->assert_s.type.node_class = etree_assert;
1132   n->assert_s.child = exp;
1133   n->assert_s.message = message;
1134   return n;
1135 }
1136
1137 void
1138 exp_print_tree (etree_type *tree)
1139 {
1140   bfd_boolean function_like;
1141
1142   if (config.map_file == NULL)
1143     config.map_file = stderr;
1144
1145   if (tree == NULL)
1146     {
1147       minfo ("NULL TREE\n");
1148       return;
1149     }
1150
1151   switch (tree->type.node_class)
1152     {
1153     case etree_value:
1154       minfo ("0x%v", tree->value.value);
1155       return;
1156     case etree_rel:
1157       if (tree->rel.section->owner != NULL)
1158         minfo ("%B:", tree->rel.section->owner);
1159       minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1160       return;
1161     case etree_assign:
1162       fputs (tree->assign.dst, config.map_file);
1163       exp_print_token (tree->type.node_code, TRUE);
1164       exp_print_tree (tree->assign.src);
1165       break;
1166     case etree_provide:
1167     case etree_provided:
1168       fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1169       exp_print_tree (tree->assign.src);
1170       fputc (')', config.map_file);
1171       break;
1172     case etree_binary:
1173       function_like = FALSE;
1174       switch (tree->type.node_code)
1175         {
1176         case MAX_K:
1177         case MIN_K:
1178         case ALIGN_K:
1179         case DATA_SEGMENT_ALIGN:
1180         case DATA_SEGMENT_RELRO_END:
1181           function_like = TRUE;
1182           break;
1183         case SEGMENT_START:
1184           /* Special handling because arguments are in reverse order and
1185              the segment name is quoted.  */
1186           exp_print_token (tree->type.node_code, FALSE);
1187           fputs (" (\"", config.map_file);
1188           exp_print_tree (tree->binary.rhs);
1189           fputs ("\", ", config.map_file);
1190           exp_print_tree (tree->binary.lhs);
1191           fputc (')', config.map_file);
1192           return;
1193         }
1194       if (function_like)
1195         {
1196           exp_print_token (tree->type.node_code, FALSE);
1197           fputc (' ', config.map_file);
1198         }
1199       fputc ('(', config.map_file);
1200       exp_print_tree (tree->binary.lhs);
1201       if (function_like)
1202         fprintf (config.map_file, ", ");
1203       else
1204         exp_print_token (tree->type.node_code, TRUE);
1205       exp_print_tree (tree->binary.rhs);
1206       fputc (')', config.map_file);
1207       break;
1208     case etree_trinary:
1209       exp_print_tree (tree->trinary.cond);
1210       fputc ('?', config.map_file);
1211       exp_print_tree (tree->trinary.lhs);
1212       fputc (':', config.map_file);
1213       exp_print_tree (tree->trinary.rhs);
1214       break;
1215     case etree_unary:
1216       exp_print_token (tree->unary.type.node_code, FALSE);
1217       if (tree->unary.child)
1218         {
1219           fprintf (config.map_file, " (");
1220           exp_print_tree (tree->unary.child);
1221           fputc (')', config.map_file);
1222         }
1223       break;
1224
1225     case etree_assert:
1226       fprintf (config.map_file, "ASSERT (");
1227       exp_print_tree (tree->assert_s.child);
1228       fprintf (config.map_file, ", %s)", tree->assert_s.message);
1229       break;
1230
1231     case etree_name:
1232       if (tree->type.node_code == NAME)
1233         fputs (tree->name.name, config.map_file);
1234       else
1235         {
1236           exp_print_token (tree->type.node_code, FALSE);
1237           if (tree->name.name)
1238             fprintf (config.map_file, " (%s)", tree->name.name);
1239         }
1240       break;
1241     default:
1242       FAIL ();
1243       break;
1244     }
1245 }
1246
1247 bfd_vma
1248 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1249 {
1250   if (tree != NULL)
1251     {
1252       exp_fold_tree_no_dot (tree);
1253       if (expld.result.valid_p)
1254         return expld.result.value;
1255       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1256         einfo (_("%F%S: nonconstant expression for %s\n"),
1257                tree, name);
1258     }
1259   return def;
1260 }
1261
1262 int
1263 exp_get_value_int (etree_type *tree, int def, char *name)
1264 {
1265   return exp_get_vma (tree, def, name);
1266 }
1267
1268 fill_type *
1269 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1270 {
1271   fill_type *fill;
1272   size_t len;
1273   unsigned int val;
1274
1275   if (tree == NULL)
1276     return def;
1277
1278   exp_fold_tree_no_dot (tree);
1279   if (!expld.result.valid_p)
1280     {
1281       if (name != NULL && expld.phase != lang_mark_phase_enum)
1282         einfo (_("%F%S: nonconstant expression for %s\n"),
1283                tree, name);
1284       return def;
1285     }
1286
1287   if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1288     {
1289       unsigned char *dst;
1290       unsigned char *s;
1291       fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1292       fill->size = (len + 1) / 2;
1293       dst = fill->data;
1294       s = (unsigned char *) expld.result.str;
1295       val = 0;
1296       do
1297         {
1298           unsigned int digit;
1299
1300           digit = *s++ - '0';
1301           if (digit > 9)
1302             digit = (digit - 'A' + '0' + 10) & 0xf;
1303           val <<= 4;
1304           val += digit;
1305           --len;
1306           if ((len & 1) == 0)
1307             {
1308               *dst++ = val;
1309               val = 0;
1310             }
1311         }
1312       while (len != 0);
1313     }
1314   else
1315     {
1316       fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1317       val = expld.result.value;
1318       fill->data[0] = (val >> 24) & 0xff;
1319       fill->data[1] = (val >> 16) & 0xff;
1320       fill->data[2] = (val >>  8) & 0xff;
1321       fill->data[3] = (val >>  0) & 0xff;
1322       fill->size = 4;
1323     }
1324   return fill;
1325 }
1326
1327 bfd_vma
1328 exp_get_abs_int (etree_type *tree, int def, char *name)
1329 {
1330   if (tree != NULL)
1331     {
1332       exp_fold_tree_no_dot (tree);
1333
1334       if (expld.result.valid_p)
1335         {
1336           if (expld.result.section != NULL)
1337             expld.result.value += expld.result.section->vma;
1338           return expld.result.value;
1339         }
1340       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1341         {
1342           einfo (_("%F%S: nonconstant expression for %s\n"),
1343                  tree, name);
1344         }
1345     }
1346   return def;
1347 }
1348
1349 static bfd_vma
1350 align_n (bfd_vma value, bfd_vma align)
1351 {
1352   if (align <= 1)
1353     return value;
1354
1355   value = (value + align - 1) / align;
1356   return value * align;
1357 }