Allow self-assignment for absolute symbols defined in a linker script
[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         {
580           struct bfd_link_hash_entry *h;
581           struct lang_definedness_hash_entry *def;
582
583           h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
584                                             &link_info,
585                                             tree->name.name,
586                                             FALSE, FALSE, TRUE);
587           new_number (h != NULL
588                       && (h->type == bfd_link_hash_defined
589                           || h->type == bfd_link_hash_defweak
590                           || h->type == bfd_link_hash_common)
591                       && ((def = lang_symbol_defined (tree->name.name)) == NULL
592                           || def->by_object
593                           || def->iteration == (lang_statement_iteration & 1)));
594         }
595       break;
596
597     case NAME:
598       if (expld.assign_name != NULL
599           && strcmp (expld.assign_name, tree->name.name) == 0)
600         {
601           /* Self-assignment is only allowed for absolute symbols
602              defined in a linker script.  */
603           struct bfd_link_hash_entry *h;
604           struct lang_definedness_hash_entry *def;
605
606           h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
607                                             &link_info,
608                                             tree->name.name,
609                                             FALSE, FALSE, TRUE);
610           if (!(h != NULL
611                 && (h->type == bfd_link_hash_defined
612                     || h->type == bfd_link_hash_defweak)
613                 && h->u.def.section == bfd_abs_section_ptr
614                 && (def = lang_symbol_defined (tree->name.name)) != NULL
615                 && def->iteration == (lang_statement_iteration & 1)))
616             expld.assign_name = NULL;
617         }
618       if (expld.phase == lang_first_phase_enum)
619         ;
620       else if (tree->name.name[0] == '.' && tree->name.name[1] == 0)
621         new_rel_from_abs (expld.dot);
622       else
623         {
624           struct bfd_link_hash_entry *h;
625
626           h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
627                                             &link_info,
628                                             tree->name.name,
629                                             TRUE, FALSE, TRUE);
630           if (!h)
631             einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
632           else if (h->type == bfd_link_hash_defined
633                    || h->type == bfd_link_hash_defweak)
634             {
635               asection *output_section;
636
637               output_section = h->u.def.section->output_section;
638               if (output_section == NULL)
639                 {
640                   if (expld.phase == lang_mark_phase_enum)
641                     new_rel (h->u.def.value, h->u.def.section);
642                   else
643                     einfo (_("%X%S: unresolvable symbol `%s'"
644                              " referenced in expression\n"),
645                            tree, tree->name.name);
646                 }
647               else if (output_section == bfd_abs_section_ptr
648                        && (expld.section != bfd_abs_section_ptr
649                            || config.sane_expr))
650                 new_number (h->u.def.value + h->u.def.section->output_offset);
651               else
652                 new_rel (h->u.def.value + h->u.def.section->output_offset,
653                          output_section);
654             }
655           else if (expld.phase == lang_final_phase_enum
656                    || (expld.phase != lang_mark_phase_enum
657                        && expld.assigning_to_dot))
658             einfo (_("%F%S: undefined symbol `%s'"
659                      " referenced in expression\n"),
660                    tree, tree->name.name);
661           else if (h->type == bfd_link_hash_new)
662             {
663               h->type = bfd_link_hash_undefined;
664               h->u.undef.abfd = NULL;
665               if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail)
666                 bfd_link_add_undef (link_info.hash, h);
667             }
668         }
669       break;
670
671     case ADDR:
672       if (expld.phase != lang_first_phase_enum)
673         {
674           lang_output_section_statement_type *os;
675
676           os = lang_output_section_find (tree->name.name);
677           if (os == NULL)
678             {
679               if (expld.phase == lang_final_phase_enum)
680                 einfo (_("%F%S: undefined section `%s'"
681                          " referenced in expression\n"),
682                        tree, tree->name.name);
683             }
684           else if (os->processed_vma)
685             new_rel (0, os->bfd_section);
686         }
687       break;
688
689     case LOADADDR:
690       if (expld.phase != lang_first_phase_enum)
691         {
692           lang_output_section_statement_type *os;
693
694           os = lang_output_section_find (tree->name.name);
695           if (os == NULL)
696             {
697               if (expld.phase == lang_final_phase_enum)
698                 einfo (_("%F%S: undefined section `%s'"
699                          " referenced in expression\n"),
700                        tree, tree->name.name);
701             }
702           else if (os->processed_lma)
703             {
704               if (os->load_base == NULL)
705                 new_abs (os->bfd_section->lma);
706               else
707                 {
708                   exp_fold_tree_1 (os->load_base);
709                   if (expld.result.valid_p)
710                     make_abs ();
711                 }
712             }
713         }
714       break;
715
716     case SIZEOF:
717     case ALIGNOF:
718       if (expld.phase != lang_first_phase_enum)
719         {
720           lang_output_section_statement_type *os;
721
722           os = lang_output_section_find (tree->name.name);
723           if (os == NULL)
724             {
725               if (expld.phase == lang_final_phase_enum)
726                 einfo (_("%F%S: undefined section `%s'"
727                          " referenced in expression\n"),
728                        tree, tree->name.name);
729               new_number (0);
730             }
731           else if (os->bfd_section != NULL)
732             {
733               bfd_vma val;
734
735               if (tree->type.node_code == SIZEOF)
736                 val = (os->bfd_section->size
737                        / bfd_octets_per_byte (link_info.output_bfd));
738               else
739                 val = (bfd_vma)1 << os->bfd_section->alignment_power;
740
741               new_number (val);
742             }
743           else
744             new_number (0);
745         }
746       break;
747
748     case LENGTH:
749       {
750         lang_memory_region_type *mem;
751
752         mem = lang_memory_region_lookup (tree->name.name, FALSE);
753         if (mem != NULL)
754           new_number (mem->length);
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 ORIGIN:
763       if (expld.phase != lang_first_phase_enum)
764         {
765           lang_memory_region_type *mem;
766
767           mem = lang_memory_region_lookup (tree->name.name, FALSE);
768           if (mem != NULL)
769             new_rel_from_abs (mem->origin);
770           else
771             einfo (_("%F%S: undefined MEMORY region `%s'"
772                      " referenced in expression\n"),
773                    tree, tree->name.name);
774         }
775       break;
776
777     case CONSTANT:
778       if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
779         new_number (config.maxpagesize);
780       else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
781         new_number (config.commonpagesize);
782       else
783         einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
784                tree, tree->name.name);
785       break;
786
787     default:
788       FAIL ();
789       break;
790     }
791 }
792
793 static void
794 exp_fold_tree_1 (etree_type *tree)
795 {
796   if (tree == NULL)
797     {
798       memset (&expld.result, 0, sizeof (expld.result));
799       return;
800     }
801
802   switch (tree->type.node_class)
803     {
804     case etree_value:
805       if (expld.section == bfd_abs_section_ptr
806           && !config.sane_expr)
807         new_abs (tree->value.value);
808       else
809         new_number (tree->value.value);
810       expld.result.str = tree->value.str;
811       break;
812
813     case etree_rel:
814       if (expld.phase != lang_first_phase_enum)
815         {
816           asection *output_section = tree->rel.section->output_section;
817           new_rel (tree->rel.value + tree->rel.section->output_offset,
818                    output_section);
819         }
820       else
821         memset (&expld.result, 0, sizeof (expld.result));
822       break;
823
824     case etree_assert:
825       exp_fold_tree_1 (tree->assert_s.child);
826       if (expld.phase == lang_final_phase_enum && !expld.result.value)
827         einfo ("%X%P: %s\n", tree->assert_s.message);
828       break;
829
830     case etree_unary:
831       fold_unary (tree);
832       break;
833
834     case etree_binary:
835       fold_binary (tree);
836       break;
837
838     case etree_trinary:
839       fold_trinary (tree);
840       break;
841
842     case etree_assign:
843     case etree_provide:
844     case etree_provided:
845       if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
846         {
847           if (tree->type.node_class != etree_assign)
848             einfo (_("%F%S can not PROVIDE assignment to"
849                      " location counter\n"), tree);
850           if (expld.phase != lang_first_phase_enum)
851             {
852               /* Notify the folder that this is an assignment to dot.  */
853               expld.assigning_to_dot = TRUE;
854               exp_fold_tree_1 (tree->assign.src);
855               expld.assigning_to_dot = FALSE;
856
857               if (!expld.result.valid_p)
858                 {
859                   if (expld.phase != lang_mark_phase_enum)
860                     einfo (_("%F%S invalid assignment to"
861                              " location counter\n"), tree);
862                 }
863               else if (expld.dotp == NULL)
864                 einfo (_("%F%S assignment to location counter"
865                          " invalid outside of SECTIONS\n"), tree);
866
867               /* After allocation, assignment to dot should not be
868                  done inside an output section since allocation adds a
869                  padding statement that effectively duplicates the
870                  assignment.  */
871               else if (expld.phase <= lang_allocating_phase_enum
872                        || expld.section == bfd_abs_section_ptr)
873                 {
874                   bfd_vma nextdot;
875
876                   nextdot = expld.result.value;
877                   if (expld.result.section != NULL)
878                     nextdot += expld.result.section->vma;
879                   else
880                     nextdot += expld.section->vma;
881                   if (nextdot < expld.dot
882                       && expld.section != bfd_abs_section_ptr)
883                     einfo (_("%F%S cannot move location counter backwards"
884                              " (from %V to %V)\n"),
885                            tree, expld.dot, nextdot);
886                   else
887                     {
888                       expld.dot = nextdot;
889                       *expld.dotp = nextdot;
890                     }
891                 }
892             }
893           else
894             memset (&expld.result, 0, sizeof (expld.result));
895         }
896       else
897         {
898           struct bfd_link_hash_entry *h = NULL;
899
900           if (tree->type.node_class == etree_provide)
901             {
902               h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
903                                         FALSE, FALSE, TRUE);
904               if (h == NULL
905                   || (h->type != bfd_link_hash_new
906                       && h->type != bfd_link_hash_undefined
907                       && h->type != bfd_link_hash_common))
908                 {
909                   /* Do nothing.  The symbol was never referenced, or was
910                      defined by some object.  */
911                   break;
912                 }
913             }
914
915           expld.assign_name = tree->assign.dst;
916           exp_fold_tree_1 (tree->assign.src);
917           /* expld.assign_name remaining equal to tree->assign.dst
918              below indicates the evaluation of tree->assign.src did
919              not use the value of tree->assign.dst.  We don't allow
920              self assignment until the final phase for two reasons:
921              1) Expressions are evaluated multiple times.  With
922              relaxation, the number of times may vary.
923              2) Section relative symbol values cannot be correctly
924              converted to absolute values, as is required by many
925              expressions, until final section sizing is complete.  */
926           if ((expld.result.valid_p
927                && (expld.phase == lang_final_phase_enum
928                    || expld.assign_name != NULL))
929               || (expld.phase <= lang_mark_phase_enum
930                   && tree->type.node_class == etree_assign
931                   && tree->assign.defsym))
932             {
933               if (h == NULL)
934                 {
935                   h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
936                                             TRUE, FALSE, TRUE);
937                   if (h == NULL)
938                     einfo (_("%P%F:%s: hash creation failed\n"),
939                            tree->assign.dst);
940                 }
941
942               /* FIXME: Should we worry if the symbol is already
943                  defined?  */
944               lang_update_definedness (tree->assign.dst, h);
945               h->type = bfd_link_hash_defined;
946               h->u.def.value = expld.result.value;
947               if (expld.result.section == NULL)
948                 expld.result.section = expld.section;
949               h->u.def.section = expld.result.section;
950               if (tree->type.node_class == etree_provide)
951                 tree->type.node_class = etree_provided;
952
953               /* Copy the symbol type if this is a simple assignment of
954                  one symbol to another.  This could be more general
955                  (e.g. a ?: operator with NAMEs in each branch).  */
956               if (tree->assign.src->type.node_class == etree_name)
957                 {
958                   struct bfd_link_hash_entry *hsrc;
959
960                   hsrc = bfd_link_hash_lookup (link_info.hash,
961                                                tree->assign.src->name.name,
962                                                FALSE, FALSE, TRUE);
963                   if (hsrc)
964                     bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
965                                                     hsrc);
966                 }
967             }
968           else if (expld.phase == lang_final_phase_enum)
969             {
970               h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
971                                         FALSE, FALSE, TRUE);
972               if (h != NULL
973                   && h->type == bfd_link_hash_new)
974                 h->type = bfd_link_hash_undefined;
975             }
976           expld.assign_name = NULL;
977         }
978       break;
979
980     case etree_name:
981       fold_name (tree);
982       break;
983
984     default:
985       FAIL ();
986       memset (&expld.result, 0, sizeof (expld.result));
987       break;
988     }
989 }
990
991 void
992 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
993 {
994   expld.dot = *dotp;
995   expld.dotp = dotp;
996   expld.section = current_section;
997   exp_fold_tree_1 (tree);
998 }
999
1000 void
1001 exp_fold_tree_no_dot (etree_type *tree)
1002 {
1003   expld.dot = 0;
1004   expld.dotp = NULL;
1005   expld.section = bfd_abs_section_ptr;
1006   exp_fold_tree_1 (tree);
1007 }
1008
1009 etree_type *
1010 exp_binop (int code, etree_type *lhs, etree_type *rhs)
1011 {
1012   etree_type value, *new_e;
1013
1014   value.type.node_code = code;
1015   value.type.filename = lhs->type.filename;
1016   value.type.lineno = lhs->type.lineno;
1017   value.binary.lhs = lhs;
1018   value.binary.rhs = rhs;
1019   value.type.node_class = etree_binary;
1020   exp_fold_tree_no_dot (&value);
1021   if (expld.result.valid_p)
1022     return exp_intop (expld.result.value);
1023
1024   new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
1025   memcpy (new_e, &value, sizeof (new_e->binary));
1026   return new_e;
1027 }
1028
1029 etree_type *
1030 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
1031 {
1032   etree_type value, *new_e;
1033
1034   value.type.node_code = code;
1035   value.type.filename = cond->type.filename;
1036   value.type.lineno = cond->type.lineno;
1037   value.trinary.lhs = lhs;
1038   value.trinary.cond = cond;
1039   value.trinary.rhs = rhs;
1040   value.type.node_class = etree_trinary;
1041   exp_fold_tree_no_dot (&value);
1042   if (expld.result.valid_p)
1043     return exp_intop (expld.result.value);
1044
1045   new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
1046   memcpy (new_e, &value, sizeof (new_e->trinary));
1047   return new_e;
1048 }
1049
1050 etree_type *
1051 exp_unop (int code, etree_type *child)
1052 {
1053   etree_type value, *new_e;
1054
1055   value.unary.type.node_code = code;
1056   value.unary.type.filename = child->type.filename;
1057   value.unary.type.lineno = child->type.lineno;
1058   value.unary.child = child;
1059   value.unary.type.node_class = etree_unary;
1060   exp_fold_tree_no_dot (&value);
1061   if (expld.result.valid_p)
1062     return exp_intop (expld.result.value);
1063
1064   new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
1065   memcpy (new_e, &value, sizeof (new_e->unary));
1066   return new_e;
1067 }
1068
1069 etree_type *
1070 exp_nameop (int code, const char *name)
1071 {
1072   etree_type value, *new_e;
1073
1074   value.name.type.node_code = code;
1075   value.name.type.filename = ldlex_filename ();
1076   value.name.type.lineno = lineno;
1077   value.name.name = name;
1078   value.name.type.node_class = etree_name;
1079
1080   exp_fold_tree_no_dot (&value);
1081   if (expld.result.valid_p)
1082     return exp_intop (expld.result.value);
1083
1084   new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
1085   memcpy (new_e, &value, sizeof (new_e->name));
1086   return new_e;
1087
1088 }
1089
1090 static etree_type *
1091 exp_assop (const char *dst,
1092            etree_type *src,
1093            enum node_tree_enum class,
1094            bfd_boolean defsym,
1095            bfd_boolean hidden)
1096 {
1097   etree_type *n;
1098
1099   n = (etree_type *) stat_alloc (sizeof (n->assign));
1100   n->assign.type.node_code = '=';
1101   n->assign.type.filename = src->type.filename;
1102   n->assign.type.lineno = src->type.lineno;
1103   n->assign.type.node_class = class;
1104   n->assign.src = src;
1105   n->assign.dst = dst;
1106   n->assign.defsym = defsym;
1107   n->assign.hidden = hidden;
1108   return n;
1109 }
1110
1111 /* Handle linker script assignments and HIDDEN.  */
1112
1113 etree_type *
1114 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
1115 {
1116   return exp_assop (dst, src, etree_assign, FALSE, hidden);
1117 }
1118
1119 /* Handle --defsym command-line option.  */
1120
1121 etree_type *
1122 exp_defsym (const char *dst, etree_type *src)
1123 {
1124   return exp_assop (dst, src, etree_assign, TRUE, FALSE);
1125 }
1126
1127 /* Handle PROVIDE.  */
1128
1129 etree_type *
1130 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
1131 {
1132   return exp_assop (dst, src, etree_provide, FALSE, hidden);
1133 }
1134
1135 /* Handle ASSERT.  */
1136
1137 etree_type *
1138 exp_assert (etree_type *exp, const char *message)
1139 {
1140   etree_type *n;
1141
1142   n = (etree_type *) stat_alloc (sizeof (n->assert_s));
1143   n->assert_s.type.node_code = '!';
1144   n->assert_s.type.filename = exp->type.filename;
1145   n->assert_s.type.lineno = exp->type.lineno;
1146   n->assert_s.type.node_class = etree_assert;
1147   n->assert_s.child = exp;
1148   n->assert_s.message = message;
1149   return n;
1150 }
1151
1152 void
1153 exp_print_tree (etree_type *tree)
1154 {
1155   bfd_boolean function_like;
1156
1157   if (config.map_file == NULL)
1158     config.map_file = stderr;
1159
1160   if (tree == NULL)
1161     {
1162       minfo ("NULL TREE\n");
1163       return;
1164     }
1165
1166   switch (tree->type.node_class)
1167     {
1168     case etree_value:
1169       minfo ("0x%v", tree->value.value);
1170       return;
1171     case etree_rel:
1172       if (tree->rel.section->owner != NULL)
1173         minfo ("%B:", tree->rel.section->owner);
1174       minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);
1175       return;
1176     case etree_assign:
1177       fputs (tree->assign.dst, config.map_file);
1178       exp_print_token (tree->type.node_code, TRUE);
1179       exp_print_tree (tree->assign.src);
1180       break;
1181     case etree_provide:
1182     case etree_provided:
1183       fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);
1184       exp_print_tree (tree->assign.src);
1185       fputc (')', config.map_file);
1186       break;
1187     case etree_binary:
1188       function_like = FALSE;
1189       switch (tree->type.node_code)
1190         {
1191         case MAX_K:
1192         case MIN_K:
1193         case ALIGN_K:
1194         case DATA_SEGMENT_ALIGN:
1195         case DATA_SEGMENT_RELRO_END:
1196           function_like = TRUE;
1197           break;
1198         case SEGMENT_START:
1199           /* Special handling because arguments are in reverse order and
1200              the segment name is quoted.  */
1201           exp_print_token (tree->type.node_code, FALSE);
1202           fputs (" (\"", config.map_file);
1203           exp_print_tree (tree->binary.rhs);
1204           fputs ("\", ", config.map_file);
1205           exp_print_tree (tree->binary.lhs);
1206           fputc (')', config.map_file);
1207           return;
1208         }
1209       if (function_like)
1210         {
1211           exp_print_token (tree->type.node_code, FALSE);
1212           fputc (' ', config.map_file);
1213         }
1214       fputc ('(', config.map_file);
1215       exp_print_tree (tree->binary.lhs);
1216       if (function_like)
1217         fprintf (config.map_file, ", ");
1218       else
1219         exp_print_token (tree->type.node_code, TRUE);
1220       exp_print_tree (tree->binary.rhs);
1221       fputc (')', config.map_file);
1222       break;
1223     case etree_trinary:
1224       exp_print_tree (tree->trinary.cond);
1225       fputc ('?', config.map_file);
1226       exp_print_tree (tree->trinary.lhs);
1227       fputc (':', config.map_file);
1228       exp_print_tree (tree->trinary.rhs);
1229       break;
1230     case etree_unary:
1231       exp_print_token (tree->unary.type.node_code, FALSE);
1232       if (tree->unary.child)
1233         {
1234           fprintf (config.map_file, " (");
1235           exp_print_tree (tree->unary.child);
1236           fputc (')', config.map_file);
1237         }
1238       break;
1239
1240     case etree_assert:
1241       fprintf (config.map_file, "ASSERT (");
1242       exp_print_tree (tree->assert_s.child);
1243       fprintf (config.map_file, ", %s)", tree->assert_s.message);
1244       break;
1245
1246     case etree_name:
1247       if (tree->type.node_code == NAME)
1248         fputs (tree->name.name, config.map_file);
1249       else
1250         {
1251           exp_print_token (tree->type.node_code, FALSE);
1252           if (tree->name.name)
1253             fprintf (config.map_file, " (%s)", tree->name.name);
1254         }
1255       break;
1256     default:
1257       FAIL ();
1258       break;
1259     }
1260 }
1261
1262 bfd_vma
1263 exp_get_vma (etree_type *tree, bfd_vma def, char *name)
1264 {
1265   if (tree != NULL)
1266     {
1267       exp_fold_tree_no_dot (tree);
1268       if (expld.result.valid_p)
1269         return expld.result.value;
1270       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1271         einfo (_("%F%S: nonconstant expression for %s\n"),
1272                tree, name);
1273     }
1274   return def;
1275 }
1276
1277 int
1278 exp_get_value_int (etree_type *tree, int def, char *name)
1279 {
1280   return exp_get_vma (tree, def, name);
1281 }
1282
1283 fill_type *
1284 exp_get_fill (etree_type *tree, fill_type *def, char *name)
1285 {
1286   fill_type *fill;
1287   size_t len;
1288   unsigned int val;
1289
1290   if (tree == NULL)
1291     return def;
1292
1293   exp_fold_tree_no_dot (tree);
1294   if (!expld.result.valid_p)
1295     {
1296       if (name != NULL && expld.phase != lang_mark_phase_enum)
1297         einfo (_("%F%S: nonconstant expression for %s\n"),
1298                tree, name);
1299       return def;
1300     }
1301
1302   if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0)
1303     {
1304       unsigned char *dst;
1305       unsigned char *s;
1306       fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1);
1307       fill->size = (len + 1) / 2;
1308       dst = fill->data;
1309       s = (unsigned char *) expld.result.str;
1310       val = 0;
1311       do
1312         {
1313           unsigned int digit;
1314
1315           digit = *s++ - '0';
1316           if (digit > 9)
1317             digit = (digit - 'A' + '0' + 10) & 0xf;
1318           val <<= 4;
1319           val += digit;
1320           --len;
1321           if ((len & 1) == 0)
1322             {
1323               *dst++ = val;
1324               val = 0;
1325             }
1326         }
1327       while (len != 0);
1328     }
1329   else
1330     {
1331       fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1);
1332       val = expld.result.value;
1333       fill->data[0] = (val >> 24) & 0xff;
1334       fill->data[1] = (val >> 16) & 0xff;
1335       fill->data[2] = (val >>  8) & 0xff;
1336       fill->data[3] = (val >>  0) & 0xff;
1337       fill->size = 4;
1338     }
1339   return fill;
1340 }
1341
1342 bfd_vma
1343 exp_get_abs_int (etree_type *tree, int def, char *name)
1344 {
1345   if (tree != NULL)
1346     {
1347       exp_fold_tree_no_dot (tree);
1348
1349       if (expld.result.valid_p)
1350         {
1351           if (expld.result.section != NULL)
1352             expld.result.value += expld.result.section->vma;
1353           return expld.result.value;
1354         }
1355       else if (name != NULL && expld.phase != lang_mark_phase_enum)
1356         {
1357           einfo (_("%F%S: nonconstant expression for %s\n"),
1358                  tree, name);
1359         }
1360     }
1361   return def;
1362 }
1363
1364 static bfd_vma
1365 align_n (bfd_vma value, bfd_vma align)
1366 {
1367   if (align <= 1)
1368     return value;
1369
1370   value = (value + align - 1) / align;
1371   return value * align;
1372 }