1 /* coff object file format with bfd
2 Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc.
4 This file is part of GAS.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22 How does this releate to the rest of GAS ?
24 Well, all the other files in gas are more or less a black box. It
25 takes care of opening files, parsing command lines, stripping blanks
26 etc etc. This module gets a chance to register what it wants to do by
27 saying that it is interested in various pseduo ops. The other big
28 change is write_object_file. This runs through all the data
29 structures that gas builds, and outputs the file in the format of our
32 Hacked for BFDness by steve chamberlain
34 This object module now supports the Hitachi H8/300 and the AMD 29k
43 #include "../bfd/libbfd.h"
46 #define MIN(a,b) ((a) < (b)? (a) : (b))
47 /* This vector is used to turn an internal segment into a section #
48 suitable for insertion into a coff symbol table
51 const short seg_N_TYPE[] =
52 { /* in: segT out: N_TYPE bits */
64 C_UNDEF_SECTION, /* SEG_UNKNOWN */
65 C_UNDEF_SECTION, /* SEG_ABSENT */
66 C_UNDEF_SECTION, /* SEG_PASS1 */
67 C_UNDEF_SECTION, /* SEG_GOOF */
68 C_UNDEF_SECTION, /* SEG_BIG */
69 C_UNDEF_SECTION, /* SEG_DIFFERENCE */
70 C_DEBUG_SECTION, /* SEG_DEBUG */
71 C_NTV_SECTION, /* SEG_NTV */
72 C_PTV_SECTION, /* SEG_PTV */
73 C_REGISTER_SECTION, /* SEG_REGISTER */
77 int function_lineoff = -1; /* Offset in line#s where the last function
78 started (the odd entry for line #0) */
84 static symbolS *last_line_symbol;
85 /* Add 4 to the real value to get the index and compensate the
86 negatives. This vector is used by S_GET_SEGMENT to turn a coff
87 section number into a segment number
89 static symbolS *previous_file_symbol = NULL;
90 void c_symbol_merge ();
93 symbolS *c_section_symbol ();
95 void EXFUN (bfd_as_write_hook, (struct internal_filehdr *,
98 static void EXFUN (fixup_segment, (fixS * fixP,
99 segT this_segment_type));
102 static void EXFUN (fixup_mdeps, (fragS *));
105 static void EXFUN (fill_section, (bfd * abfd,
106 struct internal_filehdr * f, unsigned
110 char *EXFUN (s_get_name, (symbolS * s));
111 static symbolS *EXFUN (tag_find_or_make, (char *name));
112 static symbolS *EXFUN (tag_find, (char *name));
119 unsigned short line_number,
123 static void EXFUN (w_symbols,
126 symbolS * symbol_rootP));
130 static void EXFUN (obj_coff_def, (int what));
131 static void EXFUN (obj_coff_lcomm, (void));
132 static void EXFUN (obj_coff_dim, (void));
133 static void EXFUN (obj_coff_text, (void));
134 static void EXFUN (obj_coff_data, (void));
135 static void EXFUN (obj_coff_endef, (void));
136 static void EXFUN (obj_coff_line, (void));
137 static void EXFUN (obj_coff_ln, (void));
138 static void EXFUN (obj_coff_scl, (void));
139 static void EXFUN (obj_coff_size, (void));
140 static void EXFUN (obj_coff_tag, (void));
141 static void EXFUN (obj_coff_type, (void));
142 static void EXFUN (obj_coff_val, (void));
143 void EXFUN (obj_coff_section, (void));
144 static void EXFUN (tag_init, (void));
145 static void EXFUN (tag_insert, (char *name, symbolS * symbolP));
148 static struct hash_control *tag_hash;
149 static symbolS *def_symbol_in_progress = NULL;
151 const pseudo_typeS obj_pseudo_table[] =
153 {"def", obj_coff_def, 0},
154 {"dim", obj_coff_dim, 0},
155 {"endef", obj_coff_endef, 0},
156 {"line", obj_coff_line, 0},
157 {"ln", obj_coff_ln, 0},
158 {"scl", obj_coff_scl, 0},
159 {"size", obj_coff_size, 0},
160 {"tag", obj_coff_tag, 0},
161 {"type", obj_coff_type, 0},
162 {"val", obj_coff_val, 0},
163 {"section", obj_coff_section, 0},
164 {"use", obj_coff_section, 0},
165 {"sect", obj_coff_section, 0},
166 {"text", obj_coff_text, 0},
167 {"data", obj_coff_data, 0},
168 /* we don't yet handle this. */
169 {"ident", s_ignore, 0},
170 {"ABORT", s_abort, 0},
171 {"lcomm", obj_coff_lcomm, 0},
172 {NULL} /* end sentinel */
173 }; /* obj_pseudo_table */
179 We allow more than just the standard 3 sections, infact, we allow
180 10 sections, (though the usual three have to be there).
182 This structure performs the mappings for us:
187 static struct internal_scnhdr bss_section_header;
188 struct internal_scnhdr data_section_header;
189 struct internal_scnhdr text_section_header;
191 const segT N_TYPE_seg [32] =
207 seg_info_type seg_info_off_by_4[N_SEG] =
233 {SEG_REGISTER}, 0, 0, 0, 0};
235 #define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4])
236 #define SEG_INFO_FROM_SEG_NUMBER(x) (seg_info_off_by_4[(x)])
240 DEFUN (relax_align, (address, alignment),
241 register relax_addressT address AND
242 register long alignment)
245 relax_addressT new_address;
247 mask = ~((~0) << alignment);
248 new_address = (address + mask) & (~mask);
249 return (new_address - address);
250 } /* relax_align() */
254 DEFUN (s_get_segment, (x),
257 return SEG_INFO_FROM_SECTION_NUMBER (x->sy_symbol.ost_entry.n_scnum).seg_t;
262 /* calculate the size of the frag chain and fill in the section header
263 to contain all of it, also fill in the addr of the sections */
265 DEFUN (size_section, (abfd, idx),
270 unsigned int size = 0;
271 fragS *frag = segment_info[idx].frchainP->frch_root;
274 size = frag->fr_address;
276 if (frag->fr_address != size)
278 printf ("Out of step\n");
279 size = frag->fr_address;
282 switch (frag->fr_type)
284 #ifdef TC_COFF_SIZEMACHDEP
285 case rs_machine_dependent:
286 size += TC_COFF_SIZEMACHDEP (frag);
291 size += frag->fr_fix;
292 size += frag->fr_offset * frag->fr_var;
295 size += frag->fr_fix;
296 size += relax_align (size, frag->fr_offset);
299 frag = frag->fr_next;
301 segment_info[idx].scnhdr.s_size = size;
307 DEFUN (count_entries_in_chain, (idx),
310 unsigned int nrelocs;
313 /* Count the relocations */
314 fixup_ptr = segment_info[idx].fix_root;
316 while (fixup_ptr != (fixS *) NULL)
318 if (TC_COUNT_RELOC (fixup_ptr))
323 if (fixup_ptr->fx_r_type == RELOC_CONSTH)
332 fixup_ptr = fixup_ptr->fx_next;
337 /* output all the relocations for a section */
339 DEFUN (do_relocs_for, (abfd, file_cursor),
341 unsigned long *file_cursor)
343 unsigned int nrelocs;
345 unsigned int addr = 0;
346 for (idx = SEG_E0; idx < SEG_E9; idx++)
348 if (segment_info[idx].scnhdr.s_name[0])
351 struct external_reloc *ext_ptr;
352 struct external_reloc *external_reloc_vec;
353 unsigned int external_reloc_size;
354 unsigned int count = 0;
355 unsigned int base = addr;
356 fixS *fix_ptr = segment_info[idx].fix_root;
357 nrelocs = count_entries_in_chain (idx);
362 external_reloc_size = nrelocs * RELSZ;
364 (struct external_reloc *) malloc (external_reloc_size);
368 ext_ptr = external_reloc_vec;
370 /* Fill in the internal coff style reloc struct from the
375 struct internal_reloc intr;
377 /* Only output some of the relocations */
378 if (TC_COUNT_RELOC (fix_ptr))
380 #ifdef TC_RELOC_MANGLE
381 TC_RELOC_MANGLE (fix_ptr, &intr, base);
385 symbol_ptr = fix_ptr->fx_addsy;
387 intr.r_type = TC_COFF_FIX2RTYPE (fix_ptr);
389 base + fix_ptr->fx_frag->fr_address + fix_ptr->fx_where;
391 intr.r_offset = fix_ptr->fx_offset;
395 /* Turn the segment of the symbol into an offset
399 dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
402 intr.r_symndx = dot->sy_number;
406 intr.r_symndx = symbol_ptr->sy_number;
418 (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr);
422 /* The 29k has a special kludge for the high 16 bit reloc.
423 Two relocations are emmited, R_IHIHALF, and
424 R_IHCONST. The second one doesn't contain a symbol,
425 but uses the value for offset */
427 if (intr.r_type == R_IHIHALF)
429 /* now emit the second bit */
430 intr.r_type = R_IHCONST;
431 intr.r_symndx = fix_ptr->fx_addnumber;
432 (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr);
438 fix_ptr = fix_ptr->fx_next;
441 /* Write out the reloc table */
442 segment_info[idx].scnhdr.s_relptr = *file_cursor;
443 segment_info[idx].scnhdr.s_nreloc = nrelocs;
444 bfd_write ((PTR) external_reloc_vec, 1, external_reloc_size, abfd);
445 *file_cursor += external_reloc_size;
446 free (external_reloc_vec);
448 #ifndef ZERO_BASED_SEGMENTS
449 /* Supposedly setting segment addresses non-zero causes problems
450 for some platforms, although it shouldn't. If you define
451 ZERO_BASED_SEGMENTS, all the segments will be based at 0.
452 Please don't make this the default, since some systems (e.g.,
453 SVR3.2) require the segments to be non-zero based. Ian Taylor
455 addr += segment_info[idx].scnhdr.s_size;
461 /* run through a frag chain and write out the data to go with it, fill
462 in the scnhdrs with the info on the file postions
465 DEFUN (fill_section, (abfd, filehdr, file_cursor),
467 struct internal_filehdr *filehdr AND
468 unsigned long *file_cursor)
473 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
475 unsigned int offset = 0;
477 struct internal_scnhdr *s = &(segment_info[i].scnhdr);
481 fragS *frag = segment_info[i].frchainP->frch_root;
482 char *buffer = malloc (s->s_size);
484 s->s_scnptr = *file_cursor;
488 s->s_flags = STYP_REG;
489 if (strcmp (s->s_name, ".text") == 0)
490 s->s_flags |= STYP_TEXT;
491 else if (strcmp (s->s_name, ".data") == 0)
492 s->s_flags |= STYP_DATA;
493 else if (strcmp (s->s_name, ".bss") == 0)
494 s->s_flags |= STYP_BSS | STYP_NOLOAD;
495 else if (strcmp (s->s_name, ".lit") == 0)
496 s->s_flags = STYP_LIT | STYP_TEXT;
501 unsigned int fill_size;
502 switch (frag->fr_type)
504 case rs_machine_dependent:
507 memcpy (buffer + frag->fr_address,
510 offset += frag->fr_fix;
519 memcpy (buffer + frag->fr_address,
522 offset += frag->fr_fix;
525 fill_size = frag->fr_var;
529 unsigned int off = frag->fr_fix;
530 for (count = frag->fr_offset; count; count--)
532 memcpy (buffer + frag->fr_address + off,
533 frag->fr_literal + frag->fr_fix,
547 frag = frag->fr_next;
551 bfd_write (buffer, s->s_size, 1, abfd);
554 *file_cursor += s->s_size;
563 /* Coff file generation & utilities */
567 DEFUN (coff_header_append, (abfd, filehdr, aouthdr),
569 struct internal_filehdr *filehdr AND
570 struct internal_aouthdr *aouthdr)
576 bfd_seek (abfd, 0, 0);
578 filehdr.f_opthdr = bfd_coff_swap_aouthdr_out (abfd, aouthdr,
581 filehdr->f_opthdr = 0;
583 i = bfd_coff_swap_filehdr_out (abfd, filehdr, buffer);
585 bfd_write (buffer, i, 1, abfd);
586 bfd_write (buffero, filehdr->f_opthdr, 1, abfd);
588 for (i = SEG_E0; i < SEG_E9; i++)
590 if (segment_info[i].scnhdr.s_name[0])
593 bfd_coff_swap_scnhdr_out (abfd,
594 &(segment_info[i].scnhdr),
596 bfd_write (buffer, size, 1, abfd);
603 DEFUN (symbol_to_chars, (abfd, where, symbolP),
608 unsigned int numaux = symbolP->sy_symbol.ost_entry.n_numaux;
611 /* Turn any symbols with register attributes into abs symbols */
612 if (S_GET_SEGMENT (symbolP) == SEG_REGISTER)
614 S_SET_SEGMENT (symbolP, SEG_ABSOLUTE);
616 /* At the same time, relocate all symbols to their output value */
618 S_SET_VALUE (symbolP,
619 segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_paddr
620 + S_GET_VALUE (symbolP));
622 where += bfd_coff_swap_sym_out (abfd, &symbolP->sy_symbol.ost_entry,
625 for (i = 0; i < numaux; i++)
627 where += bfd_coff_swap_aux_out (abfd,
628 &symbolP->sy_symbol.ost_auxent[i],
629 S_GET_DATA_TYPE (symbolP),
630 S_GET_STORAGE_CLASS (symbolP),
641 obj_symbol_new_hook (symbolP)
644 char underscore = 0; /* Symbol has leading _ */
646 /* Effective symbol */
647 /* Store the pointer in the offset. */
648 S_SET_ZEROES (symbolP, 0L);
649 S_SET_DATA_TYPE (symbolP, T_NULL);
650 S_SET_STORAGE_CLASS (symbolP, 0);
651 S_SET_NUMBER_AUXILIARY (symbolP, 0);
652 /* Additional information */
653 symbolP->sy_symbol.ost_flags = 0;
654 /* Auxiliary entries */
655 bzero ((char *) &symbolP->sy_symbol.ost_auxent[0], AUXESZ);
657 #ifdef STRIP_UNDERSCORE
658 /* Remove leading underscore at the beginning of the symbol.
659 * This is to be compatible with the standard librairies.
661 if (*S_GET_NAME (symbolP) == '_')
664 S_SET_NAME (symbolP, S_GET_NAME (symbolP) + 1);
665 } /* strip underscore */
666 #endif /* STRIP_UNDERSCORE */
668 if (S_IS_STRING (symbolP))
669 SF_SET_STRING (symbolP);
670 if (!underscore && S_IS_LOCAL (symbolP))
671 SF_SET_LOCAL (symbolP);
674 } /* obj_symbol_new_hook() */
678 stack_init (chunk_size, element_size)
679 unsigned long chunk_size;
680 unsigned long element_size;
684 if ((st = (stack *) malloc (sizeof (stack))) == (stack *) 0)
686 if ((st->data = malloc (chunk_size)) == (char *) 0)
692 st->size = chunk_size;
693 st->chunk_size = chunk_size;
694 st->element_size = element_size;
707 stack_push (st, element)
711 if (st->pointer + st->element_size >= st->size)
713 st->size += st->chunk_size;
714 if ((st->data = xrealloc (st->data, st->size)) == (char *) 0)
717 memcpy (st->data + st->pointer, element, st->element_size);
718 st->pointer += st->element_size;
719 return st->data + st->pointer;
726 if ((st->pointer -= st->element_size) < 0)
732 return st->data + st->pointer;
739 return st->data + st->pointer - st->element_size;
744 * Handle .ln directives.
752 if (def_symbol_in_progress != NULL)
754 as_warn (".ln pseudo-op inside .def/.endef: ignored.");
755 demand_empty_rest_of_line ();
757 } /* wrong context */
760 obstack_next_free (&frags) - frag_now->fr_literal,
761 l = get_absolute_expression (),
769 listing_source_line (l + line_base - 1);
774 demand_empty_rest_of_line ();
776 } /* obj_coff_line() */
781 * Handle .def directives.
783 * One might ask : why can't we symbol_new if the symbol does not
784 * already exist and fill it with debug information. Because of
785 * the C_EFCN special symbol. It would clobber the value of the
786 * function symbol before we have a chance to notice that it is
787 * a C_EFCN. And a second reason is that the code is more clear this
788 * way. (at least I think it is :-).
792 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
793 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
794 *input_line_pointer == '\t') \
795 input_line_pointer++;
798 DEFUN (obj_coff_def, (what),
801 char name_end; /* Char after the end of name */
802 char *symbol_name; /* Name of the debug symbol */
803 char *symbol_name_copy; /* Temporary copy of the name */
804 unsigned int symbol_name_length;
805 /*$char* directiveP;$ *//* Name of the pseudo opcode */
806 /*$char directive[MAX_DIRECTIVE];$ *//* Backup of the directive */
807 /*$char end = 0;$ *//* If 1, stop parsing */
809 if (def_symbol_in_progress != NULL)
811 as_warn (".def pseudo-op used inside of .def/.endef: ignored.");
812 demand_empty_rest_of_line ();
814 } /* if not inside .def/.endef */
818 def_symbol_in_progress = (symbolS *) obstack_alloc (¬es, sizeof (*def_symbol_in_progress));
819 bzero (def_symbol_in_progress, sizeof (*def_symbol_in_progress));
821 symbol_name = input_line_pointer;
822 name_end = get_symbol_end ();
823 symbol_name_length = strlen (symbol_name);
824 symbol_name_copy = xmalloc (symbol_name_length + 1);
825 strcpy (symbol_name_copy, symbol_name);
827 /* Initialize the new symbol */
828 #ifdef STRIP_UNDERSCORE
829 S_SET_NAME (def_symbol_in_progress, (*symbol_name_copy == '_'
830 ? symbol_name_copy + 1
831 : symbol_name_copy));
832 #else /* STRIP_UNDERSCORE */
833 S_SET_NAME (def_symbol_in_progress, symbol_name_copy);
834 #endif /* STRIP_UNDERSCORE */
835 /* free(symbol_name_copy); */
836 def_symbol_in_progress->sy_name_offset = ~0;
837 def_symbol_in_progress->sy_number = ~0;
838 def_symbol_in_progress->sy_frag = &zero_address_frag;
840 if (S_IS_STRING (def_symbol_in_progress))
842 SF_SET_STRING (def_symbol_in_progress);
845 *input_line_pointer = name_end;
847 demand_empty_rest_of_line ();
849 } /* obj_coff_def() */
851 unsigned int dim_index;
853 DEFUN_VOID (obj_coff_endef)
855 symbolS *symbolP = 0;
858 if (def_symbol_in_progress == NULL)
860 as_warn (".endef pseudo-op used outside of .def/.endef: ignored.");
861 demand_empty_rest_of_line ();
863 } /* if not inside .def/.endef */
865 /* Set the section number according to storage class. */
866 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress))
871 SF_SET_TAG (def_symbol_in_progress);
872 /* intentional fallthrough */
875 SF_SET_DEBUG (def_symbol_in_progress);
876 S_SET_SEGMENT (def_symbol_in_progress, SEG_DEBUG);
880 SF_SET_LOCAL (def_symbol_in_progress); /* Do not emit this symbol. */
881 /* intentional fallthrough */
883 SF_SET_PROCESS (def_symbol_in_progress); /* Will need processing before writing */
884 /* intentional fallthrough */
886 S_SET_SEGMENT (def_symbol_in_progress, SEG_E0);
888 if (def_symbol_in_progress->sy_symbol.ost_entry._n._n_nptr[1][1] == 'b'
889 && def_symbol_in_progress->sy_symbol.ost_entry._n._n_nptr[1][2] == 'f')
891 if (function_lineoff < 0)
893 fprintf (stderr, "`.bf' symbol without preceding function\n");
894 } /* missing function symbol */
895 SA_GET_SYM_LNNOPTR (last_line_symbol) = function_lineoff;
897 SF_SET_PROCESS (last_line_symbol);
898 function_lineoff = -1;
904 #endif /* C_AUTOARG */
914 SF_SET_DEBUG (def_symbol_in_progress);
915 S_SET_SEGMENT (def_symbol_in_progress, SEG_ABSOLUTE);
921 /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
927 as_warn ("unexpected storage class %d", S_GET_STORAGE_CLASS (def_symbol_in_progress));
929 } /* switch on storage class */
931 /* Now that we have built a debug symbol, try to
932 find if we should merge with an existing symbol
933 or not. If a symbol is C_EFCN or SEG_ABSOLUTE or
934 untagged SEG_DEBUG it never merges. */
936 /* Two cases for functions. Either debug followed
937 by definition or definition followed by debug.
938 For definition first, we will merge the debug
939 symbol into the definition. For debug first, the
940 lineno entry MUST point to the definition
941 function or else it will point off into space
942 when crawl_symbols() merges the debug
943 symbol into the real symbol. Therefor, let's
944 presume the debug symbol is a real function
947 /* FIXME-SOON If for some reason the definition
948 label/symbol is never seen, this will probably
949 leave an undefined symbol at link time. */
951 if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
952 || (S_GET_SEGMENT (def_symbol_in_progress) == SEG_DEBUG
953 && !SF_GET_TAG (def_symbol_in_progress))
954 || S_GET_SEGMENT (def_symbol_in_progress) == SEG_ABSOLUTE
955 || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP)) == NULL)
958 symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP);
963 /* This symbol already exists, merge the
964 newly created symbol into the old one.
965 This is not mandatory. The linker can
966 handle duplicate symbols correctly. But I
967 guess that it save a *lot* of space if
968 the assembly file defines a lot of
971 /* The debug entry (def_symbol_in_progress)
972 is merged into the previous definition. */
974 c_symbol_merge (def_symbol_in_progress, symbolP);
975 /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */
976 def_symbol_in_progress = symbolP;
978 if (SF_GET_FUNCTION (def_symbol_in_progress)
979 || SF_GET_TAG (def_symbol_in_progress))
981 /* For functions, and tags, the symbol *must* be where the debug symbol
982 appears. Move the existing symbol to the current place. */
983 /* If it already is at the end of the symbol list, do nothing */
984 if (def_symbol_in_progress != symbol_lastP)
986 symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
987 symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP);
988 } /* if not already in place */
990 } /* normal or mergable */
992 if (SF_GET_TAG (def_symbol_in_progress)
993 && symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP) == NULL)
995 tag_insert (S_GET_NAME (def_symbol_in_progress), def_symbol_in_progress);
996 } /* If symbol is a {structure,union} tag, associate symbol to its name. */
998 if (SF_GET_FUNCTION (def_symbol_in_progress))
1000 know (sizeof (def_symbol_in_progress) <= sizeof (long));
1002 = c_line_new (def_symbol_in_progress, 0, 0, &zero_address_frag);
1006 SF_SET_PROCESS (def_symbol_in_progress);
1008 if (symbolP == NULL)
1010 /* That is, if this is the first
1011 time we've seen the function... */
1012 symbol_table_insert (def_symbol_in_progress);
1013 } /* definition follows debug */
1014 } /* Create the line number entry pointing to the function being defined */
1016 def_symbol_in_progress = NULL;
1017 demand_empty_rest_of_line ();
1019 } /* obj_coff_endef() */
1022 DEFUN_VOID (obj_coff_dim)
1024 register int dim_index;
1026 if (def_symbol_in_progress == NULL)
1028 as_warn (".dim pseudo-op used outside of .def/.endef: ignored.");
1029 demand_empty_rest_of_line ();
1031 } /* if not inside .def/.endef */
1033 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
1035 for (dim_index = 0; dim_index < DIMNUM; dim_index++)
1037 SKIP_WHITESPACES ();
1038 SA_SET_SYM_DIMEN (def_symbol_in_progress, dim_index, get_absolute_expression ());
1040 switch (*input_line_pointer)
1044 input_line_pointer++;
1048 as_warn ("badly formed .dim directive ignored");
1049 /* intentional fallthrough */
1054 } /* switch on following character */
1055 } /* for each dimension */
1057 demand_empty_rest_of_line ();
1059 } /* obj_coff_dim() */
1066 if (def_symbol_in_progress == NULL)
1070 } /* if it looks like a stabs style line */
1072 this_base = get_absolute_expression ();
1073 if (this_base > line_base)
1075 line_base = this_base;
1084 listing_source_line (line_base);
1088 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
1089 SA_SET_SYM_LNNO (def_symbol_in_progress, line_base);
1091 demand_empty_rest_of_line ();
1093 } /* obj_coff_line() */
1098 if (def_symbol_in_progress == NULL)
1100 as_warn (".size pseudo-op used outside of .def/.endef ignored.");
1101 demand_empty_rest_of_line ();
1103 } /* if not inside .def/.endef */
1105 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
1106 SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ());
1107 demand_empty_rest_of_line ();
1109 } /* obj_coff_size() */
1114 if (def_symbol_in_progress == NULL)
1116 as_warn (".scl pseudo-op used outside of .def/.endef ignored.");
1117 demand_empty_rest_of_line ();
1119 } /* if not inside .def/.endef */
1121 S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ());
1122 demand_empty_rest_of_line ();
1124 } /* obj_coff_scl() */
1132 if (def_symbol_in_progress == NULL)
1134 as_warn (".tag pseudo-op used outside of .def/.endef ignored.");
1135 demand_empty_rest_of_line ();
1137 } /* if not inside .def/.endef */
1139 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
1140 symbol_name = input_line_pointer;
1141 name_end = get_symbol_end ();
1143 /* Assume that the symbol referred to by .tag is always defined. */
1144 /* This was a bad assumption. I've added find_or_make. xoxorich. */
1145 SA_SET_SYM_TAGNDX (def_symbol_in_progress, (long) tag_find_or_make (symbol_name));
1146 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
1148 as_warn ("tag not found for .tag %s", symbol_name);
1151 SF_SET_TAGGED (def_symbol_in_progress);
1152 *input_line_pointer = name_end;
1154 demand_empty_rest_of_line ();
1156 } /* obj_coff_tag() */
1161 if (def_symbol_in_progress == NULL)
1163 as_warn (".type pseudo-op used outside of .def/.endef ignored.");
1164 demand_empty_rest_of_line ();
1166 } /* if not inside .def/.endef */
1168 S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ());
1170 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) &&
1171 S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF)
1173 SF_SET_FUNCTION (def_symbol_in_progress);
1174 } /* is a function */
1176 demand_empty_rest_of_line ();
1178 } /* obj_coff_type() */
1183 if (def_symbol_in_progress == NULL)
1185 as_warn (".val pseudo-op used outside of .def/.endef ignored.");
1186 demand_empty_rest_of_line ();
1188 } /* if not inside .def/.endef */
1190 if (is_name_beginner (*input_line_pointer))
1192 char *symbol_name = input_line_pointer;
1193 char name_end = get_symbol_end ();
1195 if (!strcmp (symbol_name, "."))
1197 def_symbol_in_progress->sy_frag = frag_now;
1198 S_SET_VALUE (def_symbol_in_progress, obstack_next_free (&frags) - frag_now->fr_literal);
1199 /* If the .val is != from the .def (e.g. statics) */
1201 else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name))
1203 def_symbol_in_progress->sy_forward = symbol_find_or_make (symbol_name);
1205 /* If the segment is undefined when the forward
1206 reference is solved, then copy the segment id
1207 from the forward symbol. */
1208 SF_SET_GET_SEGMENT (def_symbol_in_progress);
1210 /* Otherwise, it is the name of a non debug symbol and its value will be calculated later. */
1211 *input_line_pointer = name_end;
1215 S_SET_VALUE (def_symbol_in_progress, get_absolute_expression ());
1216 } /* if symbol based */
1218 demand_empty_rest_of_line ();
1220 } /* obj_coff_val() */
1223 * Maintain a list of the tagnames of the structres.
1229 tag_hash = hash_new ();
1234 tag_insert (name, symbolP)
1238 register char *error_string;
1240 if (*(error_string = hash_jam (tag_hash, name, (char *) symbolP)))
1242 as_fatal ("Inserting \"%s\" into structure table failed: %s",
1243 name, error_string);
1246 } /* tag_insert() */
1249 tag_find_or_make (name)
1254 if ((symbolP = tag_find (name)) == NULL)
1256 symbolP = symbol_new (name,
1259 &zero_address_frag);
1261 tag_insert (S_GET_NAME (symbolP), symbolP);
1262 symbol_table_insert (symbolP);
1266 } /* tag_find_or_make() */
1272 #ifdef STRIP_UNDERSCORE
1275 #endif /* STRIP_UNDERSCORE */
1276 return ((symbolS *) hash_find (tag_hash, name));
1280 obj_read_begin_hook ()
1282 /* These had better be the same. Usually 18 bytes. */
1284 know (sizeof (SYMENT) == sizeof (AUXENT));
1285 know (SYMESZ == AUXESZ);
1290 } /* obj_read_begin_hook() */
1292 /* This function runs through the symbol table and puts all the
1293 externals onto another chain */
1295 /* The chain of externals */
1296 symbolS *symbol_externP = NULL;
1297 symbolS *symbol_extern_lastP = NULL;
1300 symbolS *last_functionP = NULL;
1305 DEFUN_VOID (yank_symbols)
1308 unsigned int symbol_number = 0;
1310 for (symbolP = symbol_rootP;
1312 symbolP = symbolP ? symbol_next (symbolP) : symbol_rootP)
1314 if (!SF_GET_DEBUG (symbolP))
1316 /* Debug symbols do not need all this rubbish */
1317 symbolS *real_symbolP;
1319 /* L* and C_EFCN symbols never merge. */
1320 if (!SF_GET_LOCAL (symbolP)
1321 && (real_symbolP = symbol_find_base (S_GET_NAME (symbolP), DO_NOT_STRIP))
1322 && real_symbolP != symbolP)
1324 /* FIXME-SOON: where do dups come from?
1325 Maybe tag references before definitions? xoxorich. */
1326 /* Move the debug data from the debug symbol to the
1327 real symbol. Do NOT do the oposite (i.e. move from
1328 real symbol to debug symbol and remove real symbol from the
1329 list.) Because some pointers refer to the real symbol
1330 whereas no pointers refer to the debug symbol. */
1331 c_symbol_merge (symbolP, real_symbolP);
1332 /* Replace the current symbol by the real one */
1333 /* The symbols will never be the last or the first
1334 because : 1st symbol is .file and 3 last symbols are
1335 .text, .data, .bss */
1336 symbol_remove (real_symbolP, &symbol_rootP, &symbol_lastP);
1337 symbol_insert (real_symbolP, symbolP, &symbol_rootP, &symbol_lastP);
1338 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
1339 symbolP = real_symbolP;
1340 } /* if not local but dup'd */
1342 if (flagseen['R'] && (S_GET_SEGMENT (symbolP) == SEG_E1))
1344 S_SET_SEGMENT (symbolP, SEG_E0);
1345 } /* push data into text */
1347 S_SET_VALUE (symbolP,
1348 S_GET_VALUE (symbolP) + symbolP->sy_frag->fr_address);
1350 if (!S_IS_DEFINED (symbolP) && !SF_GET_LOCAL (symbolP))
1352 S_SET_EXTERNAL (symbolP);
1354 else if (S_GET_STORAGE_CLASS (symbolP) == C_NULL)
1356 if (S_GET_SEGMENT (symbolP) == SEG_E0)
1358 S_SET_STORAGE_CLASS (symbolP, C_LABEL);
1362 S_SET_STORAGE_CLASS (symbolP, C_STAT);
1366 /* Mainly to speed up if not -g */
1367 if (SF_GET_PROCESS (symbolP))
1369 /* Handle the nested blocks auxiliary info. */
1370 if (S_GET_STORAGE_CLASS (symbolP) == C_BLOCK)
1372 if (!strcmp (S_GET_NAME (symbolP), ".bb"))
1373 stack_push (block_stack, (char *) &symbolP);
1376 register symbolS *begin_symbolP;
1377 begin_symbolP = *(symbolS **) stack_pop (block_stack);
1378 if (begin_symbolP == (symbolS *) 0)
1379 as_warn ("mismatched .eb");
1381 SA_SET_SYM_ENDNDX (begin_symbolP, symbol_number + 2);
1384 /* If we are able to identify the type of a function, and we
1385 are out of a function (last_functionP == 0) then, the
1386 function symbol will be associated with an auxiliary
1388 if (last_functionP == (symbolS *) 0 &&
1389 SF_GET_FUNCTION (symbolP))
1391 last_functionP = symbolP;
1393 if (S_GET_NUMBER_AUXILIARY (symbolP) < 1)
1395 S_SET_NUMBER_AUXILIARY (symbolP, 1);
1396 } /* make it at least 1 */
1398 /* Clobber possible stale .dim information. */
1400 /* Iffed out by steve - this fries the lnnoptr info too */
1401 bzero (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen,
1402 sizeof (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen));
1405 /* The C_FCN doesn't need any additional information.
1406 I don't even know if this is needed for sdb. But the
1407 standard assembler generates it, so...
1409 if (S_GET_STORAGE_CLASS (symbolP) == C_EFCN)
1411 if (last_functionP == (symbolS *) 0)
1412 as_fatal ("C_EFCN symbol out of scope");
1413 SA_SET_SYM_FSIZE (last_functionP,
1414 (long) (S_GET_VALUE (symbolP) -
1415 S_GET_VALUE (last_functionP)));
1416 SA_SET_SYM_ENDNDX (last_functionP, symbol_number);
1417 last_functionP = (symbolS *) 0;
1421 else if (SF_GET_TAG (symbolP))
1423 /* First descriptor of a structure must point to
1424 the first slot after the structure description. */
1425 last_tagP = symbolP;
1428 else if (S_GET_STORAGE_CLASS (symbolP) == C_EOS)
1430 /* +2 take in account the current symbol */
1431 SA_SET_SYM_ENDNDX (last_tagP, symbol_number + 2);
1433 else if (S_GET_STORAGE_CLASS (symbolP) == C_FILE)
1435 if (S_GET_VALUE (symbolP))
1437 S_SET_VALUE ((symbolS *) S_GET_VALUE (symbolP), symbol_number);
1438 S_SET_VALUE (symbolP, 0);
1439 } /* no one points at the first .file symbol */
1440 } /* if debug or tag or eos or file */
1442 /* We must put the external symbols apart. The loader
1443 does not bomb if we do not. But the references in
1444 the endndx field for a .bb symbol are not corrected
1445 if an external symbol is removed between .bb and .be.
1446 I.e in the following case :
1447 [20] .bb endndx = 22
1450 ld will move the symbol 21 to the end of the list but
1451 endndx will still be 22 instead of 21. */
1454 if (SF_GET_LOCAL (symbolP))
1456 /* remove C_EFCN and LOCAL (L...) symbols */
1457 /* next pointer remains valid */
1458 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
1461 else if (!S_IS_DEFINED (symbolP)
1462 && !S_IS_DEBUG (symbolP)
1463 && !SF_GET_STATICS (symbolP) &&
1464 S_GET_STORAGE_CLASS (symbolP) == C_EXT)
1465 { /* C_EXT && !SF_GET_FUNCTION(symbolP)) */
1466 /* if external, Remove from the list */
1467 symbolS *hold = symbol_previous (symbolP);
1469 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
1470 symbol_clear_list_pointers (symbolP);
1471 symbol_append (symbolP, symbol_extern_lastP, &symbol_externP, &symbol_extern_lastP);
1476 if (SF_GET_STRING (symbolP))
1478 symbolP->sy_name_offset = string_byte_count;
1479 string_byte_count += strlen (S_GET_NAME (symbolP)) + 1;
1483 symbolP->sy_name_offset = 0;
1484 } /* fix "long" names */
1486 symbolP->sy_number = symbol_number;
1487 symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP);
1488 } /* if local symbol */
1489 } /* traverse the symbol list */
1490 return symbol_number;
1496 DEFUN_VOID (glue_symbols)
1498 unsigned int symbol_number = 0;
1500 for (symbolP = symbol_externP; symbol_externP;)
1502 symbolS *tmp = symbol_externP;
1505 symbol_remove (tmp, &symbol_externP, &symbol_extern_lastP);
1506 symbol_append (tmp, symbol_lastP, &symbol_rootP, &symbol_lastP);
1509 if (SF_GET_STRING (tmp))
1511 tmp->sy_name_offset = string_byte_count;
1512 string_byte_count += strlen (S_GET_NAME (tmp)) + 1;
1516 tmp->sy_name_offset = 0;
1517 } /* fix "long" names */
1519 tmp->sy_number = symbol_number;
1520 symbol_number += 1 + S_GET_NUMBER_AUXILIARY (tmp);
1521 } /* append the entire extern chain */
1522 return symbol_number;
1527 DEFUN_VOID (tie_tags)
1529 unsigned int symbol_number = 0;
1532 for (symbolP = symbol_rootP; symbolP; symbolP =
1533 symbol_next (symbolP))
1535 symbolP->sy_number = symbol_number;
1539 if (SF_GET_TAGGED (symbolP))
1543 ((symbolS *) SA_GET_SYM_TAGNDX (symbolP))->sy_number);
1546 symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP);
1548 return symbol_number;
1553 DEFUN (crawl_symbols, (headers, abfd),
1554 struct internal_filehdr *headers AND
1559 unsigned int ptr = 0;
1564 /* Initialize the stack used to keep track of the matching .bb .be */
1566 block_stack = stack_init (512, sizeof (symbolS *));
1567 /* JF deal with forward references first... */
1568 for (symbolP = symbol_rootP;
1570 symbolP = symbol_next (symbolP))
1573 if (symbolP->sy_forward)
1575 S_SET_VALUE (symbolP, (S_GET_VALUE (symbolP)
1576 + S_GET_VALUE (symbolP->sy_forward)
1577 + symbolP->sy_forward->sy_frag->fr_address));
1579 if (SF_GET_GET_SEGMENT (symbolP))
1581 S_SET_SEGMENT (symbolP, S_GET_SEGMENT (symbolP->sy_forward));
1582 } /* forward segment also */
1584 symbolP->sy_forward = 0;
1585 } /* if it has a forward reference */
1586 } /* walk the symbol chain */
1589 /* The symbol list should be ordered according to the following sequence
1592 * . debug entries for functions
1593 * . fake symbols for the sections, including.text .data and .bss
1595 * . undefined symbols
1596 * But this is not mandatory. The only important point is to put the
1597 * undefined symbols at the end of the list.
1600 if (symbol_rootP == NULL
1601 || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE)
1603 c_dot_file_symbol ("fake");
1605 /* Is there a .file symbol ? If not insert one at the beginning. */
1608 * Build up static symbols for the sections, they are filled in later
1612 for (i = SEG_E0; i < SEG_E9; i++)
1614 if (segment_info[i].scnhdr.s_name[0])
1616 segment_info[i].dot =
1617 c_section_symbol (segment_info[i].scnhdr.s_name,
1624 /* Take all the externals out and put them into another chain */
1625 headers->f_nsyms = yank_symbols ();
1626 /* Take the externals and glue them onto the end.*/
1627 headers->f_nsyms += glue_symbols ();
1629 headers->f_nsyms = tie_tags ();
1630 know (symbol_externP == NULL);
1631 know (symbol_extern_lastP == NULL);
1637 * Find strings by crawling along symbol table chain.
1641 DEFUN (w_strings, (where),
1646 /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */
1647 md_number_to_chars (where, string_byte_count, sizeof (string_byte_count));
1648 where += sizeof (string_byte_count);
1649 for (symbolP = symbol_rootP;
1651 symbolP = symbol_next (symbolP))
1655 if (SF_GET_STRING (symbolP))
1657 size = strlen (S_GET_NAME (symbolP)) + 1;
1659 memcpy (where, S_GET_NAME (symbolP), size);
1672 DEFUN (do_linenos_for, (abfd, file_cursor),
1674 unsigned long *file_cursor)
1678 for (idx = SEG_E0; idx < SEG_E9; idx++)
1680 segment_info_type *s = segment_info + idx;
1683 if (s->scnhdr.s_nlnno != 0)
1685 struct lineno_list *line_ptr;
1687 struct external_lineno *buffer =
1688 (struct external_lineno *) xmalloc (s->scnhdr.s_nlnno * LINESZ);
1690 struct external_lineno *dst = buffer;
1692 /* Run through the table we've built and turn it into its external
1693 form, take this chance to remove duplicates */
1695 for (line_ptr = s->lineno_list_head;
1696 line_ptr != (struct lineno_list *) NULL;
1697 line_ptr = line_ptr->next)
1700 if (line_ptr->line.l_lnno == 0)
1702 /* Turn a pointer to a symbol into the symbols' index */
1703 line_ptr->line.l_addr.l_symndx =
1704 ((symbolS *) line_ptr->line.l_addr.l_symndx)->sy_number;
1708 line_ptr->line.l_addr.l_paddr += ((struct frag *) (line_ptr->frag))->fr_address;
1712 (void) bfd_coff_swap_lineno_out (abfd, &(line_ptr->line), dst);
1717 s->scnhdr.s_lnnoptr = *file_cursor;
1719 bfd_write (buffer, 1, s->scnhdr.s_nlnno * LINESZ, abfd);
1722 *file_cursor += s->scnhdr.s_nlnno * LINESZ;
1728 /* Now we run through the list of frag chains in a segment and
1729 make all the subsegment frags appear at the end of the
1730 list, as if the seg 0 was extra long */
1733 DEFUN_VOID (remove_subsegs)
1737 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
1739 frchainS *head = segment_info[i].frchainP;
1741 fragS *prev_frag = &dummy;
1743 while (head && head->frch_seg == i)
1745 prev_frag->fr_next = head->frch_root;
1746 prev_frag = head->frch_last;
1747 head = head->frch_next;
1749 prev_frag->fr_next = 0;
1756 DEFUN_VOID (write_object_file)
1759 struct frchain *frchain_ptr;
1761 struct internal_filehdr filehdr;
1762 struct internal_aouthdr aouthdr;
1763 unsigned long file_cursor;
1766 abfd = bfd_openw (out_file_name, TARGET_FORMAT);
1771 as_perror ("FATAL: Can't create %s", out_file_name);
1774 bfd_set_format (abfd, bfd_object);
1775 bfd_set_arch_mach (abfd, BFD_ARCH, machine);
1779 string_byte_count = 4;
1781 for (frchain_ptr = frchain_root;
1782 frchain_ptr != (struct frchain *) NULL;
1783 frchain_ptr = frchain_ptr->frch_next)
1785 /* Run through all the sub-segments and align them up. Also close any
1786 open frags. We tack a .fill onto the end of the frag chain so
1787 that any .align's size can be worked by looking at the next
1790 subseg_new (frchain_ptr->frch_seg, frchain_ptr->frch_subseg);
1791 #define SUB_SEGMENT_ALIGN 1
1792 frag_align (SUB_SEGMENT_ALIGN, 0);
1793 frag_wane (frag_now);
1794 frag_now->fr_fix = 0;
1795 know (frag_now->fr_next == NULL);
1802 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
1804 relax_segment (segment_info[i].frchainP->frch_root, i);
1807 filehdr.f_nscns = 0;
1809 /* Find out how big the sections are, and set the addresses. */
1811 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
1813 segment_info[i].scnhdr.s_paddr = addr;
1814 segment_info[i].scnhdr.s_vaddr = addr;
1816 if (segment_info[i].scnhdr.s_name[0])
1821 #ifndef ZERO_BASED_SEGMENTS
1822 /* See the comment at the previous ZERO_BASED_SEGMENTS check. */
1825 /* This is a special case, we leave the size alone, which
1826 will have been made up from all and any lcomms seen. */
1827 addr += segment_info[i].scnhdr.s_size;
1831 addr += size_section (abfd, i);
1838 /* Turn the gas native symbol table shape into a coff symbol table */
1839 crawl_symbols (&filehdr, abfd);
1840 #if !defined(TC_H8300) && !defined(TC_Z8K)
1841 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
1843 fixup_mdeps (segment_info[i].frchainP->frch_root);
1844 fixup_segment (segment_info[i].fix_root, i);
1848 file_cursor = FILHSZ + SCNHSZ * filehdr.f_nscns;
1850 bfd_seek (abfd, file_cursor, 0);
1853 do_relocs_for (abfd, &file_cursor);
1855 do_linenos_for (abfd, &file_cursor);
1858 /* Plant the data */
1860 fill_section (abfd, &filehdr, &file_cursor);
1864 filehdr.f_magic = COFF_MAGIC;
1865 filehdr.f_timdat = time (0);
1866 filehdr.f_flags = COFF_FLAGS | coff_flags;
1870 filehdr.f_flags |= F_LNNO;
1874 filehdr.f_flags |= F_RELFLG;
1885 unsigned int symtable_size = filehdr.f_nsyms * SYMESZ;
1886 char *buffer1 = malloc (symtable_size + string_byte_count + 4);
1887 char *ptr = buffer1;
1888 filehdr.f_symptr = bfd_tell (abfd);
1889 w_symbols (abfd, buffer1, symbol_rootP);
1890 w_strings (buffer1 + symtable_size);
1891 bfd_write (buffer1, 1, symtable_size + string_byte_count + 4, abfd);
1895 coff_header_append (abfd, &filehdr, &aouthdr);
1897 if (bfd_close_all_done (abfd) == false)
1898 as_fatal ("Can't close %s: %s", out_file_name,
1899 bfd_errmsg (bfd_error));
1904 DEFUN (change_to_section, (name, len, exp),
1906 unsigned int len AND
1910 /* Find out if we've already got a section of this name etc */
1911 for (i = SEG_E0; i < SEG_E9 && segment_info[i].scnhdr.s_name[0]; i++)
1913 if (strncmp (segment_info[i].scnhdr.s_name, name, len) == 0)
1915 subseg_new (i, exp);
1920 /* No section, add one */
1921 strncpy (segment_info[i].scnhdr.s_name, name, 8);
1922 subseg_new (i, exp);
1926 DEFUN_VOID (obj_coff_section)
1928 /* Strip out the section name */
1930 char *section_name_end;
1936 section_name = input_line_pointer;
1937 c = get_symbol_end ();
1938 section_name_end = input_line_pointer;
1940 len = section_name_end - section_name;
1941 input_line_pointer++;
1945 exp = get_absolute_expression ();
1947 else if (*input_line_pointer == ',')
1950 input_line_pointer++;
1951 exp = get_absolute_expression ();
1958 change_to_section (section_name, len, exp);
1959 *section_name_end = c;
1967 change_to_section (".text", 5, get_absolute_expression ());
1974 change_to_section (".data", 5, get_absolute_expression ());
1978 c_symbol_merge (debug, normal)
1982 S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug));
1983 S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug));
1985 if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal))
1987 S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
1988 } /* take the most we have */
1990 if (S_GET_NUMBER_AUXILIARY (debug) > 0)
1992 memcpy ((char *) &normal->sy_symbol.ost_auxent[0], (char *) &debug->sy_symbol.ost_auxent[0], S_GET_NUMBER_AUXILIARY (debug) * AUXESZ);
1993 } /* Move all the auxiliary information */
1995 /* Move the debug flags. */
1996 SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug));
1997 } /* c_symbol_merge() */
2000 DEFUN (c_line_new, (symbol, paddr, line_number, frag),
2001 symbolS * symbol AND
2003 unsigned short line_number AND
2006 struct lineno_list *new_line =
2007 (struct lineno_list *) xmalloc (sizeof (struct lineno_list));
2009 segment_info_type *s = segment_info + now_seg;
2010 new_line->line.l_lnno = line_number;
2014 if (line_number == 0)
2016 last_line_symbol = symbol;
2017 new_line->line.l_addr.l_symndx = (long) symbol;
2021 new_line->line.l_addr.l_paddr = paddr;
2024 new_line->frag = (char *) frag;
2025 new_line->next = (struct lineno_list *) NULL;
2028 if (s->lineno_list_head == (struct lineno_list *) NULL)
2030 s->lineno_list_head = new_line;
2034 s->lineno_list_tail->next = new_line;
2036 s->lineno_list_tail = new_line;
2037 return LINESZ * s->scnhdr.s_nlnno++;
2041 c_dot_file_symbol (filename)
2046 symbolP = symbol_new (".file",
2049 &zero_address_frag);
2051 S_SET_STORAGE_CLASS (symbolP, C_FILE);
2052 S_SET_NUMBER_AUXILIARY (symbolP, 1);
2053 SA_SET_FILE_FNAME (symbolP, filename);
2059 listing_source_file (filename);
2065 SF_SET_DEBUG (symbolP);
2066 S_SET_VALUE (symbolP, (long) previous_file_symbol);
2068 previous_file_symbol = symbolP;
2070 /* Make sure that the symbol is first on the symbol chain */
2071 if (symbol_rootP != symbolP)
2073 if (symbolP == symbol_lastP)
2075 symbol_lastP = symbol_lastP->sy_previous;
2076 } /* if it was the last thing on the list */
2078 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
2079 symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP);
2080 symbol_rootP = symbolP;
2081 } /* if not first on the list */
2083 } /* c_dot_file_symbol() */
2086 * Build a 'section static' symbol.
2090 c_section_symbol (name, idx)
2096 symbolP = symbol_new (name, idx,
2098 &zero_address_frag);
2100 S_SET_STORAGE_CLASS (symbolP, C_STAT);
2101 S_SET_NUMBER_AUXILIARY (symbolP, 1);
2103 SF_SET_STATICS (symbolP);
2106 } /* c_section_symbol() */
2109 DEFUN (w_symbols, (abfd, where, symbol_rootP),
2112 symbolS * symbol_rootP)
2117 /* First fill in those values we have only just worked out */
2118 for (i = SEG_E0; i < SEG_E9; i++)
2120 symbolP = segment_info[i].dot;
2124 SA_SET_SCN_SCNLEN (symbolP, segment_info[i].scnhdr.s_size);
2125 SA_SET_SCN_NRELOC (symbolP, segment_info[i].scnhdr.s_nreloc);
2126 SA_SET_SCN_NLINNO (symbolP, segment_info[i].scnhdr.s_nlnno);
2132 * Emit all symbols left in the symbol chain.
2134 for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
2136 /* Used to save the offset of the name. It is used to point
2137 to the string in memory but must be a file offset. */
2138 register char *temp;
2140 tc_coff_symbol_emit_hook (symbolP);
2142 temp = S_GET_NAME (symbolP);
2143 if (SF_GET_STRING (symbolP))
2145 S_SET_OFFSET (symbolP, symbolP->sy_name_offset);
2146 S_SET_ZEROES (symbolP, 0);
2150 bzero (symbolP->sy_symbol.ost_entry.n_name, SYMNMLEN);
2151 strncpy (symbolP->sy_symbol.ost_entry.n_name, temp, SYMNMLEN);
2153 where = symbol_to_chars (abfd, where, symbolP);
2154 S_SET_NAME (symbolP, temp);
2160 DEFUN_VOID (obj_coff_lcomm)
2169 name = input_line_pointer;
2172 c = get_symbol_end ();
2173 p = input_line_pointer;
2176 if (*input_line_pointer != ',')
2178 as_bad ("Expected comma after name");
2179 ignore_rest_of_line ();
2182 if (*input_line_pointer == '\n')
2184 as_bad ("Missing size expression");
2187 input_line_pointer++;
2188 if ((temp = get_absolute_expression ()) < 0)
2190 as_warn ("lcomm length (%d.) <0! Ignored.", temp);
2191 ignore_rest_of_line ();
2197 /* Allocate zero static local data in the .data section now
2198 instead of the bss section as a symbol with a value */
2200 segT oldseg = now_seg;
2201 int oldsubseg = now_subseg;
2203 subseg_new (SEG_DATA, 10);
2206 record_alignment (SEG_DATA, 4);
2207 x = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
2211 subseg_new (oldseg, oldsubseg);
2213 demand_empty_rest_of_line ();
2217 DEFUN (fixup_mdeps, (frags),
2222 switch (frags->fr_type)
2226 frags->fr_type = rs_fill;
2228 (frags->fr_next->fr_address - frags->fr_address - frags->fr_fix);
2230 case rs_machine_dependent:
2231 md_convert_frag (0, frags);
2236 frags = frags->fr_next;
2243 DEFUN (fixup_segment, (fixP, this_segment_type),
2244 register fixS * fixP AND
2245 segT this_segment_type)
2247 register symbolS *add_symbolP;
2248 register symbolS *sub_symbolP;
2249 register long add_number;
2251 register char *place;
2252 register long where;
2253 register char pcrel;
2254 register fragS *fragP;
2255 register segT add_symbol_segment = SEG_ABSOLUTE;
2258 for (; fixP; fixP = fixP->fx_next)
2260 fragP = fixP->fx_frag;
2262 where = fixP->fx_where;
2263 place = fragP->fr_literal + where;
2264 size = fixP->fx_size;
2265 add_symbolP = fixP->fx_addsy;
2267 if (fixP->fx_callj && TC_S_IS_CALLNAME (add_symbolP))
2269 /* Relocation should be done via the
2270 associated 'bal' entry point
2273 if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
2275 as_bad ("No 'bal' entry point for leafproc %s",
2276 S_GET_NAME (add_symbolP));
2279 fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
2280 } /* callj relocation */
2282 sub_symbolP = fixP->fx_subsy;
2283 add_number = fixP->fx_offset;
2284 pcrel = fixP->fx_pcrel;
2288 add_symbol_segment = S_GET_SEGMENT (add_symbolP);
2289 } /* if there is an addend */
2296 if (S_GET_SEGMENT (sub_symbolP) != SEG_ABSOLUTE)
2298 as_bad ("Negative of non-absolute symbol %s", S_GET_NAME (sub_symbolP));
2299 } /* not absolute */
2301 add_number -= S_GET_VALUE (sub_symbolP);
2304 /* if sub_symbol is in the same segment that add_symbol
2305 and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE */
2307 else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
2308 && (SEG_NORMAL (add_symbol_segment)
2309 || (add_symbol_segment == SEG_ABSOLUTE)))
2311 /* Difference of 2 symbols from same segment. */
2312 /* Can't make difference of 2 undefineds: 'value' means */
2313 /* something different for N_UNDF. */
2315 /* Makes no sense to use the difference of 2 arbitrary symbols
2316 * as the target of a call instruction.
2320 as_bad ("callj to difference of 2 symbols");
2322 #endif /* TC_I960 */
2323 add_number += S_GET_VALUE (add_symbolP) -
2324 S_GET_VALUE (sub_symbolP);
2327 fixP->fx_addsy = NULL;
2331 /* Different segments in subtraction. */
2332 know (!(S_IS_EXTERNAL (sub_symbolP) && (S_GET_SEGMENT (sub_symbolP) == SEG_ABSOLUTE)));
2334 if ((S_GET_SEGMENT (sub_symbolP) == SEG_ABSOLUTE))
2336 add_number -= S_GET_VALUE (sub_symbolP);
2340 as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %d.",
2341 segment_name (S_GET_SEGMENT (sub_symbolP)),
2342 S_GET_NAME (sub_symbolP), fragP->fr_address + where);
2345 } /* if sub_symbolP */
2349 if (add_symbol_segment == this_segment_type && pcrel)
2352 * This fixup was made when the symbol's segment was
2353 * SEG_UNKNOWN, but it is now in the local segment.
2354 * So we know how to do the address without relocation.
2357 /* reloc_callj() may replace a 'call' with a 'calls' or a 'bal',
2358 * in which cases it modifies *fixP as appropriate. In the case
2359 * of a 'calls', no further work is required, and *fixP has been
2360 * set up to make the rest of the code below a no-op.
2363 #endif /* TC_I960 */
2365 add_number += S_GET_VALUE (add_symbolP);
2366 add_number -= md_pcrel_from (fixP);
2367 pcrel = 0; /* Lie. Don't want further pcrel processing. */
2368 fixP->fx_addsy = NULL; /* No relocations please. */
2372 switch (add_symbol_segment)
2376 reloc_callj (fixP); /* See comment about reloc_callj() above*/
2377 #endif /* TC_I960 */
2378 add_number += S_GET_VALUE (add_symbolP);
2379 fixP->fx_addsy = NULL;
2384 add_number += S_GET_VALUE (add_symbolP) +
2385 segment_info[S_GET_SEGMENT (add_symbolP)].scnhdr.s_paddr;
2390 if ((int) fixP->fx_bit_fixP == 13)
2392 /* This is a COBR instruction. They have only a
2393 * 13-bit displacement and are only to be used
2394 * for local branches: flag as error, don't generate
2397 as_bad ("can't use COBR format with external label");
2398 fixP->fx_addsy = NULL; /* No relocations please. */
2401 #endif /* TC_I960 */
2403 /* 386 COFF uses a peculiar format in
2404 which the value of a common symbol is
2405 stored in the .text segment (I've
2406 checked this on SVR3.2 and SCO 3.2.2)
2408 add_number += S_GET_VALUE (add_symbolP);
2413 } /* switch on symbol seg */
2414 } /* if not in local seg */
2415 } /* if there was a + symbol */
2419 add_number -= md_pcrel_from (fixP);
2420 if (add_symbolP == 0)
2422 fixP->fx_addsy = &abs_symbol;
2423 } /* if there's an add_symbol */
2426 if (!fixP->fx_bit_fixP)
2429 (add_number & ~0xFF) && ((add_number & ~0xFF) != (-1 & ~0xFF))) ||
2431 (add_number & ~0xFFFF) && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF))))
2433 as_bad ("Value of %d too large for field of %d bytes at 0x%x",
2434 add_number, size, fragP->fr_address + where);
2435 } /* generic error checking */
2436 #ifdef WARN_SIGNED_OVERFLOW_WORD
2437 /* Warn if a .word value is too large when treated as
2438 a signed number. We already know it is not too
2439 negative. This is to catch over-large switches
2440 generated by gcc on the 68k. */
2443 && add_number > 0x7fff)
2444 as_bad ("Signed .word overflow; switch may be too large; %d at 0x%x",
2445 add_number, fragP->fr_address + where);
2447 } /* not a bit fix */
2448 /* once this fix has been applied, we don't have to output anything
2449 nothing more need be done -*/
2450 md_apply_fix (fixP, add_number);
2452 } /* For each fixS in this segment. */
2455 } /* fixup_segment() */