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