* ldlang.c (size_input_section): count the sizes of all sections
[deliverable/binutils-gdb.git] / ld / ldlang.c
1 /* Copyright (C) 1991 Free Software Foundation, Inc.
2
3 This file is part of GLD, the Gnu Linker.
4
5 GLD is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 1, or (at your option)
8 any later version.
9
10 GLD is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GLD; see the file COPYING. If not, write to
17 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
18
19 #include "bfd.h"
20 #include "sysdep.h"
21
22 #include "ld.h"
23 #include "ldmain.h"
24 #include "ldsym.h"
25 #include "ldgram.h"
26 #include "ldwarn.h"
27 #include "ldlang.h"
28 #include "ldexp.h"
29 #include "ldemul.h"
30 #include "ldlex.h"
31 #include "ldmisc.h"
32 #include "ldindr.h"
33 #include "ldctor.h"
34 /* FORWARDS */
35 PROTO (static void, print_statements, (void));
36 PROTO (static void, print_statement, (lang_statement_union_type *,
37 lang_output_section_statement_type *));
38
39 /* LOCALS */
40 static struct obstack stat_obstack;
41
42 #define obstack_chunk_alloc ldmalloc
43 #define obstack_chunk_free free
44 static CONST char *startup_file;
45 static lang_statement_list_type input_file_chain;
46
47 /* Points to the last statement in the .data section, so we can add
48 stuff to the data section without pain */
49 static lang_statement_list_type end_of_data_section_statement_list;
50
51 /* List of statements needed to handle constructors */
52 extern lang_statement_list_type constructor_list;
53
54 static boolean placed_commons = false;
55 static lang_output_section_statement_type *default_common_section;
56 static boolean map_option_f;
57 static bfd_vma print_dot;
58 static lang_input_statement_type *first_file;
59 static lang_statement_list_type lang_output_section_statement;
60 static CONST char *current_target;
61 static CONST char *output_target;
62 static size_t longest_section_name = 8;
63 static asection common_section;
64 static section_userdata_type common_section_userdata;
65 static lang_statement_list_type statement_list;
66
67 /* EXPORTS */
68 boolean relaxing;
69 lang_output_section_statement_type *abs_output_section;
70 lang_statement_list_type *stat_ptr = &statement_list;
71 lang_input_statement_type *script_file = 0;
72 boolean option_longmap = false;
73 lang_statement_list_type file_chain =
74 {0};
75 CONST char *entry_symbol = 0;
76 bfd_size_type largest_section = 0;
77 boolean lang_has_input_file = false;
78 lang_output_section_statement_type *create_object_symbols = 0;
79 boolean had_output_filename = false;
80 boolean lang_float_flag = false;
81
82 /* IMPORTS */
83 extern char *default_target;
84
85 extern unsigned int undefined_global_sym_count;
86 extern char *current_file;
87 extern bfd *output_bfd;
88 extern enum bfd_architecture ldfile_output_architecture;
89 extern unsigned long ldfile_output_machine;
90 extern char *ldfile_output_machine_name;
91 extern ldsym_type *symbol_head;
92 extern unsigned int commons_pending;
93 extern args_type command_line;
94 extern ld_config_type config;
95 extern boolean had_script;
96 extern boolean write_map;
97
98 #ifdef __STDC__
99 #define cat(a,b) a##b
100 #else
101 #define cat(a,b) a/**/b
102 #endif
103
104 #define new_stat(x,y) (cat(x,_type)*) new_statement(cat(x,_enum), sizeof(cat(x,_type)),y)
105
106 #define outside_section_address(q) ( (q)->output_offset + (q)->output_section->vma)
107
108 #define outside_symbol_address(q) ((q)->value + outside_section_address(q->section))
109
110 void EXFUN (lang_add_data, (int type, union etree_union * exp));
111
112 PTR
113 DEFUN (stat_alloc, (size),
114 size_t size)
115 {
116 return obstack_alloc (&stat_obstack, size);
117 }
118 static void
119 DEFUN (print_size, (value),
120 size_t value)
121 {
122 fprintf (config.map_file, "%5x", (unsigned) value);
123 }
124 static void
125 DEFUN (print_alignment, (value),
126 unsigned int value)
127 {
128 fprintf (config.map_file, "2**%1u", value);
129 }
130 static void
131 DEFUN (print_fill, (value),
132 fill_type value)
133 {
134 fprintf (config.map_file, "%04x", (unsigned) value);
135 }
136
137
138 static void
139 DEFUN (print_section, (name),
140 CONST char *CONST name)
141 {
142 fprintf (config.map_file, "%*s", -longest_section_name, name);
143 }
144
145 /*----------------------------------------------------------------------
146 lang_for_each_statement walks the parse tree and calls the provided
147 function for each node
148 */
149
150 static void
151 DEFUN (lang_for_each_statement_worker, (func, s),
152 void (*func) ()AND
153 lang_statement_union_type * s)
154 {
155 for (; s != (lang_statement_union_type *) NULL; s = s->next)
156 {
157 func (s);
158
159 switch (s->header.type)
160 {
161 case lang_constructors_statement_enum:
162 lang_for_each_statement_worker (func, constructor_list.head);
163 break;
164 case lang_output_section_statement_enum:
165 lang_for_each_statement_worker
166 (func,
167 s->output_section_statement.children.head);
168 break;
169 case lang_wild_statement_enum:
170 lang_for_each_statement_worker
171 (func,
172 s->wild_statement.children.head);
173 break;
174 case lang_data_statement_enum:
175 case lang_object_symbols_statement_enum:
176 case lang_output_statement_enum:
177 case lang_target_statement_enum:
178 case lang_input_section_enum:
179 case lang_input_statement_enum:
180 case lang_assignment_statement_enum:
181 case lang_padding_statement_enum:
182 case lang_address_statement_enum:
183 break;
184 default:
185 FAIL ();
186 break;
187 }
188 }
189 }
190
191 void
192 DEFUN (lang_for_each_statement, (func),
193 void (*func) ())
194 {
195 lang_for_each_statement_worker (func,
196 statement_list.head);
197 }
198
199 /*----------------------------------------------------------------------*/
200 void
201 DEFUN (lang_list_init, (list),
202 lang_statement_list_type * list)
203 {
204 list->head = (lang_statement_union_type *) NULL;
205 list->tail = &list->head;
206 }
207
208 /*----------------------------------------------------------------------
209
210 build a new statement node for the parse tree
211
212 */
213
214 static
215 lang_statement_union_type *
216 DEFUN (new_statement, (type, size, list),
217 enum statement_enum type AND
218 bfd_size_type size AND
219 lang_statement_list_type * list)
220 {
221 lang_statement_union_type *new = (lang_statement_union_type *)
222 stat_alloc (size);
223
224 new->header.type = type;
225 new->header.next = (lang_statement_union_type *) NULL;
226 lang_statement_append (list, new, &new->header.next);
227 return new;
228 }
229
230 /*
231 Build a new input file node for the language. There are several ways
232 in which we treat an input file, eg, we only look at symbols, or
233 prefix it with a -l etc.
234
235 We can be supplied with requests for input files more than once;
236 they may, for example be split over serveral lines like foo.o(.text)
237 foo.o(.data) etc, so when asked for a file we check that we havn't
238 got it already so we don't duplicate the bfd.
239
240 */
241 static lang_input_statement_type *
242 DEFUN (new_afile, (name, file_type, target),
243 CONST char *CONST name AND
244 CONST lang_input_file_enum_type file_type AND
245 CONST char *CONST target)
246 {
247
248 lang_input_statement_type *p = new_stat (lang_input_statement,
249 stat_ptr);
250
251 lang_has_input_file = true;
252 p->target = target;
253 p->complained = false;
254 switch (file_type)
255 {
256 case lang_input_file_is_symbols_only_enum:
257 p->filename = name;
258 p->is_archive = false;
259 p->real = true;
260 p->local_sym_name = name;
261 p->just_syms_flag = true;
262 p->search_dirs_flag = false;
263 break;
264 case lang_input_file_is_fake_enum:
265 p->filename = name;
266 p->is_archive = false;
267 p->real = false;
268 p->local_sym_name = name;
269 p->just_syms_flag = false;
270 p->search_dirs_flag = false;
271 break;
272 case lang_input_file_is_l_enum:
273 p->is_archive = true;
274 p->filename = name;
275 p->real = true;
276 p->local_sym_name = concat ("-l", name, "");
277 p->just_syms_flag = false;
278 p->search_dirs_flag = true;
279 break;
280 case lang_input_file_is_search_file_enum:
281 case lang_input_file_is_marker_enum:
282 p->filename = name;
283 p->is_archive = false;
284 p->real = true;
285 p->local_sym_name = name;
286 p->just_syms_flag = false;
287 p->search_dirs_flag = true;
288 break;
289 case lang_input_file_is_file_enum:
290 p->filename = name;
291 p->is_archive = false;
292 p->real = true;
293 p->local_sym_name = name;
294 p->just_syms_flag = false;
295 p->search_dirs_flag = false;
296 break;
297 default:
298 FAIL ();
299 }
300 p->asymbols = (asymbol **) NULL;
301 p->superfile = (lang_input_statement_type *) NULL;
302 p->next_real_file = (lang_statement_union_type *) NULL;
303 p->next = (lang_statement_union_type *) NULL;
304 p->symbol_count = 0;
305 p->common_output_section = (asection *) NULL;
306 lang_statement_append (&input_file_chain,
307 (lang_statement_union_type *) p,
308 &p->next_real_file);
309 return p;
310 }
311
312 lang_input_statement_type *
313 DEFUN (lang_add_input_file, (name, file_type, target),
314 CONST char *name AND
315 lang_input_file_enum_type file_type AND
316 CONST char *target)
317 {
318 /* Look it up or build a new one */
319 lang_has_input_file = true;
320 #if 0
321 lang_input_statement_type *p;
322
323 for (p = (lang_input_statement_type *) input_file_chain.head;
324 p != (lang_input_statement_type *) NULL;
325 p = (lang_input_statement_type *) (p->next_real_file))
326 {
327 /* Sometimes we have incomplete entries in here */
328 if (p->filename != (char *) NULL)
329 {
330 if (strcmp (name, p->filename) == 0)
331 return p;
332 }
333
334 }
335 #endif
336 return new_afile (name, file_type, target);
337 }
338
339 void
340 DEFUN (lang_add_keepsyms_file, (filename),
341 CONST char *filename)
342 {
343 extern strip_symbols_type strip_symbols;
344 if (keepsyms_file != 0)
345 info ("%X%P error: duplicated keep-symbols-file value\n");
346 keepsyms_file = filename;
347 if (strip_symbols != STRIP_NONE)
348 info ("%P `-keep-only-symbols-file' overrides `-s' and `-S'\n");
349 strip_symbols = STRIP_SOME;
350 }
351
352 /* Build enough state so that the parser can build its tree */
353 void
354 DEFUN_VOID (lang_init)
355 {
356 obstack_begin (&stat_obstack, 1000);
357
358 stat_ptr = &statement_list;
359
360 lang_list_init (stat_ptr);
361
362 lang_list_init (&input_file_chain);
363 lang_list_init (&lang_output_section_statement);
364 lang_list_init (&file_chain);
365 first_file = lang_add_input_file ((char *) NULL,
366 lang_input_file_is_marker_enum,
367 (char *) NULL);
368 abs_output_section = lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME);
369
370 abs_output_section->bfd_section = &bfd_abs_section;
371
372 }
373
374 /*----------------------------------------------------------------------
375 A region is an area of memory declared with the
376 MEMORY { name:org=exp, len=exp ... }
377 syntax.
378
379 We maintain a list of all the regions here
380
381 If no regions are specified in the script, then the default is used
382 which is created when looked up to be the entire data space
383 */
384
385 static lang_memory_region_type *lang_memory_region_list;
386 static lang_memory_region_type **lang_memory_region_list_tail = &lang_memory_region_list;
387
388 lang_memory_region_type *
389 DEFUN (lang_memory_region_lookup, (name),
390 CONST char *CONST name)
391 {
392
393 lang_memory_region_type *p = lang_memory_region_list;
394
395 for (p = lang_memory_region_list;
396 p != (lang_memory_region_type *) NULL;
397 p = p->next)
398 {
399 if (strcmp (p->name, name) == 0)
400 {
401 return p;
402 }
403 }
404 if (strcmp (name, "*default*") == 0)
405 {
406 /* This is the default region, dig out first one on the list */
407 if (lang_memory_region_list != (lang_memory_region_type *) NULL)
408 {
409 return lang_memory_region_list;
410 }
411 }
412 {
413 lang_memory_region_type *new =
414 (lang_memory_region_type *) stat_alloc ((bfd_size_type) (sizeof (lang_memory_region_type)));
415
416 new->name = buystring (name);
417 new->next = (lang_memory_region_type *) NULL;
418
419 *lang_memory_region_list_tail = new;
420 lang_memory_region_list_tail = &new->next;
421 new->origin = 0;
422 new->length = ~0;
423 new->current = 0;
424 new->had_full_message = false;
425
426 return new;
427 }
428 }
429
430
431 lang_output_section_statement_type *
432 DEFUN (lang_output_section_find, (name),
433 CONST char *CONST name)
434 {
435 lang_statement_union_type *u;
436 lang_output_section_statement_type *lookup;
437
438 for (u = lang_output_section_statement.head;
439 u != (lang_statement_union_type *) NULL;
440 u = lookup->next)
441 {
442 lookup = &u->output_section_statement;
443 if (strcmp (name, lookup->name) == 0)
444 {
445 return lookup;
446 }
447 }
448 return (lang_output_section_statement_type *) NULL;
449 }
450
451 lang_output_section_statement_type *
452 DEFUN (lang_output_section_statement_lookup, (name),
453 CONST char *CONST name)
454 {
455 lang_output_section_statement_type *lookup;
456
457 lookup = lang_output_section_find (name);
458 if (lookup == (lang_output_section_statement_type *) NULL)
459 {
460
461 lookup = (lang_output_section_statement_type *)
462 new_stat (lang_output_section_statement, stat_ptr);
463 lookup->region = (lang_memory_region_type *) NULL;
464 lookup->fill = 0;
465 lookup->block_value = 1;
466 lookup->name = name;
467
468 lookup->next = (lang_statement_union_type *) NULL;
469 lookup->bfd_section = (asection *) NULL;
470 lookup->processed = false;
471 lookup->loadable = 1;
472 lookup->addr_tree = (etree_type *) NULL;
473 lang_list_init (&lookup->children);
474
475 lang_statement_append (&lang_output_section_statement,
476 (lang_statement_union_type *) lookup,
477 &lookup->next);
478 }
479 return lookup;
480 }
481
482 /*ARGSUSED*/
483 static void
484 DEFUN (print_flags, (ignore_flags),
485 int *ignore_flags)
486 {
487 fprintf (config.map_file, "(");
488 #if 0
489 if (flags->flag_read)
490 fprintf (outfile, "R");
491 if (flags->flag_write)
492 fprintf (outfile, "W");
493 if (flags->flag_executable)
494 fprintf (outfile, "X");
495 if (flags->flag_loadable)
496 fprintf (outfile, "L");
497 #endif
498 fprintf (config.map_file, ")");
499 }
500
501 void
502 DEFUN_VOID (lang_map)
503 {
504 lang_memory_region_type *m;
505
506 fprintf (config.map_file, "**MEMORY CONFIGURATION**\n\n");
507 #ifdef HOST_64_BIT
508 fprintf (config.map_file, "name\t\torigin\t\tlength\t\tattributes\n");
509 #else
510 fprintf (config.map_file,
511 "name\t\torigin length r_size c_size is attributes\n");
512
513 #endif
514 for (m = lang_memory_region_list;
515 m != (lang_memory_region_type *) NULL;
516 m = m->next)
517 {
518 fprintf (config.map_file, "%-16s", m->name);
519 print_address (m->origin);
520 print_space ();
521 print_address (m->length);
522 print_space ();
523 print_address (m->old_length);
524 print_space();
525 print_address (m->current - m->origin);
526 print_space();
527 if (m->old_length)
528 fprintf(config.map_file," %2d%% ", ( m->current - m->origin) * 100 / m->old_length);
529 print_flags (&m->flags);
530 fprintf (config.map_file, "\n");
531 }
532 fprintf (config.map_file, "\n\n**LINK EDITOR MEMORY MAP**\n\n");
533 fprintf (config.map_file, "output input virtual\n");
534 fprintf (config.map_file, "section section address tsize\n\n");
535
536 print_statements ();
537
538 }
539
540 /*
541 *
542 */
543 static void
544 DEFUN (init_os, (s),
545 lang_output_section_statement_type * s)
546 {
547 /* asection *section = bfd_get_section_by_name(output_bfd, s->name);*/
548 section_userdata_type *new =
549 (section_userdata_type *)
550 stat_alloc ((bfd_size_type) (sizeof (section_userdata_type)));
551
552 s->bfd_section = bfd_get_section_by_name (output_bfd, s->name);
553 if (s->bfd_section == (asection *) NULL)
554 s->bfd_section = bfd_make_section (output_bfd, s->name);
555 if (s->bfd_section == (asection *) NULL)
556 {
557 einfo ("%P%F output format %s cannot represent section called %s\n",
558 output_bfd->xvec->name, s->name);
559 }
560 s->bfd_section->output_section = s->bfd_section;
561 /* s->bfd_section->flags = s->flags;*/
562
563 /* We initialize an output sections output offset to minus its own */
564 /* vma to allow us to output a section through itself */
565 s->bfd_section->output_offset = 0;
566 get_userdata (s->bfd_section) = (PTR) new;
567
568 }
569
570 /***********************************************************************
571 The wild routines.
572
573 These expand statements like *(.text) and foo.o to a list of
574 explicit actions, like foo.o(.text), bar.o(.text) and
575 foo.o(.text,.data) .
576
577 The toplevel routine, wild, takes a statement, section, file and
578 target. If either the section or file is null it is taken to be the
579 wildcard. Seperate lang_input_section statements are created for
580 each part of the expanstion, and placed after the statement provided.
581
582 */
583
584 static void
585 DEFUN (wild_doit, (ptr, section, output, file),
586 lang_statement_list_type * ptr AND
587 asection * section AND
588 lang_output_section_statement_type * output AND
589 lang_input_statement_type * file)
590 {
591 if (output->bfd_section == (asection *) NULL)
592 {
593 init_os (output);
594 }
595
596 if (section != (asection *) NULL
597 && section->output_section == (asection *) NULL)
598 {
599 /* Add a section reference to the list */
600 lang_input_section_type *new = new_stat (lang_input_section, ptr);
601
602 new->section = section;
603 new->ifile = file;
604 section->output_section = output->bfd_section;
605 section->output_section->flags |= section->flags;
606 if (!output->loadable)
607 {
608 /* Turn of load flag */
609 output->bfd_section->flags &= ~SEC_LOAD;
610 }
611 if (section->alignment_power > output->bfd_section->alignment_power)
612 {
613 output->bfd_section->alignment_power = section->alignment_power;
614 }
615 }
616 }
617
618 static asection *
619 DEFUN (our_bfd_get_section_by_name, (abfd, section),
620 bfd * abfd AND
621 CONST char *section)
622 {
623 return bfd_get_section_by_name (abfd, section);
624 }
625
626 static void
627 DEFUN (wild_section, (ptr, section, file, output),
628 lang_wild_statement_type * ptr AND
629 CONST char *section AND
630 lang_input_statement_type * file AND
631 lang_output_section_statement_type * output)
632 {
633 asection *s;
634
635 if (file->just_syms_flag == false)
636 {
637 if (section == (char *) NULL)
638 {
639 /* Do the creation to all sections in the file */
640 for (s = file->the_bfd->sections; s != (asection *) NULL; s = s->next)
641 {
642 wild_doit (&ptr->children, s, output, file);
643 }
644 }
645 else
646 {
647 /* Do the creation to the named section only */
648 wild_doit (&ptr->children,
649 our_bfd_get_section_by_name (file->the_bfd, section),
650 output, file);
651 }
652 }
653 }
654
655 /* passed a file name (which must have been seen already and added to
656 the statement tree. We will see if it has been opened already and
657 had its symbols read. If not then we'll read it.
658
659 Archives are pecuilar here. We may open them once, but if they do
660 not define anything we need at the time, they won't have all their
661 symbols read. If we need them later, we'll have to redo it.
662 */
663 static
664 lang_input_statement_type *
665 DEFUN (lookup_name, (name),
666 CONST char *CONST name)
667 {
668 lang_input_statement_type *search;
669
670 for (search = (lang_input_statement_type *) input_file_chain.head;
671 search != (lang_input_statement_type *) NULL;
672 search = (lang_input_statement_type *) search->next_real_file)
673 {
674 if (search->filename == (char *) NULL && name == (char *) NULL)
675 {
676 return search;
677 }
678 if (search->filename != (char *) NULL && name != (char *) NULL)
679 {
680 if (strcmp (search->filename, name) == 0)
681 {
682 ldmain_open_file_read_symbol (search);
683 return search;
684 }
685 }
686 }
687
688 /* There isn't an afile entry for this file yet, this must be
689 because the name has only appeared inside a load script and not
690 on the command line */
691 search = new_afile (name, lang_input_file_is_file_enum, default_target);
692 ldmain_open_file_read_symbol (search);
693 return search;
694
695
696 }
697
698 static void
699 DEFUN (wild, (s, section, file, target, output),
700 lang_wild_statement_type * s AND
701 CONST char *CONST section AND
702 CONST char *CONST file AND
703 CONST char *CONST target AND
704 lang_output_section_statement_type * output)
705 {
706 lang_input_statement_type *f;
707
708 if (file == (char *) NULL)
709 {
710 /* Perform the iteration over all files in the list */
711 for (f = (lang_input_statement_type *) file_chain.head;
712 f != (lang_input_statement_type *) NULL;
713 f = (lang_input_statement_type *) f->next)
714 {
715 wild_section (s, section, f, output);
716 }
717 }
718 else
719 {
720 /* Perform the iteration over a single file */
721 wild_section (s, section, lookup_name (file), output);
722 }
723 if (section != (char *) NULL
724 && strcmp (section, "COMMON") == 0
725 && default_common_section == (lang_output_section_statement_type *) NULL)
726 {
727 /* Remember the section that common is going to incase we later
728 get something which doesn't know where to put it */
729 default_common_section = output;
730 }
731 }
732
733 /*
734 read in all the files
735 */
736 static bfd *
737 DEFUN (open_output, (name),
738 CONST char *CONST name)
739 {
740 extern unsigned long ldfile_output_machine;
741 extern enum bfd_architecture ldfile_output_architecture;
742
743 extern CONST char *output_filename;
744 bfd *output;
745
746 if (output_target == (char *) NULL)
747 {
748 if (current_target != (char *) NULL)
749 output_target = current_target;
750 else
751 output_target = default_target;
752 }
753 output = bfd_openw (name, output_target);
754 output_filename = name;
755
756 if (output == (bfd *) NULL)
757 {
758 if (bfd_error == invalid_target)
759 {
760 einfo ("%P%F target %s not found\n", output_target);
761 }
762 einfo ("%P%F problem opening output file %s, %E", name);
763 }
764
765 /* output->flags |= D_PAGED;*/
766
767 bfd_set_format (output, bfd_object);
768 bfd_set_arch_mach (output,
769 ldfile_output_architecture,
770 ldfile_output_machine);
771 return output;
772 }
773
774
775
776
777 static void
778 DEFUN (ldlang_open_output, (statement),
779 lang_statement_union_type * statement)
780 {
781 switch (statement->header.type)
782 {
783 case lang_output_statement_enum:
784 output_bfd = open_output (statement->output_statement.name);
785 ldemul_set_output_arch ();
786 if (config.magic_demand_paged && !config.relocateable_output)
787 output_bfd->flags |= D_PAGED;
788 else
789 output_bfd->flags &= ~D_PAGED;
790 if (config.text_read_only)
791 output_bfd->flags |= WP_TEXT;
792 else
793 output_bfd->flags &= ~WP_TEXT;
794 break;
795
796 case lang_target_statement_enum:
797 current_target = statement->target_statement.target;
798 break;
799 default:
800 break;
801 }
802 }
803
804 static void
805 DEFUN (open_input_bfds, (statement),
806 lang_statement_union_type * statement)
807 {
808 switch (statement->header.type)
809 {
810 case lang_target_statement_enum:
811 current_target = statement->target_statement.target;
812 break;
813 case lang_wild_statement_enum:
814 /* Maybe we should load the file's symbols */
815 if (statement->wild_statement.filename)
816 {
817 (void) lookup_name (statement->wild_statement.filename);
818 }
819 break;
820 case lang_input_statement_enum:
821 if (statement->input_statement.real == true)
822 {
823 statement->input_statement.target = current_target;
824 lookup_name (statement->input_statement.filename);
825 }
826 break;
827 default:
828 break;
829 }
830 }
831
832 /* If there are [COMMONS] statements, put a wild one into the bss section */
833
834 static void
835 lang_reasonable_defaults ()
836 {
837
838
839
840 #if 0
841 lang_output_section_statement_lookup (".text");
842 lang_output_section_statement_lookup (".data");
843
844 default_common_section =
845 lang_output_section_statement_lookup (".bss");
846
847
848 if (placed_commons == false)
849 {
850 lang_wild_statement_type *new =
851 new_stat (lang_wild_statement,
852 &default_common_section->children);
853
854 new->section_name = "COMMON";
855 new->filename = (char *) NULL;
856 lang_list_init (&new->children);
857 }
858 #endif
859
860 }
861
862 /*
863 Add the supplied name to the symbol table as an undefined reference.
864 Remove items from the chain as we open input bfds
865 */
866 typedef struct ldlang_undef_chain_list
867 {
868 struct ldlang_undef_chain_list *next;
869 char *name;
870 } ldlang_undef_chain_list_type;
871
872 static ldlang_undef_chain_list_type *ldlang_undef_chain_list_head;
873
874 void
875 DEFUN (ldlang_add_undef, (name),
876 CONST char *CONST name)
877 {
878 ldlang_undef_chain_list_type *new =
879 (ldlang_undef_chain_list_type
880 *) stat_alloc ((bfd_size_type) (sizeof (ldlang_undef_chain_list_type)));
881
882 new->next = ldlang_undef_chain_list_head;
883 ldlang_undef_chain_list_head = new;
884
885 new->name = buystring (name);
886 }
887
888 /* Run through the list of undefineds created above and place them
889 into the linker hash table as undefined symbols belonging to the
890 script file.
891 */
892 static void
893 DEFUN_VOID (lang_place_undefineds)
894 {
895 ldlang_undef_chain_list_type *ptr = ldlang_undef_chain_list_head;
896
897 while (ptr != (ldlang_undef_chain_list_type *) NULL)
898 {
899 asymbol *def;
900 asymbol **def_ptr = (asymbol **) stat_alloc ((bfd_size_type) (sizeof (asymbol **)));
901
902 def = (asymbol *) bfd_make_empty_symbol (script_file->the_bfd);
903 *def_ptr = def;
904 def->name = ptr->name;
905 def->section = &bfd_und_section;
906 Q_enter_global_ref (def_ptr, ptr->name);
907 ptr = ptr->next;
908 }
909 }
910
911 /* Copy important data from out internal form to the bfd way. Also
912 create a section for the dummy file
913 */
914
915 static void
916 DEFUN_VOID (lang_create_output_section_statements)
917 {
918 lang_statement_union_type *os;
919
920 for (os = lang_output_section_statement.head;
921 os != (lang_statement_union_type *) NULL;
922 os = os->output_section_statement.next)
923 {
924 lang_output_section_statement_type *s =
925 &os->output_section_statement;
926
927 init_os (s);
928 }
929
930 }
931
932 static void
933 DEFUN_VOID (lang_init_script_file)
934 {
935 script_file = lang_add_input_file ("script file",
936 lang_input_file_is_fake_enum,
937 (char *) NULL);
938 script_file->the_bfd = bfd_create ("script file", output_bfd);
939 script_file->symbol_count = 0;
940 script_file->the_bfd->sections = output_bfd->sections;
941 abs_output_section = lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME);
942
943 abs_output_section->bfd_section = &bfd_abs_section;
944
945 }
946
947 /* Open input files and attatch to output sections */
948 static void
949 DEFUN (map_input_to_output_sections, (s, target, output_section_statement),
950 lang_statement_union_type * s AND
951 CONST char *target AND
952 lang_output_section_statement_type * output_section_statement)
953 {
954 for (; s != (lang_statement_union_type *) NULL; s = s->next)
955 {
956 switch (s->header.type)
957 {
958
959
960 case lang_wild_statement_enum:
961 wild (&s->wild_statement, s->wild_statement.section_name,
962 s->wild_statement.filename, target,
963 output_section_statement);
964
965 break;
966 case lang_constructors_statement_enum:
967 map_input_to_output_sections (constructor_list.head,
968 target,
969 output_section_statement);
970 break;
971 case lang_output_section_statement_enum:
972 map_input_to_output_sections (s->output_section_statement.children.head,
973 target,
974 &s->output_section_statement);
975 break;
976 case lang_output_statement_enum:
977 break;
978 case lang_target_statement_enum:
979 target = s->target_statement.target;
980 break;
981 case lang_fill_statement_enum:
982 case lang_input_section_enum:
983 case lang_object_symbols_statement_enum:
984 case lang_data_statement_enum:
985 case lang_assignment_statement_enum:
986 case lang_padding_statement_enum:
987 break;
988 case lang_afile_asection_pair_statement_enum:
989 FAIL ();
990 break;
991 case lang_address_statement_enum:
992 /* Mark the specified section with the supplied address */
993 {
994 lang_output_section_statement_type *os =
995 lang_output_section_statement_lookup
996 (s->address_statement.section_name);
997
998 os->addr_tree = s->address_statement.address;
999 if (os->bfd_section == (asection *) NULL)
1000 {
1001 einfo ("%P%F can't set the address of undefined section %s\n",
1002 s->address_statement.section_name);
1003 }
1004 }
1005 break;
1006 case lang_input_statement_enum:
1007 /* A standard input statement, has no wildcards */
1008 /* ldmain_open_file_read_symbol(&s->input_statement);*/
1009 break;
1010 }
1011 }
1012 }
1013
1014
1015
1016
1017
1018 static void
1019 DEFUN (print_output_section_statement, (output_section_statement),
1020 lang_output_section_statement_type * output_section_statement)
1021 {
1022 asection *section = output_section_statement->bfd_section;
1023
1024 print_nl ();
1025 print_section (output_section_statement->name);
1026
1027 if (section)
1028 {
1029 print_dot = section->vma;
1030 print_space ();
1031 print_section ("");
1032 print_space ();
1033 print_address (section->vma);
1034 print_space ();
1035 print_size (section->_raw_size);
1036 print_space();
1037 print_size(section->_cooked_size);
1038 print_space ();
1039 print_alignment (section->alignment_power);
1040 print_space ();
1041 #if 0
1042 fprintf (config.map_file, "%s flags", output_section_statement->region->name);
1043 print_flags (stdout, &output_section_statement->flags);
1044 #endif
1045 if (section->flags & SEC_LOAD)
1046 fprintf (config.map_file, "load ");
1047 if (section->flags & SEC_ALLOC)
1048 fprintf (config.map_file, "alloc ");
1049 if (section->flags & SEC_RELOC)
1050 fprintf (config.map_file, "reloc ");
1051 if (section->flags & SEC_HAS_CONTENTS)
1052 fprintf (config.map_file, "contents ");
1053
1054 }
1055 else
1056 {
1057 fprintf (config.map_file, "No attached output section");
1058 }
1059 print_nl ();
1060 print_statement (output_section_statement->children.head,
1061 output_section_statement);
1062
1063 }
1064
1065 static void
1066 DEFUN (print_assignment, (assignment, output_section),
1067 lang_assignment_statement_type * assignment AND
1068 lang_output_section_statement_type * output_section)
1069 {
1070 etree_value_type result;
1071
1072 print_section ("");
1073 print_space ();
1074 print_section ("");
1075 print_space ();
1076 print_address (print_dot);
1077 print_space ();
1078 result = exp_fold_tree (assignment->exp->assign.src,
1079 output_section,
1080 lang_final_phase_enum,
1081 print_dot,
1082 &print_dot);
1083
1084 if (result.valid)
1085 {
1086 print_address (result.value);
1087 }
1088 else
1089 {
1090 fprintf (config.map_file, "*undefined*");
1091 }
1092 print_space ();
1093 exp_print_tree (assignment->exp);
1094
1095 fprintf (config.map_file, "\n");
1096 }
1097
1098 static void
1099 DEFUN (print_input_statement, (statm),
1100 lang_input_statement_type * statm)
1101 {
1102 if (statm->filename != (char *) NULL)
1103 {
1104 fprintf (config.map_file, "LOAD %s\n", statm->filename);
1105 }
1106 }
1107
1108 static void
1109 DEFUN (print_symbol, (q),
1110 asymbol * q)
1111 {
1112 print_section ("");
1113 fprintf (config.map_file, " ");
1114 print_section ("");
1115 fprintf (config.map_file, " ");
1116 print_address (outside_symbol_address (q));
1117 fprintf (config.map_file, " %s", q->name ? q->name : " ");
1118 print_nl ();
1119 }
1120
1121 static void
1122 DEFUN (print_input_section, (in),
1123 lang_input_section_type * in)
1124 {
1125 asection *i = in->section;
1126 int size = i->reloc_done ?
1127 bfd_get_section_size_after_reloc (i) :
1128 bfd_get_section_size_before_reloc (i);
1129
1130 if (size != 0)
1131 {
1132 print_section ("");
1133 fprintf (config.map_file, " ");
1134 print_section (i->name);
1135 fprintf (config.map_file, " ");
1136 if (i->output_section)
1137 {
1138 print_address (i->output_section->vma + i->output_offset);
1139 fprintf (config.map_file, " ");
1140 print_size (i->_raw_size);
1141 fprintf (config.map_file, " ");
1142 print_size(i->_cooked_size);
1143 fprintf (config.map_file, " ");
1144 print_alignment (i->alignment_power);
1145 fprintf (config.map_file, " ");
1146 if (in->ifile)
1147 {
1148
1149 bfd *abfd = in->ifile->the_bfd;
1150
1151 if (in->ifile->just_syms_flag == true)
1152 {
1153 fprintf (config.map_file, "symbols only ");
1154 }
1155
1156 fprintf (config.map_file, " %s ", abfd->xvec->name);
1157 if (abfd->my_archive != (bfd *) NULL)
1158 {
1159 fprintf (config.map_file, "[%s]%s", abfd->my_archive->filename,
1160 abfd->filename);
1161 }
1162 else
1163 {
1164 fprintf (config.map_file, "%s", abfd->filename);
1165 }
1166 fprintf (config.map_file, "(overhead %d bytes)", (int) bfd_alloc_size (abfd));
1167 print_nl ();
1168
1169 /* Find all the symbols in this file defined in this section */
1170
1171 if (in->ifile->symbol_count)
1172 {
1173 asymbol **p;
1174
1175 for (p = in->ifile->asymbols; *p; p++)
1176 {
1177 asymbol *q = *p;
1178
1179 if (bfd_get_section (q) == i && q->flags & BSF_GLOBAL)
1180 {
1181 print_symbol (q);
1182 }
1183 }
1184 }
1185 }
1186 else
1187 {
1188 print_nl ();
1189 }
1190
1191
1192 print_dot = outside_section_address (i) + size;
1193 }
1194 else
1195 {
1196 fprintf (config.map_file, "No output section allocated\n");
1197 }
1198 }
1199 }
1200
1201 static void
1202 DEFUN (print_fill_statement, (fill),
1203 lang_fill_statement_type * fill)
1204 {
1205 fprintf (config.map_file, "FILL mask ");
1206 print_fill (fill->fill);
1207 }
1208
1209 static void
1210 DEFUN (print_data_statement, (data),
1211 lang_data_statement_type * data)
1212 {
1213 /* bfd_vma value; */
1214 print_section ("");
1215 print_space ();
1216 print_section ("");
1217 print_space ();
1218 /* ASSERT(print_dot == data->output_vma);*/
1219
1220 print_address (data->output_vma + data->output_section->vma);
1221 print_space ();
1222 print_address (data->value);
1223 print_space ();
1224 switch (data->type)
1225 {
1226 case BYTE:
1227 fprintf (config.map_file, "BYTE ");
1228 print_dot += BYTE_SIZE;
1229 break;
1230 case SHORT:
1231 fprintf (config.map_file, "SHORT ");
1232 print_dot += SHORT_SIZE;
1233 break;
1234 case LONG:
1235 fprintf (config.map_file, "LONG ");
1236 print_dot += LONG_SIZE;
1237 break;
1238 }
1239
1240 exp_print_tree (data->exp);
1241
1242 fprintf (config.map_file, "\n");
1243 }
1244
1245
1246 static void
1247 DEFUN (print_padding_statement, (s),
1248 lang_padding_statement_type * s)
1249 {
1250 print_section ("");
1251 print_space ();
1252 print_section ("*fill*");
1253 print_space ();
1254 print_address (s->output_offset + s->output_section->vma);
1255 print_space ();
1256 print_size (s->size);
1257 print_space ();
1258 print_fill (s->fill);
1259 print_nl ();
1260
1261 print_dot = s->output_offset + s->output_section->vma + s->size;
1262
1263 }
1264
1265 static void
1266 DEFUN (print_wild_statement, (w, os),
1267 lang_wild_statement_type * w AND
1268 lang_output_section_statement_type * os)
1269 {
1270 fprintf (config.map_file, " from ");
1271 if (w->filename != (char *) NULL)
1272 {
1273 fprintf (config.map_file, "%s", w->filename);
1274 }
1275 else
1276 {
1277 fprintf (config.map_file, "*");
1278 }
1279 if (w->section_name != (char *) NULL)
1280 {
1281 fprintf (config.map_file, "(%s)", w->section_name);
1282 }
1283 else
1284 {
1285 fprintf (config.map_file, "(*)");
1286 }
1287 print_nl ();
1288 print_statement (w->children.head, os);
1289
1290 }
1291 static void
1292 DEFUN (print_statement, (s, os),
1293 lang_statement_union_type * s AND
1294 lang_output_section_statement_type * os)
1295 {
1296 while (s)
1297 {
1298 switch (s->header.type)
1299 {
1300 case lang_constructors_statement_enum:
1301 fprintf (config.map_file, "constructors:\n");
1302 print_statement (constructor_list.head, os);
1303 break;
1304 case lang_wild_statement_enum:
1305 print_wild_statement (&s->wild_statement, os);
1306 break;
1307 default:
1308 fprintf (config.map_file, "Fail with %d\n", s->header.type);
1309 FAIL ();
1310 break;
1311 case lang_address_statement_enum:
1312 fprintf (config.map_file, "address\n");
1313 break;
1314 case lang_object_symbols_statement_enum:
1315 fprintf (config.map_file, "object symbols\n");
1316 break;
1317 case lang_fill_statement_enum:
1318 print_fill_statement (&s->fill_statement);
1319 break;
1320 case lang_data_statement_enum:
1321 print_data_statement (&s->data_statement);
1322 break;
1323 case lang_input_section_enum:
1324 print_input_section (&s->input_section);
1325 break;
1326 case lang_padding_statement_enum:
1327 print_padding_statement (&s->padding_statement);
1328 break;
1329 case lang_output_section_statement_enum:
1330 print_output_section_statement (&s->output_section_statement);
1331 break;
1332 case lang_assignment_statement_enum:
1333 print_assignment (&s->assignment_statement,
1334 os);
1335 break;
1336 case lang_target_statement_enum:
1337 fprintf (config.map_file, "TARGET(%s)\n", s->target_statement.target);
1338 break;
1339 case lang_output_statement_enum:
1340 fprintf (config.map_file, "OUTPUT(%s %s)\n",
1341 s->output_statement.name,
1342 output_target);
1343 break;
1344 case lang_input_statement_enum:
1345 print_input_statement (&s->input_statement);
1346 break;
1347 case lang_afile_asection_pair_statement_enum:
1348 FAIL ();
1349 break;
1350 }
1351 s = s->next;
1352 }
1353 }
1354
1355
1356 static void
1357 DEFUN_VOID (print_statements)
1358 {
1359 print_statement (statement_list.head,
1360 abs_output_section);
1361
1362 }
1363
1364 static bfd_vma
1365 DEFUN (insert_pad, (this_ptr, fill, power, output_section_statement, dot),
1366 lang_statement_union_type ** this_ptr AND
1367 fill_type fill AND
1368 unsigned int power AND
1369 asection * output_section_statement AND
1370 bfd_vma dot)
1371 {
1372 /* Align this section first to the
1373 input sections requirement, then
1374 to the output section's requirement.
1375 If this alignment is > than any seen before,
1376 then record it too. Perform the alignment by
1377 inserting a magic 'padding' statement.
1378 */
1379
1380 unsigned int alignment_needed = align_power (dot, power) - dot;
1381
1382 if (alignment_needed != 0)
1383 {
1384 lang_statement_union_type *new =
1385 (lang_statement_union_type *)
1386 stat_alloc ((bfd_size_type) (sizeof (lang_padding_statement_type)));
1387
1388 /* Link into existing chain */
1389 new->header.next = *this_ptr;
1390 *this_ptr = new;
1391 new->header.type = lang_padding_statement_enum;
1392 new->padding_statement.output_section = output_section_statement;
1393 new->padding_statement.output_offset =
1394 dot - output_section_statement->vma;
1395 new->padding_statement.fill = fill;
1396 new->padding_statement.size = alignment_needed;
1397 }
1398
1399
1400 /* Remember the most restrictive alignment */
1401 if (power > output_section_statement->alignment_power)
1402 {
1403 output_section_statement->alignment_power = power;
1404 }
1405 output_section_statement->_raw_size += alignment_needed;
1406 return alignment_needed + dot;
1407
1408 }
1409
1410 /* Work out how much this section will move the dot point */
1411 static bfd_vma
1412 DEFUN (size_input_section, (this_ptr, output_section_statement, fill,
1413 dot, relax),
1414 lang_statement_union_type ** this_ptr AND
1415 lang_output_section_statement_type * output_section_statement AND
1416 unsigned short fill AND
1417 bfd_vma dot AND
1418 boolean relax)
1419 {
1420 lang_input_section_type *is = &((*this_ptr)->input_section);
1421 asection *i = is->section;
1422
1423 if (is->ifile->just_syms_flag == false)
1424 {
1425 dot = insert_pad (this_ptr, fill, i->alignment_power,
1426 output_section_statement->bfd_section, dot);
1427
1428 /* remember the largest size so we can malloc the largest area
1429 needed for the output stage. Only remember the size of sections
1430 which we will actually allocate */
1431 if (((i->flags &
1432 (SEC_HAS_CONTENTS | SEC_ALLOC)) == (SEC_HAS_CONTENTS | SEC_ALLOC))
1433 && (bfd_get_section_size_before_reloc (i) > largest_section))
1434 {
1435 largest_section = bfd_get_section_size_before_reloc (i);
1436 }
1437
1438 /* Remember where in the output section this input section goes */
1439
1440 i->output_offset = dot - output_section_statement->bfd_section->vma;
1441
1442 /* Mark how big the output section must be to contain this now
1443 */
1444 if (relax)
1445 {
1446 dot += i->_cooked_size;
1447 }
1448 else
1449 {
1450 dot += i->_raw_size;
1451 }
1452 output_section_statement->bfd_section->_raw_size = dot - output_section_statement->bfd_section->vma;
1453 }
1454 else
1455 {
1456 i->output_offset = i->vma - output_section_statement->bfd_section->vma;
1457 }
1458
1459 return dot;
1460 }
1461
1462 /* Sizing happens in two passes, first pass we allocate worst case
1463 stuff. The second pass (if relaxing), we use what we learnt to
1464 change the size of some relocs from worst case to better
1465 */
1466 static boolean had_relax;
1467
1468 static bfd_vma
1469 DEFUN (lang_size_sections, (s, output_section_statement, prev, fill,
1470 dot, relax),
1471 lang_statement_union_type * s AND
1472 lang_output_section_statement_type * output_section_statement AND
1473 lang_statement_union_type ** prev AND
1474 unsigned short fill AND
1475 bfd_vma dot AND
1476 boolean relax)
1477 {
1478 /* Size up the sections from their constituent parts */
1479 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1480 {
1481 switch (s->header.type)
1482 {
1483
1484 case lang_output_section_statement_enum:
1485 {
1486 bfd_vma after;
1487 lang_output_section_statement_type *os = &s->output_section_statement;
1488
1489 if (os->bfd_section == &bfd_abs_section)
1490 {
1491 /* No matter what happens, an abs section starts at zero */
1492 bfd_set_section_vma (0, os->bfd_section, 0);
1493 }
1494 else
1495 {
1496 if (os->addr_tree == (etree_type *) NULL)
1497 {
1498 /* No address specified for this section, get one
1499 from the region specification
1500 */
1501 if (os->region == (lang_memory_region_type *) NULL)
1502 {
1503 os->region = lang_memory_region_lookup ("*default*");
1504 }
1505 dot = os->region->current;
1506 }
1507 else
1508 {
1509 etree_value_type r;
1510
1511 r = exp_fold_tree (os->addr_tree,
1512 abs_output_section,
1513 lang_allocating_phase_enum,
1514 dot, &dot);
1515 if (r.valid == false)
1516 {
1517 einfo ("%F%S: non constant address expression for section %s\n",
1518 os->name);
1519 }
1520 dot = r.value;
1521 }
1522 /* The section starts here */
1523 /* First, align to what the section needs */
1524
1525
1526 dot = align_power (dot, os->bfd_section->alignment_power);
1527 bfd_set_section_vma (0, os->bfd_section, dot);
1528 }
1529
1530
1531 os->bfd_section->output_offset = 0;
1532
1533 (void) lang_size_sections (os->children.head, os, &os->children.head,
1534 os->fill, dot, relax);
1535 /* Ignore the size of the input sections, use the vma and size to */
1536 /* align against */
1537
1538
1539 after = ALIGN (os->bfd_section->vma +
1540 os->bfd_section->_raw_size,
1541 os->block_value);
1542
1543
1544 os->bfd_section->_raw_size = after - os->bfd_section->vma;
1545 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1546 os->processed = true;
1547
1548 /* Replace into region ? */
1549 if (os->addr_tree == (etree_type *) NULL
1550 && os->region != (lang_memory_region_type *) NULL)
1551 {
1552 os->region->current = dot;
1553 /* Make sure this isn't silly */
1554 if (os->region->current >
1555 os->region->origin +
1556 os->region->length)
1557 {
1558 einfo ("%X%P: Region %s is full (%B section %s)\n",
1559 os->region->name,
1560 os->bfd_section->owner,
1561 os->bfd_section->name);
1562 /* Reset the region pointer */
1563 os->region->current = 0;
1564
1565 }
1566
1567 }
1568 }
1569
1570 break;
1571 case lang_constructors_statement_enum:
1572 dot = lang_size_sections (constructor_list.head,
1573 output_section_statement,
1574 &s->wild_statement.children.head,
1575 fill,
1576 dot, relax);
1577 break;
1578
1579 case lang_data_statement_enum:
1580 {
1581 unsigned int size = 0;
1582
1583 s->data_statement.output_vma = dot - output_section_statement->bfd_section->vma;
1584 s->data_statement.output_section =
1585 output_section_statement->bfd_section;
1586
1587 switch (s->data_statement.type)
1588 {
1589 case LONG:
1590 size = LONG_SIZE;
1591 break;
1592 case SHORT:
1593 size = SHORT_SIZE;
1594 break;
1595 case BYTE:
1596 size = BYTE_SIZE;
1597 break;
1598
1599 }
1600 dot += size;
1601 output_section_statement->bfd_section->_raw_size += size;
1602 }
1603 break;
1604
1605 case lang_wild_statement_enum:
1606
1607 dot = lang_size_sections (s->wild_statement.children.head,
1608 output_section_statement,
1609 &s->wild_statement.children.head,
1610
1611 fill, dot, relax);
1612
1613 break;
1614
1615 case lang_object_symbols_statement_enum:
1616 create_object_symbols = output_section_statement;
1617 break;
1618 case lang_output_statement_enum:
1619 case lang_target_statement_enum:
1620 break;
1621 case lang_input_section_enum:
1622 if (relax)
1623 {
1624 relaxing = true;
1625
1626 if( relax_section (prev))
1627 had_relax = true;
1628 relaxing = false;
1629
1630 }
1631 else {
1632 (*prev)->input_section.section->_cooked_size =
1633 (*prev)->input_section.section->_raw_size ;
1634
1635 }
1636 dot = size_input_section (prev,
1637 output_section_statement,
1638 output_section_statement->fill,
1639 dot, relax);
1640 break;
1641 case lang_input_statement_enum:
1642 break;
1643 case lang_fill_statement_enum:
1644 s->fill_statement.output_section = output_section_statement->bfd_section;
1645
1646 fill = s->fill_statement.fill;
1647 break;
1648 case lang_assignment_statement_enum:
1649 {
1650 bfd_vma newdot = dot;
1651
1652 exp_fold_tree (s->assignment_statement.exp,
1653 output_section_statement,
1654 lang_allocating_phase_enum,
1655 dot,
1656 &newdot);
1657
1658 if (newdot != dot && !relax)
1659 /* We've been moved ! so insert a pad */
1660 {
1661 lang_statement_union_type *new =
1662 (lang_statement_union_type *)
1663 stat_alloc ((bfd_size_type) (sizeof (lang_padding_statement_type)));
1664
1665 /* Link into existing chain */
1666 new->header.next = *prev;
1667 *prev = new;
1668 new->header.type = lang_padding_statement_enum;
1669 new->padding_statement.output_section =
1670 output_section_statement->bfd_section;
1671 new->padding_statement.output_offset =
1672 dot - output_section_statement->bfd_section->vma;
1673 new->padding_statement.fill = fill;
1674 new->padding_statement.size = newdot - dot;
1675 output_section_statement->bfd_section->_raw_size +=
1676 new->padding_statement.size;
1677 dot = newdot;
1678 }
1679 }
1680
1681 break;
1682 default:
1683 FAIL ();
1684 break;
1685 /* This can only get here when relaxing is turned on */
1686 case lang_padding_statement_enum:
1687
1688 case lang_address_statement_enum:
1689 break;
1690 }
1691 prev = &s->header.next;
1692 }
1693 return dot;
1694 }
1695
1696 static bfd_vma
1697 DEFUN (lang_do_assignments, (s, output_section_statement, fill, dot),
1698 lang_statement_union_type * s AND
1699 lang_output_section_statement_type * output_section_statement AND
1700 unsigned short fill AND
1701 bfd_vma dot)
1702 {
1703
1704 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1705 {
1706 switch (s->header.type)
1707 {
1708 case lang_constructors_statement_enum:
1709 dot = lang_do_assignments (constructor_list.head,
1710 output_section_statement,
1711 fill,
1712 dot);
1713 break;
1714
1715 case lang_output_section_statement_enum:
1716 {
1717 lang_output_section_statement_type *os =
1718 &(s->output_section_statement);
1719
1720 dot = os->bfd_section->vma;
1721 (void) lang_do_assignments (os->children.head, os, os->fill, dot);
1722 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1723 }
1724 break;
1725 case lang_wild_statement_enum:
1726
1727 dot = lang_do_assignments (s->wild_statement.children.head,
1728 output_section_statement,
1729 fill, dot);
1730
1731 break;
1732
1733 case lang_object_symbols_statement_enum:
1734 case lang_output_statement_enum:
1735 case lang_target_statement_enum:
1736 #if 0
1737 case lang_common_statement_enum:
1738 #endif
1739 break;
1740 case lang_data_statement_enum:
1741 {
1742 etree_value_type value;
1743
1744 value = exp_fold_tree (s->data_statement.exp,
1745 abs_output_section,
1746 lang_final_phase_enum, dot, &dot);
1747 s->data_statement.value = value.value;
1748 if (value.valid == false)
1749 einfo ("%F%P: Invalid data statement\n");
1750 }
1751 switch (s->data_statement.type)
1752 {
1753 case LONG:
1754 dot += LONG_SIZE;
1755 break;
1756 case SHORT:
1757 dot += SHORT_SIZE;
1758 break;
1759 case BYTE:
1760 dot += BYTE_SIZE;
1761 break;
1762 }
1763 break;
1764 case lang_input_section_enum:
1765 {
1766 asection *in = s->input_section.section;
1767
1768 dot += bfd_get_section_size_before_reloc (in);
1769 }
1770 break;
1771
1772 case lang_input_statement_enum:
1773 break;
1774 case lang_fill_statement_enum:
1775 fill = s->fill_statement.fill;
1776 break;
1777 case lang_assignment_statement_enum:
1778 {
1779 exp_fold_tree (s->assignment_statement.exp,
1780 output_section_statement,
1781 lang_final_phase_enum,
1782 dot,
1783 &dot);
1784 }
1785
1786 break;
1787 case lang_padding_statement_enum:
1788 dot += s->padding_statement.size;
1789 break;
1790 default:
1791 FAIL ();
1792 break;
1793 case lang_address_statement_enum:
1794 break;
1795 }
1796
1797 }
1798 return dot;
1799 }
1800
1801
1802
1803 static void
1804 DEFUN_VOID (lang_relocate_globals)
1805 {
1806
1807 /*
1808 Each ldsym_type maintains a chain of pointers to asymbols which
1809 references the definition. Replace each pointer to the referenence
1810 with a pointer to only one place, preferably the definition. If
1811 the defintion isn't available then the common symbol, and if
1812 there isn't one of them then choose one reference.
1813 */
1814
1815 FOR_EACH_LDSYM (lgs)
1816 {
1817 asymbol *it;
1818
1819 if (lgs->sdefs_chain)
1820 {
1821 it = *(lgs->sdefs_chain);
1822 }
1823 else if (lgs->scoms_chain != (asymbol **) NULL)
1824 {
1825 it = *(lgs->scoms_chain);
1826 }
1827 else if (lgs->srefs_chain != (asymbol **) NULL)
1828 {
1829 it = *(lgs->srefs_chain);
1830 }
1831 else
1832 {
1833 /* This can happen when the command line asked for a symbol to
1834 be -u */
1835 it = (asymbol *) NULL;
1836 }
1837 if (it != (asymbol *) NULL)
1838 {
1839 asymbol **ptr = lgs->srefs_chain;;
1840 if (lgs->flags & SYM_WARNING)
1841 {
1842 produce_warnings (lgs, it);
1843 }
1844
1845 while (ptr != (asymbol **) NULL)
1846 {
1847 asymbol *ref = *ptr;
1848
1849 *ptr = it;
1850 ptr = (asymbol **) (ref->udata);
1851 }
1852 }
1853 }
1854 }
1855
1856
1857
1858 static void
1859 DEFUN_VOID (lang_finish)
1860 {
1861 ldsym_type *lgs;
1862 int warn = config.relocateable_output != true;
1863 if (entry_symbol == (char *) NULL)
1864 {
1865 /* No entry has been specified, look for start, but don't warn */
1866 entry_symbol = "start";
1867 warn =0;
1868 }
1869 lgs = ldsym_get_soft (entry_symbol);
1870 if (lgs && lgs->sdefs_chain)
1871 {
1872 asymbol *sy = *(lgs->sdefs_chain);
1873
1874 /* We can set the entry address*/
1875 bfd_set_start_address (output_bfd,
1876 outside_symbol_address (sy));
1877
1878 }
1879 else
1880 {
1881 /* Can't find anything reasonable,
1882 use the first address in the text section
1883 */
1884 asection *ts = bfd_get_section_by_name (output_bfd, ".text");
1885 if (ts)
1886 {
1887 if (warn)
1888 einfo ("%P: Warning, can't find entry symbol %s, defaulting to %V\n",
1889 entry_symbol, ts->vma);
1890
1891 bfd_set_start_address (output_bfd, ts->vma);
1892 }
1893 else
1894 {
1895 if (warn)
1896 einfo ("%P: Warning, can't find entry symbol %s, not setting start address\n",
1897 entry_symbol);
1898 }
1899 }
1900 }
1901
1902 /* By now we know the target architecture, and we may have an */
1903 /* ldfile_output_machine_name */
1904 static void
1905 DEFUN_VOID (lang_check)
1906 {
1907 lang_statement_union_type *file;
1908 bfd *input_bfd;
1909 unsigned long input_machine;
1910 enum bfd_architecture input_architecture;
1911 CONST bfd_arch_info_type *compatible;
1912
1913 for (file = file_chain.head;
1914 file != (lang_statement_union_type *) NULL;
1915 file = file->input_statement.next)
1916 {
1917 unsigned long ldfile_new_output_machine = 0;
1918 enum bfd_architecture ldfile_new_output_architecture = bfd_arch_unknown;
1919
1920 input_bfd = file->input_statement.the_bfd;
1921
1922 input_machine = bfd_get_mach (input_bfd);
1923 input_architecture = bfd_get_arch (input_bfd);
1924
1925
1926 /* Inspect the architecture and ensure we're linking like with
1927 like */
1928
1929 compatible = bfd_arch_get_compatible (input_bfd,
1930 output_bfd);
1931
1932 if (compatible)
1933 {
1934 ldfile_output_machine = compatible->mach;
1935 ldfile_output_architecture = compatible->arch;
1936 }
1937 else
1938 {
1939
1940 info ("%P: warning, %s architecture of input file `%B' incompatible with %s output\n",
1941 bfd_printable_name (input_bfd), input_bfd,
1942 bfd_printable_name (output_bfd));
1943
1944 bfd_set_arch_mach (output_bfd,
1945 input_architecture,
1946 input_machine);
1947 }
1948
1949 }
1950 }
1951
1952 /*
1953 * run through all the global common symbols and tie them
1954 * to the output section requested.
1955 *
1956 As an experiment we do this 4 times, once for all the byte sizes,
1957 then all the two bytes, all the four bytes and then everything else
1958 */
1959
1960 static void
1961 DEFUN_VOID (lang_common)
1962 {
1963 ldsym_type *lgs;
1964 size_t power;
1965
1966 if (config.relocateable_output == false ||
1967 command_line.force_common_definition == true)
1968 {
1969 for (power = 1; (config.sort_common == true && power == 1) || (power <= 16); power <<= 1)
1970 {
1971 for (lgs = symbol_head;
1972 lgs != (ldsym_type *) NULL;
1973 lgs = lgs->next)
1974 {
1975 asymbol *com;
1976 unsigned int power_of_two;
1977 size_t size;
1978 size_t align;
1979
1980 if (lgs->scoms_chain != (asymbol **) NULL)
1981 {
1982 com = *(lgs->scoms_chain);
1983 size = com->value;
1984 switch (size)
1985 {
1986 case 0:
1987 case 1:
1988 align = 1;
1989 power_of_two = 0;
1990 break;
1991 case 2:
1992 power_of_two = 1;
1993 align = 2;
1994 break;
1995 case 3:
1996 case 4:
1997 power_of_two = 2;
1998 align = 4;
1999 break;
2000 case 5:
2001 case 6:
2002 case 7:
2003 case 8:
2004 power_of_two = 3;
2005 align = 8;
2006 break;
2007 default:
2008 power_of_two = 4;
2009 align = 16;
2010 break;
2011 }
2012 if (config.sort_common == false || align == power)
2013 {
2014 /* Change from a common symbol into a definition of
2015 a symbol */
2016 lgs->sdefs_chain = lgs->scoms_chain;
2017 lgs->scoms_chain = (asymbol **) NULL;
2018 commons_pending--;
2019 /* Point to the correct common section */
2020 com->section =
2021 ((lang_input_statement_type *)
2022 (com->the_bfd->usrdata))->common_section;
2023 /* Fix the size of the common section */
2024
2025 com->section->_raw_size =
2026 ALIGN (com->section->_raw_size, align);
2027
2028 /* Remember if this is the biggest alignment ever seen */
2029 if (power_of_two > com->section->alignment_power)
2030 {
2031 com->section->alignment_power = power_of_two;
2032 }
2033
2034 /* Symbol stops being common and starts being global, but
2035 we remember that it was common once. */
2036
2037 com->flags = BSF_EXPORT | BSF_GLOBAL | BSF_OLD_COMMON;
2038 com->value = com->section->_raw_size;
2039
2040 if (write_map)
2041 {
2042 fprintf (config.map_file, "Allocating common %s: %x at %x %s\n",
2043 lgs->name,
2044 (unsigned) size,
2045 (unsigned) com->value,
2046 com->the_bfd->filename);
2047 }
2048
2049 com->section->_raw_size += size;
2050
2051 }
2052 }
2053
2054 }
2055 }
2056 }
2057
2058
2059 }
2060
2061 /*
2062 run through the input files and ensure that every input
2063 section has somewhere to go. If one is found without
2064 a destination then create an input request and place it
2065 into the statement tree.
2066 */
2067
2068 static void
2069 DEFUN_VOID (lang_place_orphans)
2070 {
2071 lang_input_statement_type *file;
2072
2073 for (file = (lang_input_statement_type *) file_chain.head;
2074 file != (lang_input_statement_type *) NULL;
2075 file = (lang_input_statement_type *) file->next)
2076 {
2077 asection *s;
2078
2079 for (s = file->the_bfd->sections;
2080 s != (asection *) NULL;
2081 s = s->next)
2082 {
2083 if (s->output_section == (asection *) NULL)
2084 {
2085 /* This section of the file is not attatched, root
2086 around for a sensible place for it to go */
2087
2088 if (file->common_section == s)
2089 {
2090 /* This is a lonely common section which must
2091 have come from an archive. We attatch to the
2092 section with the wildcard */
2093 if (config.relocateable_output != true
2094 && command_line.force_common_definition == false)
2095 {
2096 if (default_common_section ==
2097 (lang_output_section_statement_type *) NULL)
2098 {
2099 info ("%P: No [COMMON] command, defaulting to .bss\n");
2100
2101 default_common_section =
2102 lang_output_section_statement_lookup (".bss");
2103
2104 }
2105 wild_doit (&default_common_section->children, s,
2106 default_common_section, file);
2107 }
2108 }
2109 else
2110 {
2111 lang_output_section_statement_type *os =
2112 lang_output_section_statement_lookup (s->name);
2113
2114 wild_doit (&os->children, s, os, file);
2115 }
2116 }
2117 }
2118 }
2119 }
2120
2121
2122 void
2123 DEFUN (lang_set_flags, (ptr, flags),
2124 int *ptr AND
2125 CONST char *flags)
2126 {
2127 boolean state = false;
2128
2129 *ptr = 0;
2130 while (*flags)
2131 {
2132 if (*flags == '!')
2133 {
2134 state = false;
2135 flags++;
2136 }
2137 else
2138 state = true;
2139 switch (*flags)
2140 {
2141 case 'R':
2142 /* ptr->flag_read = state; */
2143 break;
2144 case 'W':
2145 /* ptr->flag_write = state; */
2146 break;
2147 case 'X':
2148 /* ptr->flag_executable= state;*/
2149 break;
2150 case 'L':
2151 case 'I':
2152 /* ptr->flag_loadable= state;*/
2153 break;
2154 default:
2155 einfo ("%P%F illegal syntax in flags\n");
2156 break;
2157 }
2158 flags++;
2159 }
2160 }
2161
2162
2163
2164 void
2165 DEFUN (lang_for_each_file, (func),
2166 PROTO (void, (*func), (lang_input_statement_type *)))
2167 {
2168 lang_input_statement_type *f;
2169
2170 for (f = (lang_input_statement_type *) file_chain.head;
2171 f != (lang_input_statement_type *) NULL;
2172 f = (lang_input_statement_type *) f->next)
2173 {
2174 func (f);
2175 }
2176 }
2177
2178
2179 void
2180 DEFUN (lang_for_each_input_section, (func),
2181 PROTO (void, (*func), (bfd * ab, asection * as)))
2182 {
2183 lang_input_statement_type *f;
2184
2185 for (f = (lang_input_statement_type *) file_chain.head;
2186 f != (lang_input_statement_type *) NULL;
2187 f = (lang_input_statement_type *) f->next)
2188 {
2189 asection *s;
2190
2191 for (s = f->the_bfd->sections;
2192 s != (asection *) NULL;
2193 s = s->next)
2194 {
2195 func (f->the_bfd, s);
2196 }
2197 }
2198 }
2199
2200
2201
2202 void
2203 DEFUN (ldlang_add_file, (entry),
2204 lang_input_statement_type * entry)
2205 {
2206
2207 lang_statement_append (&file_chain,
2208 (lang_statement_union_type *) entry,
2209 &entry->next);
2210 }
2211
2212 void
2213 DEFUN (lang_add_output, (name),
2214 CONST char *name)
2215 {
2216 lang_output_statement_type *new = new_stat (lang_output_statement,
2217 stat_ptr);
2218
2219 new->name = name;
2220 had_output_filename = true;
2221 }
2222
2223
2224 static lang_output_section_statement_type *current_section;
2225
2226 void
2227 DEFUN (lang_enter_output_section_statement,
2228 (output_section_statement_name,
2229 address_exp,
2230 flags,
2231 block_value),
2232 char *output_section_statement_name AND
2233 etree_type * address_exp AND
2234 int flags AND
2235 bfd_vma block_value)
2236 {
2237 lang_output_section_statement_type *os;
2238
2239 current_section =
2240 os =
2241 lang_output_section_statement_lookup (output_section_statement_name);
2242
2243
2244
2245 /* Add this statement to tree */
2246 /* add_statement(lang_output_section_statement_enum,
2247 output_section_statement);*/
2248 /* Make next things chain into subchain of this */
2249
2250 if (os->addr_tree ==
2251 (etree_type *) NULL)
2252 {
2253 os->addr_tree =
2254 address_exp;
2255 }
2256 os->flags = flags;
2257 if (flags & SEC_NEVER_LOAD)
2258 os->loadable = 0;
2259 else
2260 os->loadable = 1;
2261 os->block_value = block_value;
2262 stat_ptr = &os->children;
2263
2264 }
2265
2266 void
2267 DEFUN_VOID (lang_final)
2268 {
2269 if (had_output_filename == false)
2270 {
2271 extern CONST char *output_filename;
2272
2273 lang_add_output (output_filename);
2274 }
2275 }
2276
2277 /* Reset the current counters in the regions */
2278 static void
2279 DEFUN_VOID (reset_memory_regions)
2280 {
2281 lang_memory_region_type *p = lang_memory_region_list;
2282
2283 for (p = lang_memory_region_list;
2284 p != (lang_memory_region_type *) NULL;
2285 p = p->next)
2286 {
2287 p->old_length = p->current - p->origin;
2288 p->current = p->origin;
2289 }
2290 }
2291
2292
2293
2294 asymbol *
2295 DEFUN (create_symbol, (name, flags, section),
2296 CONST char *name AND
2297 flagword flags AND
2298 asection * section)
2299 {
2300 extern lang_input_statement_type *script_file;
2301 asymbol **def_ptr = (asymbol **) stat_alloc ((bfd_size_type) (sizeof (asymbol **)));
2302
2303 /* Add this definition to script file */
2304 asymbol *def = (asymbol *) bfd_make_empty_symbol (script_file->the_bfd);
2305
2306 def->name = buystring (name);
2307 def->udata = 0;
2308 def->flags = flags;
2309 def->section = section;
2310
2311 *def_ptr = def;
2312 Q_enter_global_ref (def_ptr, name);
2313 return def;
2314 }
2315
2316 void
2317 DEFUN_VOID (lang_process)
2318 {
2319
2320 if (had_script == false)
2321 {
2322 parse_line (ldemul_get_script (), 1);
2323 }
2324 lang_reasonable_defaults ();
2325 current_target = default_target;
2326
2327 lang_for_each_statement (ldlang_open_output); /* Open the output file */
2328 /* For each output section statement, create a section in the output
2329 file */
2330 lang_create_output_section_statements ();
2331
2332 /* Create a dummy bfd for the script */
2333 lang_init_script_file ();
2334
2335 /* Add to the hash table all undefineds on the command line */
2336 lang_place_undefineds ();
2337
2338 /* Create a bfd for each input file */
2339 current_target = default_target;
2340 lang_for_each_statement (open_input_bfds);
2341
2342 common_section.userdata = (PTR) & common_section_userdata;
2343
2344
2345 /* Run through the contours of the script and attatch input sections
2346 to the correct output sections
2347 */
2348 find_constructors ();
2349 map_input_to_output_sections (statement_list.head, (char *) NULL,
2350 (lang_output_section_statement_type *) NULL);
2351
2352
2353 /* Find any sections not attatched explicitly and handle them */
2354 lang_place_orphans ();
2355
2356 /* Size up the common data */
2357 lang_common ();
2358
2359 ldemul_before_allocation ();
2360
2361
2362 #if 0
2363 had_relax = true;
2364 while (had_relax)
2365 {
2366
2367 had_relax = false;
2368
2369 lang_size_sections (statement_list.head,
2370 (lang_output_section_statement_type *) NULL,
2371 &(statement_list.head), 0, (bfd_vma) 0, true);
2372 /* FIXME. Until the code in relax is fixed so that it only reads in
2373 stuff once, we cant iterate since there is no way for the linker to
2374 know what has been patched and what hasn't */
2375 break;
2376
2377 }
2378 #endif
2379
2380 /* Now run around and relax if we can */
2381 if (command_line.relax)
2382 {
2383 /* First time round is a trial run to get the 'worst case' addresses of the
2384 objects if there was no relaxing */
2385 lang_size_sections (statement_list.head,
2386 (lang_output_section_statement_type *) NULL,
2387 &(statement_list.head), 0, (bfd_vma) 0, false);
2388
2389
2390
2391 /* Move the global symbols around so the second pass of relaxing can
2392 see them */
2393 lang_relocate_globals ();
2394
2395 reset_memory_regions ();
2396
2397 /* Do all the assignments, now that we know the final restingplaces
2398 of all the symbols */
2399
2400 lang_do_assignments (statement_list.head,
2401 abs_output_section,
2402 0, (bfd_vma) 0);
2403
2404
2405 /* Perform another relax pass - this time we know where the
2406 globals are, so can make better guess */
2407 lang_size_sections (statement_list.head,
2408 (lang_output_section_statement_type *) NULL,
2409 &(statement_list.head), 0, (bfd_vma) 0, true);
2410
2411
2412
2413 }
2414
2415 else
2416 {
2417 /* Size up the sections */
2418 lang_size_sections (statement_list.head,
2419 abs_output_section,
2420 &(statement_list.head), 0, (bfd_vma) 0, false);
2421
2422 }
2423
2424
2425 /* See if anything special should be done now we know how big
2426 everything is */
2427 ldemul_after_allocation ();
2428
2429 /* Do all the assignments, now that we know the final restingplaces
2430 of all the symbols */
2431
2432 lang_do_assignments (statement_list.head,
2433 abs_output_section,
2434 0, (bfd_vma) 0);
2435
2436
2437 /* Move the global symbols around */
2438 lang_relocate_globals ();
2439
2440 /* Make sure that we're not mixing architectures */
2441
2442 lang_check ();
2443
2444 /* Final stuffs */
2445 lang_finish ();
2446 }
2447
2448 /* EXPORTED TO YACC */
2449
2450 void
2451 DEFUN (lang_add_wild, (section_name, filename),
2452 CONST char *CONST section_name AND
2453 CONST char *CONST filename)
2454 {
2455 lang_wild_statement_type *new = new_stat (lang_wild_statement,
2456 stat_ptr);
2457
2458 if (section_name != (char *) NULL && strcmp (section_name, "COMMON") == 0)
2459 {
2460 placed_commons = true;
2461 }
2462 if (filename != (char *) NULL)
2463 {
2464 lang_has_input_file = true;
2465 }
2466 new->section_name = section_name;
2467 new->filename = filename;
2468 lang_list_init (&new->children);
2469 }
2470
2471 void
2472 DEFUN (lang_section_start, (name, address),
2473 CONST char *name AND
2474 etree_type * address)
2475 {
2476 lang_address_statement_type *ad = new_stat (lang_address_statement, stat_ptr);
2477
2478 ad->section_name = name;
2479 ad->address = address;
2480 }
2481
2482 void
2483 DEFUN (lang_add_entry, (name),
2484 CONST char *name)
2485 {
2486 entry_symbol = name;
2487 }
2488
2489 void
2490 DEFUN (lang_add_target, (name),
2491 CONST char *name)
2492 {
2493 lang_target_statement_type *new = new_stat (lang_target_statement,
2494 stat_ptr);
2495
2496 new->target = name;
2497
2498 }
2499
2500 void
2501 DEFUN (lang_add_map, (name),
2502 CONST char *name)
2503 {
2504 while (*name)
2505 {
2506 switch (*name)
2507 {
2508 case 'F':
2509 map_option_f = true;
2510 break;
2511 }
2512 name++;
2513 }
2514 }
2515
2516 void
2517 DEFUN (lang_add_fill, (exp),
2518 int exp)
2519 {
2520 lang_fill_statement_type *new = new_stat (lang_fill_statement,
2521 stat_ptr);
2522
2523 new->fill = exp;
2524 }
2525
2526 void
2527 DEFUN (lang_add_data, (type, exp),
2528 int type AND
2529 union etree_union *exp)
2530 {
2531
2532 lang_data_statement_type *new = new_stat (lang_data_statement,
2533 stat_ptr);
2534
2535 new->exp = exp;
2536 new->type = type;
2537
2538 }
2539
2540 void
2541 DEFUN (lang_add_assignment, (exp),
2542 etree_type * exp)
2543 {
2544 lang_assignment_statement_type *new = new_stat (lang_assignment_statement,
2545 stat_ptr);
2546
2547 new->exp = exp;
2548 }
2549
2550 void
2551 DEFUN (lang_add_attribute, (attribute),
2552 enum statement_enum attribute)
2553 {
2554 new_statement (attribute, sizeof (lang_statement_union_type), stat_ptr);
2555 }
2556
2557 void
2558 DEFUN (lang_startup, (name),
2559 CONST char *name)
2560 {
2561 if (startup_file != (char *) NULL)
2562 {
2563 einfo ("%P%FMultiple STARTUP files\n");
2564 }
2565 first_file->filename = name;
2566 first_file->local_sym_name = name;
2567
2568 startup_file = name;
2569 }
2570
2571 void
2572 DEFUN (lang_float, (maybe),
2573 boolean maybe)
2574 {
2575 lang_float_flag = maybe;
2576 }
2577
2578 void
2579 DEFUN (lang_leave_output_section_statement, (fill, memspec),
2580 bfd_vma fill AND
2581 CONST char *memspec)
2582 {
2583 current_section->fill = fill;
2584 current_section->region = lang_memory_region_lookup (memspec);
2585 stat_ptr = &statement_list;
2586
2587 /* We remember if we are closing a .data section, since we use it to
2588 store constructors in */
2589 if (strcmp (current_section->name, ".data") == 0)
2590 {
2591 end_of_data_section_statement_list = statement_list;
2592
2593 }
2594 }
2595
2596 /*
2597 Create an absolute symbol with the given name with the value of the
2598 address of first byte of the section named.
2599
2600 If the symbol already exists, then do nothing.
2601 */
2602 void
2603 DEFUN (lang_abs_symbol_at_beginning_of, (section, name),
2604 CONST char *section AND
2605 CONST char *name)
2606 {
2607 if (ldsym_undefined (name))
2608 {
2609 asection *s = bfd_get_section_by_name (output_bfd, section);
2610 asymbol *def = create_symbol (name,
2611 BSF_GLOBAL | BSF_EXPORT,
2612 &bfd_abs_section);
2613
2614 if (s != (asection *) NULL)
2615 {
2616 def->value = s->vma;
2617 }
2618 else
2619 {
2620 def->value = 0;
2621 }
2622 }
2623 }
2624
2625 /*
2626 Create an absolute symbol with the given name with the value of the
2627 address of the first byte after the end of the section named.
2628
2629 If the symbol already exists, then do nothing.
2630 */
2631 void
2632 DEFUN (lang_abs_symbol_at_end_of, (section, name),
2633 CONST char *section AND
2634 CONST char *name)
2635 {
2636 if (ldsym_undefined (name))
2637 {
2638 asection *s = bfd_get_section_by_name (output_bfd, section);
2639
2640 /* Add a symbol called _end */
2641 asymbol *def = create_symbol (name,
2642 BSF_GLOBAL | BSF_EXPORT,
2643 &bfd_abs_section);
2644
2645 if (s != (asection *) NULL)
2646 {
2647 def->value = s->vma + s->_raw_size;
2648 }
2649 else
2650 {
2651 def->value = 0;
2652 }
2653 }
2654 }
2655
2656 void
2657 DEFUN (lang_statement_append, (list, element, field),
2658 lang_statement_list_type * list AND
2659 lang_statement_union_type * element AND
2660 lang_statement_union_type ** field)
2661 {
2662 *(list->tail) = element;
2663 list->tail = field;
2664 }
2665
2666 /* Set the output format type */
2667 void
2668 DEFUN (lang_add_output_format, (format),
2669 CONST char *format)
2670 {
2671 output_target = format;
2672 }
This page took 0.082826 seconds and 5 git commands to generate.