Silently ignore an 'a' flag in a COFF .section directive.
[deliverable/binutils-gdb.git] / gas / config / obj-coff.c
1 /* coff object file format
2 Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002
4 Free Software Foundation, Inc.
5
6 This file is part of GAS.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
22
23 #define OBJ_HEADER "obj-coff.h"
24
25 #include "as.h"
26 #include "obstack.h"
27 #include "subsegs.h"
28
29 /* I think this is probably always correct. */
30 #ifndef KEEP_RELOC_INFO
31 #define KEEP_RELOC_INFO
32 #endif
33
34 /* The BFD_ASSEMBLER version of obj_coff_section will use this macro to set
35 a new section's attributes when a directive has no valid flags or the
36 "w" flag is used. This default should be appropriate for most. */
37 #ifndef TC_COFF_SECTION_DEFAULT_ATTRIBUTES
38 #define TC_COFF_SECTION_DEFAULT_ATTRIBUTES (SEC_LOAD | SEC_DATA)
39 #endif
40
41 /* This is used to hold the symbol built by a sequence of pseudo-ops
42 from .def and .endef. */
43 static symbolS *def_symbol_in_progress;
44
45 typedef struct
46 {
47 unsigned long chunk_size;
48 unsigned long element_size;
49 unsigned long size;
50 char *data;
51 unsigned long pointer;
52 }
53 stack;
54
55 static stack *stack_init PARAMS ((unsigned long, unsigned long));
56 static char *stack_push PARAMS ((stack *, char *));
57 static char *stack_pop PARAMS ((stack *));
58 static void tag_init PARAMS ((void));
59 static void tag_insert PARAMS ((const char *, symbolS *));
60 static symbolS *tag_find PARAMS ((char *));
61 static symbolS *tag_find_or_make PARAMS ((char *));
62 static void obj_coff_bss PARAMS ((int));
63 static void obj_coff_weak PARAMS ((int));
64 const char *s_get_name PARAMS ((symbolS * s));
65 static void obj_coff_ln PARAMS ((int));
66 static void obj_coff_def PARAMS ((int));
67 static void obj_coff_endef PARAMS ((int));
68 static void obj_coff_dim PARAMS ((int));
69 static void obj_coff_line PARAMS ((int));
70 static void obj_coff_size PARAMS ((int));
71 static void obj_coff_scl PARAMS ((int));
72 static void obj_coff_tag PARAMS ((int));
73 static void obj_coff_val PARAMS ((int));
74 static void obj_coff_type PARAMS ((int));
75 static void obj_coff_ident PARAMS ((int));
76 #ifdef BFD_ASSEMBLER
77 static void obj_coff_loc PARAMS((int));
78 #endif
79 \f
80 /* stack stuff */
81
82 static stack *
83 stack_init (chunk_size, element_size)
84 unsigned long chunk_size;
85 unsigned long element_size;
86 {
87 stack *st;
88
89 st = (stack *) malloc (sizeof (stack));
90 if (!st)
91 return 0;
92 st->data = malloc (chunk_size);
93 if (!st->data)
94 {
95 free (st);
96 return 0;
97 }
98 st->pointer = 0;
99 st->size = chunk_size;
100 st->chunk_size = chunk_size;
101 st->element_size = element_size;
102 return st;
103 }
104
105 #if 0
106 /* Not currently used. */
107 static void
108 stack_delete (st)
109 stack *st;
110 {
111 free (st->data);
112 free (st);
113 }
114 #endif
115
116 static char *
117 stack_push (st, element)
118 stack *st;
119 char *element;
120 {
121 if (st->pointer + st->element_size >= st->size)
122 {
123 st->size += st->chunk_size;
124 if ((st->data = xrealloc (st->data, st->size)) == (char *) 0)
125 return (char *) 0;
126 }
127 memcpy (st->data + st->pointer, element, st->element_size);
128 st->pointer += st->element_size;
129 return st->data + st->pointer;
130 }
131
132 static char *
133 stack_pop (st)
134 stack *st;
135 {
136 if (st->pointer < st->element_size)
137 {
138 st->pointer = 0;
139 return (char *) 0;
140 }
141 st->pointer -= st->element_size;
142 return st->data + st->pointer;
143 }
144 \f
145 /*
146 * Maintain a list of the tagnames of the structres.
147 */
148
149 static struct hash_control *tag_hash;
150
151 static void
152 tag_init ()
153 {
154 tag_hash = hash_new ();
155 }
156
157 static void
158 tag_insert (name, symbolP)
159 const char *name;
160 symbolS *symbolP;
161 {
162 const char *error_string;
163
164 if ((error_string = hash_jam (tag_hash, name, (char *) symbolP)))
165 {
166 as_fatal (_("Inserting \"%s\" into structure table failed: %s"),
167 name, error_string);
168 }
169 }
170
171 static symbolS *
172 tag_find (name)
173 char *name;
174 {
175 #ifdef STRIP_UNDERSCORE
176 if (*name == '_')
177 name++;
178 #endif /* STRIP_UNDERSCORE */
179 return (symbolS *) hash_find (tag_hash, name);
180 }
181
182 static symbolS *
183 tag_find_or_make (name)
184 char *name;
185 {
186 symbolS *symbolP;
187
188 if ((symbolP = tag_find (name)) == NULL)
189 {
190 symbolP = symbol_new (name, undefined_section,
191 0, &zero_address_frag);
192
193 tag_insert (S_GET_NAME (symbolP), symbolP);
194 #ifdef BFD_ASSEMBLER
195 symbol_table_insert (symbolP);
196 #endif
197 } /* not found */
198
199 return symbolP;
200 }
201
202 /* We accept the .bss directive to set the section for backward
203 compatibility with earlier versions of gas. */
204
205 static void
206 obj_coff_bss (ignore)
207 int ignore ATTRIBUTE_UNUSED;
208 {
209 if (*input_line_pointer == '\n')
210 subseg_new (".bss", get_absolute_expression ());
211 else
212 s_lcomm (0);
213 }
214
215 /* Handle .weak. This is a GNU extension. */
216
217 static void
218 obj_coff_weak (ignore)
219 int ignore ATTRIBUTE_UNUSED;
220 {
221 char *name;
222 int c;
223 symbolS *symbolP;
224
225 do
226 {
227 name = input_line_pointer;
228 c = get_symbol_end ();
229 symbolP = symbol_find_or_make (name);
230 *input_line_pointer = c;
231 SKIP_WHITESPACE ();
232
233 #if defined BFD_ASSEMBLER || defined S_SET_WEAK
234 S_SET_WEAK (symbolP);
235 #endif
236
237 #ifdef TE_PE
238 S_SET_STORAGE_CLASS (symbolP, C_NT_WEAK);
239 #else
240 S_SET_STORAGE_CLASS (symbolP, C_WEAKEXT);
241 #endif
242
243 if (c == ',')
244 {
245 input_line_pointer++;
246 SKIP_WHITESPACE ();
247 if (*input_line_pointer == '\n')
248 c = '\n';
249 }
250 }
251 while (c == ',');
252
253 demand_empty_rest_of_line ();
254 }
255
256 #ifdef BFD_ASSEMBLER
257
258 static segT fetch_coff_debug_section PARAMS ((void));
259 static void SA_SET_SYM_TAGNDX PARAMS ((symbolS *, symbolS *));
260 static int S_GET_DATA_TYPE PARAMS ((symbolS *));
261 void c_symbol_merge PARAMS ((symbolS *, symbolS *));
262 static void add_lineno PARAMS ((fragS *, addressT, int));
263
264 #define GET_FILENAME_STRING(X) \
265 ((char*) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1])
266
267 /* @@ Ick. */
268 static segT
269 fetch_coff_debug_section ()
270 {
271 static segT debug_section;
272 if (!debug_section)
273 {
274 CONST asymbol *s;
275 s = bfd_make_debug_symbol (stdoutput, (char *) 0, 0);
276 assert (s != 0);
277 debug_section = s->section;
278 }
279 return debug_section;
280 }
281
282 void
283 SA_SET_SYM_ENDNDX (sym, val)
284 symbolS *sym;
285 symbolS *val;
286 {
287 combined_entry_type *entry, *p;
288
289 entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1];
290 p = coffsymbol (symbol_get_bfdsym (val))->native;
291 entry->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = p;
292 entry->fix_end = 1;
293 }
294
295 static void
296 SA_SET_SYM_TAGNDX (sym, val)
297 symbolS *sym;
298 symbolS *val;
299 {
300 combined_entry_type *entry, *p;
301
302 entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1];
303 p = coffsymbol (symbol_get_bfdsym (val))->native;
304 entry->u.auxent.x_sym.x_tagndx.p = p;
305 entry->fix_tag = 1;
306 }
307
308 static int
309 S_GET_DATA_TYPE (sym)
310 symbolS *sym;
311 {
312 return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type;
313 }
314
315 int
316 S_SET_DATA_TYPE (sym, val)
317 symbolS *sym;
318 int val;
319 {
320 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type = val;
321 return val;
322 }
323
324 int
325 S_GET_STORAGE_CLASS (sym)
326 symbolS *sym;
327 {
328 return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass;
329 }
330
331 int
332 S_SET_STORAGE_CLASS (sym, val)
333 symbolS *sym;
334 int val;
335 {
336 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass = val;
337 return val;
338 }
339
340 /* Merge a debug symbol containing debug information into a normal symbol. */
341
342 void
343 c_symbol_merge (debug, normal)
344 symbolS *debug;
345 symbolS *normal;
346 {
347 S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug));
348 S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug));
349
350 if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal))
351 {
352 /* take the most we have */
353 S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
354 }
355
356 if (S_GET_NUMBER_AUXILIARY (debug) > 0)
357 {
358 /* Move all the auxiliary information. */
359 memcpy (SYM_AUXINFO (normal), SYM_AUXINFO (debug),
360 (S_GET_NUMBER_AUXILIARY (debug)
361 * sizeof (*SYM_AUXINFO (debug))));
362 }
363
364 /* Move the debug flags. */
365 SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug));
366 }
367
368 void
369 c_dot_file_symbol (filename)
370 const char *filename;
371 {
372 symbolS *symbolP;
373
374 /* BFD converts filename to a .file symbol with an aux entry. It
375 also handles chaining. */
376 symbolP = symbol_new (filename, bfd_abs_section_ptr, 0, &zero_address_frag);
377
378 S_SET_STORAGE_CLASS (symbolP, C_FILE);
379 S_SET_NUMBER_AUXILIARY (symbolP, 1);
380
381 symbol_get_bfdsym (symbolP)->flags = BSF_DEBUGGING;
382
383 #ifndef NO_LISTING
384 {
385 extern int listing;
386 if (listing)
387 {
388 listing_source_file (filename);
389 }
390 }
391 #endif
392
393 /* Make sure that the symbol is first on the symbol chain */
394 if (symbol_rootP != symbolP)
395 {
396 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
397 symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP);
398 } /* if not first on the list */
399 }
400
401 /* Line number handling */
402
403 struct line_no {
404 struct line_no *next;
405 fragS *frag;
406 alent l;
407 };
408
409 int coff_line_base;
410
411 /* Symbol of last function, which we should hang line#s off of. */
412 static symbolS *line_fsym;
413
414 #define in_function() (line_fsym != 0)
415 #define clear_function() (line_fsym = 0)
416 #define set_function(F) (line_fsym = (F), coff_add_linesym (F))
417
418 \f
419 void
420 coff_obj_symbol_new_hook (symbolP)
421 symbolS *symbolP;
422 {
423 long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type);
424 char * s = (char *) xmalloc (sz);
425
426 memset (s, 0, sz);
427 coffsymbol (symbol_get_bfdsym (symbolP))->native = (combined_entry_type *) s;
428
429 S_SET_DATA_TYPE (symbolP, T_NULL);
430 S_SET_STORAGE_CLASS (symbolP, 0);
431 S_SET_NUMBER_AUXILIARY (symbolP, 0);
432
433 if (S_IS_STRING (symbolP))
434 SF_SET_STRING (symbolP);
435
436 if (S_IS_LOCAL (symbolP))
437 SF_SET_LOCAL (symbolP);
438 }
439
440 \f
441 /*
442 * Handle .ln directives.
443 */
444
445 static symbolS *current_lineno_sym;
446 static struct line_no *line_nos;
447 /* @@ Blindly assume all .ln directives will be in the .text section... */
448 int coff_n_line_nos;
449
450 static void
451 add_lineno (frag, offset, num)
452 fragS *frag;
453 addressT offset;
454 int num;
455 {
456 struct line_no *new_line =
457 (struct line_no *) xmalloc (sizeof (struct line_no));
458 if (!current_lineno_sym)
459 {
460 abort ();
461 }
462
463 #ifndef OBJ_XCOFF
464 /* The native aix assembler accepts negative line number */
465
466 if (num <= 0)
467 {
468 /* Zero is used as an end marker in the file. */
469 as_warn (_("Line numbers must be positive integers\n"));
470 num = 1;
471 }
472 #endif /* OBJ_XCOFF */
473 new_line->next = line_nos;
474 new_line->frag = frag;
475 new_line->l.line_number = num;
476 new_line->l.u.offset = offset;
477 line_nos = new_line;
478 coff_n_line_nos++;
479 }
480
481 void
482 coff_add_linesym (sym)
483 symbolS *sym;
484 {
485 if (line_nos)
486 {
487 coffsymbol (symbol_get_bfdsym (current_lineno_sym))->lineno =
488 (alent *) line_nos;
489 coff_n_line_nos++;
490 line_nos = 0;
491 }
492 current_lineno_sym = sym;
493 }
494
495 static void
496 obj_coff_ln (appline)
497 int appline;
498 {
499 int l;
500
501 if (! appline && def_symbol_in_progress != NULL)
502 {
503 as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
504 demand_empty_rest_of_line ();
505 return;
506 }
507
508 l = get_absolute_expression ();
509
510 /* If there is no lineno symbol, treat a .ln
511 directive as if it were a .appline directive. */
512 if (appline || current_lineno_sym == NULL)
513 new_logical_line ((char *) NULL, l - 1);
514 else
515 add_lineno (frag_now, frag_now_fix (), l);
516
517 #ifndef NO_LISTING
518 {
519 extern int listing;
520
521 if (listing)
522 {
523 if (! appline)
524 l += coff_line_base - 1;
525 listing_source_line (l);
526 }
527 }
528 #endif
529
530 demand_empty_rest_of_line ();
531 }
532
533 /* .loc is essentially the same as .ln; parse it for assembler
534 compatibility. */
535
536 static void
537 obj_coff_loc (ignore)
538 int ignore ATTRIBUTE_UNUSED;
539 {
540 int lineno;
541
542 /* FIXME: Why do we need this check? We need it for ECOFF, but why
543 do we need it for COFF? */
544 if (now_seg != text_section)
545 {
546 as_warn (_(".loc outside of .text"));
547 demand_empty_rest_of_line ();
548 return;
549 }
550
551 if (def_symbol_in_progress != NULL)
552 {
553 as_warn (_(".loc pseudo-op inside .def/.endef: ignored."));
554 demand_empty_rest_of_line ();
555 return;
556 }
557
558 /* Skip the file number. */
559 SKIP_WHITESPACE ();
560 get_absolute_expression ();
561 SKIP_WHITESPACE ();
562
563 lineno = get_absolute_expression ();
564
565 #ifndef NO_LISTING
566 {
567 extern int listing;
568
569 if (listing)
570 {
571 lineno += coff_line_base - 1;
572 listing_source_line (lineno);
573 }
574 }
575 #endif
576
577 demand_empty_rest_of_line ();
578
579 add_lineno (frag_now, frag_now_fix (), lineno);
580 }
581
582 /* Handle the .ident pseudo-op. */
583
584 static void
585 obj_coff_ident (ignore)
586 int ignore ATTRIBUTE_UNUSED;
587 {
588 segT current_seg = now_seg;
589 subsegT current_subseg = now_subseg;
590
591 #ifdef TE_PE
592 {
593 segT sec;
594
595 /* We could put it in .comment, but that creates an extra section
596 that shouldn't be loaded into memory, which requires linker
597 changes... For now, until proven otherwise, use .rdata. */
598 sec = subseg_new (".rdata$zzz", 0);
599 bfd_set_section_flags (stdoutput, sec,
600 ((SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA)
601 & bfd_applicable_section_flags (stdoutput)));
602 }
603 #else
604 subseg_new (".comment", 0);
605 #endif
606
607 stringer (1);
608 subseg_set (current_seg, current_subseg);
609 }
610
611 /*
612 * def()
613 *
614 * Handle .def directives.
615 *
616 * One might ask : why can't we symbol_new if the symbol does not
617 * already exist and fill it with debug information. Because of
618 * the C_EFCN special symbol. It would clobber the value of the
619 * function symbol before we have a chance to notice that it is
620 * a C_EFCN. And a second reason is that the code is more clear this
621 * way. (at least I think it is :-).
622 *
623 */
624
625 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
626 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
627 *input_line_pointer == '\t') \
628 input_line_pointer++;
629
630 static void
631 obj_coff_def (what)
632 int what ATTRIBUTE_UNUSED;
633 {
634 char name_end; /* Char after the end of name */
635 char *symbol_name; /* Name of the debug symbol */
636 char *symbol_name_copy; /* Temporary copy of the name */
637 unsigned int symbol_name_length;
638
639 if (def_symbol_in_progress != NULL)
640 {
641 as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
642 demand_empty_rest_of_line ();
643 return;
644 } /* if not inside .def/.endef */
645
646 SKIP_WHITESPACES ();
647
648 symbol_name = input_line_pointer;
649 #ifdef STRIP_UNDERSCORE
650 if (symbol_name[0] == '_' && symbol_name[1] != 0)
651 symbol_name++;
652 #endif /* STRIP_UNDERSCORE */
653
654 name_end = get_symbol_end ();
655 symbol_name_length = strlen (symbol_name);
656 symbol_name_copy = xmalloc (symbol_name_length + 1);
657 strcpy (symbol_name_copy, symbol_name);
658 #ifdef tc_canonicalize_symbol_name
659 symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy);
660 #endif
661
662 /* Initialize the new symbol */
663 def_symbol_in_progress = symbol_make (symbol_name_copy);
664 symbol_set_frag (def_symbol_in_progress, &zero_address_frag);
665 S_SET_VALUE (def_symbol_in_progress, 0);
666
667 if (S_IS_STRING (def_symbol_in_progress))
668 SF_SET_STRING (def_symbol_in_progress);
669
670 *input_line_pointer = name_end;
671
672 demand_empty_rest_of_line ();
673 }
674
675 unsigned int dim_index;
676
677 static void
678 obj_coff_endef (ignore)
679 int ignore ATTRIBUTE_UNUSED;
680 {
681 symbolS *symbolP = NULL;
682
683 /* DIM BUG FIX sac@cygnus.com */
684 dim_index = 0;
685 if (def_symbol_in_progress == NULL)
686 {
687 as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
688 demand_empty_rest_of_line ();
689 return;
690 } /* if not inside .def/.endef */
691
692 /* Set the section number according to storage class. */
693 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress))
694 {
695 case C_STRTAG:
696 case C_ENTAG:
697 case C_UNTAG:
698 SF_SET_TAG (def_symbol_in_progress);
699 /* intentional fallthrough */
700 case C_FILE:
701 case C_TPDEF:
702 SF_SET_DEBUG (def_symbol_in_progress);
703 S_SET_SEGMENT (def_symbol_in_progress, fetch_coff_debug_section ());
704 break;
705
706 case C_EFCN:
707 SF_SET_LOCAL (def_symbol_in_progress); /* Do not emit this symbol. */
708 /* intentional fallthrough */
709 case C_BLOCK:
710 SF_SET_PROCESS (def_symbol_in_progress); /* Will need processing before writing */
711 /* intentional fallthrough */
712 case C_FCN:
713 {
714 CONST char *name;
715 S_SET_SEGMENT (def_symbol_in_progress, text_section);
716
717 name = S_GET_NAME (def_symbol_in_progress);
718 if (name[0] == '.' && name[2] == 'f' && name[3] == '\0')
719 {
720 switch (name[1])
721 {
722 case 'b':
723 /* .bf */
724 if (! in_function ())
725 as_warn (_("`%s' symbol without preceding function"), name);
726 /* Will need relocating. */
727 SF_SET_PROCESS (def_symbol_in_progress);
728 clear_function ();
729 break;
730 #ifdef TE_PE
731 case 'e':
732 /* .ef */
733 /* The MS compilers output the actual endline, not the
734 function-relative one... we want to match without
735 changing the assembler input. */
736 SA_SET_SYM_LNNO (def_symbol_in_progress,
737 (SA_GET_SYM_LNNO (def_symbol_in_progress)
738 + coff_line_base));
739 break;
740 #endif
741 }
742 }
743 }
744 break;
745
746 #ifdef C_AUTOARG
747 case C_AUTOARG:
748 #endif /* C_AUTOARG */
749 case C_AUTO:
750 case C_REG:
751 case C_ARG:
752 case C_REGPARM:
753 case C_FIELD:
754
755 /* According to the COFF documentation:
756
757 http://osr5doc.sco.com:1996/topics/COFF_SectNumFld.html
758
759 A special section number (-2) marks symbolic debugging symbols,
760 including structure/union/enumeration tag names, typedefs, and
761 the name of the file. A section number of -1 indicates that the
762 symbol has a value but is not relocatable. Examples of
763 absolute-valued symbols include automatic and register variables,
764 function arguments, and .eos symbols.
765
766 But from Ian Lance Taylor:
767
768 http://sources.redhat.com/ml/binutils/2000-08/msg00202.html
769
770 the actual tools all marked them as section -1. So the GNU COFF
771 assembler follows historical COFF assemblers.
772
773 However, it causes problems for djgpp
774
775 http://sources.redhat.com/ml/binutils/2000-08/msg00210.html
776
777 By defining STRICTCOFF, a COFF port can make the assembler to
778 follow the documented behavior. */
779 #ifdef STRICTCOFF
780 case C_MOS:
781 case C_MOE:
782 case C_MOU:
783 case C_EOS:
784 #endif
785 SF_SET_DEBUG (def_symbol_in_progress);
786 S_SET_SEGMENT (def_symbol_in_progress, absolute_section);
787 break;
788
789 #ifndef STRICTCOFF
790 case C_MOS:
791 case C_MOE:
792 case C_MOU:
793 case C_EOS:
794 S_SET_SEGMENT (def_symbol_in_progress, absolute_section);
795 break;
796 #endif
797
798 case C_EXT:
799 case C_WEAKEXT:
800 #ifdef TE_PE
801 case C_NT_WEAK:
802 #endif
803 case C_STAT:
804 case C_LABEL:
805 /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
806 break;
807
808 default:
809 case C_USTATIC:
810 case C_EXTDEF:
811 case C_ULABEL:
812 as_warn (_("unexpected storage class %d"),
813 S_GET_STORAGE_CLASS (def_symbol_in_progress));
814 break;
815 } /* switch on storage class */
816
817 /* Now that we have built a debug symbol, try to find if we should
818 merge with an existing symbol or not. If a symbol is C_EFCN or
819 absolute_section or untagged SEG_DEBUG it never merges. We also
820 don't merge labels, which are in a different namespace, nor
821 symbols which have not yet been defined since they are typically
822 unique, nor do we merge tags with non-tags. */
823
824 /* Two cases for functions. Either debug followed by definition or
825 definition followed by debug. For definition first, we will
826 merge the debug symbol into the definition. For debug first, the
827 lineno entry MUST point to the definition function or else it
828 will point off into space when obj_crawl_symbol_chain() merges
829 the debug symbol into the real symbol. Therefor, let's presume
830 the debug symbol is a real function reference. */
831
832 /* FIXME-SOON If for some reason the definition label/symbol is
833 never seen, this will probably leave an undefined symbol at link
834 time. */
835
836 if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
837 || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL
838 || (!strcmp (bfd_get_section_name (stdoutput,
839 S_GET_SEGMENT (def_symbol_in_progress)),
840 "*DEBUG*")
841 && !SF_GET_TAG (def_symbol_in_progress))
842 || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section
843 || ! symbol_constant_p (def_symbol_in_progress)
844 || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress),
845 DO_NOT_STRIP)) == NULL
846 || SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP))
847 {
848 /* If it already is at the end of the symbol list, do nothing */
849 if (def_symbol_in_progress != symbol_lastP)
850 {
851 symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
852 symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
853 &symbol_lastP);
854 }
855 }
856 else
857 {
858 /* This symbol already exists, merge the newly created symbol
859 into the old one. This is not mandatory. The linker can
860 handle duplicate symbols correctly. But I guess that it save
861 a *lot* of space if the assembly file defines a lot of
862 symbols. [loic] */
863
864 /* The debug entry (def_symbol_in_progress) is merged into the
865 previous definition. */
866
867 c_symbol_merge (def_symbol_in_progress, symbolP);
868 symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
869
870 def_symbol_in_progress = symbolP;
871
872 if (SF_GET_FUNCTION (def_symbol_in_progress)
873 || SF_GET_TAG (def_symbol_in_progress)
874 || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_STAT)
875 {
876 /* For functions, and tags, and static symbols, the symbol
877 *must* be where the debug symbol appears. Move the
878 existing symbol to the current place. */
879 /* If it already is at the end of the symbol list, do nothing */
880 if (def_symbol_in_progress != symbol_lastP)
881 {
882 symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
883 symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP);
884 }
885 }
886 }
887
888 if (SF_GET_TAG (def_symbol_in_progress))
889 {
890 symbolS *oldtag;
891
892 oldtag = symbol_find_base (S_GET_NAME (def_symbol_in_progress),
893 DO_NOT_STRIP);
894 if (oldtag == NULL || ! SF_GET_TAG (oldtag))
895 tag_insert (S_GET_NAME (def_symbol_in_progress),
896 def_symbol_in_progress);
897 }
898
899 if (SF_GET_FUNCTION (def_symbol_in_progress))
900 {
901 know (sizeof (def_symbol_in_progress) <= sizeof (long));
902 set_function (def_symbol_in_progress);
903 SF_SET_PROCESS (def_symbol_in_progress);
904
905 if (symbolP == NULL)
906 {
907 /* That is, if this is the first time we've seen the
908 function... */
909 symbol_table_insert (def_symbol_in_progress);
910 } /* definition follows debug */
911 } /* Create the line number entry pointing to the function being defined */
912
913 def_symbol_in_progress = NULL;
914 demand_empty_rest_of_line ();
915 }
916
917 static void
918 obj_coff_dim (ignore)
919 int ignore ATTRIBUTE_UNUSED;
920 {
921 int dim_index;
922
923 if (def_symbol_in_progress == NULL)
924 {
925 as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
926 demand_empty_rest_of_line ();
927 return;
928 } /* if not inside .def/.endef */
929
930 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
931
932 for (dim_index = 0; dim_index < DIMNUM; dim_index++)
933 {
934 SKIP_WHITESPACES ();
935 SA_SET_SYM_DIMEN (def_symbol_in_progress, dim_index,
936 get_absolute_expression ());
937
938 switch (*input_line_pointer)
939 {
940 case ',':
941 input_line_pointer++;
942 break;
943
944 default:
945 as_warn (_("badly formed .dim directive ignored"));
946 /* intentional fallthrough */
947 case '\n':
948 case ';':
949 dim_index = DIMNUM;
950 break;
951 }
952 }
953
954 demand_empty_rest_of_line ();
955 }
956
957 static void
958 obj_coff_line (ignore)
959 int ignore ATTRIBUTE_UNUSED;
960 {
961 int this_base;
962
963 if (def_symbol_in_progress == NULL)
964 {
965 /* Probably stabs-style line? */
966 obj_coff_ln (0);
967 return;
968 }
969
970 this_base = get_absolute_expression ();
971 if (!strcmp (".bf", S_GET_NAME (def_symbol_in_progress)))
972 coff_line_base = this_base;
973
974 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
975 SA_SET_SYM_LNNO (def_symbol_in_progress, this_base);
976
977 demand_empty_rest_of_line ();
978
979 #ifndef NO_LISTING
980 if (strcmp (".bf", S_GET_NAME (def_symbol_in_progress)) == 0)
981 {
982 extern int listing;
983
984 if (listing)
985 listing_source_line ((unsigned int) this_base);
986 }
987 #endif
988 }
989
990 static void
991 obj_coff_size (ignore)
992 int ignore ATTRIBUTE_UNUSED;
993 {
994 if (def_symbol_in_progress == NULL)
995 {
996 as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
997 demand_empty_rest_of_line ();
998 return;
999 } /* if not inside .def/.endef */
1000
1001 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
1002 SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ());
1003 demand_empty_rest_of_line ();
1004 }
1005
1006 static void
1007 obj_coff_scl (ignore)
1008 int ignore ATTRIBUTE_UNUSED;
1009 {
1010 if (def_symbol_in_progress == NULL)
1011 {
1012 as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
1013 demand_empty_rest_of_line ();
1014 return;
1015 } /* if not inside .def/.endef */
1016
1017 S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ());
1018 demand_empty_rest_of_line ();
1019 }
1020
1021 static void
1022 obj_coff_tag (ignore)
1023 int ignore ATTRIBUTE_UNUSED;
1024 {
1025 char *symbol_name;
1026 char name_end;
1027
1028 if (def_symbol_in_progress == NULL)
1029 {
1030 as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
1031 demand_empty_rest_of_line ();
1032 return;
1033 }
1034
1035 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
1036 symbol_name = input_line_pointer;
1037 name_end = get_symbol_end ();
1038
1039 #ifdef tc_canonicalize_symbol_name
1040 symbol_name = tc_canonicalize_symbol_name (symbol_name);
1041 #endif
1042
1043 /* Assume that the symbol referred to by .tag is always defined.
1044 This was a bad assumption. I've added find_or_make. xoxorich. */
1045 SA_SET_SYM_TAGNDX (def_symbol_in_progress,
1046 tag_find_or_make (symbol_name));
1047 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
1048 {
1049 as_warn (_("tag not found for .tag %s"), symbol_name);
1050 } /* not defined */
1051
1052 SF_SET_TAGGED (def_symbol_in_progress);
1053 *input_line_pointer = name_end;
1054
1055 demand_empty_rest_of_line ();
1056 }
1057
1058 static void
1059 obj_coff_type (ignore)
1060 int ignore ATTRIBUTE_UNUSED;
1061 {
1062 if (def_symbol_in_progress == NULL)
1063 {
1064 as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
1065 demand_empty_rest_of_line ();
1066 return;
1067 } /* if not inside .def/.endef */
1068
1069 S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ());
1070
1071 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) &&
1072 S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF)
1073 {
1074 SF_SET_FUNCTION (def_symbol_in_progress);
1075 } /* is a function */
1076
1077 demand_empty_rest_of_line ();
1078 }
1079
1080 static void
1081 obj_coff_val (ignore)
1082 int ignore ATTRIBUTE_UNUSED;
1083 {
1084 if (def_symbol_in_progress == NULL)
1085 {
1086 as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
1087 demand_empty_rest_of_line ();
1088 return;
1089 } /* if not inside .def/.endef */
1090
1091 if (is_name_beginner (*input_line_pointer))
1092 {
1093 char *symbol_name = input_line_pointer;
1094 char name_end = get_symbol_end ();
1095
1096 #ifdef tc_canonicalize_symbol_name
1097 symbol_name = tc_canonicalize_symbol_name (symbol_name);
1098 #endif
1099 if (!strcmp (symbol_name, "."))
1100 {
1101 symbol_set_frag (def_symbol_in_progress, frag_now);
1102 S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
1103 /* If the .val is != from the .def (e.g. statics) */
1104 }
1105 else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name))
1106 {
1107 expressionS exp;
1108
1109 exp.X_op = O_symbol;
1110 exp.X_add_symbol = symbol_find_or_make (symbol_name);
1111 exp.X_op_symbol = NULL;
1112 exp.X_add_number = 0;
1113 symbol_set_value_expression (def_symbol_in_progress, &exp);
1114
1115 /* If the segment is undefined when the forward reference is
1116 resolved, then copy the segment id from the forward
1117 symbol. */
1118 SF_SET_GET_SEGMENT (def_symbol_in_progress);
1119
1120 /* FIXME: gcc can generate address expressions here in
1121 unusual cases (search for "obscure" in sdbout.c). We
1122 just ignore the offset here, thus generating incorrect
1123 debugging information. We ignore the rest of the line
1124 just below. */
1125 }
1126 /* Otherwise, it is the name of a non debug symbol and its value
1127 will be calculated later. */
1128 *input_line_pointer = name_end;
1129 }
1130 else
1131 {
1132 S_SET_VALUE (def_symbol_in_progress, get_absolute_expression ());
1133 } /* if symbol based */
1134
1135 demand_empty_rest_of_line ();
1136 }
1137
1138 void
1139 coff_obj_read_begin_hook ()
1140 {
1141 /* These had better be the same. Usually 18 bytes. */
1142 #ifndef BFD_HEADERS
1143 know (sizeof (SYMENT) == sizeof (AUXENT));
1144 know (SYMESZ == AUXESZ);
1145 #endif
1146 tag_init ();
1147 }
1148
1149 symbolS *coff_last_function;
1150 static symbolS *coff_last_bf;
1151
1152 void
1153 coff_frob_symbol (symp, punt)
1154 symbolS *symp;
1155 int *punt;
1156 {
1157 static symbolS *last_tagP;
1158 static stack *block_stack;
1159 static symbolS *set_end;
1160 symbolS *next_set_end = NULL;
1161
1162 if (symp == &abs_symbol)
1163 {
1164 *punt = 1;
1165 return;
1166 }
1167
1168 if (current_lineno_sym)
1169 coff_add_linesym ((symbolS *) 0);
1170
1171 if (!block_stack)
1172 block_stack = stack_init (512, sizeof (symbolS*));
1173
1174 if (S_IS_WEAK (symp))
1175 {
1176 #ifdef TE_PE
1177 S_SET_STORAGE_CLASS (symp, C_NT_WEAK);
1178 #else
1179 S_SET_STORAGE_CLASS (symp, C_WEAKEXT);
1180 #endif
1181 }
1182
1183 if (!S_IS_DEFINED (symp)
1184 && !S_IS_WEAK (symp)
1185 && S_GET_STORAGE_CLASS (symp) != C_STAT)
1186 S_SET_STORAGE_CLASS (symp, C_EXT);
1187
1188 if (!SF_GET_DEBUG (symp))
1189 {
1190 symbolS * real;
1191
1192 if (!SF_GET_LOCAL (symp)
1193 && !SF_GET_STATICS (symp)
1194 && S_GET_STORAGE_CLASS (symp) != C_LABEL
1195 && symbol_constant_p(symp)
1196 && (real = symbol_find_base (S_GET_NAME (symp), DO_NOT_STRIP))
1197 && S_GET_STORAGE_CLASS (real) == C_NULL
1198 && real != symp)
1199 {
1200 c_symbol_merge (symp, real);
1201 *punt = 1;
1202 return;
1203 }
1204
1205 if (!S_IS_DEFINED (symp) && !SF_GET_LOCAL (symp))
1206 {
1207 assert (S_GET_VALUE (symp) == 0);
1208 S_SET_EXTERNAL (symp);
1209 }
1210 else if (S_GET_STORAGE_CLASS (symp) == C_NULL)
1211 {
1212 if (S_GET_SEGMENT (symp) == text_section
1213 && symp != seg_info (text_section)->sym)
1214 S_SET_STORAGE_CLASS (symp, C_LABEL);
1215 else
1216 S_SET_STORAGE_CLASS (symp, C_STAT);
1217 }
1218
1219 if (SF_GET_PROCESS (symp))
1220 {
1221 if (S_GET_STORAGE_CLASS (symp) == C_BLOCK)
1222 {
1223 if (!strcmp (S_GET_NAME (symp), ".bb"))
1224 stack_push (block_stack, (char *) &symp);
1225 else
1226 {
1227 symbolS *begin;
1228
1229 begin = *(symbolS **) stack_pop (block_stack);
1230 if (begin == 0)
1231 as_warn (_("mismatched .eb"));
1232 else
1233 next_set_end = begin;
1234 }
1235 }
1236
1237 if (coff_last_function == 0 && SF_GET_FUNCTION (symp))
1238 {
1239 union internal_auxent *auxp;
1240
1241 coff_last_function = symp;
1242 if (S_GET_NUMBER_AUXILIARY (symp) < 1)
1243 S_SET_NUMBER_AUXILIARY (symp, 1);
1244 auxp = SYM_AUXENT (symp);
1245 memset (auxp->x_sym.x_fcnary.x_ary.x_dimen, 0,
1246 sizeof (auxp->x_sym.x_fcnary.x_ary.x_dimen));
1247 }
1248
1249 if (S_GET_STORAGE_CLASS (symp) == C_EFCN)
1250 {
1251 if (coff_last_function == 0)
1252 as_fatal (_("C_EFCN symbol out of scope"));
1253 SA_SET_SYM_FSIZE (coff_last_function,
1254 (long) (S_GET_VALUE (symp)
1255 - S_GET_VALUE (coff_last_function)));
1256 next_set_end = coff_last_function;
1257 coff_last_function = 0;
1258 }
1259 }
1260
1261 if (S_IS_EXTERNAL (symp))
1262 S_SET_STORAGE_CLASS (symp, C_EXT);
1263 else if (SF_GET_LOCAL (symp))
1264 *punt = 1;
1265
1266 if (SF_GET_FUNCTION (symp))
1267 symbol_get_bfdsym (symp)->flags |= BSF_FUNCTION;
1268
1269 /* more ... */
1270 }
1271
1272 /* Double check weak symbols. */
1273 if (S_IS_WEAK (symp) && S_IS_COMMON (symp))
1274 as_bad (_("Symbol `%s' can not be both weak and common"),
1275 S_GET_NAME (symp));
1276
1277 if (SF_GET_TAG (symp))
1278 last_tagP = symp;
1279 else if (S_GET_STORAGE_CLASS (symp) == C_EOS)
1280 next_set_end = last_tagP;
1281
1282 #ifdef OBJ_XCOFF
1283 /* This is pretty horrible, but we have to set *punt correctly in
1284 order to call SA_SET_SYM_ENDNDX correctly. */
1285 if (! symbol_used_in_reloc_p (symp)
1286 && ((symbol_get_bfdsym (symp)->flags & BSF_SECTION_SYM) != 0
1287 || (! S_IS_EXTERNAL (symp)
1288 && ! symbol_get_tc (symp)->output
1289 && S_GET_STORAGE_CLASS (symp) != C_FILE)))
1290 *punt = 1;
1291 #endif
1292
1293 if (set_end != (symbolS *) NULL
1294 && ! *punt
1295 && ((symbol_get_bfdsym (symp)->flags & BSF_NOT_AT_END) != 0
1296 || (S_IS_DEFINED (symp)
1297 && ! S_IS_COMMON (symp)
1298 && (! S_IS_EXTERNAL (symp) || SF_GET_FUNCTION (symp)))))
1299 {
1300 SA_SET_SYM_ENDNDX (set_end, symp);
1301 set_end = NULL;
1302 }
1303
1304 if (next_set_end != NULL)
1305 {
1306 if (set_end != NULL)
1307 as_warn ("Warning: internal error: forgetting to set endndx of %s",
1308 S_GET_NAME (set_end));
1309 set_end = next_set_end;
1310 }
1311
1312 #ifndef OBJ_XCOFF
1313 if (! *punt
1314 && S_GET_STORAGE_CLASS (symp) == C_FCN
1315 && strcmp (S_GET_NAME (symp), ".bf") == 0)
1316 {
1317 if (coff_last_bf != NULL)
1318 SA_SET_SYM_ENDNDX (coff_last_bf, symp);
1319 coff_last_bf = symp;
1320 }
1321 #endif
1322 if (coffsymbol (symbol_get_bfdsym (symp))->lineno)
1323 {
1324 int i;
1325 struct line_no *lptr;
1326 alent *l;
1327
1328 lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno;
1329 for (i = 0; lptr; lptr = lptr->next)
1330 i++;
1331 lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno;
1332
1333 /* We need i entries for line numbers, plus 1 for the first
1334 entry which BFD will override, plus 1 for the last zero
1335 entry (a marker for BFD). */
1336 l = (alent *) xmalloc ((i + 2) * sizeof (alent));
1337 coffsymbol (symbol_get_bfdsym (symp))->lineno = l;
1338 l[i + 1].line_number = 0;
1339 l[i + 1].u.sym = NULL;
1340 for (; i > 0; i--)
1341 {
1342 if (lptr->frag)
1343 lptr->l.u.offset += lptr->frag->fr_address / OCTETS_PER_BYTE;
1344 l[i] = lptr->l;
1345 lptr = lptr->next;
1346 }
1347 }
1348 }
1349
1350 void
1351 coff_adjust_section_syms (abfd, sec, x)
1352 bfd *abfd ATTRIBUTE_UNUSED;
1353 asection *sec;
1354 PTR x ATTRIBUTE_UNUSED;
1355 {
1356 symbolS *secsym;
1357 segment_info_type *seginfo = seg_info (sec);
1358 int nlnno, nrelocs = 0;
1359
1360 /* RS/6000 gas creates a .debug section manually in ppc_frob_file in
1361 tc-ppc.c. Do not get confused by it. */
1362 if (seginfo == NULL)
1363 return;
1364
1365 if (!strcmp (sec->name, ".text"))
1366 nlnno = coff_n_line_nos;
1367 else
1368 nlnno = 0;
1369 {
1370 /* @@ Hope that none of the fixups expand to more than one reloc
1371 entry... */
1372 fixS *fixp = seginfo->fix_root;
1373 while (fixp)
1374 {
1375 if (! fixp->fx_done)
1376 nrelocs++;
1377 fixp = fixp->fx_next;
1378 }
1379 }
1380 if (bfd_get_section_size_before_reloc (sec) == 0
1381 && nrelocs == 0
1382 && nlnno == 0
1383 && sec != text_section
1384 && sec != data_section
1385 && sec != bss_section)
1386 return;
1387 secsym = section_symbol (sec);
1388 /* This is an estimate; we'll plug in the real value using
1389 SET_SECTION_RELOCS later */
1390 SA_SET_SCN_NRELOC (secsym, nrelocs);
1391 SA_SET_SCN_NLINNO (secsym, nlnno);
1392 }
1393
1394 void
1395 coff_frob_file_after_relocs ()
1396 {
1397 bfd_map_over_sections (stdoutput, coff_adjust_section_syms, (char*) 0);
1398 }
1399
1400 /* Implement the .section pseudo op:
1401 .section name {, "flags"}
1402 ^ ^
1403 | +--- optional flags: 'b' for bss
1404 | 'i' for info
1405 +-- section name 'l' for lib
1406 'n' for noload
1407 'o' for over
1408 'w' for data
1409 'd' (apparently m88k for data)
1410 'x' for text
1411 'r' for read-only data
1412 's' for shared data (PE)
1413 But if the argument is not a quoted string, treat it as a
1414 subsegment number.
1415
1416 Note the 'a' flag is silently ignored. This allows the same
1417 .section directive to be parsed in both ELF and COFF formats. */
1418
1419 void
1420 obj_coff_section (ignore)
1421 int ignore ATTRIBUTE_UNUSED;
1422 {
1423 /* Strip out the section name */
1424 char *section_name;
1425 char c;
1426 char *name;
1427 unsigned int exp;
1428 flagword flags, oldflags;
1429 asection *sec;
1430
1431 if (flag_mri)
1432 {
1433 char type;
1434
1435 s_mri_sect (&type);
1436 return;
1437 }
1438
1439 section_name = input_line_pointer;
1440 c = get_symbol_end ();
1441
1442 name = xmalloc (input_line_pointer - section_name + 1);
1443 strcpy (name, section_name);
1444
1445 *input_line_pointer = c;
1446
1447 SKIP_WHITESPACE ();
1448
1449 exp = 0;
1450 flags = SEC_NO_FLAGS;
1451
1452 if (*input_line_pointer == ',')
1453 {
1454 ++input_line_pointer;
1455 SKIP_WHITESPACE ();
1456 if (*input_line_pointer != '"')
1457 exp = get_absolute_expression ();
1458 else
1459 {
1460 ++input_line_pointer;
1461 while (*input_line_pointer != '"'
1462 && ! is_end_of_line[(unsigned char) *input_line_pointer])
1463 {
1464 switch (*input_line_pointer)
1465 {
1466 case 'b': flags |= SEC_ALLOC; flags &=~ SEC_LOAD; break;
1467 case 'n': flags &=~ SEC_LOAD; flags |= SEC_NEVER_LOAD; break;
1468 case 'd': flags |= SEC_DATA | SEC_LOAD; /* fall through */
1469 case 'w': flags &=~ SEC_READONLY; break;
1470 case 'a': break; /* For compatability with ELF. */
1471 case 'x': flags |= SEC_CODE | SEC_LOAD; break;
1472 case 'r': flags |= SEC_READONLY; break;
1473 case 's': flags |= SEC_SHARED; break;
1474
1475 case 'i': /* STYP_INFO */
1476 case 'l': /* STYP_LIB */
1477 case 'o': /* STYP_OVER */
1478 as_warn (_("unsupported section attribute '%c'"),
1479 *input_line_pointer);
1480 break;
1481
1482 default:
1483 as_warn(_("unknown section attribute '%c'"),
1484 *input_line_pointer);
1485 break;
1486 }
1487 ++input_line_pointer;
1488 }
1489 if (*input_line_pointer == '"')
1490 ++input_line_pointer;
1491 }
1492 }
1493
1494 sec = subseg_new (name, (subsegT) exp);
1495
1496 oldflags = bfd_get_section_flags (stdoutput, sec);
1497 if (oldflags == SEC_NO_FLAGS)
1498 {
1499 /* Set section flags for a new section just created by subseg_new.
1500 Provide a default if no flags were parsed. */
1501 if (flags == SEC_NO_FLAGS)
1502 flags = TC_COFF_SECTION_DEFAULT_ATTRIBUTES;
1503
1504 #ifdef COFF_LONG_SECTION_NAMES
1505 /* Add SEC_LINK_ONCE and SEC_LINK_DUPLICATES_DISCARD to .gnu.linkonce
1506 sections so adjust_reloc_syms in write.c will correctly handle
1507 relocs which refer to non-local symbols in these sections. */
1508 if (strncmp (name, ".gnu.linkonce", sizeof (".gnu.linkonce") - 1) == 0)
1509 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1510 #endif
1511
1512 if (! bfd_set_section_flags (stdoutput, sec, flags))
1513 as_warn (_("error setting flags for \"%s\": %s"),
1514 bfd_section_name (stdoutput, sec),
1515 bfd_errmsg (bfd_get_error ()));
1516 }
1517 else if (flags != SEC_NO_FLAGS)
1518 {
1519 /* This section's attributes have already been set. Warn if the
1520 attributes don't match. */
1521 flagword matchflags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
1522 | SEC_DATA | SEC_SHARED | SEC_NEVER_LOAD);
1523 if ((flags ^ oldflags) & matchflags)
1524 as_warn (_("Ignoring changed section attributes for %s"), name);
1525 }
1526
1527 demand_empty_rest_of_line ();
1528 }
1529
1530 void
1531 coff_adjust_symtab ()
1532 {
1533 if (symbol_rootP == NULL
1534 || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE)
1535 c_dot_file_symbol ("fake");
1536 }
1537
1538 void
1539 coff_frob_section (sec)
1540 segT sec;
1541 {
1542 segT strsec;
1543 char *p;
1544 fragS *fragp;
1545 bfd_vma size, n_entries, mask;
1546 bfd_vma align_power = (bfd_vma)sec->alignment_power + OCTETS_PER_BYTE_POWER;
1547
1548 /* The COFF back end in BFD requires that all section sizes be
1549 rounded up to multiples of the corresponding section alignments,
1550 supposedly because standard COFF has no other way of encoding alignment
1551 for sections. If your COFF flavor has a different way of encoding
1552 section alignment, then skip this step, as TICOFF does. */
1553 size = bfd_get_section_size_before_reloc (sec);
1554 mask = ((bfd_vma) 1 << align_power) - 1;
1555 #if !defined(TICOFF)
1556 if (size & mask)
1557 {
1558 bfd_vma new_size;
1559 fragS *last;
1560
1561 new_size = (size + mask) & ~mask;
1562 bfd_set_section_size (stdoutput, sec, new_size);
1563
1564 /* If the size had to be rounded up, add some padding in
1565 the last non-empty frag. */
1566 fragp = seg_info (sec)->frchainP->frch_root;
1567 last = seg_info (sec)->frchainP->frch_last;
1568 while (fragp->fr_next != last)
1569 fragp = fragp->fr_next;
1570 last->fr_address = size;
1571 fragp->fr_offset += new_size - size;
1572 }
1573 #endif
1574
1575 /* If the section size is non-zero, the section symbol needs an aux
1576 entry associated with it, indicating the size. We don't know
1577 all the values yet; coff_frob_symbol will fill them in later. */
1578 #ifndef TICOFF
1579 if (size != 0
1580 || sec == text_section
1581 || sec == data_section
1582 || sec == bss_section)
1583 #endif
1584 {
1585 symbolS *secsym = section_symbol (sec);
1586
1587 S_SET_STORAGE_CLASS (secsym, C_STAT);
1588 S_SET_NUMBER_AUXILIARY (secsym, 1);
1589 SF_SET_STATICS (secsym);
1590 SA_SET_SCN_SCNLEN (secsym, size);
1591 }
1592
1593 /* @@ these should be in a "stabs.h" file, or maybe as.h */
1594 #ifndef STAB_SECTION_NAME
1595 #define STAB_SECTION_NAME ".stab"
1596 #endif
1597 #ifndef STAB_STRING_SECTION_NAME
1598 #define STAB_STRING_SECTION_NAME ".stabstr"
1599 #endif
1600 if (strcmp (STAB_STRING_SECTION_NAME, sec->name))
1601 return;
1602
1603 strsec = sec;
1604 sec = subseg_get (STAB_SECTION_NAME, 0);
1605 /* size is already rounded up, since other section will be listed first */
1606 size = bfd_get_section_size_before_reloc (strsec);
1607
1608 n_entries = bfd_get_section_size_before_reloc (sec) / 12 - 1;
1609
1610 /* Find first non-empty frag. It should be large enough. */
1611 fragp = seg_info (sec)->frchainP->frch_root;
1612 while (fragp && fragp->fr_fix == 0)
1613 fragp = fragp->fr_next;
1614 assert (fragp != 0 && fragp->fr_fix >= 12);
1615
1616 /* Store the values. */
1617 p = fragp->fr_literal;
1618 bfd_h_put_16 (stdoutput, n_entries, (bfd_byte *) p + 6);
1619 bfd_h_put_32 (stdoutput, size, (bfd_byte *) p + 8);
1620 }
1621
1622 void
1623 obj_coff_init_stab_section (seg)
1624 segT seg;
1625 {
1626 char *file;
1627 char *p;
1628 char *stabstr_name;
1629 unsigned int stroff;
1630
1631 /* Make space for this first symbol. */
1632 p = frag_more (12);
1633 /* Zero it out. */
1634 memset (p, 0, 12);
1635 as_where (&file, (unsigned int *) NULL);
1636 stabstr_name = (char *) xmalloc (strlen (seg->name) + 4);
1637 strcpy (stabstr_name, seg->name);
1638 strcat (stabstr_name, "str");
1639 stroff = get_stab_string_offset (file, stabstr_name);
1640 know (stroff == 1);
1641 md_number_to_chars (p, stroff, 4);
1642 }
1643
1644 #ifdef DEBUG
1645 /* for debugging */
1646 const char *
1647 s_get_name (s)
1648 symbolS *s;
1649 {
1650 return ((s == NULL) ? "(NULL)" : S_GET_NAME (s));
1651 }
1652
1653 void
1654 symbol_dump ()
1655 {
1656 symbolS *symbolP;
1657
1658 for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
1659 {
1660 printf (_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"),
1661 (unsigned long) symbolP,
1662 S_GET_NAME(symbolP),
1663 (long) S_GET_DATA_TYPE(symbolP),
1664 S_GET_STORAGE_CLASS(symbolP),
1665 (int) S_GET_SEGMENT(symbolP));
1666 }
1667 }
1668
1669 #endif /* DEBUG */
1670
1671 #else /* not BFD_ASSEMBLER */
1672
1673 #include "frags.h"
1674 /* This is needed because we include internal bfd things. */
1675 #include <time.h>
1676
1677 #include "libbfd.h"
1678 #include "libcoff.h"
1679
1680 #ifdef TE_PE
1681 #include "coff/pe.h"
1682 #endif
1683
1684 /* The NOP_OPCODE is for the alignment fill value. Fill with nop so
1685 that we can stick sections together without causing trouble. */
1686 #ifndef NOP_OPCODE
1687 #define NOP_OPCODE 0x00
1688 #endif
1689
1690 /* The zeroes if symbol name is longer than 8 chars */
1691 #define S_SET_ZEROES(s,v) ((s)->sy_symbol.ost_entry.n_zeroes = (v))
1692
1693 #define MIN(a,b) ((a) < (b)? (a) : (b))
1694
1695 /* This vector is used to turn a gas internal segment number into a
1696 section number suitable for insertion into a coff symbol table.
1697 This must correspond to seg_info_off_by_4. */
1698
1699 const short seg_N_TYPE[] =
1700 { /* in: segT out: N_TYPE bits */
1701 C_ABS_SECTION,
1702 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1703 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
1704 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
1705 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
1706 C_UNDEF_SECTION, /* SEG_UNKNOWN */
1707 C_UNDEF_SECTION, /* SEG_GOOF */
1708 C_UNDEF_SECTION, /* SEG_EXPR */
1709 C_DEBUG_SECTION, /* SEG_DEBUG */
1710 C_NTV_SECTION, /* SEG_NTV */
1711 C_PTV_SECTION, /* SEG_PTV */
1712 C_REGISTER_SECTION, /* SEG_REGISTER */
1713 };
1714
1715 int function_lineoff = -1; /* Offset in line#s where the last function
1716 started (the odd entry for line #0) */
1717
1718 /* Structure used to keep the filenames which
1719 are too long around so that we can stick them
1720 into the string table. */
1721 struct filename_list
1722 {
1723 char *filename;
1724 struct filename_list *next;
1725 };
1726
1727 static struct filename_list *filename_list_head;
1728 static struct filename_list *filename_list_tail;
1729
1730 static symbolS *last_line_symbol;
1731
1732 /* Add 4 to the real value to get the index and compensate the
1733 negatives. This vector is used by S_GET_SEGMENT to turn a coff
1734 section number into a segment number. */
1735
1736 bfd *abfd;
1737 static symbolS *previous_file_symbol;
1738 static int line_base;
1739
1740 void c_symbol_merge PARAMS ((symbolS *, symbolS *));
1741 symbolS *c_section_symbol PARAMS ((char *, int));
1742 void obj_coff_section PARAMS ((int));
1743 void do_relocs_for PARAMS ((bfd *, object_headers *, unsigned long *));
1744 char * symbol_to_chars PARAMS ((bfd *, char *, symbolS *));
1745 void w_strings PARAMS ((char *));
1746
1747 static void fixup_segment PARAMS ((segment_info_type *, segT));
1748 static void fixup_mdeps PARAMS ((fragS *, object_headers *, segT));
1749 static void fill_section PARAMS ((bfd *, object_headers *, unsigned long *));
1750 static int c_line_new PARAMS ((symbolS *, long, int, fragS *));
1751 static void w_symbols PARAMS ((bfd *, char *, symbolS *));
1752 static void adjust_stab_section PARAMS ((bfd *, segT));
1753 static void obj_coff_lcomm PARAMS ((int));
1754 static void obj_coff_text PARAMS ((int));
1755 static void obj_coff_data PARAMS ((int));
1756 static unsigned int count_entries_in_chain PARAMS ((unsigned int));
1757 static void coff_header_append PARAMS ((bfd *, object_headers *));
1758 static unsigned int yank_symbols PARAMS ((void));
1759 static unsigned int glue_symbols PARAMS ((symbolS **, symbolS **));
1760 static unsigned int tie_tags PARAMS ((void));
1761 static void crawl_symbols PARAMS ((object_headers *, bfd *));
1762 static void do_linenos_for PARAMS ((bfd *, object_headers *, unsigned long *));
1763 static void remove_subsegs PARAMS ((void));
1764
1765
1766
1767 /* When not using BFD_ASSEMBLER, we permit up to 40 sections.
1768
1769 This array maps a COFF section number into a gas section number.
1770 Because COFF uses negative section numbers, you must add 4 to the
1771 COFF section number when indexing into this array; this is done via
1772 the SEG_INFO_FROM_SECTION_NUMBER macro. This must correspond to
1773 seg_N_TYPE. */
1774
1775 static const segT seg_info_off_by_4[] =
1776 {
1777 SEG_PTV,
1778 SEG_NTV,
1779 SEG_DEBUG,
1780 SEG_ABSOLUTE,
1781 SEG_UNKNOWN,
1782 SEG_E0, SEG_E1, SEG_E2, SEG_E3, SEG_E4,
1783 SEG_E5, SEG_E6, SEG_E7, SEG_E8, SEG_E9,
1784 SEG_E10, SEG_E11, SEG_E12, SEG_E13, SEG_E14,
1785 SEG_E15, SEG_E16, SEG_E17, SEG_E18, SEG_E19,
1786 SEG_E20, SEG_E21, SEG_E22, SEG_E23, SEG_E24,
1787 SEG_E25, SEG_E26, SEG_E27, SEG_E28, SEG_E29,
1788 SEG_E30, SEG_E31, SEG_E32, SEG_E33, SEG_E34,
1789 SEG_E35, SEG_E36, SEG_E37, SEG_E38, SEG_E39,
1790 (segT) 40,
1791 (segT) 41,
1792 (segT) 42,
1793 (segT) 43,
1794 (segT) 44,
1795 (segT) 45,
1796 (segT) 0,
1797 (segT) 0,
1798 (segT) 0,
1799 SEG_REGISTER
1800 };
1801
1802 #define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4])
1803
1804 static relax_addressT relax_align PARAMS ((relax_addressT, long));
1805
1806 static relax_addressT
1807 relax_align (address, alignment)
1808 relax_addressT address;
1809 long alignment;
1810 {
1811 relax_addressT mask;
1812 relax_addressT new_address;
1813
1814 mask = ~((~0) << alignment);
1815 new_address = (address + mask) & (~mask);
1816 return (new_address - address);
1817 }
1818
1819 segT
1820 s_get_segment (x)
1821 symbolS * x;
1822 {
1823 return SEG_INFO_FROM_SECTION_NUMBER (x->sy_symbol.ost_entry.n_scnum);
1824 }
1825
1826 static unsigned int size_section PARAMS ((bfd *, unsigned int));
1827
1828 /* Calculate the size of the frag chain and fill in the section header
1829 to contain all of it, also fill in the addr of the sections. */
1830
1831 static unsigned int
1832 size_section (abfd, idx)
1833 bfd *abfd ATTRIBUTE_UNUSED;
1834 unsigned int idx;
1835 {
1836
1837 unsigned int size = 0;
1838 fragS *frag = segment_info[idx].frchainP->frch_root;
1839
1840 while (frag)
1841 {
1842 size = frag->fr_address;
1843 if (frag->fr_address != size)
1844 {
1845 fprintf (stderr, _("Out of step\n"));
1846 size = frag->fr_address;
1847 }
1848
1849 switch (frag->fr_type)
1850 {
1851 #ifdef TC_COFF_SIZEMACHDEP
1852 case rs_machine_dependent:
1853 size += TC_COFF_SIZEMACHDEP (frag);
1854 break;
1855 #endif
1856 case rs_space:
1857 case rs_fill:
1858 case rs_org:
1859 size += frag->fr_fix;
1860 size += frag->fr_offset * frag->fr_var;
1861 break;
1862 case rs_align:
1863 case rs_align_code:
1864 case rs_align_test:
1865 {
1866 addressT off;
1867
1868 size += frag->fr_fix;
1869 off = relax_align (size, frag->fr_offset);
1870 if (frag->fr_subtype != 0 && off > frag->fr_subtype)
1871 off = 0;
1872 size += off;
1873 }
1874 break;
1875 default:
1876 BAD_CASE (frag->fr_type);
1877 break;
1878 }
1879 frag = frag->fr_next;
1880 }
1881 segment_info[idx].scnhdr.s_size = size;
1882 return size;
1883 }
1884
1885 static unsigned int
1886 count_entries_in_chain (idx)
1887 unsigned int idx;
1888 {
1889 unsigned int nrelocs;
1890 fixS *fixup_ptr;
1891
1892 /* Count the relocations. */
1893 fixup_ptr = segment_info[idx].fix_root;
1894 nrelocs = 0;
1895 while (fixup_ptr != (fixS *) NULL)
1896 {
1897 if (fixup_ptr->fx_done == 0 && TC_COUNT_RELOC (fixup_ptr))
1898 {
1899 #if defined(TC_A29K) || defined(TC_OR32)
1900 if (fixup_ptr->fx_r_type == RELOC_CONSTH)
1901 nrelocs += 2;
1902 else
1903 nrelocs++;
1904 #else
1905 nrelocs++;
1906 #endif
1907 }
1908
1909 fixup_ptr = fixup_ptr->fx_next;
1910 }
1911 return nrelocs;
1912 }
1913
1914 #ifdef TE_AUX
1915
1916 static int compare_external_relocs PARAMS ((const PTR, const PTR));
1917
1918 /* AUX's ld expects relocations to be sorted. */
1919
1920 static int
1921 compare_external_relocs (x, y)
1922 const PTR x;
1923 const PTR y;
1924 {
1925 struct external_reloc *a = (struct external_reloc *) x;
1926 struct external_reloc *b = (struct external_reloc *) y;
1927 bfd_vma aadr = bfd_getb32 (a->r_vaddr);
1928 bfd_vma badr = bfd_getb32 (b->r_vaddr);
1929 return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
1930 }
1931
1932 #endif
1933
1934 /* Output all the relocations for a section. */
1935
1936 void
1937 do_relocs_for (abfd, h, file_cursor)
1938 bfd * abfd;
1939 object_headers * h;
1940 unsigned long *file_cursor;
1941 {
1942 unsigned int nrelocs;
1943 unsigned int idx;
1944 unsigned long reloc_start = *file_cursor;
1945
1946 for (idx = SEG_E0; idx < SEG_LAST; idx++)
1947 {
1948 if (segment_info[idx].scnhdr.s_name[0])
1949 {
1950 struct external_reloc *ext_ptr;
1951 struct external_reloc *external_reloc_vec;
1952 unsigned int external_reloc_size;
1953 unsigned int base = segment_info[idx].scnhdr.s_paddr;
1954 fixS *fix_ptr = segment_info[idx].fix_root;
1955 nrelocs = count_entries_in_chain (idx);
1956
1957 if (nrelocs)
1958 /* Bypass this stuff if no relocs. This also incidentally
1959 avoids a SCO bug, where free(malloc(0)) tends to crash. */
1960 {
1961 external_reloc_size = nrelocs * RELSZ;
1962 external_reloc_vec =
1963 (struct external_reloc *) malloc (external_reloc_size);
1964
1965 ext_ptr = external_reloc_vec;
1966
1967 /* Fill in the internal coff style reloc struct from the
1968 internal fix list. */
1969 while (fix_ptr)
1970 {
1971 struct internal_reloc intr;
1972
1973 /* Only output some of the relocations. */
1974 if (fix_ptr->fx_done == 0 && TC_COUNT_RELOC (fix_ptr))
1975 {
1976 #ifdef TC_RELOC_MANGLE
1977 TC_RELOC_MANGLE (&segment_info[idx], fix_ptr, &intr,
1978 base);
1979 #else
1980 symbolS *dot;
1981 symbolS *symbol_ptr = fix_ptr->fx_addsy;
1982
1983 intr.r_type = TC_COFF_FIX2RTYPE (fix_ptr);
1984 intr.r_vaddr =
1985 base + fix_ptr->fx_frag->fr_address + fix_ptr->fx_where;
1986
1987 #ifdef TC_KEEP_FX_OFFSET
1988 intr.r_offset = fix_ptr->fx_offset;
1989 #else
1990 intr.r_offset = 0;
1991 #endif
1992
1993 while (symbol_ptr->sy_value.X_op == O_symbol
1994 && (! S_IS_DEFINED (symbol_ptr)
1995 || S_IS_COMMON (symbol_ptr)))
1996 {
1997 symbolS *n;
1998
1999 /* We must avoid looping, as that can occur
2000 with a badly written program. */
2001 n = symbol_ptr->sy_value.X_add_symbol;
2002 if (n == symbol_ptr)
2003 break;
2004 symbol_ptr = n;
2005 }
2006
2007 /* Turn the segment of the symbol into an offset. */
2008 if (symbol_ptr)
2009 {
2010 resolve_symbol_value (symbol_ptr);
2011 if (! symbol_ptr->sy_resolved)
2012 {
2013 char *file;
2014 unsigned int line;
2015
2016 if (expr_symbol_where (symbol_ptr, &file, &line))
2017 as_bad_where (file, line,
2018 _("unresolved relocation"));
2019 else
2020 as_bad (_("bad relocation: symbol `%s' not in symbol table"),
2021 S_GET_NAME (symbol_ptr));
2022 }
2023
2024 dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
2025 if (dot)
2026 intr.r_symndx = dot->sy_number;
2027 else
2028 intr.r_symndx = symbol_ptr->sy_number;
2029 }
2030 else
2031 intr.r_symndx = -1;
2032 #endif
2033 (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr);
2034 ext_ptr++;
2035 #if defined(TC_A29K)
2036 /* The 29k has a special kludge for the high 16 bit
2037 reloc. Two relocations are emited, R_IHIHALF,
2038 and R_IHCONST. The second one doesn't contain a
2039 symbol, but uses the value for offset. */
2040 if (intr.r_type == R_IHIHALF)
2041 {
2042 /* Now emit the second bit. */
2043 intr.r_type = R_IHCONST;
2044 intr.r_symndx = fix_ptr->fx_addnumber;
2045 (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr);
2046 ext_ptr++;
2047 }
2048 #endif
2049 #if defined(TC_OR32)
2050 /* The or32 has a special kludge for the high 16 bit
2051 reloc. Two relocations are emited, R_IHIHALF,
2052 and R_IHCONST. The second one doesn't contain a
2053 symbol, but uses the value for offset. */
2054 if (intr.r_type == R_IHIHALF)
2055 {
2056 /* Now emit the second bit. */
2057 intr.r_type = R_IHCONST;
2058 intr.r_symndx = fix_ptr->fx_addnumber;
2059 (void) bfd_coff_swap_reloc_out (abfd, & intr, ext_ptr);
2060 ext_ptr ++;
2061 }
2062 #endif
2063 }
2064
2065 fix_ptr = fix_ptr->fx_next;
2066 }
2067 #ifdef TE_AUX
2068 /* Sort the reloc table. */
2069 qsort ((PTR) external_reloc_vec, nrelocs,
2070 sizeof (struct external_reloc), compare_external_relocs);
2071 #endif
2072 /* Write out the reloc table. */
2073 bfd_bwrite ((PTR) external_reloc_vec,
2074 (bfd_size_type) external_reloc_size, abfd);
2075 free (external_reloc_vec);
2076
2077 /* Fill in section header info. */
2078 segment_info[idx].scnhdr.s_relptr = *file_cursor;
2079 *file_cursor += external_reloc_size;
2080 segment_info[idx].scnhdr.s_nreloc = nrelocs;
2081 }
2082 else
2083 {
2084 /* No relocs. */
2085 segment_info[idx].scnhdr.s_relptr = 0;
2086 }
2087 }
2088 }
2089
2090 /* Set relocation_size field in file headers. */
2091 H_SET_RELOCATION_SIZE (h, *file_cursor - reloc_start, 0);
2092 }
2093
2094 /* Run through a frag chain and write out the data to go with it, fill
2095 in the scnhdrs with the info on the file postions. */
2096
2097 static void
2098 fill_section (abfd, h, file_cursor)
2099 bfd * abfd;
2100 object_headers *h ATTRIBUTE_UNUSED;
2101 unsigned long *file_cursor;
2102 {
2103 unsigned int i;
2104 unsigned int paddr = 0;
2105
2106 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
2107 {
2108 unsigned int offset = 0;
2109 struct internal_scnhdr *s = &(segment_info[i].scnhdr);
2110
2111 PROGRESS (1);
2112
2113 if (s->s_name[0])
2114 {
2115 fragS *frag = segment_info[i].frchainP->frch_root;
2116 char *buffer = NULL;
2117
2118 if (s->s_size == 0)
2119 s->s_scnptr = 0;
2120 else
2121 {
2122 buffer = xmalloc (s->s_size);
2123 s->s_scnptr = *file_cursor;
2124 }
2125 know (s->s_paddr == paddr);
2126
2127 if (strcmp (s->s_name, ".text") == 0)
2128 s->s_flags |= STYP_TEXT;
2129 else if (strcmp (s->s_name, ".data") == 0)
2130 s->s_flags |= STYP_DATA;
2131 else if (strcmp (s->s_name, ".bss") == 0)
2132 {
2133 s->s_scnptr = 0;
2134 s->s_flags |= STYP_BSS;
2135
2136 /* @@ Should make the i386 and a29k coff targets define
2137 COFF_NOLOAD_PROBLEM, and have only one test here. */
2138 #ifndef TC_I386
2139 #ifndef TC_A29K
2140 #ifndef TC_OR32
2141 #ifndef COFF_NOLOAD_PROBLEM
2142 /* Apparently the SVR3 linker (and exec syscall) and UDI
2143 mondfe progrem are confused by noload sections. */
2144 s->s_flags |= STYP_NOLOAD;
2145 #endif
2146 #endif
2147 #endif
2148 #endif
2149 }
2150 else if (strcmp (s->s_name, ".lit") == 0)
2151 s->s_flags = STYP_LIT | STYP_TEXT;
2152 else if (strcmp (s->s_name, ".init") == 0)
2153 s->s_flags |= STYP_TEXT;
2154 else if (strcmp (s->s_name, ".fini") == 0)
2155 s->s_flags |= STYP_TEXT;
2156 else if (strncmp (s->s_name, ".comment", 8) == 0)
2157 s->s_flags |= STYP_INFO;
2158
2159 while (frag)
2160 {
2161 unsigned int fill_size;
2162 switch (frag->fr_type)
2163 {
2164 case rs_machine_dependent:
2165 if (frag->fr_fix)
2166 {
2167 memcpy (buffer + frag->fr_address,
2168 frag->fr_literal,
2169 (unsigned int) frag->fr_fix);
2170 offset += frag->fr_fix;
2171 }
2172
2173 break;
2174 case rs_space:
2175 case rs_fill:
2176 case rs_align:
2177 case rs_align_code:
2178 case rs_align_test:
2179 case rs_org:
2180 if (frag->fr_fix)
2181 {
2182 memcpy (buffer + frag->fr_address,
2183 frag->fr_literal,
2184 (unsigned int) frag->fr_fix);
2185 offset += frag->fr_fix;
2186 }
2187
2188 fill_size = frag->fr_var;
2189 if (fill_size && frag->fr_offset > 0)
2190 {
2191 unsigned int count;
2192 unsigned int off = frag->fr_fix;
2193 for (count = frag->fr_offset; count; count--)
2194 {
2195 if (fill_size + frag->fr_address + off <= s->s_size)
2196 {
2197 memcpy (buffer + frag->fr_address + off,
2198 frag->fr_literal + frag->fr_fix,
2199 fill_size);
2200 off += fill_size;
2201 offset += fill_size;
2202 }
2203 }
2204 }
2205 break;
2206 case rs_broken_word:
2207 break;
2208 default:
2209 abort ();
2210 }
2211 frag = frag->fr_next;
2212 }
2213
2214 if (s->s_size != 0)
2215 {
2216 if (s->s_scnptr != 0)
2217 {
2218 bfd_bwrite (buffer, s->s_size, abfd);
2219 *file_cursor += s->s_size;
2220 }
2221 free (buffer);
2222 }
2223 paddr += s->s_size;
2224 }
2225 }
2226 }
2227
2228 /* Coff file generation & utilities. */
2229
2230 static void
2231 coff_header_append (abfd, h)
2232 bfd * abfd;
2233 object_headers * h;
2234 {
2235 unsigned int i;
2236 char buffer[1000];
2237 char buffero[1000];
2238 #ifdef COFF_LONG_SECTION_NAMES
2239 unsigned long string_size = 4;
2240 #endif
2241
2242 bfd_seek (abfd, (file_ptr) 0, 0);
2243
2244 #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
2245 H_SET_MAGIC_NUMBER (h, COFF_MAGIC);
2246 H_SET_VERSION_STAMP (h, 0);
2247 H_SET_ENTRY_POINT (h, 0);
2248 H_SET_TEXT_START (h, segment_info[SEG_E0].frchainP->frch_root->fr_address);
2249 H_SET_DATA_START (h, segment_info[SEG_E1].frchainP->frch_root->fr_address);
2250 H_SET_SIZEOF_OPTIONAL_HEADER (h, bfd_coff_swap_aouthdr_out(abfd, &h->aouthdr,
2251 buffero));
2252 #else /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
2253 H_SET_SIZEOF_OPTIONAL_HEADER (h, 0);
2254 #endif /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
2255
2256 i = bfd_coff_swap_filehdr_out (abfd, &h->filehdr, buffer);
2257
2258 bfd_bwrite (buffer, (bfd_size_type) i, abfd);
2259 bfd_bwrite (buffero, (bfd_size_type) H_GET_SIZEOF_OPTIONAL_HEADER (h), abfd);
2260
2261 for (i = SEG_E0; i < SEG_LAST; i++)
2262 {
2263 if (segment_info[i].scnhdr.s_name[0])
2264 {
2265 unsigned int size;
2266
2267 #ifdef COFF_LONG_SECTION_NAMES
2268 /* Support long section names as found in PE. This code
2269 must coordinate with that in write_object_file and
2270 w_strings. */
2271 if (strlen (segment_info[i].name) > SCNNMLEN)
2272 {
2273 memset (segment_info[i].scnhdr.s_name, 0, SCNNMLEN);
2274 sprintf (segment_info[i].scnhdr.s_name, "/%lu", string_size);
2275 string_size += strlen (segment_info[i].name) + 1;
2276 }
2277 #endif
2278 size = bfd_coff_swap_scnhdr_out (abfd,
2279 &(segment_info[i].scnhdr),
2280 buffer);
2281 if (size == 0)
2282 as_bad (_("bfd_coff_swap_scnhdr_out failed"));
2283 bfd_bwrite (buffer, (bfd_size_type) size, abfd);
2284 }
2285 }
2286 }
2287
2288 char *
2289 symbol_to_chars (abfd, where, symbolP)
2290 bfd * abfd;
2291 char *where;
2292 symbolS * symbolP;
2293 {
2294 unsigned int numaux = symbolP->sy_symbol.ost_entry.n_numaux;
2295 unsigned int i;
2296 valueT val;
2297
2298 /* Turn any symbols with register attributes into abs symbols. */
2299 if (S_GET_SEGMENT (symbolP) == reg_section)
2300 S_SET_SEGMENT (symbolP, absolute_section);
2301
2302 /* At the same time, relocate all symbols to their output value. */
2303 #ifndef TE_PE
2304 val = (segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_paddr
2305 + S_GET_VALUE (symbolP));
2306 #else
2307 val = S_GET_VALUE (symbolP);
2308 #endif
2309
2310 S_SET_VALUE (symbolP, val);
2311
2312 symbolP->sy_symbol.ost_entry.n_value = val;
2313
2314 where += bfd_coff_swap_sym_out (abfd, &symbolP->sy_symbol.ost_entry,
2315 where);
2316
2317 for (i = 0; i < numaux; i++)
2318 {
2319 where += bfd_coff_swap_aux_out (abfd,
2320 &symbolP->sy_symbol.ost_auxent[i],
2321 S_GET_DATA_TYPE (symbolP),
2322 S_GET_STORAGE_CLASS (symbolP),
2323 i, numaux, where);
2324 }
2325
2326 return where;
2327 }
2328
2329 void
2330 coff_obj_symbol_new_hook (symbolP)
2331 symbolS *symbolP;
2332 {
2333 char underscore = 0; /* Symbol has leading _ */
2334
2335 /* Effective symbol. */
2336 /* Store the pointer in the offset. */
2337 S_SET_ZEROES (symbolP, 0L);
2338 S_SET_DATA_TYPE (symbolP, T_NULL);
2339 S_SET_STORAGE_CLASS (symbolP, 0);
2340 S_SET_NUMBER_AUXILIARY (symbolP, 0);
2341 /* Additional information. */
2342 symbolP->sy_symbol.ost_flags = 0;
2343 /* Auxiliary entries. */
2344 memset ((char *) &symbolP->sy_symbol.ost_auxent[0], 0, AUXESZ);
2345
2346 if (S_IS_STRING (symbolP))
2347 SF_SET_STRING (symbolP);
2348 if (!underscore && S_IS_LOCAL (symbolP))
2349 SF_SET_LOCAL (symbolP);
2350 }
2351
2352 /* Handle .ln directives. */
2353
2354 static void
2355 obj_coff_ln (appline)
2356 int appline;
2357 {
2358 int l;
2359
2360 if (! appline && def_symbol_in_progress != NULL)
2361 {
2362 /* Wrong context. */
2363 as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
2364 demand_empty_rest_of_line ();
2365 return;
2366 }
2367
2368 l = get_absolute_expression ();
2369 c_line_new (0, frag_now_fix (), l, frag_now);
2370
2371 if (appline)
2372 new_logical_line ((char *) NULL, l - 1);
2373
2374 #ifndef NO_LISTING
2375 {
2376 extern int listing;
2377
2378 if (listing)
2379 {
2380 if (! appline)
2381 l += line_base - 1;
2382 listing_source_line ((unsigned int) l);
2383 }
2384
2385 }
2386 #endif
2387 demand_empty_rest_of_line ();
2388 }
2389
2390 /* Handle .def directives.
2391
2392 One might ask : why can't we symbol_new if the symbol does not
2393 already exist and fill it with debug information. Because of
2394 the C_EFCN special symbol. It would clobber the value of the
2395 function symbol before we have a chance to notice that it is
2396 a C_EFCN. And a second reason is that the code is more clear this
2397 way. (at least I think it is :-). */
2398
2399 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
2400 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
2401 *input_line_pointer == '\t') \
2402 input_line_pointer++;
2403
2404 static void
2405 obj_coff_def (what)
2406 int what ATTRIBUTE_UNUSED;
2407 {
2408 char name_end; /* Char after the end of name. */
2409 char *symbol_name; /* Name of the debug symbol. */
2410 char *symbol_name_copy; /* Temporary copy of the name. */
2411 unsigned int symbol_name_length;
2412
2413 if (def_symbol_in_progress != NULL)
2414 {
2415 as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
2416 demand_empty_rest_of_line ();
2417 return;
2418 }
2419
2420 SKIP_WHITESPACES ();
2421
2422 def_symbol_in_progress = (symbolS *) obstack_alloc (&notes, sizeof (*def_symbol_in_progress));
2423 memset (def_symbol_in_progress, 0, sizeof (*def_symbol_in_progress));
2424
2425 symbol_name = input_line_pointer;
2426 name_end = get_symbol_end ();
2427 symbol_name_length = strlen (symbol_name);
2428 symbol_name_copy = xmalloc (symbol_name_length + 1);
2429 strcpy (symbol_name_copy, symbol_name);
2430 #ifdef tc_canonicalize_symbol_name
2431 symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy);
2432 #endif
2433
2434 /* Initialize the new symbol. */
2435 #ifdef STRIP_UNDERSCORE
2436 S_SET_NAME (def_symbol_in_progress, (*symbol_name_copy == '_'
2437 ? symbol_name_copy + 1
2438 : symbol_name_copy));
2439 #else /* STRIP_UNDERSCORE */
2440 S_SET_NAME (def_symbol_in_progress, symbol_name_copy);
2441 #endif /* STRIP_UNDERSCORE */
2442 /* free(symbol_name_copy); */
2443 def_symbol_in_progress->sy_name_offset = (unsigned long) ~0;
2444 def_symbol_in_progress->sy_number = ~0;
2445 def_symbol_in_progress->sy_frag = &zero_address_frag;
2446 S_SET_VALUE (def_symbol_in_progress, 0);
2447
2448 if (S_IS_STRING (def_symbol_in_progress))
2449 SF_SET_STRING (def_symbol_in_progress);
2450
2451 *input_line_pointer = name_end;
2452
2453 demand_empty_rest_of_line ();
2454 }
2455
2456 unsigned int dim_index;
2457
2458 static void
2459 obj_coff_endef (ignore)
2460 int ignore ATTRIBUTE_UNUSED;
2461 {
2462 symbolS *symbolP = 0;
2463 /* DIM BUG FIX sac@cygnus.com */
2464 dim_index = 0;
2465 if (def_symbol_in_progress == NULL)
2466 {
2467 as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
2468 demand_empty_rest_of_line ();
2469 return;
2470 }
2471
2472 /* Set the section number according to storage class. */
2473 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress))
2474 {
2475 case C_STRTAG:
2476 case C_ENTAG:
2477 case C_UNTAG:
2478 SF_SET_TAG (def_symbol_in_progress);
2479 /* Intentional fallthrough. */
2480
2481 case C_FILE:
2482 case C_TPDEF:
2483 SF_SET_DEBUG (def_symbol_in_progress);
2484 S_SET_SEGMENT (def_symbol_in_progress, SEG_DEBUG);
2485 break;
2486
2487 case C_EFCN:
2488 /* Do not emit this symbol. */
2489 SF_SET_LOCAL (def_symbol_in_progress);
2490 /* Intentional fallthrough. */
2491
2492 case C_BLOCK:
2493 /* Will need processing before writing. */
2494 SF_SET_PROCESS (def_symbol_in_progress);
2495 /* Intentional fallthrough. */
2496
2497 case C_FCN:
2498 S_SET_SEGMENT (def_symbol_in_progress, SEG_E0);
2499
2500 if (strcmp (S_GET_NAME (def_symbol_in_progress), ".bf") == 0)
2501 { /* .bf */
2502 if (function_lineoff < 0)
2503 fprintf (stderr, _("`.bf' symbol without preceding function\n"));
2504
2505 SA_GET_SYM_LNNOPTR (last_line_symbol) = function_lineoff;
2506
2507 SF_SET_PROCESS (last_line_symbol);
2508 SF_SET_ADJ_LNNOPTR (last_line_symbol);
2509 SF_SET_PROCESS (def_symbol_in_progress);
2510 function_lineoff = -1;
2511 }
2512
2513 /* Value is always set to . */
2514 def_symbol_in_progress->sy_frag = frag_now;
2515 S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
2516 break;
2517
2518 #ifdef C_AUTOARG
2519 case C_AUTOARG:
2520 #endif /* C_AUTOARG */
2521 case C_AUTO:
2522 case C_REG:
2523 case C_MOS:
2524 case C_MOE:
2525 case C_MOU:
2526 case C_ARG:
2527 case C_REGPARM:
2528 case C_FIELD:
2529 case C_EOS:
2530 SF_SET_DEBUG (def_symbol_in_progress);
2531 S_SET_SEGMENT (def_symbol_in_progress, absolute_section);
2532 break;
2533
2534 case C_EXT:
2535 case C_WEAKEXT:
2536 #ifdef TE_PE
2537 case C_NT_WEAK:
2538 #endif
2539 case C_STAT:
2540 case C_LABEL:
2541 /* Valid but set somewhere else (s_comm, s_lcomm, colon). */
2542 break;
2543
2544 case C_USTATIC:
2545 case C_EXTDEF:
2546 case C_ULABEL:
2547 as_warn (_("unexpected storage class %d"), S_GET_STORAGE_CLASS (def_symbol_in_progress));
2548 break;
2549 }
2550
2551 /* Now that we have built a debug symbol, try to find if we should
2552 merge with an existing symbol or not. If a symbol is C_EFCN or
2553 absolute_section or untagged SEG_DEBUG it never merges. We also
2554 don't merge labels, which are in a different namespace, nor
2555 symbols which have not yet been defined since they are typically
2556 unique, nor do we merge tags with non-tags. */
2557
2558 /* Two cases for functions. Either debug followed by definition or
2559 definition followed by debug. For definition first, we will
2560 merge the debug symbol into the definition. For debug first, the
2561 lineno entry MUST point to the definition function or else it
2562 will point off into space when crawl_symbols() merges the debug
2563 symbol into the real symbol. Therefor, let's presume the debug
2564 symbol is a real function reference. */
2565
2566 /* FIXME-SOON If for some reason the definition label/symbol is
2567 never seen, this will probably leave an undefined symbol at link
2568 time. */
2569
2570 if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
2571 || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL
2572 || (S_GET_SEGMENT (def_symbol_in_progress) == SEG_DEBUG
2573 && !SF_GET_TAG (def_symbol_in_progress))
2574 || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section
2575 || def_symbol_in_progress->sy_value.X_op != O_constant
2576 || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP)) == NULL
2577 || (SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP)))
2578 {
2579 symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
2580 &symbol_lastP);
2581 }
2582 else
2583 {
2584 /* This symbol already exists, merge the newly created symbol
2585 into the old one. This is not mandatory. The linker can
2586 handle duplicate symbols correctly. But I guess that it save
2587 a *lot* of space if the assembly file defines a lot of
2588 symbols. [loic] */
2589
2590 /* The debug entry (def_symbol_in_progress) is merged into the
2591 previous definition. */
2592
2593 c_symbol_merge (def_symbol_in_progress, symbolP);
2594 /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */
2595 def_symbol_in_progress = symbolP;
2596
2597 if (SF_GET_FUNCTION (def_symbol_in_progress)
2598 || SF_GET_TAG (def_symbol_in_progress)
2599 || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_STAT)
2600 {
2601 /* For functions, and tags, and static symbols, the symbol
2602 *must* be where the debug symbol appears. Move the
2603 existing symbol to the current place. */
2604 /* If it already is at the end of the symbol list, do nothing. */
2605 if (def_symbol_in_progress != symbol_lastP)
2606 {
2607 symbol_remove (def_symbol_in_progress, &symbol_rootP,
2608 &symbol_lastP);
2609 symbol_append (def_symbol_in_progress, symbol_lastP,
2610 &symbol_rootP, &symbol_lastP);
2611 }
2612 }
2613 }
2614
2615 if (SF_GET_TAG (def_symbol_in_progress))
2616 {
2617 symbolS *oldtag;
2618
2619 oldtag = symbol_find_base (S_GET_NAME (def_symbol_in_progress),
2620 DO_NOT_STRIP);
2621 if (oldtag == NULL || ! SF_GET_TAG (oldtag))
2622 tag_insert (S_GET_NAME (def_symbol_in_progress),
2623 def_symbol_in_progress);
2624 }
2625
2626 if (SF_GET_FUNCTION (def_symbol_in_progress))
2627 {
2628 know (sizeof (def_symbol_in_progress) <= sizeof (long));
2629 function_lineoff
2630 = c_line_new (def_symbol_in_progress, 0, 0, &zero_address_frag);
2631
2632 SF_SET_PROCESS (def_symbol_in_progress);
2633
2634 if (symbolP == NULL)
2635 {
2636 /* That is, if this is the first time we've seen the
2637 function... */
2638 symbol_table_insert (def_symbol_in_progress);
2639 }
2640 }
2641
2642 def_symbol_in_progress = NULL;
2643 demand_empty_rest_of_line ();
2644 }
2645
2646 static void
2647 obj_coff_dim (ignore)
2648 int ignore ATTRIBUTE_UNUSED;
2649 {
2650 int dim_index;
2651
2652 if (def_symbol_in_progress == NULL)
2653 {
2654 as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
2655 demand_empty_rest_of_line ();
2656 return;
2657 }
2658
2659 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
2660
2661 for (dim_index = 0; dim_index < DIMNUM; dim_index++)
2662 {
2663 SKIP_WHITESPACES ();
2664 SA_SET_SYM_DIMEN (def_symbol_in_progress, dim_index,
2665 get_absolute_expression ());
2666
2667 switch (*input_line_pointer)
2668 {
2669 case ',':
2670 input_line_pointer++;
2671 break;
2672
2673 default:
2674 as_warn (_("badly formed .dim directive ignored"));
2675 /* Intentional fallthrough. */
2676
2677 case '\n':
2678 case ';':
2679 dim_index = DIMNUM;
2680 break;
2681 }
2682 }
2683
2684 demand_empty_rest_of_line ();
2685 }
2686
2687 static void
2688 obj_coff_line (ignore)
2689 int ignore ATTRIBUTE_UNUSED;
2690 {
2691 int this_base;
2692 const char *name;
2693
2694 if (def_symbol_in_progress == NULL)
2695 {
2696 obj_coff_ln (0);
2697 return;
2698 }
2699
2700 name = S_GET_NAME (def_symbol_in_progress);
2701 this_base = get_absolute_expression ();
2702
2703 /* Only .bf symbols indicate the use of a new base line number; the
2704 line numbers associated with .ef, .bb, .eb are relative to the
2705 start of the containing function. */
2706 if (!strcmp (".bf", name))
2707 {
2708 #if 0 /* XXX Can we ever have line numbers going backwards? */
2709 if (this_base > line_base)
2710 #endif
2711 line_base = this_base;
2712
2713 #ifndef NO_LISTING
2714 {
2715 extern int listing;
2716 if (listing)
2717 listing_source_line ((unsigned int) line_base);
2718 }
2719 #endif
2720 }
2721
2722 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
2723 SA_SET_SYM_LNNO (def_symbol_in_progress, this_base);
2724
2725 demand_empty_rest_of_line ();
2726 }
2727
2728 static void
2729 obj_coff_size (ignore)
2730 int ignore ATTRIBUTE_UNUSED;
2731 {
2732 if (def_symbol_in_progress == NULL)
2733 {
2734 as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
2735 demand_empty_rest_of_line ();
2736 return;
2737 }
2738
2739 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
2740 SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ());
2741 demand_empty_rest_of_line ();
2742 }
2743
2744 static void
2745 obj_coff_scl (ignore)
2746 int ignore ATTRIBUTE_UNUSED;
2747 {
2748 if (def_symbol_in_progress == NULL)
2749 {
2750 as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
2751 demand_empty_rest_of_line ();
2752 return;
2753 }
2754
2755 S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ());
2756 demand_empty_rest_of_line ();
2757 }
2758
2759 static void
2760 obj_coff_tag (ignore)
2761 int ignore ATTRIBUTE_UNUSED;
2762 {
2763 char *symbol_name;
2764 char name_end;
2765
2766 if (def_symbol_in_progress == NULL)
2767 {
2768 as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
2769 demand_empty_rest_of_line ();
2770 return;
2771 }
2772
2773 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
2774 symbol_name = input_line_pointer;
2775 name_end = get_symbol_end ();
2776 #ifdef tc_canonicalize_symbol_name
2777 symbol_name = tc_canonicalize_symbol_name (symbol_name);
2778 #endif
2779
2780 /* Assume that the symbol referred to by .tag is always defined.
2781 This was a bad assumption. I've added find_or_make. xoxorich. */
2782 SA_SET_SYM_TAGNDX (def_symbol_in_progress,
2783 (long) tag_find_or_make (symbol_name));
2784 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
2785 as_warn (_("tag not found for .tag %s"), symbol_name);
2786
2787 SF_SET_TAGGED (def_symbol_in_progress);
2788 *input_line_pointer = name_end;
2789
2790 demand_empty_rest_of_line ();
2791 }
2792
2793 static void
2794 obj_coff_type (ignore)
2795 int ignore ATTRIBUTE_UNUSED;
2796 {
2797 if (def_symbol_in_progress == NULL)
2798 {
2799 as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
2800 demand_empty_rest_of_line ();
2801 return;
2802 }
2803
2804 S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ());
2805
2806 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) &&
2807 S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF)
2808 SF_SET_FUNCTION (def_symbol_in_progress);
2809
2810 demand_empty_rest_of_line ();
2811 }
2812
2813 static void
2814 obj_coff_val (ignore)
2815 int ignore ATTRIBUTE_UNUSED;
2816 {
2817 if (def_symbol_in_progress == NULL)
2818 {
2819 as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
2820 demand_empty_rest_of_line ();
2821 return;
2822 }
2823
2824 if (is_name_beginner (*input_line_pointer))
2825 {
2826 char *symbol_name = input_line_pointer;
2827 char name_end = get_symbol_end ();
2828
2829 #ifdef tc_canonicalize_symbol_name
2830 symbol_name = tc_canonicalize_symbol_name (symbol_name);
2831 #endif
2832
2833 if (!strcmp (symbol_name, "."))
2834 {
2835 def_symbol_in_progress->sy_frag = frag_now;
2836 S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
2837 /* If the .val is != from the .def (e.g. statics). */
2838 }
2839 else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name))
2840 {
2841 def_symbol_in_progress->sy_value.X_op = O_symbol;
2842 def_symbol_in_progress->sy_value.X_add_symbol =
2843 symbol_find_or_make (symbol_name);
2844 def_symbol_in_progress->sy_value.X_op_symbol = NULL;
2845 def_symbol_in_progress->sy_value.X_add_number = 0;
2846
2847 /* If the segment is undefined when the forward reference is
2848 resolved, then copy the segment id from the forward
2849 symbol. */
2850 SF_SET_GET_SEGMENT (def_symbol_in_progress);
2851
2852 /* FIXME: gcc can generate address expressions here in
2853 unusual cases (search for "obscure" in sdbout.c). We
2854 just ignore the offset here, thus generating incorrect
2855 debugging information. We ignore the rest of the line
2856 just below. */
2857 }
2858 /* Otherwise, it is the name of a non debug symbol and
2859 its value will be calculated later. */
2860 *input_line_pointer = name_end;
2861
2862 /* FIXME: this is to avoid an error message in the
2863 FIXME case mentioned just above. */
2864 while (! is_end_of_line[(unsigned char) *input_line_pointer])
2865 ++input_line_pointer;
2866 }
2867 else
2868 {
2869 S_SET_VALUE (def_symbol_in_progress,
2870 (valueT) get_absolute_expression ());
2871 } /* if symbol based */
2872
2873 demand_empty_rest_of_line ();
2874 }
2875
2876 #ifdef TE_PE
2877
2878 /* Handle the .linkonce pseudo-op. This is parsed by s_linkonce in
2879 read.c, which then calls this object file format specific routine. */
2880
2881 void
2882 obj_coff_pe_handle_link_once (type)
2883 enum linkonce_type type;
2884 {
2885 seg_info (now_seg)->scnhdr.s_flags |= IMAGE_SCN_LNK_COMDAT;
2886
2887 /* We store the type in the seg_info structure, and use it to set up
2888 the auxiliary entry for the section symbol in c_section_symbol. */
2889 seg_info (now_seg)->linkonce = type;
2890 }
2891
2892 #endif /* TE_PE */
2893
2894 void
2895 coff_obj_read_begin_hook ()
2896 {
2897 /* These had better be the same. Usually 18 bytes. */
2898 #ifndef BFD_HEADERS
2899 know (sizeof (SYMENT) == sizeof (AUXENT));
2900 know (SYMESZ == AUXESZ);
2901 #endif
2902 tag_init ();
2903 }
2904
2905 /* This function runs through the symbol table and puts all the
2906 externals onto another chain. */
2907
2908 /* The chain of globals. */
2909 symbolS *symbol_globalP;
2910 symbolS *symbol_global_lastP;
2911
2912 /* The chain of externals. */
2913 symbolS *symbol_externP;
2914 symbolS *symbol_extern_lastP;
2915
2916 stack *block_stack;
2917 symbolS *last_functionP;
2918 static symbolS *last_bfP;
2919 symbolS *last_tagP;
2920
2921 static unsigned int
2922 yank_symbols ()
2923 {
2924 symbolS *symbolP;
2925 unsigned int symbol_number = 0;
2926 unsigned int last_file_symno = 0;
2927
2928 struct filename_list *filename_list_scan = filename_list_head;
2929
2930 for (symbolP = symbol_rootP;
2931 symbolP;
2932 symbolP = symbolP ? symbol_next (symbolP) : symbol_rootP)
2933 {
2934 if (symbolP->sy_mri_common)
2935 {
2936 if (S_GET_STORAGE_CLASS (symbolP) == C_EXT
2937 #ifdef TE_PE
2938 || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
2939 #endif
2940 || S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT)
2941 as_bad (_("%s: global symbols not supported in common sections"),
2942 S_GET_NAME (symbolP));
2943 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
2944 continue;
2945 }
2946
2947 if (!SF_GET_DEBUG (symbolP))
2948 {
2949 /* Debug symbols do not need all this rubbish. */
2950 symbolS *real_symbolP;
2951
2952 /* L* and C_EFCN symbols never merge. */
2953 if (!SF_GET_LOCAL (symbolP)
2954 && !SF_GET_STATICS (symbolP)
2955 && S_GET_STORAGE_CLASS (symbolP) != C_LABEL
2956 && symbolP->sy_value.X_op == O_constant
2957 && (real_symbolP = symbol_find_base (S_GET_NAME (symbolP), DO_NOT_STRIP))
2958 && real_symbolP != symbolP)
2959 {
2960 /* FIXME-SOON: where do dups come from?
2961 Maybe tag references before definitions? xoxorich. */
2962 /* Move the debug data from the debug symbol to the
2963 real symbol. Do NOT do the oposite (i.e. move from
2964 real symbol to debug symbol and remove real symbol from the
2965 list.) Because some pointers refer to the real symbol
2966 whereas no pointers refer to the debug symbol. */
2967 c_symbol_merge (symbolP, real_symbolP);
2968 /* Replace the current symbol by the real one. */
2969 /* The symbols will never be the last or the first
2970 because : 1st symbol is .file and 3 last symbols are
2971 .text, .data, .bss. */
2972 symbol_remove (real_symbolP, &symbol_rootP, &symbol_lastP);
2973 symbol_insert (real_symbolP, symbolP, &symbol_rootP, &symbol_lastP);
2974 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
2975 symbolP = real_symbolP;
2976 }
2977
2978 if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_E1))
2979 S_SET_SEGMENT (symbolP, SEG_E0);
2980
2981 resolve_symbol_value (symbolP);
2982
2983 if (S_GET_STORAGE_CLASS (symbolP) == C_NULL)
2984 {
2985 if (!S_IS_DEFINED (symbolP) && !SF_GET_LOCAL (symbolP))
2986 {
2987 S_SET_EXTERNAL (symbolP);
2988 }
2989
2990 else if (S_GET_SEGMENT (symbolP) == SEG_E0)
2991 S_SET_STORAGE_CLASS (symbolP, C_LABEL);
2992
2993 else
2994 S_SET_STORAGE_CLASS (symbolP, C_STAT);
2995 }
2996
2997 /* Mainly to speed up if not -g. */
2998 if (SF_GET_PROCESS (symbolP))
2999 {
3000 /* Handle the nested blocks auxiliary info. */
3001 if (S_GET_STORAGE_CLASS (symbolP) == C_BLOCK)
3002 {
3003 if (!strcmp (S_GET_NAME (symbolP), ".bb"))
3004 stack_push (block_stack, (char *) &symbolP);
3005 else
3006 {
3007 /* .eb */
3008 symbolS *begin_symbolP;
3009
3010 begin_symbolP = *(symbolS **) stack_pop (block_stack);
3011 if (begin_symbolP == (symbolS *) 0)
3012 as_warn (_("mismatched .eb"));
3013 else
3014 SA_SET_SYM_ENDNDX (begin_symbolP, symbol_number + 2);
3015 }
3016 }
3017 /* If we are able to identify the type of a function, and we
3018 are out of a function (last_functionP == 0) then, the
3019 function symbol will be associated with an auxiliary
3020 entry. */
3021 if (last_functionP == (symbolS *) 0 &&
3022 SF_GET_FUNCTION (symbolP))
3023 {
3024 last_functionP = symbolP;
3025
3026 if (S_GET_NUMBER_AUXILIARY (symbolP) < 1)
3027 S_SET_NUMBER_AUXILIARY (symbolP, 1);
3028
3029 /* Clobber possible stale .dim information. */
3030 #if 0
3031 /* Iffed out by steve - this fries the lnnoptr info too. */
3032 bzero (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen,
3033 sizeof (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen));
3034 #endif
3035 }
3036 if (S_GET_STORAGE_CLASS (symbolP) == C_FCN)
3037 {
3038 if (strcmp (S_GET_NAME (symbolP), ".bf") == 0)
3039 {
3040 if (last_bfP != NULL)
3041 SA_SET_SYM_ENDNDX (last_bfP, symbol_number);
3042 last_bfP = symbolP;
3043 }
3044 }
3045 else if (S_GET_STORAGE_CLASS (symbolP) == C_EFCN)
3046 {
3047 /* I don't even know if this is needed for sdb. But
3048 the standard assembler generates it, so... */
3049 if (last_functionP == (symbolS *) 0)
3050 as_fatal (_("C_EFCN symbol out of scope"));
3051 SA_SET_SYM_FSIZE (last_functionP,
3052 (long) (S_GET_VALUE (symbolP) -
3053 S_GET_VALUE (last_functionP)));
3054 SA_SET_SYM_ENDNDX (last_functionP, symbol_number);
3055 last_functionP = (symbolS *) 0;
3056 }
3057 }
3058 }
3059 else if (SF_GET_TAG (symbolP))
3060 {
3061 /* First descriptor of a structure must point to
3062 the first slot after the structure description. */
3063 last_tagP = symbolP;
3064
3065 }
3066 else if (S_GET_STORAGE_CLASS (symbolP) == C_EOS)
3067 {
3068 /* +2 take in account the current symbol. */
3069 SA_SET_SYM_ENDNDX (last_tagP, symbol_number + 2);
3070 }
3071 else if (S_GET_STORAGE_CLASS (symbolP) == C_FILE)
3072 {
3073 /* If the filename was too long to fit in the
3074 auxent, put it in the string table. */
3075 if (SA_GET_FILE_FNAME_ZEROS (symbolP) == 0
3076 && SA_GET_FILE_FNAME_OFFSET (symbolP) != 0)
3077 {
3078 SA_SET_FILE_FNAME_OFFSET (symbolP, string_byte_count);
3079 string_byte_count += strlen (filename_list_scan->filename) + 1;
3080 filename_list_scan = filename_list_scan->next;
3081 }
3082 if (S_GET_VALUE (symbolP))
3083 {
3084 S_SET_VALUE (symbolP, last_file_symno);
3085 last_file_symno = symbol_number;
3086 }
3087 }
3088
3089 #ifdef tc_frob_coff_symbol
3090 tc_frob_coff_symbol (symbolP);
3091 #endif
3092
3093 /* We must put the external symbols apart. The loader
3094 does not bomb if we do not. But the references in
3095 the endndx field for a .bb symbol are not corrected
3096 if an external symbol is removed between .bb and .be.
3097 I.e in the following case :
3098 [20] .bb endndx = 22
3099 [21] foo external
3100 [22] .be
3101 ld will move the symbol 21 to the end of the list but
3102 endndx will still be 22 instead of 21. */
3103
3104 if (SF_GET_LOCAL (symbolP))
3105 {
3106 /* Remove C_EFCN and LOCAL (L...) symbols. */
3107 /* Next pointer remains valid. */
3108 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3109
3110 }
3111 else if (symbolP->sy_value.X_op == O_symbol
3112 && (! S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP)))
3113 {
3114 /* Skip symbols which were equated to undefined or common
3115 symbols. */
3116 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3117 }
3118 else if (!S_IS_DEFINED (symbolP)
3119 && !S_IS_DEBUG (symbolP)
3120 && !SF_GET_STATICS (symbolP)
3121 && (S_GET_STORAGE_CLASS (symbolP) == C_EXT
3122 #ifdef TE_PE
3123 || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
3124 #endif
3125 || S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT))
3126 {
3127 /* If external, Remove from the list. */
3128 symbolS *hold = symbol_previous (symbolP);
3129
3130 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3131 symbol_clear_list_pointers (symbolP);
3132 symbol_append (symbolP, symbol_extern_lastP, &symbol_externP, &symbol_extern_lastP);
3133 symbolP = hold;
3134 }
3135 else if (! S_IS_DEBUG (symbolP)
3136 && ! SF_GET_STATICS (symbolP)
3137 && ! SF_GET_FUNCTION (symbolP)
3138 && (S_GET_STORAGE_CLASS (symbolP) == C_EXT
3139 #ifdef TE_PE
3140 || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
3141 #endif
3142 || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK))
3143 {
3144 symbolS *hold = symbol_previous (symbolP);
3145
3146 /* The O'Reilly COFF book says that defined global symbols
3147 come at the end of the symbol table, just before
3148 undefined global symbols. */
3149 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3150 symbol_clear_list_pointers (symbolP);
3151 symbol_append (symbolP, symbol_global_lastP, &symbol_globalP,
3152 &symbol_global_lastP);
3153 symbolP = hold;
3154 }
3155 else
3156 {
3157 if (SF_GET_STRING (symbolP))
3158 {
3159 symbolP->sy_name_offset = string_byte_count;
3160 string_byte_count += strlen (S_GET_NAME (symbolP)) + 1;
3161 }
3162 else
3163 {
3164 symbolP->sy_name_offset = 0;
3165 }
3166
3167 symbolP->sy_number = symbol_number;
3168 symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP);
3169 }
3170 }
3171
3172 return symbol_number;
3173 }
3174
3175 static unsigned int
3176 glue_symbols (head, tail)
3177 symbolS **head;
3178 symbolS **tail;
3179 {
3180 unsigned int symbol_number = 0;
3181
3182 while (*head != NULL)
3183 {
3184 symbolS *tmp = *head;
3185
3186 /* Append. */
3187 symbol_remove (tmp, head, tail);
3188 symbol_append (tmp, symbol_lastP, &symbol_rootP, &symbol_lastP);
3189
3190 /* Process. */
3191 if (SF_GET_STRING (tmp))
3192 {
3193 tmp->sy_name_offset = string_byte_count;
3194 string_byte_count += strlen (S_GET_NAME (tmp)) + 1;
3195 }
3196 else
3197 {
3198 /* Fix "long" names. */
3199 tmp->sy_name_offset = 0;
3200 }
3201
3202 tmp->sy_number = symbol_number;
3203 symbol_number += 1 + S_GET_NUMBER_AUXILIARY (tmp);
3204 }
3205
3206 return symbol_number;
3207 }
3208
3209 static unsigned int
3210 tie_tags ()
3211 {
3212 unsigned int symbol_number = 0;
3213 symbolS *symbolP;
3214
3215 for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
3216 {
3217 symbolP->sy_number = symbol_number;
3218
3219 if (SF_GET_TAGGED (symbolP))
3220 {
3221 SA_SET_SYM_TAGNDX
3222 (symbolP,
3223 ((symbolS *) SA_GET_SYM_TAGNDX (symbolP))->sy_number);
3224 }
3225
3226 symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP);
3227 }
3228
3229 return symbol_number;
3230 }
3231
3232
3233 static void
3234 crawl_symbols (h, abfd)
3235 object_headers *h;
3236 bfd *abfd ATTRIBUTE_UNUSED;
3237 {
3238 unsigned int i;
3239
3240 /* Initialize the stack used to keep track of the matching .bb .be. */
3241
3242 block_stack = stack_init (512, sizeof (symbolS *));
3243
3244 /* The symbol list should be ordered according to the following sequence
3245 order :
3246 . .file symbol
3247 . debug entries for functions
3248 . fake symbols for the sections, including .text .data and .bss
3249 . defined symbols
3250 . undefined symbols
3251 But this is not mandatory. The only important point is to put the
3252 undefined symbols at the end of the list. */
3253
3254 /* Is there a .file symbol ? If not insert one at the beginning. */
3255 if (symbol_rootP == NULL
3256 || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE)
3257 c_dot_file_symbol ("fake");
3258
3259 /* Build up static symbols for the sections, they are filled in later. */
3260
3261 for (i = SEG_E0; i < SEG_LAST; i++)
3262 if (segment_info[i].scnhdr.s_name[0])
3263 segment_info[i].dot = c_section_symbol ((char *) segment_info[i].name,
3264 i - SEG_E0 + 1);
3265
3266 /* Take all the externals out and put them into another chain. */
3267 H_SET_SYMBOL_TABLE_SIZE (h, yank_symbols ());
3268 /* Take the externals and glue them onto the end. */
3269 H_SET_SYMBOL_TABLE_SIZE (h,
3270 (H_GET_SYMBOL_COUNT (h)
3271 + glue_symbols (&symbol_globalP,
3272 &symbol_global_lastP)
3273 + glue_symbols (&symbol_externP,
3274 &symbol_extern_lastP)));
3275
3276 H_SET_SYMBOL_TABLE_SIZE (h, tie_tags ());
3277 know (symbol_globalP == NULL);
3278 know (symbol_global_lastP == NULL);
3279 know (symbol_externP == NULL);
3280 know (symbol_extern_lastP == NULL);
3281 }
3282
3283 /* Find strings by crawling along symbol table chain. */
3284
3285 void
3286 w_strings (where)
3287 char *where;
3288 {
3289 symbolS *symbolP;
3290 struct filename_list *filename_list_scan = filename_list_head;
3291
3292 /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK. */
3293 md_number_to_chars (where, (valueT) string_byte_count, 4);
3294 where += 4;
3295
3296 #ifdef COFF_LONG_SECTION_NAMES
3297 /* Support long section names as found in PE. This code must
3298 coordinate with that in coff_header_append and write_object_file. */
3299 {
3300 unsigned int i;
3301
3302 for (i = SEG_E0; i < SEG_LAST; i++)
3303 {
3304 if (segment_info[i].scnhdr.s_name[0]
3305 && strlen (segment_info[i].name) > SCNNMLEN)
3306 {
3307 unsigned int size;
3308
3309 size = strlen (segment_info[i].name) + 1;
3310 memcpy (where, segment_info[i].name, size);
3311 where += size;
3312 }
3313 }
3314 }
3315 #endif /* COFF_LONG_SECTION_NAMES */
3316
3317 for (symbolP = symbol_rootP;
3318 symbolP;
3319 symbolP = symbol_next (symbolP))
3320 {
3321 unsigned int size;
3322
3323 if (SF_GET_STRING (symbolP))
3324 {
3325 size = strlen (S_GET_NAME (symbolP)) + 1;
3326 memcpy (where, S_GET_NAME (symbolP), size);
3327 where += size;
3328 }
3329 if (S_GET_STORAGE_CLASS (symbolP) == C_FILE
3330 && SA_GET_FILE_FNAME_ZEROS (symbolP) == 0
3331 && SA_GET_FILE_FNAME_OFFSET (symbolP) != 0)
3332 {
3333 size = strlen (filename_list_scan->filename) + 1;
3334 memcpy (where, filename_list_scan->filename, size);
3335 filename_list_scan = filename_list_scan ->next;
3336 where += size;
3337 }
3338 }
3339 }
3340
3341 static void
3342 do_linenos_for (abfd, h, file_cursor)
3343 bfd * abfd;
3344 object_headers * h;
3345 unsigned long *file_cursor;
3346 {
3347 unsigned int idx;
3348 unsigned long start = *file_cursor;
3349
3350 for (idx = SEG_E0; idx < SEG_LAST; idx++)
3351 {
3352 segment_info_type *s = segment_info + idx;
3353
3354 if (s->scnhdr.s_nlnno != 0)
3355 {
3356 struct lineno_list *line_ptr;
3357
3358 struct external_lineno *buffer =
3359 (struct external_lineno *) xmalloc (s->scnhdr.s_nlnno * LINESZ);
3360
3361 struct external_lineno *dst = buffer;
3362
3363 /* Run through the table we've built and turn it into its external
3364 form, take this chance to remove duplicates. */
3365
3366 for (line_ptr = s->lineno_list_head;
3367 line_ptr != (struct lineno_list *) NULL;
3368 line_ptr = line_ptr->next)
3369 {
3370 if (line_ptr->line.l_lnno == 0)
3371 {
3372 /* Turn a pointer to a symbol into the symbols' index,
3373 provided that it has been initialised. */
3374 if (line_ptr->line.l_addr.l_symndx)
3375 line_ptr->line.l_addr.l_symndx =
3376 ((symbolS *) line_ptr->line.l_addr.l_symndx)->sy_number;
3377 }
3378 else
3379 line_ptr->line.l_addr.l_paddr += ((struct frag *) (line_ptr->frag))->fr_address;
3380
3381 (void) bfd_coff_swap_lineno_out (abfd, &(line_ptr->line), dst);
3382 dst++;
3383 }
3384
3385 s->scnhdr.s_lnnoptr = *file_cursor;
3386
3387 bfd_bwrite (buffer, (bfd_size_type) s->scnhdr.s_nlnno * LINESZ, abfd);
3388 free (buffer);
3389
3390 *file_cursor += s->scnhdr.s_nlnno * LINESZ;
3391 }
3392 }
3393
3394 H_SET_LINENO_SIZE (h, *file_cursor - start);
3395 }
3396
3397 /* Now we run through the list of frag chains in a segment and
3398 make all the subsegment frags appear at the end of the
3399 list, as if the seg 0 was extra long. */
3400
3401 static void
3402 remove_subsegs ()
3403 {
3404 unsigned int i;
3405
3406 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3407 {
3408 frchainS *head = segment_info[i].frchainP;
3409 fragS dummy;
3410 fragS *prev_frag = &dummy;
3411
3412 while (head && head->frch_seg == i)
3413 {
3414 prev_frag->fr_next = head->frch_root;
3415 prev_frag = head->frch_last;
3416 head = head->frch_next;
3417 }
3418 prev_frag->fr_next = 0;
3419 }
3420 }
3421
3422 unsigned long machine;
3423 int coff_flags;
3424
3425 #ifndef SUB_SEGMENT_ALIGN
3426 #ifdef HANDLE_ALIGN
3427 /* The last subsegment gets an aligment corresponding to the alignment
3428 of the section. This allows proper nop-filling at the end of
3429 code-bearing sections. */
3430 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
3431 (!(FRCHAIN)->frch_next || (FRCHAIN)->frch_next->frch_seg != (SEG) \
3432 ? get_recorded_alignment (SEG) : 0)
3433 #else
3434 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 1
3435 #endif
3436 #endif
3437
3438 extern void
3439 write_object_file ()
3440 {
3441 int i;
3442 const char *name;
3443 struct frchain *frchain_ptr;
3444
3445 object_headers headers;
3446 unsigned long file_cursor;
3447 bfd *abfd;
3448 unsigned int addr;
3449 abfd = bfd_openw (out_file_name, TARGET_FORMAT);
3450
3451 if (abfd == 0)
3452 {
3453 as_perror (_("FATAL: Can't create %s"), out_file_name);
3454 exit (EXIT_FAILURE);
3455 }
3456 bfd_set_format (abfd, bfd_object);
3457 bfd_set_arch_mach (abfd, BFD_ARCH, machine);
3458
3459 string_byte_count = 4;
3460
3461 /* Run through all the sub-segments and align them up. Also
3462 close any open frags. We tack a .fill onto the end of the
3463 frag chain so that any .align's size can be worked by looking
3464 at the next frag. */
3465 for (frchain_ptr = frchain_root;
3466 frchain_ptr != (struct frchain *) NULL;
3467 frchain_ptr = frchain_ptr->frch_next)
3468 {
3469 int alignment;
3470
3471 subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg);
3472
3473 alignment = SUB_SEGMENT_ALIGN (now_seg, frchain_ptr)
3474
3475 #ifdef md_do_align
3476 md_do_align (alignment, (char *) NULL, 0, 0, alignment_done);
3477 #endif
3478 if (subseg_text_p (now_seg))
3479 frag_align_code (alignment, 0);
3480 else
3481 frag_align (alignment, 0, 0);
3482
3483 #ifdef md_do_align
3484 alignment_done:
3485 #endif
3486
3487 frag_wane (frag_now);
3488 frag_now->fr_fix = 0;
3489 know (frag_now->fr_next == NULL);
3490 }
3491
3492 remove_subsegs ();
3493
3494 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3495 relax_segment (segment_info[i].frchainP->frch_root, i);
3496
3497 /* Relaxation has completed. Freeze all syms. */
3498 finalize_syms = 1;
3499
3500 H_SET_NUMBER_OF_SECTIONS (&headers, 0);
3501
3502 /* Find out how big the sections are, and set the addresses. */
3503 addr = 0;
3504 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3505 {
3506 long size;
3507
3508 segment_info[i].scnhdr.s_paddr = addr;
3509 segment_info[i].scnhdr.s_vaddr = addr;
3510
3511 if (segment_info[i].scnhdr.s_name[0])
3512 {
3513 H_SET_NUMBER_OF_SECTIONS (&headers,
3514 H_GET_NUMBER_OF_SECTIONS (&headers) + 1);
3515
3516 #ifdef COFF_LONG_SECTION_NAMES
3517 /* Support long section names as found in PE. This code
3518 must coordinate with that in coff_header_append and
3519 w_strings. */
3520 {
3521 unsigned int len;
3522
3523 len = strlen (segment_info[i].name);
3524 if (len > SCNNMLEN)
3525 string_byte_count += len + 1;
3526 }
3527 #endif /* COFF_LONG_SECTION_NAMES */
3528 }
3529
3530 size = size_section (abfd, (unsigned int) i);
3531 addr += size;
3532
3533 /* I think the section alignment is only used on the i960; the
3534 i960 needs it, and it should do no harm on other targets. */
3535 #ifdef ALIGNMENT_IN_S_FLAGS
3536 segment_info[i].scnhdr.s_flags |= (section_alignment[i] & 0xF) << 8;
3537 #else
3538 segment_info[i].scnhdr.s_align = 1 << section_alignment[i];
3539 #endif
3540
3541 if (i == SEG_E0)
3542 H_SET_TEXT_SIZE (&headers, size);
3543 else if (i == SEG_E1)
3544 H_SET_DATA_SIZE (&headers, size);
3545 else if (i == SEG_E2)
3546 H_SET_BSS_SIZE (&headers, size);
3547 }
3548
3549 /* Turn the gas native symbol table shape into a coff symbol table. */
3550 crawl_symbols (&headers, abfd);
3551
3552 if (string_byte_count == 4)
3553 string_byte_count = 0;
3554
3555 H_SET_STRING_SIZE (&headers, string_byte_count);
3556
3557 #ifdef tc_frob_file
3558 tc_frob_file ();
3559 #endif
3560
3561 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3562 {
3563 fixup_mdeps (segment_info[i].frchainP->frch_root, &headers, i);
3564 fixup_segment (&segment_info[i], i);
3565 }
3566
3567 /* Look for ".stab" segments and fill in their initial symbols
3568 correctly. */
3569 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3570 {
3571 name = segment_info[i].name;
3572
3573 if (name != NULL
3574 && strncmp (".stab", name, 5) == 0
3575 && strncmp (".stabstr", name, 8) != 0)
3576 adjust_stab_section (abfd, i);
3577 }
3578
3579 file_cursor = H_GET_TEXT_FILE_OFFSET (&headers);
3580
3581 bfd_seek (abfd, (file_ptr) file_cursor, 0);
3582
3583 /* Plant the data. */
3584 fill_section (abfd, &headers, &file_cursor);
3585
3586 do_relocs_for (abfd, &headers, &file_cursor);
3587
3588 do_linenos_for (abfd, &headers, &file_cursor);
3589
3590 H_SET_FILE_MAGIC_NUMBER (&headers, COFF_MAGIC);
3591 #ifndef OBJ_COFF_OMIT_TIMESTAMP
3592 H_SET_TIME_STAMP (&headers, (long)time((time_t *)0));
3593 #else
3594 H_SET_TIME_STAMP (&headers, 0);
3595 #endif
3596 #ifdef TC_COFF_SET_MACHINE
3597 TC_COFF_SET_MACHINE (&headers);
3598 #endif
3599
3600 #ifndef COFF_FLAGS
3601 #define COFF_FLAGS 0
3602 #endif
3603
3604 #ifdef KEEP_RELOC_INFO
3605 H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) |
3606 COFF_FLAGS | coff_flags));
3607 #else
3608 H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) |
3609 (H_GET_RELOCATION_SIZE(&headers) ? 0 : F_RELFLG) |
3610 COFF_FLAGS | coff_flags));
3611 #endif
3612
3613 {
3614 unsigned int symtable_size = H_GET_SYMBOL_TABLE_SIZE (&headers);
3615 char *buffer1 = xmalloc (symtable_size + string_byte_count + 1);
3616
3617 H_SET_SYMBOL_TABLE_POINTER (&headers, bfd_tell (abfd));
3618 w_symbols (abfd, buffer1, symbol_rootP);
3619 if (string_byte_count > 0)
3620 w_strings (buffer1 + symtable_size);
3621 bfd_bwrite (buffer1, (bfd_size_type) symtable_size + string_byte_count,
3622 abfd);
3623 free (buffer1);
3624 }
3625
3626 coff_header_append (abfd, &headers);
3627 #if 0
3628 /* Recent changes to write need this, but where it should
3629 go is up to Ken.. */
3630 if (bfd_close_all_done (abfd) == false)
3631 as_fatal (_("Can't close %s: %s"), out_file_name,
3632 bfd_errmsg (bfd_get_error ()));
3633 #else
3634 {
3635 extern bfd *stdoutput;
3636 stdoutput = abfd;
3637 }
3638 #endif
3639
3640 }
3641
3642 /* Add a new segment. This is called from subseg_new via the
3643 obj_new_segment macro. */
3644
3645 segT
3646 obj_coff_add_segment (name)
3647 const char *name;
3648 {
3649 unsigned int i;
3650
3651 #ifndef COFF_LONG_SECTION_NAMES
3652 char buf[SCNNMLEN + 1];
3653
3654 strncpy (buf, name, SCNNMLEN);
3655 buf[SCNNMLEN] = '\0';
3656 name = buf;
3657 #endif
3658
3659 for (i = SEG_E0; i < SEG_LAST && segment_info[i].scnhdr.s_name[0]; i++)
3660 if (strcmp (name, segment_info[i].name) == 0)
3661 return (segT) i;
3662
3663 if (i == SEG_LAST)
3664 {
3665 as_bad (_("Too many new sections; can't add \"%s\""), name);
3666 return now_seg;
3667 }
3668
3669 /* Add a new section. */
3670 strncpy (segment_info[i].scnhdr.s_name, name,
3671 sizeof (segment_info[i].scnhdr.s_name));
3672 segment_info[i].scnhdr.s_flags = STYP_REG;
3673 segment_info[i].name = xstrdup (name);
3674
3675 return (segT) i;
3676 }
3677
3678 /* Implement the .section pseudo op:
3679 .section name {, "flags"}
3680 ^ ^
3681 | +--- optional flags: 'b' for bss
3682 | 'i' for info
3683 +-- section name 'l' for lib
3684 'n' for noload
3685 'o' for over
3686 'w' for data
3687 'd' (apparently m88k for data)
3688 'x' for text
3689 'r' for read-only data
3690 But if the argument is not a quoted string, treat it as a
3691 subsegment number. */
3692
3693 void
3694 obj_coff_section (ignore)
3695 int ignore ATTRIBUTE_UNUSED;
3696 {
3697 /* Strip out the section name. */
3698 char *section_name, *name;
3699 char c;
3700 unsigned int exp;
3701 long flags;
3702
3703 if (flag_mri)
3704 {
3705 char type;
3706
3707 s_mri_sect (&type);
3708 flags = 0;
3709 if (type == 'C')
3710 flags = STYP_TEXT;
3711 else if (type == 'D')
3712 flags = STYP_DATA;
3713 segment_info[now_seg].scnhdr.s_flags |= flags;
3714
3715 return;
3716 }
3717
3718 section_name = input_line_pointer;
3719 c = get_symbol_end ();
3720
3721 name = xmalloc (input_line_pointer - section_name + 1);
3722 strcpy (name, section_name);
3723
3724 *input_line_pointer = c;
3725
3726 exp = 0;
3727 flags = 0;
3728
3729 SKIP_WHITESPACE ();
3730 if (*input_line_pointer == ',')
3731 {
3732 ++input_line_pointer;
3733 SKIP_WHITESPACE ();
3734
3735 if (*input_line_pointer != '"')
3736 exp = get_absolute_expression ();
3737 else
3738 {
3739 ++input_line_pointer;
3740 while (*input_line_pointer != '"'
3741 && ! is_end_of_line[(unsigned char) *input_line_pointer])
3742 {
3743 switch (*input_line_pointer)
3744 {
3745 case 'b': flags |= STYP_BSS; break;
3746 case 'i': flags |= STYP_INFO; break;
3747 case 'l': flags |= STYP_LIB; break;
3748 case 'n': flags |= STYP_NOLOAD; break;
3749 case 'o': flags |= STYP_OVER; break;
3750 case 'd':
3751 case 'w': flags |= STYP_DATA; break;
3752 case 'x': flags |= STYP_TEXT; break;
3753 case 'r': flags |= STYP_LIT; break;
3754 default:
3755 as_warn(_("unknown section attribute '%c'"),
3756 *input_line_pointer);
3757 break;
3758 }
3759 ++input_line_pointer;
3760 }
3761 if (*input_line_pointer == '"')
3762 ++input_line_pointer;
3763 }
3764 }
3765
3766 subseg_new (name, (subsegT) exp);
3767
3768 segment_info[now_seg].scnhdr.s_flags |= flags;
3769
3770 demand_empty_rest_of_line ();
3771 }
3772
3773 static void
3774 obj_coff_text (ignore)
3775 int ignore ATTRIBUTE_UNUSED;
3776 {
3777 subseg_new (".text", get_absolute_expression ());
3778 }
3779
3780 static void
3781 obj_coff_data (ignore)
3782 int ignore ATTRIBUTE_UNUSED;
3783 {
3784 if (flag_readonly_data_in_text)
3785 subseg_new (".text", get_absolute_expression () + 1000);
3786 else
3787 subseg_new (".data", get_absolute_expression ());
3788 }
3789
3790 static void
3791 obj_coff_ident (ignore)
3792 int ignore ATTRIBUTE_UNUSED;
3793 {
3794 segT current_seg = now_seg; /* Save current seg. */
3795 subsegT current_subseg = now_subseg;
3796
3797 subseg_new (".comment", 0); /* .comment seg. */
3798 stringer (1); /* Read string. */
3799 subseg_set (current_seg, current_subseg); /* Restore current seg. */
3800 }
3801
3802 void
3803 c_symbol_merge (debug, normal)
3804 symbolS *debug;
3805 symbolS *normal;
3806 {
3807 S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug));
3808 S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug));
3809
3810 if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal))
3811 S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
3812
3813 if (S_GET_NUMBER_AUXILIARY (debug) > 0)
3814 memcpy ((char *) &normal->sy_symbol.ost_auxent[0],
3815 (char *) &debug->sy_symbol.ost_auxent[0],
3816 (unsigned int) (S_GET_NUMBER_AUXILIARY (debug) * AUXESZ));
3817
3818 /* Move the debug flags. */
3819 SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug));
3820 }
3821
3822 static int
3823 c_line_new (symbol, paddr, line_number, frag)
3824 symbolS * symbol;
3825 long paddr;
3826 int line_number;
3827 fragS * frag;
3828 {
3829 struct lineno_list *new_line =
3830 (struct lineno_list *) xmalloc (sizeof (struct lineno_list));
3831
3832 segment_info_type *s = segment_info + now_seg;
3833 new_line->line.l_lnno = line_number;
3834
3835 if (line_number == 0)
3836 {
3837 last_line_symbol = symbol;
3838 new_line->line.l_addr.l_symndx = (long) symbol;
3839 }
3840 else
3841 {
3842 new_line->line.l_addr.l_paddr = paddr;
3843 }
3844
3845 new_line->frag = (char *) frag;
3846 new_line->next = (struct lineno_list *) NULL;
3847
3848 if (s->lineno_list_head == (struct lineno_list *) NULL)
3849 s->lineno_list_head = new_line;
3850 else
3851 s->lineno_list_tail->next = new_line;
3852
3853 s->lineno_list_tail = new_line;
3854 return LINESZ * s->scnhdr.s_nlnno++;
3855 }
3856
3857 void
3858 c_dot_file_symbol (filename)
3859 char *filename;
3860 {
3861 symbolS *symbolP;
3862
3863 symbolP = symbol_new (".file",
3864 SEG_DEBUG,
3865 0,
3866 &zero_address_frag);
3867
3868 S_SET_STORAGE_CLASS (symbolP, C_FILE);
3869 S_SET_NUMBER_AUXILIARY (symbolP, 1);
3870
3871 if (strlen (filename) > FILNMLEN)
3872 {
3873 /* Filename is too long to fit into an auxent,
3874 we stick it into the string table instead. We keep
3875 a linked list of the filenames we find so we can emit
3876 them later. */
3877 struct filename_list *f = ((struct filename_list *)
3878 xmalloc (sizeof (struct filename_list)));
3879
3880 f->filename = filename;
3881 f->next = 0;
3882
3883 SA_SET_FILE_FNAME_ZEROS (symbolP, 0);
3884 SA_SET_FILE_FNAME_OFFSET (symbolP, 1);
3885
3886 if (filename_list_tail)
3887 filename_list_tail->next = f;
3888 else
3889 filename_list_head = f;
3890 filename_list_tail = f;
3891 }
3892 else
3893 {
3894 SA_SET_FILE_FNAME (symbolP, filename);
3895 }
3896 #ifndef NO_LISTING
3897 {
3898 extern int listing;
3899 if (listing)
3900 listing_source_file (filename);
3901 }
3902 #endif
3903 SF_SET_DEBUG (symbolP);
3904 S_SET_VALUE (symbolP, (valueT) previous_file_symbol);
3905
3906 previous_file_symbol = symbolP;
3907
3908 /* Make sure that the symbol is first on the symbol chain. */
3909 if (symbol_rootP != symbolP)
3910 {
3911 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3912 symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP);
3913 }
3914 }
3915
3916 /* Build a 'section static' symbol. */
3917
3918 symbolS *
3919 c_section_symbol (name, idx)
3920 char *name;
3921 int idx;
3922 {
3923 symbolS *symbolP;
3924
3925 symbolP = symbol_find_base (name, DO_NOT_STRIP);
3926 if (symbolP == NULL)
3927 symbolP = symbol_new (name, idx, 0, &zero_address_frag);
3928 else
3929 {
3930 /* Mmmm. I just love violating interfaces. Makes me feel...dirty. */
3931 S_SET_SEGMENT (symbolP, idx);
3932 symbolP->sy_frag = &zero_address_frag;
3933 }
3934
3935 S_SET_STORAGE_CLASS (symbolP, C_STAT);
3936 S_SET_NUMBER_AUXILIARY (symbolP, 1);
3937
3938 SF_SET_STATICS (symbolP);
3939
3940 #ifdef TE_DELTA
3941 /* manfred@s-direktnet.de: section symbols *must* have the LOCAL bit cleared,
3942 which is set by the new definition of LOCAL_LABEL in tc-m68k.h. */
3943 SF_CLEAR_LOCAL (symbolP);
3944 #endif
3945 #ifdef TE_PE
3946 /* If the .linkonce pseudo-op was used for this section, we must
3947 store the information in the auxiliary entry for the section
3948 symbol. */
3949 if (segment_info[idx].linkonce != LINKONCE_UNSET)
3950 {
3951 int type;
3952
3953 switch (segment_info[idx].linkonce)
3954 {
3955 default:
3956 abort ();
3957 case LINKONCE_DISCARD:
3958 type = IMAGE_COMDAT_SELECT_ANY;
3959 break;
3960 case LINKONCE_ONE_ONLY:
3961 type = IMAGE_COMDAT_SELECT_NODUPLICATES;
3962 break;
3963 case LINKONCE_SAME_SIZE:
3964 type = IMAGE_COMDAT_SELECT_SAME_SIZE;
3965 break;
3966 case LINKONCE_SAME_CONTENTS:
3967 type = IMAGE_COMDAT_SELECT_EXACT_MATCH;
3968 break;
3969 }
3970
3971 SYM_AUXENT (symbolP)->x_scn.x_comdat = type;
3972 }
3973 #endif /* TE_PE */
3974
3975 return symbolP;
3976 }
3977
3978 static void
3979 w_symbols (abfd, where, symbol_rootP)
3980 bfd * abfd;
3981 char *where;
3982 symbolS * symbol_rootP;
3983 {
3984 symbolS *symbolP;
3985 unsigned int i;
3986
3987 /* First fill in those values we have only just worked out. */
3988 for (i = SEG_E0; i < SEG_LAST; i++)
3989 {
3990 symbolP = segment_info[i].dot;
3991 if (symbolP)
3992 {
3993 SA_SET_SCN_SCNLEN (symbolP, segment_info[i].scnhdr.s_size);
3994 SA_SET_SCN_NRELOC (symbolP, segment_info[i].scnhdr.s_nreloc);
3995 SA_SET_SCN_NLINNO (symbolP, segment_info[i].scnhdr.s_nlnno);
3996 }
3997 }
3998
3999 /* Emit all symbols left in the symbol chain. */
4000 for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
4001 {
4002 /* Used to save the offset of the name. It is used to point
4003 to the string in memory but must be a file offset. */
4004 char *temp;
4005
4006 /* We can't fix the lnnoptr field in yank_symbols with the other
4007 adjustments, because we have to wait until we know where they
4008 go in the file. */
4009 if (SF_GET_ADJ_LNNOPTR (symbolP))
4010 SA_GET_SYM_LNNOPTR (symbolP) +=
4011 segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_lnnoptr;
4012
4013 tc_coff_symbol_emit_hook (symbolP);
4014
4015 temp = S_GET_NAME (symbolP);
4016 if (SF_GET_STRING (symbolP))
4017 {
4018 S_SET_OFFSET (symbolP, symbolP->sy_name_offset);
4019 S_SET_ZEROES (symbolP, 0);
4020 }
4021 else
4022 {
4023 memset (symbolP->sy_symbol.ost_entry.n_name, 0, SYMNMLEN);
4024 strncpy (symbolP->sy_symbol.ost_entry.n_name, temp, SYMNMLEN);
4025 }
4026 where = symbol_to_chars (abfd, where, symbolP);
4027 S_SET_NAME (symbolP, temp);
4028 }
4029 }
4030
4031 static void
4032 obj_coff_lcomm (ignore)
4033 int ignore ATTRIBUTE_UNUSED;
4034 {
4035 s_lcomm(0);
4036 return;
4037 #if 0
4038 char *name;
4039 char c;
4040 int temp;
4041 char *p;
4042
4043 symbolS *symbolP;
4044
4045 name = input_line_pointer;
4046
4047 c = get_symbol_end ();
4048 p = input_line_pointer;
4049 *p = c;
4050 SKIP_WHITESPACE ();
4051 if (*input_line_pointer != ',')
4052 {
4053 as_bad (_("Expected comma after name"));
4054 ignore_rest_of_line ();
4055 return;
4056 }
4057 if (*input_line_pointer == '\n')
4058 {
4059 as_bad (_("Missing size expression"));
4060 return;
4061 }
4062 input_line_pointer++;
4063 if ((temp = get_absolute_expression ()) < 0)
4064 {
4065 as_warn (_("lcomm length (%d.) <0! Ignored."), temp);
4066 ignore_rest_of_line ();
4067 return;
4068 }
4069 *p = 0;
4070
4071 symbolP = symbol_find_or_make (name);
4072
4073 if (S_GET_SEGMENT (symbolP) == SEG_UNKNOWN &&
4074 S_GET_VALUE (symbolP) == 0)
4075 {
4076 if (! need_pass_2)
4077 {
4078 char *p;
4079 segT current_seg = now_seg; /* Save current seg. */
4080 subsegT current_subseg = now_subseg;
4081
4082 subseg_set (SEG_E2, 1);
4083 symbolP->sy_frag = frag_now;
4084 p = frag_var(rs_org, 1, 1, (relax_substateT)0, symbolP,
4085 (offsetT) temp, (char *) 0);
4086 *p = 0;
4087 subseg_set (current_seg, current_subseg); /* Restore current seg. */
4088 S_SET_SEGMENT (symbolP, SEG_E2);
4089 S_SET_STORAGE_CLASS (symbolP, C_STAT);
4090 }
4091 }
4092 else
4093 as_bad (_("Symbol %s already defined"), name);
4094
4095 demand_empty_rest_of_line ();
4096 #endif
4097 }
4098
4099 static void
4100 fixup_mdeps (frags, h, this_segment)
4101 fragS * frags;
4102 object_headers * h;
4103 segT this_segment;
4104 {
4105 subseg_change (this_segment, 0);
4106
4107 while (frags)
4108 {
4109 switch (frags->fr_type)
4110 {
4111 case rs_align:
4112 case rs_align_code:
4113 case rs_align_test:
4114 case rs_org:
4115 #ifdef HANDLE_ALIGN
4116 HANDLE_ALIGN (frags);
4117 #endif
4118 frags->fr_type = rs_fill;
4119 frags->fr_offset =
4120 ((frags->fr_next->fr_address - frags->fr_address - frags->fr_fix)
4121 / frags->fr_var);
4122 break;
4123 case rs_machine_dependent:
4124 md_convert_frag (h, this_segment, frags);
4125 frag_wane (frags);
4126 break;
4127 default:
4128 ;
4129 }
4130 frags = frags->fr_next;
4131 }
4132 }
4133
4134 #if 1
4135
4136 #ifndef TC_FORCE_RELOCATION
4137 #define TC_FORCE_RELOCATION(fix) 0
4138 #endif
4139
4140 static void
4141 fixup_segment (segP, this_segment_type)
4142 segment_info_type * segP;
4143 segT this_segment_type;
4144 {
4145 fixS * fixP;
4146 symbolS *add_symbolP;
4147 symbolS *sub_symbolP;
4148 long add_number;
4149 int size;
4150 char *place;
4151 long where;
4152 char pcrel;
4153 fragS *fragP;
4154 segT add_symbol_segment = absolute_section;
4155
4156 for (fixP = segP->fix_root; fixP; fixP = fixP->fx_next)
4157 {
4158 fragP = fixP->fx_frag;
4159 know (fragP);
4160 where = fixP->fx_where;
4161 place = fragP->fr_literal + where;
4162 size = fixP->fx_size;
4163 add_symbolP = fixP->fx_addsy;
4164 sub_symbolP = fixP->fx_subsy;
4165 add_number = fixP->fx_offset;
4166 pcrel = fixP->fx_pcrel;
4167
4168 /* We want function-relative stabs to work on systems which
4169 may use a relaxing linker; thus we must handle the sym1-sym2
4170 fixups function-relative stabs generates.
4171
4172 Of course, if you actually enable relaxing in the linker, the
4173 line and block scoping information is going to be incorrect
4174 in some cases. The only way to really fix this is to support
4175 a reloc involving the difference of two symbols. */
4176 if (linkrelax
4177 && (!sub_symbolP || pcrel))
4178 continue;
4179
4180 #ifdef TC_I960
4181 if (fixP->fx_tcbit && SF_GET_CALLNAME (add_symbolP))
4182 {
4183 /* Relocation should be done via the associated 'bal' entry
4184 point symbol. */
4185
4186 if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP)))
4187 {
4188 as_bad_where (fixP->fx_file, fixP->fx_line,
4189 _("No 'bal' entry point for leafproc %s"),
4190 S_GET_NAME (add_symbolP));
4191 continue;
4192 }
4193 fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
4194 }
4195 #endif
4196
4197 /* Make sure the symbols have been resolved; this may not have
4198 happened if these are expression symbols. */
4199 if (add_symbolP != NULL && ! add_symbolP->sy_resolved)
4200 resolve_symbol_value (add_symbolP);
4201
4202 if (add_symbolP != NULL)
4203 {
4204 /* If this fixup is against a symbol which has been equated
4205 to another symbol, convert it to the other symbol. */
4206 if (add_symbolP->sy_value.X_op == O_symbol
4207 && (! S_IS_DEFINED (add_symbolP)
4208 || S_IS_COMMON (add_symbolP)))
4209 {
4210 while (add_symbolP->sy_value.X_op == O_symbol
4211 && (! S_IS_DEFINED (add_symbolP)
4212 || S_IS_COMMON (add_symbolP)))
4213 {
4214 symbolS *n;
4215
4216 /* We must avoid looping, as that can occur with a
4217 badly written program. */
4218 n = add_symbolP->sy_value.X_add_symbol;
4219 if (n == add_symbolP)
4220 break;
4221 add_number += add_symbolP->sy_value.X_add_number;
4222 add_symbolP = n;
4223 }
4224 fixP->fx_addsy = add_symbolP;
4225 fixP->fx_offset = add_number;
4226 }
4227 }
4228
4229 if (sub_symbolP != NULL && ! sub_symbolP->sy_resolved)
4230 resolve_symbol_value (sub_symbolP);
4231
4232 if (add_symbolP != NULL
4233 && add_symbolP->sy_mri_common)
4234 {
4235 know (add_symbolP->sy_value.X_op == O_symbol);
4236 add_number += S_GET_VALUE (add_symbolP);
4237 fixP->fx_offset = add_number;
4238 add_symbolP = fixP->fx_addsy = add_symbolP->sy_value.X_add_symbol;
4239 }
4240
4241 if (add_symbolP)
4242 add_symbol_segment = S_GET_SEGMENT (add_symbolP);
4243
4244 if (sub_symbolP)
4245 {
4246 if (add_symbolP == NULL || add_symbol_segment == absolute_section)
4247 {
4248 if (add_symbolP != NULL)
4249 {
4250 add_number += S_GET_VALUE (add_symbolP);
4251 add_symbolP = NULL;
4252 fixP->fx_addsy = NULL;
4253 }
4254
4255 /* It's just -sym. */
4256 if (S_GET_SEGMENT (sub_symbolP) == absolute_section)
4257 {
4258 add_number -= S_GET_VALUE (sub_symbolP);
4259 fixP->fx_subsy = 0;
4260 fixP->fx_done = 1;
4261 }
4262 else
4263 {
4264 #ifndef TC_M68K
4265 as_bad_where (fixP->fx_file, fixP->fx_line,
4266 _("Negative of non-absolute symbol %s"),
4267 S_GET_NAME (sub_symbolP));
4268 #endif
4269 add_number -= S_GET_VALUE (sub_symbolP);
4270 } /* not absolute */
4271
4272 /* if sub_symbol is in the same segment that add_symbol
4273 and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE. */
4274 }
4275 else if (S_GET_SEGMENT (sub_symbolP) == add_symbol_segment
4276 && SEG_NORMAL (add_symbol_segment))
4277 {
4278 /* Difference of 2 symbols from same segment. Can't
4279 make difference of 2 undefineds: 'value' means
4280 something different for N_UNDF. */
4281 #ifdef TC_I960
4282 /* Makes no sense to use the difference of 2 arbitrary symbols
4283 as the target of a call instruction. */
4284 if (fixP->fx_tcbit)
4285 as_bad_where (fixP->fx_file, fixP->fx_line,
4286 _("callj to difference of 2 symbols"));
4287 #endif /* TC_I960 */
4288 add_number += S_GET_VALUE (add_symbolP) -
4289 S_GET_VALUE (sub_symbolP);
4290 add_symbolP = NULL;
4291
4292 if (!TC_FORCE_RELOCATION (fixP))
4293 {
4294 fixP->fx_addsy = NULL;
4295 fixP->fx_subsy = NULL;
4296 fixP->fx_done = 1;
4297 #ifdef TC_M68K /* is this right? */
4298 pcrel = 0;
4299 fixP->fx_pcrel = 0;
4300 #endif
4301 }
4302 }
4303 else
4304 {
4305 /* Different segments in subtraction. */
4306 know (!(S_IS_EXTERNAL (sub_symbolP) && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
4307
4308 if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
4309 add_number -= S_GET_VALUE (sub_symbolP);
4310
4311 #ifdef DIFF_EXPR_OK
4312 else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type
4313 #if 0 /* Okay for 68k, at least... */
4314 && !pcrel
4315 #endif
4316 )
4317 {
4318 /* Make it pc-relative. */
4319 add_number += (md_pcrel_from (fixP)
4320 - S_GET_VALUE (sub_symbolP));
4321 pcrel = 1;
4322 fixP->fx_pcrel = 1;
4323 sub_symbolP = 0;
4324 fixP->fx_subsy = 0;
4325 }
4326 #endif
4327 else
4328 {
4329 as_bad_where (fixP->fx_file, fixP->fx_line,
4330 _("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld."),
4331 segment_name (S_GET_SEGMENT (sub_symbolP)),
4332 S_GET_NAME (sub_symbolP),
4333 (long) (fragP->fr_address + where));
4334 }
4335 }
4336 }
4337
4338 if (add_symbolP)
4339 {
4340 if (add_symbol_segment == this_segment_type && pcrel)
4341 {
4342 /* This fixup was made when the symbol's segment was
4343 SEG_UNKNOWN, but it is now in the local segment.
4344 So we know how to do the address without relocation. */
4345 #ifdef TC_I960
4346 /* reloc_callj() may replace a 'call' with a 'calls' or a 'bal',
4347 in which cases it modifies *fixP as appropriate. In the case
4348 of a 'calls', no further work is required, and *fixP has been
4349 set up to make the rest of the code below a no-op. */
4350 reloc_callj (fixP);
4351 #endif /* TC_I960 */
4352
4353 add_number += S_GET_VALUE (add_symbolP);
4354 add_number -= md_pcrel_from (fixP);
4355
4356 /* We used to do
4357 add_number -= segP->scnhdr.s_vaddr;
4358 if defined (TC_I386) || defined (TE_LYNX). I now
4359 think that was an error propagated from the case when
4360 we are going to emit the relocation. If we are not
4361 going to emit the relocation, then we just want to
4362 set add_number to the difference between the symbols.
4363 This is a case that would only arise when there is a
4364 PC relative reference from a section other than .text
4365 to a symbol defined in the same section, and the
4366 reference is not relaxed. Since jump instructions on
4367 the i386 are relaxed, this could only arise with a
4368 call instruction. */
4369
4370 pcrel = 0; /* Lie. Don't want further pcrel processing. */
4371 if (!TC_FORCE_RELOCATION (fixP))
4372 {
4373 fixP->fx_addsy = NULL;
4374 fixP->fx_done = 1;
4375 }
4376 }
4377 else
4378 {
4379 switch (add_symbol_segment)
4380 {
4381 case absolute_section:
4382 #ifdef TC_I960
4383 /* See comment about reloc_callj() above. */
4384 reloc_callj (fixP);
4385 #endif /* TC_I960 */
4386 add_number += S_GET_VALUE (add_symbolP);
4387 add_symbolP = NULL;
4388
4389 if (!TC_FORCE_RELOCATION (fixP))
4390 {
4391 fixP->fx_addsy = NULL;
4392 fixP->fx_done = 1;
4393 }
4394 break;
4395 default:
4396
4397 #if defined(TC_A29K) || (defined(TE_PE) && defined(TC_I386)) || defined(TC_M88K) || defined(TC_OR32)
4398 /* This really should be handled in the linker, but
4399 backward compatibility forbids. */
4400 add_number += S_GET_VALUE (add_symbolP);
4401 #else
4402 add_number += S_GET_VALUE (add_symbolP) +
4403 segment_info[S_GET_SEGMENT (add_symbolP)].scnhdr.s_paddr;
4404 #endif
4405 break;
4406
4407 case SEG_UNKNOWN:
4408 #ifdef TC_I960
4409 if ((int) fixP->fx_bit_fixP == 13)
4410 {
4411 /* This is a COBR instruction. They have only a
4412 13-bit displacement and are only to be used
4413 for local branches: flag as error, don't generate
4414 relocation. */
4415 as_bad_where (fixP->fx_file, fixP->fx_line,
4416 _("can't use COBR format with external label"));
4417 fixP->fx_addsy = NULL;
4418 fixP->fx_done = 1;
4419 continue;
4420 }
4421 #endif /* TC_I960 */
4422 #if ((defined (TC_I386) || defined (TE_LYNX) || defined (TE_AUX)) && !defined(TE_PE)) || defined (COFF_COMMON_ADDEND)
4423 /* 386 COFF uses a peculiar format in which the
4424 value of a common symbol is stored in the .text
4425 segment (I've checked this on SVR3.2 and SCO
4426 3.2.2) Ian Taylor <ian@cygnus.com>. */
4427 /* This is also true for 68k COFF on sysv machines
4428 (Checked on Motorola sysv68 R3V6 and R3V7.1, and also on
4429 UNIX System V/M68000, Release 1.0 from ATT/Bell Labs)
4430 Philippe De Muyter <phdm@info.ucl.ac.be>. */
4431 if (S_IS_COMMON (add_symbolP))
4432 add_number += S_GET_VALUE (add_symbolP);
4433 #endif
4434 break;
4435
4436 }
4437 }
4438 }
4439
4440 if (pcrel)
4441 {
4442 #if !defined(TC_M88K) && !(defined(TE_PE) && defined(TC_I386)) && !defined(TC_A29K) && !defined(TC_OR32)
4443 /* This adjustment is not correct on the m88k, for which the
4444 linker does all the computation. */
4445 add_number -= md_pcrel_from (fixP);
4446 #endif
4447 if (add_symbolP == 0)
4448 fixP->fx_addsy = &abs_symbol;
4449 #if defined (TC_I386) || defined (TE_LYNX) || defined (TC_I960) || defined (TC_M68K)
4450 /* On the 386 we must adjust by the segment vaddr as well.
4451 Ian Taylor.
4452
4453 I changed the i960 to work this way as well. This is
4454 compatible with the current GNU linker behaviour. I do
4455 not know what other i960 COFF assemblers do. This is not
4456 a common case: normally, only assembler code will contain
4457 a PC relative reloc, and only branches which do not
4458 originate in the .text section will have a non-zero
4459 address.
4460
4461 I changed the m68k to work this way as well. This will
4462 break existing PC relative relocs from sections which do
4463 not start at address 0, but it will make ld -r work.
4464 Ian Taylor, 4 Oct 96. */
4465
4466 add_number -= segP->scnhdr.s_vaddr;
4467 #endif
4468 }
4469
4470 md_apply_fix3 (fixP, (valueT *) & add_number, this_segment_type);
4471
4472 if (!fixP->fx_bit_fixP && ! fixP->fx_no_overflow)
4473 {
4474 #ifndef TC_M88K
4475 /* The m88k uses the offset field of the reloc to get around
4476 this problem. */
4477 if ((size == 1
4478 && ((add_number & ~0xFF)
4479 || (fixP->fx_signed && (add_number & 0x80)))
4480 && ((add_number & ~0xFF) != (-1 & ~0xFF)
4481 || (add_number & 0x80) == 0))
4482 || (size == 2
4483 && ((add_number & ~0xFFFF)
4484 || (fixP->fx_signed && (add_number & 0x8000)))
4485 && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF)
4486 || (add_number & 0x8000) == 0)))
4487 {
4488 as_bad_where (fixP->fx_file, fixP->fx_line,
4489 _("Value of %ld too large for field of %d bytes at 0x%lx"),
4490 (long) add_number, size,
4491 (unsigned long) (fragP->fr_address + where));
4492 }
4493 #endif
4494 #ifdef WARN_SIGNED_OVERFLOW_WORD
4495 /* Warn if a .word value is too large when treated as a
4496 signed number. We already know it is not too negative.
4497 This is to catch over-large switches generated by gcc on
4498 the 68k. */
4499 if (!flag_signed_overflow_ok
4500 && size == 2
4501 && add_number > 0x7fff)
4502 as_bad_where (fixP->fx_file, fixP->fx_line,
4503 _("Signed .word overflow; switch may be too large; %ld at 0x%lx"),
4504 (long) add_number,
4505 (unsigned long) (fragP->fr_address + where));
4506 #endif
4507 }
4508 }
4509 }
4510
4511 #endif
4512
4513 /* The first entry in a .stab section is special. */
4514
4515 void
4516 obj_coff_init_stab_section (seg)
4517 segT seg;
4518 {
4519 char *file;
4520 char *p;
4521 char *stabstr_name;
4522 unsigned int stroff;
4523
4524 /* Make space for this first symbol. */
4525 p = frag_more (12);
4526 /* Zero it out. */
4527 memset (p, 0, 12);
4528 as_where (&file, (unsigned int *) NULL);
4529 stabstr_name = (char *) alloca (strlen (segment_info[seg].name) + 4);
4530 strcpy (stabstr_name, segment_info[seg].name);
4531 strcat (stabstr_name, "str");
4532 stroff = get_stab_string_offset (file, stabstr_name);
4533 know (stroff == 1);
4534 md_number_to_chars (p, stroff, 4);
4535 }
4536
4537 /* Fill in the counts in the first entry in a .stab section. */
4538
4539 static void
4540 adjust_stab_section(abfd, seg)
4541 bfd *abfd;
4542 segT seg;
4543 {
4544 segT stabstrseg = SEG_UNKNOWN;
4545 const char *secname, *name2;
4546 char *name;
4547 char *p = NULL;
4548 int i, strsz = 0, nsyms;
4549 fragS *frag = segment_info[seg].frchainP->frch_root;
4550
4551 /* Look for the associated string table section. */
4552
4553 secname = segment_info[seg].name;
4554 name = (char *) alloca (strlen (secname) + 4);
4555 strcpy (name, secname);
4556 strcat (name, "str");
4557
4558 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
4559 {
4560 name2 = segment_info[i].name;
4561 if (name2 != NULL && strncmp(name2, name, 8) == 0)
4562 {
4563 stabstrseg = i;
4564 break;
4565 }
4566 }
4567
4568 /* If we found the section, get its size. */
4569 if (stabstrseg != SEG_UNKNOWN)
4570 strsz = size_section (abfd, stabstrseg);
4571
4572 nsyms = size_section (abfd, seg) / 12 - 1;
4573
4574 /* Look for the first frag of sufficient size for the initial stab
4575 symbol, and collect a pointer to it. */
4576 while (frag && frag->fr_fix < 12)
4577 frag = frag->fr_next;
4578 assert (frag != 0);
4579 p = frag->fr_literal;
4580 assert (p != 0);
4581
4582 /* Write in the number of stab symbols and the size of the string
4583 table. */
4584 bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6);
4585 bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
4586 }
4587
4588 #endif /* not BFD_ASSEMBLER */
4589
4590 const pseudo_typeS coff_pseudo_table[] =
4591 {
4592 {"def", obj_coff_def, 0},
4593 {"dim", obj_coff_dim, 0},
4594 {"endef", obj_coff_endef, 0},
4595 {"line", obj_coff_line, 0},
4596 {"ln", obj_coff_ln, 0},
4597 #ifdef BFD_ASSEMBLER
4598 {"loc", obj_coff_loc, 0},
4599 #endif
4600 {"appline", obj_coff_ln, 1},
4601 {"scl", obj_coff_scl, 0},
4602 {"size", obj_coff_size, 0},
4603 {"tag", obj_coff_tag, 0},
4604 {"type", obj_coff_type, 0},
4605 {"val", obj_coff_val, 0},
4606 {"section", obj_coff_section, 0},
4607 {"sect", obj_coff_section, 0},
4608 /* FIXME: We ignore the MRI short attribute. */
4609 {"section.s", obj_coff_section, 0},
4610 {"sect.s", obj_coff_section, 0},
4611 /* We accept the .bss directive for backward compatibility with
4612 earlier versions of gas. */
4613 {"bss", obj_coff_bss, 0},
4614 {"weak", obj_coff_weak, 0},
4615 {"ident", obj_coff_ident, 0},
4616 #ifndef BFD_ASSEMBLER
4617 {"use", obj_coff_section, 0},
4618 {"text", obj_coff_text, 0},
4619 {"data", obj_coff_data, 0},
4620 {"lcomm", obj_coff_lcomm, 0},
4621 #else
4622 {"optim", s_ignore, 0}, /* For sun386i cc (?) */
4623 #endif
4624 {"version", s_ignore, 0},
4625 {"ABORT", s_abort, 0},
4626 #ifdef TC_M88K
4627 /* The m88k uses sdef instead of def. */
4628 {"sdef", obj_coff_def, 0},
4629 #endif
4630 {NULL, NULL, 0} /* end sentinel */
4631 }; /* coff_pseudo_table */
4632 \f
4633 #ifdef BFD_ASSEMBLER
4634
4635 /* Support for a COFF emulation. */
4636
4637 static void coff_pop_insert PARAMS ((void));
4638 static int coff_separate_stab_sections PARAMS ((void));
4639
4640 static void
4641 coff_pop_insert ()
4642 {
4643 pop_insert (coff_pseudo_table);
4644 }
4645
4646 static int
4647 coff_separate_stab_sections ()
4648 {
4649 return 1;
4650 }
4651
4652 const struct format_ops coff_format_ops =
4653 {
4654 bfd_target_coff_flavour,
4655 0, /* dfl_leading_underscore */
4656 1, /* emit_section_symbols */
4657 0, /* begin */
4658 c_dot_file_symbol,
4659 coff_frob_symbol,
4660 0, /* frob_file */
4661 0, /* frob_file_before_adjust */
4662 coff_frob_file_after_relocs,
4663 0, /* s_get_size */
4664 0, /* s_set_size */
4665 0, /* s_get_align */
4666 0, /* s_set_align */
4667 0, /* s_get_other */
4668 0, /* s_set_other */
4669 0, /* s_get_desc */
4670 0, /* s_set_desc */
4671 0, /* s_get_type */
4672 0, /* s_set_type */
4673 0, /* copy_symbol_attributes */
4674 0, /* generate_asm_lineno */
4675 0, /* process_stab */
4676 coff_separate_stab_sections,
4677 obj_coff_init_stab_section,
4678 0, /* sec_sym_ok_for_reloc */
4679 coff_pop_insert,
4680 0, /* ecoff_set_ext */
4681 coff_obj_read_begin_hook,
4682 coff_obj_symbol_new_hook
4683 };
4684
4685 #endif
This page took 0.136765 seconds and 5 git commands to generate.