diff options
author | Ken Raeburn <raeburn@cygnus> | 1994-04-20 23:01:40 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@cygnus> | 1994-04-20 23:01:40 +0000 |
commit | 71b4de6fb868f6da4b0e99aad7547874cab797a5 (patch) | |
tree | d1e55c9f69eee7c4801cccca0450a2f3260f800c /gas | |
parent | a6652b1c62131201431833aa719e3fa902cdc47c (diff) | |
download | gdb-71b4de6fb868f6da4b0e99aad7547874cab797a5.zip gdb-71b4de6fb868f6da4b0e99aad7547874cab797a5.tar.gz gdb-71b4de6fb868f6da4b0e99aad7547874cab797a5.tar.bz2 |
* config/obj-coff.h, config/obj-coff.c: Deleted all code used only when
BFD_ASSEMBLER is not defined, and all conditionals relating to such code. No
such targets remain.
Fixes for stabs-in-coff:
* config/obj-coff.c: Include subsegs.h.
(coff_frob_section): New function.
(obj_coff_init_stab_section): New function.
* config/obj-coff.h (obj_coff_init_stab_section, coff_frob_section): Declare.
(obj_frob_section): New macro; uses coff_frob_section.
(INIT_STAB_SECTION): New macro; uses obj_coff_init_stab_section.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 13 | ||||
-rw-r--r-- | gas/config/obj-coff.c | 1412 | ||||
-rw-r--r-- | gas/config/obj-coff.h | 401 |
3 files changed, 82 insertions, 1744 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 609c6a4..a204c82 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,18 @@ Wed Apr 20 18:46:14 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + * config/obj-coff.h, config/obj-coff.c: Deleted all code used only + when BFD_ASSEMBLER is not defined, and all conditionals relating + to such code. No such targets remain. + + Fixes for stabs-in-coff: + * config/obj-coff.c: Include subsegs.h. + (coff_frob_section): New function. + (obj_coff_init_stab_section): New function. + * config/obj-coff.h (obj_coff_init_stab_section, + coff_frob_section): Declare. + (obj_frob_section): New macro; uses coff_frob_section. + (INIT_STAB_SECTION): New macro; uses obj_coff_init_stab_section. + * config/tc-sparc.c (md_section_align): Always round up to multiple of alignment power specified in bfd target vector. diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index c6d1b14..a6ba063 100644 --- a/gas/config/obj-coff.c +++ b/gas/config/obj-coff.c @@ -19,65 +19,19 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "as.h" - +#include "subsegs.h" #include "obstack.h" -#ifndef BFD_ASSEMBLER - -const short seg_N_TYPE[] = -{ /* in: segT out: N_TYPE bits */ - C_ABS_SECTION, - C_TEXT_SECTION, - C_DATA_SECTION, - C_BSS_SECTION, - C_UNDEF_SECTION, /* SEG_UNKNOWN */ - C_UNDEF_SECTION, /* SEG_GOOF */ - C_UNDEF_SECTION, /* SEG_EXPR */ - C_DEBUG_SECTION, /* SEG_DEBUG */ - C_NTV_SECTION, /* SEG_NTV */ - C_PTV_SECTION, /* SEG_PTV */ - C_REGISTER_SECTION, /* SEG_REGISTER */ -}; - - -/* Add 4 to the real value to get the index and compensate the negatives */ - -const segT N_TYPE_seg[32] = -{ - SEG_PTV, /* C_PTV_SECTION == -4 */ - SEG_NTV, /* C_NTV_SECTION == -3 */ - SEG_DEBUG, /* C_DEBUG_SECTION == -2 */ - SEG_ABSOLUTE, /* C_ABS_SECTION == -1 */ - SEG_UNKNOWN, /* C_UNDEF_SECTION == 0 */ - SEG_TEXT, /* C_TEXT_SECTION == 1 */ - SEG_DATA, /* C_DATA_SECTION == 2 */ - SEG_BSS, /* C_BSS_SECTION == 3 */ - SEG_REGISTER, /* C_REGISTER_SECTION == 4 */ - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF -}; -#endif - const char *s_get_name PARAMS ((symbolS * s)); static symbolS *tag_find_or_make PARAMS ((char *name)); static symbolS *tag_find PARAMS ((char *name)); -#ifndef BFD_ASSEMBLER -#ifdef BFD_HEADERS -static void obj_coff_section_header_append PARAMS ((char **where, struct internal_scnhdr * header)); -#else -static void obj_coff_section_header_append PARAMS ((char **where, SCNHDR * header)); -#endif -#endif - static void obj_coff_def PARAMS ((int what)); static void obj_coff_dim PARAMS ((int)); static void obj_coff_endef PARAMS ((int)); static void obj_coff_line PARAMS ((int)); static void obj_coff_ln PARAMS ((int)); static void obj_coff_scl PARAMS ((int)); -static void obj_coff_section PARAMS ((int)); static void obj_coff_size PARAMS ((int)); static void obj_coff_tag PARAMS ((int)); static void obj_coff_type PARAMS ((int)); @@ -85,19 +39,11 @@ static void obj_coff_val PARAMS ((int)); static void tag_init PARAMS ((void)); static void tag_insert PARAMS ((const char *name, symbolS * symbolP)); -#ifdef BFD_ASSEMBLER static void SA_SET_SYM_TAGNDX PARAMS ((symbolS *, symbolS *)); -#endif static struct hash_control *tag_hash; static symbolS *def_symbol_in_progress; -#ifndef BFD_ASSEMBLER -static symbolS *dot_text_symbol; -static symbolS *dot_data_symbol; -static symbolS *dot_bss_symbol; -#endif - const pseudo_typeS obj_pseudo_table[] = { #ifndef IGNORE_DEBUG @@ -125,12 +71,9 @@ const pseudo_typeS obj_pseudo_table[] = {"val", s_ignore, 0}, #endif /* ignore debug */ -#ifdef MANY_SECTIONS { "section", obj_coff_section, 0 }, -#endif {"ident", s_ignore, 0}, /* we don't yet handle this. */ - {"optim", s_ignore, 0}, /* For sun386i cc (?) */ /* other stuff */ {"ABORT", s_abort, 0}, @@ -138,32 +81,15 @@ const pseudo_typeS obj_pseudo_table[] = {NULL} /* end sentinel */ }; /* obj_pseudo_table */ -#ifdef BFD_ASSEMBLER struct line_no { struct line_no *next; fragS *frag; alent l; }; -#endif #define GET_FILENAME_STRING(X) \ ((char*)(&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1]) -/* obj dependant output values */ -#ifndef BFD_ASSEMBLER -#ifdef BFD_HEADERS -static struct internal_scnhdr bss_section_header; -struct internal_scnhdr data_section_header; -struct internal_scnhdr text_section_header; -#else -static SCNHDR bss_section_header; -SCNHDR data_section_header; -SCNHDR text_section_header; -#endif -#endif - -#ifdef BFD_ASSEMBLER - /* @@ Ick. */ static segT fetch_coff_debug_section () @@ -237,498 +163,6 @@ S_SET_STORAGE_CLASS (sym, val) return val; } -#else /* ! BFD_ASSEMBLER */ - -/* Relocation. */ - -static int -reloc_compare (p1, p2) -#ifdef BFD_HEADERS - struct internal_reloc *p1, *p2; -#else - RELOC *p1, *p2; -#endif -{ - return (int) (p1->r_vaddr - p2->r_vaddr); -} - -/* - * emit_relocations() - * - * Crawl along a fixS chain. Emit the segment's relocations. - */ - -void -obj_emit_relocations (where, fixP, segment_address_in_file) - char **where; - fixS *fixP; /* Fixup chain for this segment. */ - relax_addressT segment_address_in_file; -{ -#ifdef BFD_HEADERS - struct internal_reloc *ri_table; -#else - RELOC *ri_table; -#endif -#ifdef TC_I960 - char *callj_table; -#endif - symbolS *symbolP; - int i, count; - fixS *p; - - for (count = 0, p = fixP; p; p = p->fx_next) - if (!p->fx_done) - count++; - if (!count) - return; - -#ifdef BFD_HEADERS - ri_table = (struct internal_reloc *) calloc (sizeof (*ri_table), count); -#else - ri_table = (RELOC *) calloc (sizeof (*ri_table), count); -#endif - if (!ri_table) - as_fatal ("obj_emit_relocations: Could not malloc relocation table"); - -#ifdef TC_I960 - callj_table = (char *) malloc (sizeof (char) * count); - if (!callj_table) - as_fatal ("obj_emit_relocations: Could not malloc callj table"); -#endif - - for (i = 0; fixP; fixP = fixP->fx_next) - { - symbolP = fixP->fx_addsy; - if (!fixP->fx_done) - { - int rtype_ok = 0; -#if defined(TC_M68K) - ri_table[i].r_type = (fixP->fx_pcrel ? - (fixP->fx_size == 1 ? R_PCRBYTE : - fixP->fx_size == 2 ? R_PCRWORD : - R_PCRLONG) : - (fixP->fx_size == 1 ? R_RELBYTE : - fixP->fx_size == 2 ? R_RELWORD : - R_RELLONG)); - rtype_ok = 1; -#endif -#if defined(TC_I386) - /* FIXME-SOON R_OFF8 & R_DIR16 are a vague guess, completly - untested. */ - ri_table[i].r_type = (fixP->fx_pcrel ? - (fixP->fx_size == 1 ? R_PCRBYTE : - fixP->fx_size == 2 ? R_PCRWORD : - R_PCRLONG) : - (fixP->fx_size == 1 ? R_OFF8 : - fixP->fx_size == 2 ? R_DIR16 : - R_DIR32)); - rtype_ok = 1; -#endif -#if defined(TC_I960) - ri_table[i].r_type = (fixP->fx_pcrel - ? R_IPRMED - : R_RELLONG); - callj_table[i] = fixP->fx_tcbit ? 1 : 0; - rtype_ok = 1; -#endif -#if defined(TC_A29K) - ri_table[i].r_type = tc_coff_fix2rtype (fixP); - rtype_ok = 1; -#endif - if (!rtype_ok) - abort (); - ri_table[i].r_vaddr = (fixP->fx_frag->fr_address - + fixP->fx_where); - /* If symbol associated to relocation entry is a bss symbol - or undefined symbol just remember the index of the symbol. - Otherwise store the index of the symbol describing the - section the symbol belong to. This heuristic speeds up ld. - */ - /* Local symbols can generate relocation information. In case - of structure return for instance. But they have no symbol - number because they won't be emitted in the final object. - In the case where they are in the BSS section, this leads - to an incorrect r_symndx. - Under bsd the loader do not care if the symbol reference - is incorrect. But the SYS V ld complains about this. To - avoid this we associate the symbol to the associated - section, *even* if it is the BSS section. */ - /* If someone can tell me why the other symbols of the bss - section are not associated with the .bss section entry, - I'd be gratefull. I guess that it has to do with the special - nature of the .bss section. Or maybe this is because the - bss symbols are declared in the common section and can - be resized later. Can it break code some where ? */ - ri_table[i].r_symndx = (S_GET_SEGMENT (symbolP) == SEG_TEXT - ? dot_text_symbol->sy_number - : (S_GET_SEGMENT (symbolP) == SEG_DATA - ? dot_data_symbol->sy_number - : ((SF_GET_LOCAL (symbolP) - ? dot_bss_symbol->sy_number - : symbolP->sy_number)))); /* bss or undefined */ - - /* md_ri_to_chars((char *) &ri, ri); *//* Last step : write md f */ - - i++; - } /* if there's a symbol */ - } /* for each fixP */ - - /* AIX ld prefer to have the reloc table with r_vaddr sorted. - But sorting it should not hurt any other ld. */ - qsort (ri_table, count, sizeof (*ri_table), reloc_compare); - - for (i = 0; i < count; i++) - { -#ifdef BFD_HEADERS - *where += bfd_coff_swap_reloc_out (stdoutput, &ri_table[i], *where); -# ifdef TC_A29K - /* The 29k has a special kludge for the high 16 bit reloc. - Two relocations are emmited, R_IHIHALF, and R_IHCONST. - The second one doesn't contain a symbol, but uses the - value for offset */ - if (ri_table[i].r_type == R_IHIHALF) - { - /* now emit the second bit */ - ri_table[i].r_type = R_IHCONST; - ri_table[i].r_symndx = fixP->fx_addnumber; - *where += bfd_coff_swap_reloc_out (stdoutput, &ri_table[i], - *where); - } -# endif /* TC_A29K */ - -#else /* not BFD_HEADERS */ - append (where, (char *) &ri_table[i], RELSZ); -#endif /* not BFD_HEADERS */ - -#ifdef TC_I960 - if (callj_table[i]) - { - ri_table[i].r_type = R_OPTCALL; -# ifdef BFD_HEADERS - *where += bfd_coff_swap_reloc_out (stdoutput, &ri_table[i], - *where); -# else - append (where, (char *) &ri_table[i], (unsigned long) RELSZ); -# endif /* BFD_HEADERS */ - } /* if it's a callj, do it again for the opcode */ -#endif /* TC_I960 */ - } - - free (ri_table); -#ifdef TC_I960 - free (callj_table); -#endif -} - -/* Coff file generation & utilities */ - -#ifdef BFD_HEADERS -void -obj_header_append (where, headers) - char **where; - object_headers *headers; -{ - tc_headers_hook (headers); - *where += bfd_coff_swap_filehdr_out (stdoutput, &(headers->filehdr), *where); -#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER - *where += bfd_coff_swap_aouthdr_out (stdoutput, &(headers->aouthdr), *where); -#endif - obj_coff_section_header_append (where, &text_section_header); - obj_coff_section_header_append (where, &data_section_header); - obj_coff_section_header_append (where, &bss_section_header); -} - -#else /* ! BFD_HEADERS */ - -void -obj_header_append (where, headers) - char **where; - object_headers *headers; -{ - tc_headers_hook (headers); - -#ifdef CROSS_COMPILE - /* Eventually swap bytes for cross compilation for file header */ - md_number_to_chars (*where, headers->filehdr.f_magic, sizeof (headers->filehdr.f_magic)); - *where += sizeof (headers->filehdr.f_magic); - md_number_to_chars (*where, headers->filehdr.f_nscns, sizeof (headers->filehdr.f_nscns)); - *where += sizeof (headers->filehdr.f_nscns); - md_number_to_chars (*where, headers->filehdr.f_timdat, sizeof (headers->filehdr.f_timdat)); - *where += sizeof (headers->filehdr.f_timdat); - md_number_to_chars (*where, headers->filehdr.f_symptr, sizeof (headers->filehdr.f_symptr)); - *where += sizeof (headers->filehdr.f_symptr); - md_number_to_chars (*where, headers->filehdr.f_nsyms, sizeof (headers->filehdr.f_nsyms)); - *where += sizeof (headers->filehdr.f_nsyms); - md_number_to_chars (*where, headers->filehdr.f_opthdr, sizeof (headers->filehdr.f_opthdr)); - *where += sizeof (headers->filehdr.f_opthdr); - md_number_to_chars (*where, headers->filehdr.f_flags, sizeof (headers->filehdr.f_flags)); - *where += sizeof (headers->filehdr.f_flags); - -#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER - /* Eventually swap bytes for cross compilation for a.out header */ - md_number_to_chars (*where, headers->aouthdr.magic, sizeof (headers->aouthdr.magic)); - *where += sizeof (headers->aouthdr.magic); - md_number_to_chars (*where, headers->aouthdr.vstamp, sizeof (headers->aouthdr.vstamp)); - *where += sizeof (headers->aouthdr.vstamp); - md_number_to_chars (*where, headers->aouthdr.tsize, sizeof (headers->aouthdr.tsize)); - *where += sizeof (headers->aouthdr.tsize); - md_number_to_chars (*where, headers->aouthdr.dsize, sizeof (headers->aouthdr.dsize)); - *where += sizeof (headers->aouthdr.dsize); - md_number_to_chars (*where, headers->aouthdr.bsize, sizeof (headers->aouthdr.bsize)); - *where += sizeof (headers->aouthdr.bsize); - md_number_to_chars (*where, headers->aouthdr.entry, sizeof (headers->aouthdr.entry)); - *where += sizeof (headers->aouthdr.entry); - md_number_to_chars (*where, headers->aouthdr.text_start, sizeof (headers->aouthdr.text_start)); - *where += sizeof (headers->aouthdr.text_start); - md_number_to_chars (*where, headers->aouthdr.data_start, sizeof (headers->aouthdr.data_start)); - *where += sizeof (headers->aouthdr.data_start); - md_number_to_chars (*where, headers->aouthdr.tagentries, sizeof (headers->aouthdr.tagentries)); - *where += sizeof (headers->aouthdr.tagentries); -#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ - -#else /* CROSS_COMPILE */ - - append (where, (char *) &headers->filehdr, sizeof (headers->filehdr)); -#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER - append (where, (char *) &headers->aouthdr, sizeof (headers->aouthdr)); -#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ - -#endif /* CROSS_COMPILE */ - - /* Output the section headers */ - obj_coff_section_header_append (where, &text_section_header); - obj_coff_section_header_append (where, &data_section_header); - obj_coff_section_header_append (where, &bss_section_header); -} - -#endif /* ! BFD_HEADERS */ - -void -obj_symbol_to_chars (where, symbolP) - char **where; - symbolS *symbolP; -{ - /* Move the value into the COFF symbol itself. */ - symbolP->sy_symbol.ost_entry.n_value = S_GET_VALUE (symbolP); - -#ifdef BFD_HEADERS - unsigned int numaux = symbolP->sy_symbol.ost_entry.n_numaux; - unsigned int i; - - if (S_GET_SEGMENT (symbolP) == SEG_REGISTER) - { - S_SET_SEGMENT (symbolP, SEG_ABSOLUTE); - } - *where += bfd_coff_swap_sym_out (stdoutput, &symbolP->sy_symbol.ost_entry, - *where); - - for (i = 0; i < numaux; i++) - { - *where += bfd_coff_swap_aux_out (stdoutput, - &symbolP->sy_symbol.ost_auxent[i], - S_GET_DATA_TYPE (symbolP), - S_GET_STORAGE_CLASS (symbolP), - i, numaux, *where); - } - -#else /* BFD_HEADERS */ - { - SYMENT *syment = &symbolP->sy_symbol.ost_entry; - int i; - char numaux = syment->n_numaux; - unsigned short type = S_GET_DATA_TYPE (symbolP); - -#ifdef CROSS_COMPILE - md_number_to_chars (*where, syment->n_value, sizeof (syment->n_value)); - *where += sizeof (syment->n_value); - md_number_to_chars (*where, 0xffff & syment->n_scnum, - sizeof (syment->n_scnum)); - *where += sizeof (syment->n_scnum); - md_number_to_chars (*where, 0, sizeof (short)); /* pad n_flags */ - *where += sizeof (short); - md_number_to_chars (*where, syment->n_type, sizeof (syment->n_type)); - *where += sizeof (syment->n_type); - md_number_to_chars (*where, syment->n_sclass, sizeof (syment->n_sclass)); - *where += sizeof (syment->n_sclass); - md_number_to_chars (*where, syment->n_numaux, sizeof (syment->n_numaux)); - *where += sizeof (syment->n_numaux); -#else /* CROSS_COMPILE */ - append (where, (char *) syment, sizeof (*syment)); -#endif /* CROSS_COMPILE */ - - /* Should do the following: - if (.file entry) MD(..)... else if (static entry) MD(..) */ - if (numaux > OBJ_COFF_MAX_AUXENTRIES) - as_bad ("Internal error? too many auxents for symbol"); - - for (i = 0; i < numaux; ++i) - { -#ifdef CROSS_COMPILE - this code does not work; - - foo *auxP = SYM_AUXENT (symbolP); - /* The most common case, x_sym entry. */ - if ((SF_GET (symbolP) & SF_STATICS) == 0) - { - md_number_to_chars (*where, auxP->x_sym.x_tagndx, - sizeof (auxP->x_sym.x_tagndx)); - *where += sizeof (auxP->x_sym.x_tagndx); - if (ISFCN (type)) - { - md_number_to_chars (*where, auxP->x_sym.x_misc.x_fsize, - sizeof (auxP->x_sym.x_misc.x_fsize)); - *where += sizeof (auxP->x_sym.x_misc.x_fsize); - } - else - { - md_number_to_chars (*where, auxP->x_sym.x_misc.x_lnno, - sizeof (auxP->x_sym.x_misc.x_lnno)); - *where += sizeof (auxP->x_sym.x_misc.x_lnno); - md_number_to_chars (*where, auxP->x_sym.x_misc.x_size, - sizeof (auxP->x_sym.x_misc.x_size)); - *where += sizeof (auxP->x_sym.x_misc.x_size); - } - if (ISARY (type)) - { - int index; - for (index = 0; index < DIMNUM; index++) - md_number_to_chars (*where, auxP->x_sym.x_fcnary.x_ary.x_dimen[index], - sizeof (auxP->x_sym.x_fcnary.x_ary.x_dimen[index])); - *where += sizeof (auxP->x_sym.x_fcnary.x_ary.x_dimen[index]); - } - else - { - md_number_to_chars (*where, - auxP->x_sym.x_fcnary.x_fcn.x_lnnoptr, - sizeof (auxP->x_sym.x_fcnary.x_fcn.x_lnnoptr)); - *where += sizeof (auxP->x_sym.x_fcnary.x_fcn.x_lnnoptr); - md_number_to_chars (*where, - auxP->x_sym.x_fcnary.x_fcn.x_endndx, - sizeof (auxP->x_sym.x_fcnary.x_fcn.x_endndx)); - *where += sizeof (auxP->x_sym.x_fcnary.x_fcn.x_endndx); - } - md_number_to_chars (*where, auxP->x_sym.x_tvndx, - sizeof (auxP->x_sym.x_tvndx)); - *where += sizeof (auxP->x_sym.x_tvndx); - } - else if (S_GET_STORAGE_CLASS (symbolP) == C_FILE) - /* .file */ - ; - else if (SF_GET_STATICS (symbolP)) - { /* .text, .data, .bss symbols */ - md_number_to_chars (*where, auxP->x_scn.x_scnlen, - sizeof (auxP->x_scn.x_scnlen)); - *where += sizeof (auxP->x_scn.x_scnlen); - md_number_to_chars (*where, auxP->x_scn.x_nreloc, - sizeof (auxP->x_scn.x_nreloc)); - *where += sizeof (auxP->x_scn.x_nreloc); - md_number_to_chars (*where, auxP->x_scn.x_nlinno, - sizeof (auxP->x_scn.x_nlinno)); - *where += sizeof (auxP->x_scn.x_nlinno); - } -#else /* CROSS_COMPILE */ - append (where, (char *) &symbolP->sy_symbol.ost_auxent[i], - sizeof (symbolP->sy_symbol.ost_auxent[i])); -#endif /* CROSS_COMPILE */ - } - } -#endif /* BFD_HEADERS */ -} - -#ifdef BFD_HEADERS -static void -obj_coff_section_header_append (where, header) - char **where; - struct internal_scnhdr *header; -{ - *where += bfd_coff_swap_scnhdr_out (stdoutput, header, *where); -} - -#else -static void -obj_coff_section_header_append (where, header) - char **where; - SCNHDR *header; -{ -#ifdef CROSS_COMPILE - memcpy (*where, header->s_name, sizeof (header->s_name)); - *where += sizeof (header->s_name); - - md_number_to_chars (*where, header->s_paddr, sizeof (header->s_paddr)); - *where += sizeof (header->s_paddr); - - md_number_to_chars (*where, header->s_vaddr, sizeof (header->s_vaddr)); - *where += sizeof (header->s_vaddr); - - md_number_to_chars (*where, header->s_size, sizeof (header->s_size)); - *where += sizeof (header->s_size); - - md_number_to_chars (*where, header->s_scnptr, sizeof (header->s_scnptr)); - *where += sizeof (header->s_scnptr); - - md_number_to_chars (*where, header->s_relptr, sizeof (header->s_relptr)); - *where += sizeof (header->s_relptr); - - md_number_to_chars (*where, header->s_lnnoptr, sizeof (header->s_lnnoptr)); - *where += sizeof (header->s_lnnoptr); - - md_number_to_chars (*where, header->s_nreloc, sizeof (header->s_nreloc)); - *where += sizeof (header->s_nreloc); - - md_number_to_chars (*where, header->s_nlnno, sizeof (header->s_nlnno)); - *where += sizeof (header->s_nlnno); - - md_number_to_chars (*where, header->s_flags, sizeof (header->s_flags)); - *where += sizeof (header->s_flags); - -#ifdef TC_I960 - md_number_to_chars (*where, header->s_align, sizeof (header->s_align)); - *where += sizeof (header->s_align); -#endif /* TC_I960 */ - -#else /* CROSS_COMPILE */ - - append (where, (char *) header, sizeof (*header)); - -#endif /* CROSS_COMPILE */ -} - -#endif -void -obj_emit_symbols (where, symbol_rootP) - char **where; - symbolS *symbol_rootP; -{ - symbolS *symbolP; - /* - * Emit all symbols left in the symbol chain. - */ - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - /* Used to save the offset of the name. It is used to point - to the string in memory but must be a file offset. */ - register char *temp; - - tc_coff_symbol_emit_hook (symbolP); - - temp = S_GET_NAME (symbolP); - if (SF_GET_STRING (symbolP)) - { - S_SET_OFFSET (symbolP, symbolP->sy_name_offset); - S_SET_ZEROES (symbolP, 0); - } - else - { - memset (symbolP->sy_symbol.ost_entry.n_name, '\0', SYMNMLEN); - strncpy (symbolP->sy_symbol.ost_entry.n_name, temp, SYMNMLEN); - } - obj_symbol_to_chars (where, symbolP); - S_SET_NAME (symbolP, temp); - } -} /* obj_emit_symbols() */ - -#endif /* ! BFD_ASSEMBLER */ - /* Merge a debug symbol containing debug information into a normal symbol. */ void @@ -746,7 +180,6 @@ c_symbol_merge (debug, normal) if (S_GET_NUMBER_AUXILIARY (debug) > 0) { /* Move all the auxiliary information. */ -#ifdef BFD_ASSEMBLER /* @@ How many fields do we want to preserve? Would it make more sense to pick and choose those we want to copy? Should look into this further.... [raeburn:19920512.2209EST] */ @@ -756,11 +189,6 @@ c_symbol_merge (debug, normal) (char *) &coffsymbol (debug->bsym)->native, S_GET_NUMBER_AUXILIARY(debug) * AUXESZ); coffsymbol (normal->bsym)->lineno = linenos; -#else - memcpy ((char *) &normal->sy_symbol.ost_auxent[0], - (char *) &debug->sy_symbol.ost_auxent[0], - S_GET_NUMBER_AUXILIARY (debug) * AUXESZ); -#endif } /* Move the debug flags. */ @@ -774,36 +202,13 @@ c_dot_file_symbol (filename) { symbolS *symbolP; -#ifdef BFD_ASSEMBLER symbolP = symbol_new (filename, &bfd_abs_section, 0, &zero_address_frag); -#else - symbolP = symbol_new (".file", - SEG_DEBUG, - 0, - &zero_address_frag); -#endif S_SET_STORAGE_CLASS (symbolP, C_FILE); S_SET_NUMBER_AUXILIARY (symbolP, 1); -#ifdef BFD_ASSEMBLER symbolP->bsym->flags = BSF_DEBUGGING; -#else - if (strlen(filename) > 14) - { - /* This won't fit into a 14 char space, it will go into the string - table. */ - symbolP->sy_symbol.ost_auxent->x_file.x_n.x_zeroes = 0; - (&(symbolP->sy_symbol.ost_auxent->x_file.x_n.x_offset))[0] = string_byte_count; - (&(symbolP->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1] = (int)filename; - } - else - { - SA_SET_FILE_FNAME (symbolP, filename); - } - SF_SET_DEBUG (symbolP); -#endif #ifndef NO_LISTING { @@ -868,67 +273,10 @@ c_section_symbol (name, value, length, nreloc, nlnno) return (char *) symbolP; } -#ifndef BFD_ASSEMBLER -void -c_section_header (header, - name, - core_address, - size, - data_ptr, - reloc_ptr, - lineno_ptr, - reloc_number, - lineno_number, - alignment) -#ifdef BFD_HEADERS - struct internal_scnhdr *header; -#else - SCNHDR *header; -#endif - char *name; - long core_address; - long size; - long data_ptr; - long reloc_ptr; - long lineno_ptr; - long reloc_number; - long lineno_number; - long alignment; -{ - strncpy (header->s_name, name, 8); - header->s_paddr = header->s_vaddr = core_address; - header->s_scnptr = ((header->s_size = size) != 0) ? data_ptr : 0; - header->s_relptr = reloc_ptr; - header->s_lnnoptr = lineno_ptr; - header->s_nreloc = reloc_number; - header->s_nlnno = lineno_number; - -#ifdef OBJ_COFF_SECTION_HEADER_HAS_ALIGNMENT -#ifdef OBJ_COFF_BROKEN_ALIGNMENT - header->s_align = ((name[1] == 'b' || (size > 0)) ? 16 : 0); -#else - header->s_align = ((alignment == 0) - ? 0 - : (1 << alignment)); -#endif /* OBJ_COFF_BROKEN_ALIGNMENT */ -#endif /* OBJ_COFF_SECTION_HEADER_HAS_ALIGNMENT */ - - header->s_flags = STYP_REG | (name[1] == 't' - ? STYP_TEXT - : name[1] == 'd' - ? STYP_DATA - : name[1] == 'b' - ? STYP_BSS - : STYP_INFO); -} -#endif - /* Line number handling */ int coff_line_base; -#ifdef BFD_ASSEMBLER - /* Symbol of last function, which we should hang line#s off of. */ static symbolS *line_fsym; @@ -936,103 +284,6 @@ static symbolS *line_fsym; #define clear_function() (line_fsym = 0) #define set_function(F) (line_fsym = (F), coff_add_linesym (F)) -#else - -/* Offset in line#s where the last function started (the odd entry for - line #0). */ -static int function_lineoff = -1; - -#define in_function() (function_lineoff >= 0) -#define clear_function() (function_lineoff = -1) -#define set_function(F) (function_lineoff = c_line_new ((long) (F), 0, &zero_address_frag)) - -int text_lineno_number; - -/* We use this to build pointers from .bf's into the linetable. It - should match exactly the values that are later assigned in - text_lineno_number by write.c. */ -int our_lineno_number; - -lineno *lineno_rootP; -lineno *lineno_lastP; - -int -c_line_new (paddr, line_number, frag) - long paddr; - unsigned short line_number; - fragS *frag; -{ - lineno *new_line = (lineno *) xmalloc (sizeof (lineno)); - - new_line->line.l_addr.l_paddr = paddr; - new_line->line.l_lnno = line_number; - new_line->frag = (char *) frag; - new_line->next = (lineno *) 0; - - if (lineno_rootP == (lineno *) 0) - lineno_rootP = new_line; - else - lineno_lastP->next = new_line; - lineno_lastP = new_line; - return LINESZ * our_lineno_number++; -} - -void -obj_emit_lineno (where, line, file_start) - char **where; - lineno *line; - char *file_start; -{ -#ifdef BFD_HEADERS - struct bfd_internal_lineno *line_entry; -#else - LINENO *line_entry; -#endif - char *where2 = *where; - - for (; line; line = line->next) - { - line_entry = &line->line; - - /* FIXME-SOMEDAY Resolving the sy_number of function linno's used to be - done in write_object_file() but their symbols need a fileptr to the - lnno, so I moved this resolution check here. xoxorich. */ - - if (line_entry->l_lnno == 0) - { - /* There is a good chance that the symbol pointed to - is not the one that will be emitted and that the - sy_number is not accurate. */ - symbolS *symbolP; - - symbolP = (symbolS *) line_entry->l_addr.l_symndx; - - line_entry->l_addr.l_symndx = symbolP->sy_number; - symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_fcn.x_lnnoptr = where2 - file_start; - } -#ifdef BFD_HEADERS - where2 += bfd_coff_swap_lineno_out (stdoutput, line_entry, where2); -#else - /* No matter which member of the union we process, they are - both long. */ - md_number_to_chars (where2, line_entry->l_addr.l_paddr, sizeof (line_entry->l_addr.l_paddr)); - where2 += sizeof (line_entry->l_addr.l_paddr); - - md_number_to_chars (where2, line_entry->l_lnno, sizeof (line_entry->l_lnno)); - where2 += sizeof (line_entry->l_lnno); - -#ifdef TC_I960 - *where2++ = '0'; - *where2++ = '0'; -#endif /* TC_I960 */ - -#endif /* BFD_HEADERS */ - } - *where = where2; -} - -#endif /* ! BFD_ASSEMBLER */ - void obj_symbol_new_hook (symbolP) @@ -1040,22 +291,12 @@ obj_symbol_new_hook (symbolP) { char underscore = 0; /* Symbol has leading _ */ -#ifdef BFD_ASSEMBLER { long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type); char *s = (char *) bfd_alloc_by_size_t (stdoutput, sz); memset (s, 0, sz); coffsymbol (symbolP->bsym)->native = (combined_entry_type *) s; } -#else - /* Effective symbol */ - /* Store the pointer in the offset. */ - S_SET_ZEROES (symbolP, 0L); - /* Additional information */ - symbolP->sy_symbol.ost_flags = 0; - /* Auxiliary entries */ - memset ((char *) &symbolP->sy_symbol.ost_auxent[0], '\0', AUXESZ); -#endif S_SET_DATA_TYPE (symbolP, T_NULL); S_SET_STORAGE_CLASS (symbolP, 0); S_SET_NUMBER_AUXILIARY (symbolP, 0); @@ -1150,7 +391,6 @@ stack_top (st) * Handle .ln directives. */ -#ifdef BFD_ASSEMBLER static symbolS *current_lineno_sym; static struct line_no *line_nos; @@ -1185,7 +425,6 @@ coff_add_linesym (sym) } current_lineno_sym = sym; } -#endif static void obj_coff_ln (appline) @@ -1203,11 +442,7 @@ obj_coff_ln (appline) l = get_absolute_expression (); if (!appline) { -#ifdef BFD_ASSEMBLER add_lineno (frag_now, frag_now_fix (), l); -#else - c_line_new (frag_now_fix (), l, frag_now); -#endif } #ifndef NO_LISTING @@ -1275,17 +510,7 @@ obj_coff_def (what) strcpy (symbol_name_copy, symbol_name); /* Initialize the new symbol */ -#ifdef BFD_ASSEMBLER def_symbol_in_progress = symbol_make (symbol_name_copy); -#else - def_symbol_in_progress = (symbolS *) obstack_alloc (¬es, sizeof (*def_symbol_in_progress)); - memset (def_symbol_in_progress, '\0', sizeof (*def_symbol_in_progress)); - - S_SET_NAME (def_symbol_in_progress, symbol_name_copy); - def_symbol_in_progress->sy_name_offset = ~0; - def_symbol_in_progress->sy_number = ~0; -#endif - def_symbol_in_progress->sy_frag = &zero_address_frag; S_SET_VALUE (def_symbol_in_progress, 0); @@ -1324,11 +549,7 @@ obj_coff_endef (ignored) case C_FILE: case C_TPDEF: SF_SET_DEBUG (def_symbol_in_progress); -#ifdef BFD_ASSEMBLER S_SET_SEGMENT (def_symbol_in_progress, fetch_coff_debug_section ()); -#else - S_SET_SEGMENT (def_symbol_in_progress, SEG_DEBUG); -#endif break; case C_EFCN: @@ -1342,20 +563,12 @@ obj_coff_endef (ignored) CONST char *name; S_SET_SEGMENT (def_symbol_in_progress, text_section); -#ifdef BFD_ASSEMBLER name = bfd_asymbol_name (def_symbol_in_progress->bsym); -#else - name = def_symbol_in_progress->sy_symbol.ost_entry._n._n_nptr[1]; -#endif if (name[1] == 'b' && name[2] == 'f') { if (! in_function ()) as_warn ("`%s' symbol without preceding function", name); -#ifdef BFD_ASSEMBLER /* SA_SET_SYM_LNNO (def_symbol_in_progress, 12345);*/ -#else - SA_GET_SYM_LNNOPTR (def_symbol_in_progress) = function_lineoff; -#endif /* Will need relocating */ SF_SET_PROCESS (def_symbol_in_progress); clear_function (); @@ -1410,26 +623,16 @@ obj_coff_endef (ignored) time. */ if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN -#ifdef BFD_ASSEMBLER || (!strcmp (bfd_get_section_name (stdoutput, S_GET_SEGMENT (def_symbol_in_progress)), "*DEBUG*") && !SF_GET_TAG (def_symbol_in_progress)) -#else - || (S_GET_SEGMENT (def_symbol_in_progress) == SEG_DEBUG - && !SF_GET_TAG (def_symbol_in_progress)) -#endif || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP)) == NULL) { -#ifdef BFD_ASSEMBLER if (def_symbol_in_progress != symbol_lastP) symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP); -#else - symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, - &symbol_lastP); -#endif } else { @@ -1744,547 +947,6 @@ obj_read_begin_hook () tag_init (); } -#ifndef BFD_ASSEMBLER -void -obj_crawl_symbol_chain (headers) - object_headers *headers; -{ - int symbol_number = 0; - lineno *lineP; - symbolS *last_functionP = NULL; - symbolS *last_tagP; - symbolS *symbolP; - symbolS *symbol_externP = NULL; - symbolS *symbol_extern_lastP = NULL; - - /* Initialize the stack used to keep track of the matching .bb .be */ - stack *block_stack = stack_init (512, sizeof (symbolS *)); - - tc_crawl_symbol_chain (headers); - - /* The symbol list should be ordered according to the following sequence - * order : - * . .file symbol - * . debug entries for functions - * . fake symbols for .text .data and .bss - * . defined symbols - * . undefined symbols - * But this is not mandatory. The only important point is to put the - * undefined symbols at the end of the list. - */ - - if (symbol_rootP == NULL - || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE) - { - know (!previous_file_symbol); - c_dot_file_symbol ("fake"); - } /* Is there a .file symbol? If not, insert one at the beginning. */ - - /* - * Build up static symbols for .text, .data and .bss - */ - dot_text_symbol = (symbolS *) c_section_symbol (".text", - 0, - H_GET_TEXT_SIZE (headers), - 0 /*text_relocation_number*/, - 0 /*text_lineno_number */); -#ifdef TE_I386AIX - symbol_remove (dot_text_symbol, &symbol_rootP, &symbol_lastP); - symbol_append (dot_text_symbol, previous_file_symbol, - &symbol_rootP, &symbol_lastP); -#endif /* TE_I386AIX */ - - dot_data_symbol = (symbolS *) - c_section_symbol (".data", - H_GET_TEXT_SIZE (headers), - H_GET_DATA_SIZE (headers), - 0 /*data_relocation_number */ , - 0); /* There are no data lineno entries */ -#ifdef TE_I386AIX - symbol_remove (dot_data_symbol, &symbol_rootP, &symbol_lastP); - symbol_append (dot_data_symbol, dot_text_symbol, - &symbol_rootP, &symbol_lastP); -#endif /* TE_I386AIX */ - - dot_bss_symbol = (symbolS *) - c_section_symbol (".bss", - H_GET_TEXT_SIZE (headers) + H_GET_DATA_SIZE (headers), - H_GET_BSS_SIZE (headers), - 0, /* No relocation for a bss section. */ - 0); /* There are no bss lineno entries */ -#ifdef TE_I386AIX - symbol_remove (dot_bss_symbol, &symbol_rootP, &symbol_lastP); - symbol_append (dot_bss_symbol, dot_data_symbol, - &symbol_rootP, &symbol_lastP); -#endif /* TE_I386AIX */ - -#if defined(DEBUG) - verify_symbol_chain (symbol_rootP, symbol_lastP); -#endif /* DEBUG */ - - /* Three traversals of symbol chains here. The - first traversal yanks externals into a temporary - chain, removing the externals from the global - chain, numbers symbols, and does some other guck. - The second traversal is on the temporary chain of - externals and just appends them to the global - chain again, numbering them as we go. The third - traversal patches pointers to symbols (using sym - indexes). The last traversal was once done as - part of the first pass, but that fails when a - reference preceeds a definition as the definition - has no number at the time we process the - reference. */ - - /* Note that symbolP will be NULL at the end of a loop - if an external was at the beginning of the list (it - gets moved off the list). Hence the weird check in - the loop control. - */ - for (symbolP = symbol_rootP; - symbolP; - symbolP = symbolP ? symbol_next (symbolP) : symbol_rootP) - { - if (!SF_GET_DEBUG (symbolP)) - { - /* Debug symbols do not need all this rubbish */ - symbolS *real_symbolP; - - /* L* and C_EFCN symbols never merge. */ - if (!SF_GET_LOCAL (symbolP) - && (real_symbolP = symbol_find_base (S_GET_NAME (symbolP), DO_NOT_STRIP)) - && real_symbolP != symbolP) - { - /* FIXME-SOON: where do dups come from? Maybe tag references before definitions? xoxorich. */ - /* Move the debug data from the debug symbol to the - real symbol. Do NOT do the oposite (i.e. move from - real symbol to debug symbol and remove real symbol from the - list.) Because some pointers refer to the real symbol - whereas no pointers refer to the debug symbol. */ - c_symbol_merge (symbolP, real_symbolP); - /* Replace the current symbol by the real one */ - /* The symbols will never be the last or the first - because : 1st symbol is .file and 3 last symbols are - .text, .data, .bss */ - symbol_remove (real_symbolP, &symbol_rootP, &symbol_lastP); - symbol_insert (real_symbolP, symbolP, &symbol_rootP, &symbol_lastP); - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - symbolP = real_symbolP; - } /* if not local but dup'd */ - - if (flagseen['R'] && (S_GET_SEGMENT (symbolP) == SEG_DATA)) - { - S_SET_SEGMENT (symbolP, SEG_TEXT); - } /* push data into text */ - - resolve_symbol_value (symbolP); - - if (!S_IS_DEFINED (symbolP) && !SF_GET_LOCAL (symbolP)) - { - S_SET_EXTERNAL (symbolP); - } - else if (S_GET_STORAGE_CLASS (symbolP) == C_NULL) - { - if (S_GET_SEGMENT (symbolP) == SEG_TEXT) - { - S_SET_STORAGE_CLASS (symbolP, C_LABEL); - } - else - { - S_SET_STORAGE_CLASS (symbolP, C_STAT); - } - } /* no storage class yet */ - - /* Mainly to speed up if not -g */ - if (SF_GET_PROCESS (symbolP)) - { - /* Handle the nested blocks auxiliary info. */ - if (S_GET_STORAGE_CLASS (symbolP) == C_BLOCK) - { - if (!strcmp (S_GET_NAME (symbolP), ".bb")) - stack_push (block_stack, (char *) &symbolP); - else - { /* .eb */ - register symbolS *begin_symbolP; - begin_symbolP = *(symbolS **) stack_pop (block_stack); - if (begin_symbolP == (symbolS *) 0) - as_warn ("mismatched .eb"); - else - SA_SET_SYM_ENDNDX (begin_symbolP, symbol_number + 2); - } - } - /* If we are able to identify the type of a function, and we - are out of a function (last_functionP == 0) then, the - function symbol will be associated with an auxiliary - entry. */ - if (last_functionP == (symbolS *) 0 && - SF_GET_FUNCTION (symbolP)) - { - last_functionP = symbolP; - - if (S_GET_NUMBER_AUXILIARY (symbolP) < 1) - { - S_SET_NUMBER_AUXILIARY (symbolP, 1); - } /* make it at least 1 */ - - /* Clobber possible stale .dim information. */ - memset (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen, - '\0', sizeof (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen)); - } - /* The C_FCN doesn't need any additional information. - I don't even know if this is needed for sdb. But the - standard assembler generates it, so... - */ - if (S_GET_STORAGE_CLASS (symbolP) == C_EFCN) - { - if (last_functionP == (symbolS *) 0) - as_fatal ("C_EFCN symbol out of scope"); - SA_SET_SYM_FSIZE (last_functionP, - (long) (S_GET_VALUE (symbolP) - - S_GET_VALUE (last_functionP))); - SA_SET_SYM_ENDNDX (last_functionP, symbol_number); - last_functionP = (symbolS *) 0; - } - } - } - else if (SF_GET_TAG (symbolP)) - { - /* First descriptor of a structure must point to - the first slot after the structure description. */ - last_tagP = symbolP; - - } - else if (S_GET_STORAGE_CLASS (symbolP) == C_EOS) - { - /* +2 take in account the current symbol */ - SA_SET_SYM_ENDNDX (last_tagP, symbol_number + 2); - } - else if (S_GET_STORAGE_CLASS (symbolP) == C_FILE) - { - if (symbolP->sy_symbol.ost_auxent->x_file.x_n.x_zeroes == 0) - { - symbolP->sy_symbol.ost_auxent->x_file.x_n.x_offset = string_byte_count; - string_byte_count += - strlen(GET_FILENAME_STRING(symbolP)) + 1; - - - } - - if (S_GET_VALUE (symbolP)) - { - S_SET_VALUE ((symbolS *) S_GET_VALUE (symbolP), symbol_number); - S_SET_VALUE (symbolP, 0); - } /* no one points at the first .file symbol */ - } /* if debug or tag or eos or file */ - - /* We must put the external symbols apart. The loader - does not bomb if we do not. But the references in - the endndx field for a .bb symbol are not corrected - if an external symbol is removed between .bb and .be. - I.e in the following case : - [20] .bb endndx = 22 - [21] foo external - [22] .be - ld will move the symbol 21 to the end of the list but - endndx will still be 22 instead of 21. */ - - if (SF_GET_LOCAL (symbolP)) - { - /* remove C_EFCN and LOCAL (L...) symbols */ - /* next pointer remains valid */ - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - - } - else if ( -#ifdef TE_I386AIX - S_GET_STORAGE_CLASS (symbolP) == C_EXT - && !SF_GET_FUNCTION (symbolP) -#else /* not TE_I386AIX */ - !S_IS_DEFINED (symbolP) - && !S_IS_DEBUG (symbolP) - && !SF_GET_STATICS (symbolP) -#endif /* not TE_I386AIX */ - ) - { - /* if external, Remove from the list */ - symbolS *hold = symbol_previous (symbolP); - - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - symbol_clear_list_pointers (symbolP); - symbol_append (symbolP, symbol_extern_lastP, &symbol_externP, &symbol_extern_lastP); - symbolP = hold; - } - else - { - if (SF_GET_STRING (symbolP)) - { - symbolP->sy_name_offset = string_byte_count; - string_byte_count += strlen (S_GET_NAME (symbolP)) + 1; - } - else - { - symbolP->sy_name_offset = 0; - } /* fix "long" names */ - - symbolP->sy_number = symbol_number; - symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP); - } /* if local symbol */ - } /* traverse the symbol list */ - - for (symbolP = symbol_externP; symbol_externP;) - { - symbolS *tmp = symbol_externP; - - /* append */ - symbol_remove (tmp, &symbol_externP, &symbol_extern_lastP); - symbol_append (tmp, symbol_lastP, &symbol_rootP, &symbol_lastP); - - /* and process */ - if (SF_GET_STRING (tmp)) - { - tmp->sy_name_offset = string_byte_count; - string_byte_count += strlen (S_GET_NAME (tmp)) + 1; - } - else - { - tmp->sy_name_offset = 0; - } /* fix "long" names */ - - tmp->sy_number = symbol_number; - symbol_number += 1 + S_GET_NUMBER_AUXILIARY (tmp); - } /* append the entire extern chain */ - - /* When a tag reference preceeds the tag definition, the definition - will not have a number at the time we process the reference - during the first traversal. Thus, a second traversal. */ - - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - if (SF_GET_TAGGED (symbolP)) - { - SA_SET_SYM_TAGNDX (symbolP, ((symbolS *) SA_GET_SYM_TAGNDX (symbolP))->sy_number); - } - } - - know (symbol_externP == NULL); - know (symbol_extern_lastP == NULL); - - /* FIXME-SOMEDAY I'm counting line no's here so we know what to put - in the section headers, and I'm resolving the addresses since I'm - not sure how to do it later. I am NOT resolving the linno's - representing functions. Their symbols need a fileptr pointing to - this linno when emitted. Thus, I resolve them on emit. - xoxorich. */ - - for (lineP = lineno_rootP; lineP; lineP = lineP->next) - { - if (lineP->line.l_lnno > 0) - { - lineP->line.l_addr.l_paddr += ((fragS *) lineP->frag)->fr_address; - } - else - { - ; - } - text_lineno_number++; - } /* for each line number */ - - H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number); -} - -/* - * Find strings by crawling along symbol table chain. - */ - -void -obj_emit_strings (where) - char **where; -{ - symbolS *symbolP; - -#ifdef CROSS_COMPILE - /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */ - md_number_to_chars (*where, string_byte_count, sizeof (string_byte_count)); - *where += sizeof (string_byte_count); -#else /* CROSS_COMPILE */ - append (where, (char *) &string_byte_count, (unsigned long) sizeof (string_byte_count)); -#endif /* CROSS_COMPILE */ - - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - if (S_GET_STORAGE_CLASS(symbolP) == C_FILE) - { - /* May need special treatment for this auxent */ - if (symbolP->sy_symbol.ost_auxent->x_file.x_n.x_zeroes == 0) - { - char *p = GET_FILENAME_STRING(symbolP); - append - (where,p, strlen(p)+1); - } - } - if (SF_GET_STRING (symbolP)) - { - append (where, S_GET_NAME (symbolP), - (unsigned long) (strlen (S_GET_NAME (symbolP)) + 1)); - } /* if it has a string */ - } /* walk the symbol chain */ -} - -void -obj_pre_write_hook (headers) - object_headers *headers; -{ - register int text_relocation_number = 0; - register int data_relocation_number = 0; - register fixS *fixP; - - /* FIXME-SOMEDAY this should be done at fixup_segment time but I'm - going to wait until I do multiple segments. xoxorich. */ - /* Count the number of relocation entries for text and data */ - for (fixP = text_fix_root; fixP; fixP = fixP->fx_next) - { - if (!fixP->fx_done) - { - ++text_relocation_number; -#ifdef TC_I960 - /* two relocs per callj under coff. */ - if (fixP->fx_tcbit) - { - ++text_relocation_number; - } /* if callj and not already fixed. */ -#endif /* TC_I960 */ -#ifdef TC_A29K - /* Count 2 for a constH */ - if (fixP->fx_r_type == RELOC_CONSTH) - { - ++text_relocation_number; - } -#endif - } /* if not yet fixed */ - } /* for each fix */ - - SA_SET_SCN_NRELOC (dot_text_symbol, text_relocation_number); - /* Assign the number of line number entries for the text section */ - SA_SET_SCN_NLINNO (dot_text_symbol, text_lineno_number); - /* Assign the size of the section */ - SA_SET_SCN_SCNLEN (dot_text_symbol, H_GET_TEXT_SIZE (headers)); - - for (fixP = data_fix_root; fixP; fixP = fixP->fx_next) - { - if (!fixP->fx_done) - { - ++data_relocation_number; - } /* if still relocatable */ -#ifdef TC_A29K - /* Count 2 for a constH */ - if (fixP->fx_r_type == RELOC_CONSTH) - { - ++data_relocation_number; - } -#endif - } - - SA_SET_SCN_NRELOC (dot_data_symbol, data_relocation_number); - /* Assign the size of the section */ - SA_SET_SCN_SCNLEN (dot_data_symbol, H_GET_DATA_SIZE (headers)); - - /* Assign the size of the section */ - SA_SET_SCN_SCNLEN (dot_bss_symbol, H_GET_BSS_SIZE (headers)); - - /* pre write hook can add relocs (for 960 and 29k coff) so */ - headers->relocation_size = text_relocation_number * RELSZ + - data_relocation_number * RELSZ; - - - - /* Fill in extra coff fields */ - - /* Initialize general line number information. */ - H_SET_LINENO_SIZE (headers, text_lineno_number * LINESZ); - - /* filehdr */ - H_SET_FILE_MAGIC_NUMBER (headers, FILE_HEADER_MAGIC); - H_SET_NUMBER_OF_SECTIONS (headers, 3); /* text+data+bss */ -#ifndef OBJ_COFF_OMIT_TIMESTAMP - H_SET_TIME_STAMP (headers, (long) time ((long *) 0)); -#else /* OBJ_COFF_OMIT_TIMESTAMP */ - H_SET_TIME_STAMP (headers, 0); -#endif /* OBJ_COFF_OMIT_TIMESTAMP */ - H_SET_SYMBOL_TABLE_POINTER (headers, H_GET_SYMBOL_TABLE_FILE_OFFSET (headers)); -#if 0 - printf ("FILHSZ %x\n", FILHSZ); - printf ("OBJ_COFF_AOUTHDRSZ %x\n", OBJ_COFF_AOUTHDRSZ); - printf ("section headers %x\n", H_GET_NUMBER_OF_SECTIONS (headers) * SCNHSZ); - printf ("get text size %x\n", H_GET_TEXT_SIZE (headers)); - printf ("get data size %x\n", H_GET_DATA_SIZE (headers)); - printf ("get relocation size %x\n", H_GET_RELOCATION_SIZE (headers)); - printf ("get lineno size %x\n", H_GET_LINENO_SIZE (headers)); -#endif - /* symbol table size allready set */ - H_SET_SIZEOF_OPTIONAL_HEADER (headers, OBJ_COFF_AOUTHDRSZ); - - /* Do not added the F_RELFLG for the standard COFF. The AIX linker - complain on file with relocation info striped flag. */ -#ifdef KEEP_RELOC_INFO - H_SET_FLAGS (headers, (text_lineno_number == 0 ? F_LNNO : 0) - | BYTE_ORDERING); -#else - H_SET_FLAGS (headers, (text_lineno_number == 0 ? F_LNNO : 0) - | ((text_relocation_number + data_relocation_number) ? 0 : F_RELFLG) - | BYTE_ORDERING); -#endif - /* aouthdr */ - /* magic number allready set */ - H_SET_VERSION_STAMP (headers, 0); - /* Text, data, bss size; entry point; text_start and data_start are already set */ - - /* Build section headers */ - - c_section_header (&text_section_header, - ".text", - 0, - H_GET_TEXT_SIZE (headers), - H_GET_TEXT_FILE_OFFSET (headers), - (SA_GET_SCN_NRELOC (dot_text_symbol) - ? H_GET_RELOCATION_FILE_OFFSET (headers) - : 0), - (text_lineno_number - ? H_GET_LINENO_FILE_OFFSET (headers) - : 0), - SA_GET_SCN_NRELOC (dot_text_symbol), - text_lineno_number, - section_alignment[(int) SEG_TEXT]); - - c_section_header (&data_section_header, - ".data", - H_GET_TEXT_SIZE (headers), - H_GET_DATA_SIZE (headers), - (H_GET_DATA_SIZE (headers) - ? H_GET_DATA_FILE_OFFSET (headers) - : 0), - (SA_GET_SCN_NRELOC (dot_data_symbol) - ? (H_GET_RELOCATION_FILE_OFFSET (headers) - + text_section_header.s_nreloc * RELSZ) - : 0), - 0, /* No line number information */ - SA_GET_SCN_NRELOC (dot_data_symbol), - 0, /* No line number information */ - section_alignment[(int) SEG_DATA]); - - c_section_header (&bss_section_header, - ".bss", - H_GET_TEXT_SIZE (headers) + H_GET_DATA_SIZE (headers), - H_GET_BSS_SIZE (headers), - 0, /* No file offset */ - 0, /* No relocation information */ - 0, /* No line number information */ - 0, /* No relocation information */ - 0, /* No line number information */ - section_alignment[(int) SEG_BSS]); -} -#endif - -#ifdef BFD_ASSEMBLER symbolS *coff_last_function; @@ -2521,7 +1183,65 @@ coff_frob_file () c_dot_file_symbol ("fake"); } } -#endif /* BFD_ASSEMBLER */ + +void +coff_frob_section (strsec) + segT strsec; +{ + segT sec; + char *strname, *p; + fragS *fragp; + bfd_vma size, n_entries; + + /* @@ these should be in a "stabs.h" file, or maybe as.h */ +#ifndef STAB_SECTION_NAME +#define STAB_SECTION_NAME ".stab" +#endif +#ifndef STAB_STRING_SECTION_NAME +#define STAB_STRING_SECTION_NAME ".stabstr" +#endif + if (strcmp (STAB_STRING_SECTION_NAME, strsec->name)) + return; + + sec = subseg_get (STAB_SECTION_NAME, 0); + /* size is already rounded up, since other section will be listed first */ + size = bfd_get_section_size_before_reloc (strsec); + + n_entries = bfd_get_section_size_before_reloc (sec) / 12 - 1; + + /* Find first non-empty frag. It should be large enough. */ + fragp = seg_info (sec)->frchainP->frch_root; + while (fragp && fragp->fr_fix == 0) + fragp = fragp->fr_next; + assert (fragp != 0 && fragp->fr_fix >= 12); + + /* Store the values. */ + p = fragp->fr_literal; + bfd_h_put_16 (stdoutput, n_entries, (bfd_byte *) p + 6); + bfd_h_put_32 (stdoutput, size, (bfd_byte *) p + 8); +} + +void +obj_coff_init_stab_section (seg) + segT seg; +{ + char *file; + char *p; + char *stabstr_name; + unsigned int stroff; + + /* Make space for this first symbol. */ + p = frag_more (12); + /* Zero it out. */ + memset (p, 0, 12); + as_where (&file, (unsigned int *) NULL); + stabstr_name = (char *) alloca (strlen (seg->name) + 4); + strcpy (stabstr_name, seg->name); + strcat (stabstr_name, "str"); + stroff = get_stab_string_offset (file, stabstr_name); + know (stroff == 1); + md_number_to_chars (p, stroff, 4); +} #ifdef DEBUG /* for debugging */ @@ -2530,7 +1250,7 @@ s_get_name (s) symbolS *s; { return ((s == NULL) ? "(NULL)" : S_GET_NAME (s)); -} /* s_get_name() */ +} void symbol_dump () @@ -2539,22 +1259,12 @@ symbol_dump () for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) { -#ifdef BFD_ASSEMBLER printf("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n", (unsigned long) symbolP, S_GET_NAME(symbolP), (long) S_GET_DATA_TYPE(symbolP), S_GET_STORAGE_CLASS(symbolP), (int) S_GET_SEGMENT(symbolP)); -#else - printf ("%3ld: 0x%lx \"%s\" type = %ld, class = %d, segment = %d\n", - symbolP->sy_number, - (unsigned long) symbolP, - S_GET_NAME (symbolP), - (long) S_GET_DATA_TYPE (symbolP), - S_GET_STORAGE_CLASS (symbolP), - (int) S_GET_SEGMENT (symbolP)); -#endif } } diff --git a/gas/config/obj-coff.h b/gas/config/obj-coff.h index 26244bf..0d5a68c 100644 --- a/gas/config/obj-coff.h +++ b/gas/config/obj-coff.h @@ -1,5 +1,5 @@ /* coff object file format - Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. + Copyright (C) 1989, 1990, 1991, 1992, 1994 Free Software Foundation, Inc. This file is part of GAS. @@ -21,8 +21,6 @@ #include "targ-cpu.h" -#if defined (BFD_HEADERS) || defined (BFD_ASSEMBLER) - /* This internal_lineno crap is to stop namespace pollution from the bfd internal coff headerfile. */ @@ -31,9 +29,7 @@ #include "coff/internal.h" #undef internal_lineno -#ifdef BFD_ASSEMBLER #include "../bfd/libcoff.h" -#endif #ifdef TC_A29K #include "coff/a29k.h" @@ -72,72 +68,6 @@ extern bfd *stdoutput; #endif #endif -#else /* not BFD_HEADERS */ - -#include "coff_gnu.h" - -#endif /* not BFD_HEADERS */ - -#ifndef BFD_ASSEMBLER -/* Define some processor dependent values according to the processor - we are on. */ -#ifdef TC_M68K - -#define BYTE_ORDERING F_AR32W /* See filehdr.h for more info. */ -#ifndef FILE_HEADER_MAGIC -#define FILE_HEADER_MAGIC MC68MAGIC /* ... */ -#endif /* FILE_HEADER_MAGIC */ - -#endif /* TC_M68K */ - -#if defined(TC_I386) - -#define BYTE_ORDERING F_AR32WR /* See filehdr.h for more info. */ -#ifndef FILE_HEADER_MAGIC -#define FILE_HEADER_MAGIC I386MAGIC /* ... */ -#endif /* FILE_HEADER_MAGIC */ - -#endif /* TC_I386 */ - -#if defined(TC_I960) - -#define BYTE_ORDERING F_AR32WR /* See filehdr.h for more info. */ -#ifndef FILE_HEADER_MAGIC -#define FILE_HEADER_MAGIC I960ROMAGIC /* ... */ -#endif /* FILE_HEADER_MAGIC */ - -#endif /* TC_I960 */ - -#if defined(TC_A29K) - -#define BYTE_ORDERING F_AR32W /* big endian. */ -#ifndef FILE_HEADER_MAGIC -#define FILE_HEADER_MAGIC SIPFBOMAGIC -#endif /* FILE_HEADER_MAGIC */ - -#endif /* TC_A29K */ - -#ifndef OBJ_COFF_MAX_AUXENTRIES -#define OBJ_COFF_MAX_AUXENTRIES 1 -#endif /* OBJ_COFF_MAX_AUXENTRIES */ - -extern const short seg_N_TYPE[]; -extern const segT N_TYPE_seg[]; - -/* Magic number of paged executable. */ -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE (FILE_HEADER_MAGIC) - -#ifndef BFD_HEADERS - -/* Add these definitions to have a consistent convention for all the - types used in COFF format. */ -#define AOUTHDR struct aouthdr -#define AOUTHDRSZ sizeof(AOUTHDR) -#endif - -#endif /* not BFD_ASSEMBLER */ - - /* SYMBOL TABLE */ /* targets may also set this */ @@ -145,8 +75,6 @@ extern const segT N_TYPE_seg[]; #define SYMBOLS_NEED_BACKPOINTERS 1 #endif /* SYMBOLS_NEED_BACKPOINTERS */ -#ifdef BFD_ASSEMBLER - /* Alter the field names, for now, until we've fixed up the other references to use the new name. */ #ifdef TC_I960 @@ -161,123 +89,12 @@ extern const segT N_TYPE_seg[]; #define OBJ_COFF_MAX_AUXENTRIES 1 #endif -#else - -/* Symbol table entry data type */ - -typedef struct - { -#ifdef BFD_HEADERS - struct internal_syment ost_entry; /* Basic symbol */ - union internal_auxent ost_auxent[OBJ_COFF_MAX_AUXENTRIES]; /* Auxiliary entry. */ -#else - SYMENT ost_entry; /* Basic symbol */ - AUXENT ost_auxent[OBJ_COFF_MAX_AUXENTRIES]; /* Auxiliary entry. */ -#endif - unsigned int ost_flags; /* obj_coff internal use only flags */ - } -obj_symbol_type; -#endif /* ! BFD_ASSEMBLER */ -#ifdef BFD_ASSEMBLER #define SYM_AUXENT(S) (&coffsymbol ((S)->bsym)->native[1].u.auxent) -#else -#define SYM_AUXENT(S) (&(S)->sy_symbol.ost_auxent[0]) -#endif #define DO_NOT_STRIP 0 #define DO_STRIP 1 -#ifndef BFD_ASSEMBLER - -/* Symbol table macros and constants */ - -/* Possible and usefull section number in symbol table - * The values of TEXT, DATA and BSS may not be portable. - */ - -#define C_TEXT_SECTION ((short)1) -#define C_DATA_SECTION ((short)2) -#define C_BSS_SECTION ((short)3) -#define C_ABS_SECTION N_ABS -#define C_UNDEF_SECTION N_UNDEF -#define C_DEBUG_SECTION N_DEBUG -#define C_NTV_SECTION N_TV -#define C_PTV_SECTION P_TV -#define C_REGISTER_SECTION 4 - -/* - * Macros to extract information from a symbol table entry. - * This syntaxic indirection allows independence regarding a.out or coff. - * The argument (s) of all these macros is a pointer to a symbol table entry. - */ - -/* Predicates */ -/* True if the symbol is external */ -#define S_IS_EXTERNAL(s) ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION) -/* True if symbol has been defined, ie : - section > 0 (DATA, TEXT or BSS) - section == 0 and value > 0 (external bss symbol) */ -#define S_IS_DEFINED(s) ((s)->sy_symbol.ost_entry.n_scnum > C_UNDEF_SECTION || \ - ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION && \ - S_GET_VALUE(s) > 0)) -/* True if a debug special symbol entry */ -#define S_IS_DEBUG(s) ((s)->sy_symbol.ost_entry.n_scnum == C_DEBUG_SECTION) -/* True if a symbol is local symbol name */ -/* A symbol name whose name begin with ^A is a gas internal pseudo symbol */ -#define S_IS_LOCAL(s) (S_GET_NAME(s)[0] == '\001' || \ - (s)->sy_symbol.ost_entry.n_scnum == C_REGISTER_SECTION || \ - (S_LOCAL_NAME(s) && !flagseen['L'])) -/* True if a symbol is not defined in this file */ -#define S_IS_EXTERN(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \ - && S_GET_VALUE (s) == 0) -/* - * True if a symbol can be multiply defined (bss symbols have this def - * though it is bad practice) - */ -#define S_IS_COMMON(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \ - && S_GET_VALUE (s) != 0) -/* True if a symbol name is in the string table, i.e. its length is > 8. */ -#define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0) - -/* Accessors */ -/* The name of the symbol */ -#define S_GET_NAME(s) ((char*)(s)->sy_symbol.ost_entry.n_offset) -/* The pointer to the string table */ -#define S_GET_OFFSET(s) ((s)->sy_symbol.ost_entry.n_offset) -/* The zeroes if symbol name is longer than 8 chars */ -#define S_GET_ZEROES(s) ((s)->sy_symbol.ost_entry.n_zeroes) -/* The numeric value of the segment */ -#define S_GET_SEGMENT(s) (N_TYPE_seg[(s)->sy_symbol.ost_entry.n_scnum+4]) -/* The data type */ -#define S_GET_DATA_TYPE(s) ((s)->sy_symbol.ost_entry.n_type) -/* The storage class */ -#define S_GET_STORAGE_CLASS(s) ((s)->sy_symbol.ost_entry.n_sclass) -/* The number of auxiliary entries */ -#define S_GET_NUMBER_AUXILIARY(s) ((s)->sy_symbol.ost_entry.n_numaux) - -/* Modifiers */ -/* Set the name of the symbol */ -#define S_SET_NAME(s,v) ((s)->sy_symbol.ost_entry.n_offset = (unsigned long)(v)) -/* Set the offset of the symbol */ -#define S_SET_OFFSET(s,v) ((s)->sy_symbol.ost_entry.n_offset = (v)) -/* The zeroes if symbol name is longer than 8 chars */ -#define S_SET_ZEROES(s,v) ((s)->sy_symbol.ost_entry.n_zeroes = (v)) -/* The numeric value of the segment */ -#define S_SET_SEGMENT(s,v) ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE(v)) -/* The data type */ -#define S_SET_DATA_TYPE(s,v) ((s)->sy_symbol.ost_entry.n_type = (v)) -/* The storage class */ -#define S_SET_STORAGE_CLASS(s,v) ((s)->sy_symbol.ost_entry.n_sclass = (v)) -/* The number of auxiliary entries */ -#define S_SET_NUMBER_AUXILIARY(s,v) ((s)->sy_symbol.ost_entry.n_numaux = (v)) - -/* Additional modifiers */ -/* The symbol is external (does not mean undefined) */ -#define S_SET_EXTERNAL(s) { S_SET_STORAGE_CLASS(s, C_EXT) ; SF_CLEAR_LOCAL(s); } - -#else /* BFD_ASSEMBLER */ - extern void obj_coff_section PARAMS ((int)); /* The number of auxiliary entries */ @@ -293,43 +110,22 @@ extern int S_SET_STORAGE_CLASS PARAMS ((struct symbol *, int)); extern int S_GET_STORAGE_CLASS PARAMS ((struct symbol *)); extern void SA_SET_SYM_ENDNDX PARAMS ((struct symbol *, struct symbol *)); -#endif /* ! BFD_ASSEMBLER */ - /* Auxiliary entry macros. SA_ stands for symbol auxiliary */ /* Omit the tv related fields */ /* Accessors */ -#if defined (BFD_HEADERS) || defined (BFD_ASSEMBLER) #define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l) -#else -#define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx) -#endif #define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno) #define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size) #define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize) #define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#ifdef BFD_HEADERS -#define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l) -#else #define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx) -#endif #define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]) #define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname) #define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen) #define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc) #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno) -/* Modifiers */ -#ifndef BFD_ASSEMBLER -#ifdef BFD_HEADERS -#define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx.l=(v)) -#define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l=(v)) -#else -#define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx=(v)) -#define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx=(v)) -#endif -#endif - #define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v)) #define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v)) #define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v)) @@ -374,15 +170,9 @@ extern void SA_SET_SYM_ENDNDX PARAMS ((struct symbol *, struct symbol *)); /* All other bits are unused. */ /* Accessors */ -#ifdef BFD_ASSEMBLER #define SF_GET(s) ((s)->sy_flags) #define SF_GET_DEBUG(s) ((s)->bsym->flags & BSF_DEBUGGING) #define SF_SET_DEBUG(s) ((s)->bsym->flags |= BSF_DEBUGGING) -#else -#define SF_GET(s) ((s)->sy_symbol.ost_flags) -#define SF_GET_DEBUG(s) ((s)->sy_symbol.ost_flags & SF_DEBUG) -#define SF_SET_DEBUG(s) ((s)->sy_symbol.ost_flags |= SF_DEBUG) -#endif #define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK) #define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK) #define SF_GET_FILE(s) (SF_GET (s) & SF_FILE) @@ -422,161 +212,12 @@ extern void SA_SET_SYM_ENDNDX PARAMS ((struct symbol *, struct symbol *)); #define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */ #define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */ -/* File header macro and type definition */ - -#ifndef BFD_ASSEMBLER -/* - * File position calculators. Beware to use them when all the - * appropriate fields are set in the header. - */ - -#ifdef OBJ_COFF_OMIT_OPTIONAL_HEADER -#define OBJ_COFF_AOUTHDRSZ (0) -#else -#define OBJ_COFF_AOUTHDRSZ (AOUTHDRSZ) -#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ - -#define H_GET_FILE_SIZE(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h) + \ - H_GET_SYMBOL_TABLE_SIZE(h) + \ - (h)->string_table_size) -#define H_GET_TEXT_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ) -#define H_GET_DATA_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h)) -#define H_GET_BSS_FILE_OFFSET(h) 0 -#define H_GET_RELOCATION_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h)) -#define H_GET_LINENO_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h)) -#define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h)) - -/* Accessors */ -/* aouthdr */ -#define H_GET_MAGIC_NUMBER(h) ((h)->aouthdr.magic) -#define H_GET_VERSION_STAMP(h) ((h)->aouthdr.vstamp) -#define H_GET_TEXT_SIZE(h) ((h)->aouthdr.tsize) -#define H_GET_DATA_SIZE(h) ((h)->aouthdr.dsize) -#define H_GET_BSS_SIZE(h) ((h)->aouthdr.bsize) -#define H_GET_ENTRY_POINT(h) ((h)->aouthdr.entry) -#define H_GET_TEXT_START(h) ((h)->aouthdr.text_start) -#define H_GET_DATA_START(h) ((h)->aouthdr.data_start) -/* filehdr */ -#define H_GET_FILE_MAGIC_NUMBER(h) ((h)->filehdr.f_magic) -#define H_GET_NUMBER_OF_SECTIONS(h) ((h)->filehdr.f_nscns) -#define H_GET_TIME_STAMP(h) ((h)->filehdr.f_timdat) -#define H_GET_SYMBOL_TABLE_POINTER(h) ((h)->filehdr.f_symptr) -#define H_GET_SYMBOL_COUNT(h) ((h)->filehdr.f_nsyms) -#define H_GET_SYMBOL_TABLE_SIZE(h) (H_GET_SYMBOL_COUNT(h) * SYMESZ) -#define H_GET_SIZEOF_OPTIONAL_HEADER(h) ((h)->filehdr.f_opthdr) -#define H_GET_FLAGS(h) ((h)->filehdr.f_flags) -/* Extra fields to achieve bsd a.out compatibility and for convenience */ -#define H_GET_RELOCATION_SIZE(h) ((h)->relocation_size) -#define H_GET_STRING_SIZE(h) ((h)->string_table_size) -#define H_GET_LINENO_SIZE(h) ((h)->lineno_size) - -#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER -#define H_GET_HEADER_SIZE(h) (sizeof(FILHDR) \ - + sizeof(AOUTHDR)\ - + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)) -#else /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ -#define H_GET_HEADER_SIZE(h) (sizeof(FILHDR) \ - + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)) -#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ - -#define H_GET_TEXT_RELOCATION_SIZE(h) (text_section_header.s_nreloc * RELSZ) -#define H_GET_DATA_RELOCATION_SIZE(h) (data_section_header.s_nreloc * RELSZ) - -/* Modifiers */ -/* aouthdr */ -#define H_SET_MAGIC_NUMBER(h,v) ((h)->aouthdr.magic = (v)) -#define H_SET_VERSION_STAMP(h,v) ((h)->aouthdr.vstamp = (v)) -#define H_SET_TEXT_SIZE(h,v) ((h)->aouthdr.tsize = (v)) -#define H_SET_DATA_SIZE(h,v) ((h)->aouthdr.dsize = (v)) -#define H_SET_BSS_SIZE(h,v) ((h)->aouthdr.bsize = (v)) -#define H_SET_ENTRY_POINT(h,v) ((h)->aouthdr.entry = (v)) -#define H_SET_TEXT_START(h,v) ((h)->aouthdr.text_start = (v)) -#define H_SET_DATA_START(h,v) ((h)->aouthdr.data_start = (v)) -/* filehdr */ -#define H_SET_FILE_MAGIC_NUMBER(h,v) ((h)->filehdr.f_magic = (v)) -#define H_SET_NUMBER_OF_SECTIONS(h,v) ((h)->filehdr.f_nscns = (v)) -#define H_SET_TIME_STAMP(h,v) ((h)->filehdr.f_timdat = (v)) -#define H_SET_SYMBOL_TABLE_POINTER(h,v) ((h)->filehdr.f_symptr = (v)) -#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->filehdr.f_nsyms = (v)) -#define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v)) -#define H_SET_FLAGS(h,v) ((h)->filehdr.f_flags = (v)) -/* Extra fields to achieve bsd a.out compatibility and for convinience */ -#define H_SET_RELOCATION_SIZE(h,t,d) ((h)->relocation_size = (t)+(d)) -#define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v)) -#define H_SET_LINENO_SIZE(h,v) ((h)->lineno_size = (v)) - -/* Segment flipping */ - -typedef struct - { -#ifdef BFD_HEADERS - struct internal_aouthdr aouthdr; /* a.out header */ - struct internal_filehdr filehdr; /* File header, not machine dep. */ -#else - AOUTHDR aouthdr; /* a.out header */ - FILHDR filehdr; /* File header, not machine dep. */ -#endif - long string_table_size; /* names + '\0' + sizeof(int) */ - long relocation_size; /* Cumulated size of relocation - information for all sections in - bytes. */ - long lineno_size; /* Size of the line number information - table in bytes */ - } - -object_headers; -#endif /* ! BFD_ASSEMBLER */ - /* -------------- Line number handling ------- */ extern int text_lineno_number; extern int coff_line_base; -#ifndef BFD_ASSEMBLER -/* line numbering stuff. */ - -typedef struct internal_lineno - { -#ifdef BFD_HEADERS - struct bfd_internal_lineno line; -#else - LINENO line; /* The lineno structure itself */ -#endif - char *frag; /* Frag to which the line number is related */ - struct internal_lineno *next; /* Forward chain pointer */ - } lineno; - -extern lineno *lineno_lastP; -extern lineno *lineno_rootP; -#define OBJ_EMIT_LINENO(a, b, c) obj_emit_lineno((a),(b),(c)) - -void obj_emit_lineno PARAMS ((char **where, lineno * line, char *file_start)); - -#endif /* not BFD_ASSEMBLER */ - -#ifdef BFD_ASSEMBLER #define obj_emit_lineno(WHERE,LINE,FILE_START) abort () extern void coff_add_linesym PARAMS ((struct symbol *)); -#endif /* stack stuff */ typedef struct @@ -587,7 +228,6 @@ typedef struct char *data; unsigned long pointer; } - stack; char *stack_pop PARAMS ((stack * st)); @@ -598,21 +238,16 @@ stack *stack_init PARAMS ((unsigned long chunk_size, void c_dot_file_symbol PARAMS ((char *filename)); void stack_delete PARAMS ((stack * st)); -#ifndef BFD_ASSEMBLER -void obj_extra_stuff PARAMS ((object_headers * headers)); -#ifndef tc_headers_hook -void tc_headers_hook PARAMS ((object_headers * headers)); -#endif -#endif - #ifndef tc_coff_symbol_emit_hook void tc_coff_symbol_emit_hook PARAMS ((/* symbolS * */)); #endif extern void coff_frob_symbol PARAMS ((struct symbol *, int *)); extern void coff_frob_file PARAMS ((void)); +extern void coff_frob_section PARAMS ((segT)); #define obj_frob_symbol(S,P) coff_frob_symbol(S,&P) #define obj_frob_file() coff_frob_file () +#define obj_frob_section(S) coff_frob_section (S) extern struct symbol *coff_last_function; @@ -629,22 +264,6 @@ extern struct symbol *coff_last_function; : 0) #endif -#ifndef BFD_ASSEMBLER -#ifdef BFD_HEADERS -void c_section_header PARAMS ((struct internal_scnhdr *header, - char *name, long core_address, long size, - long data_ptr, long reloc_ptr, long lineno_ptr, - long reloc_number, long lineno_number, - long alignment)); -#else -void c_section_header PARAMS ((SCNHDR * header, - char *name, long core_address, long size, - long data_ptr, long reloc_ptr, long lineno_ptr, - long reloc_number, long lineno_number, - long alignment)); -#endif -#endif - /* sanity check */ #ifdef TC_I960 @@ -652,16 +271,12 @@ void c_section_header PARAMS ((SCNHDR * header, hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it. #endif /* no C_LEAFSTAT */ #endif /* TC_I960 */ -#ifndef BFD_ASSEMBLER -#ifdef BFD_HEADERS -extern struct internal_scnhdr data_section_header; -extern struct internal_scnhdr text_section_header; -#else -extern SCNHDR data_section_header; -extern SCNHDR text_section_header; -#endif -#endif #define SEPARATE_STAB_SECTIONS +/* We need 12 bytes at the start of the section to hold some initial + information. */ +extern void obj_coff_init_stab_section PARAMS ((segT)); +#define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg) + /* end of obj-coff.h */ |