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