diff options
author | K. Richard Pixley <rich@cygnus> | 1992-02-13 08:33:54 +0000 |
---|---|---|
committer | K. Richard Pixley <rich@cygnus> | 1992-02-13 08:33:54 +0000 |
commit | a39116f1c91d3642c068d9df871338cca9006be2 (patch) | |
tree | dbd53d94ef859ca6425ef5370573030d4766161b /gas/config/obj-coff.c | |
parent | 77806c3e79cc6ebd5ab62ce46f7cdeecad50ca52 (diff) | |
download | gdb-a39116f1c91d3642c068d9df871338cca9006be2.zip gdb-a39116f1c91d3642c068d9df871338cca9006be2.tar.gz gdb-a39116f1c91d3642c068d9df871338cca9006be2.tar.bz2 |
White space and comments only. The devo tree prior to this delta is
tagged as "vanilla" for your convenience.
There are also some comment changes.
Diffstat (limited to 'gas/config/obj-coff.c')
-rw-r--r-- | gas/config/obj-coff.c | 970 |
1 files changed, 474 insertions, 496 deletions
diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index b157acc..77b75f8 100644 --- a/gas/config/obj-coff.c +++ b/gas/config/obj-coff.c @@ -1,21 +1,21 @@ /* coff object file format Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc. - -This file is part of GAS. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + + This file is part of GAS. + + GAS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GAS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* $Id$ */ @@ -47,19 +47,19 @@ const short seg_N_TYPE[] = { /* in: segT out: N_TYPE bits */ 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 -}; + 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 + }; #ifdef __STDC__ @@ -134,29 +134,29 @@ const pseudo_typeS obj_pseudo_table[] = { { "type", s_ignore, 0 }, { "val", s_ignore, 0 }, #endif /* ignore debug */ - + { "ident", s_ignore, 0 }, /* we don't yet handle this. */ - - - /* stabs aka a.out aka b.out directives for debug symbols. - Currently ignored silently. Except for .line at which - we guess from context. */ + + + /* stabs aka a.out aka b.out directives for debug symbols. + Currently ignored silently. Except for .line at which + we guess from context. */ { "desc", s_ignore, 0 }, /* def */ -/* { "line", s_ignore, 0 }, */ /* source code line number */ + /* { "line", s_ignore, 0 }, */ /* source code line number */ { "stabd", obj_coff_stab, 'd' }, /* stabs */ { "stabn", obj_coff_stab, 'n' }, /* stabs */ { "stabs", obj_coff_stab, 's' }, /* stabs */ - - /* stabs-in-coff (?) debug pseudos (ignored) */ + + /* stabs-in-coff (?) debug pseudos (ignored) */ { "optim", s_ignore, 0 }, /* For sun386i cc (?) */ - /* other stuff */ + /* other stuff */ { "ABORT", s_abort, 0 }, - + { NULL} /* end sentinel */ }; /* obj_pseudo_table */ - /* obj dependant output values */ +/* obj dependant output values */ #ifdef BFD_HEADERS static struct internal_scnhdr bss_section_header; struct internal_scnhdr data_section_header; @@ -185,7 +185,7 @@ relax_addressT segment_address_in_file; RELOC ri; #endif symbolS *symbolP; - + bzero((char *)&ri,sizeof(ri)); for (; fixP; fixP = fixP->fx_next) { if (symbolP = fixP->fx_addsy) { @@ -212,7 +212,7 @@ relax_addressT segment_address_in_file; : R_RELLONG); #elif defined(TC_A29K) ri.r_type = tc_coff_fix2rtype(fixP); - + #else you lose #endif /* TC_M68K || TC_I386 */ @@ -244,7 +244,7 @@ relax_addressT segment_address_in_file; : ((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 */ @@ -255,34 +255,34 @@ relax_addressT segment_address_in_file; 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.r_type == R_IHIHALF) { - /* now emit the second bit */ - ri.r_type = R_IHCONST; - ri.r_symndx = fixP->fx_addnumber; - *where += bfd_coff_swap_reloc_out(stdoutput, &ri, *where); + /* now emit the second bit */ + ri.r_type = R_IHCONST; + ri.r_symndx = fixP->fx_addnumber; + *where += bfd_coff_swap_reloc_out(stdoutput, &ri, *where); } - + #endif - + #else append(where, (char *) &ri, sizeof(ri)); #endif - + #ifdef TC_I960 if (fixP->fx_callj) { ri.r_type = R_OPTCALL; #ifdef BFD_HEADERS - *where += bfd_coff_swap_reloc_out(stdoutput, &ri, *where); + *where += bfd_coff_swap_reloc_out(stdoutput, &ri, *where); #else - append(where, (char *) &ri, sizeof(ri)); + append(where, (char *) &ri, sizeof(ri)); #endif - - + + } /* if it's a callj, do it again for the opcode */ #endif /* TC_I960 */ - + } /* if there's a symbol */ } /* for each fixP */ - + return; } /* obj_emit_relocations() */ @@ -293,15 +293,15 @@ 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); + 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); + *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); - + 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 @@ -311,7 +311,7 @@ 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)); @@ -328,7 +328,7 @@ object_headers *headers; *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)); @@ -350,21 +350,21 @@ object_headers *headers; 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); - + return; } /* obj_header_append() */ #endif @@ -373,97 +373,99 @@ char **where; symbolS *symbolP; { #ifdef BFD_HEADERS - unsigned int numaux = symbolP->sy_symbol.ost_entry.n_numaux; - unsigned int i; - + 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); + 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), + *where += bfd_coff_swap_sym_out(stdoutput, &symbolP->sy_symbol.ost_entry, *where); - } - -#else - SYMENT *syment = &symbolP->sy_symbol.ost_entry; - int i; - char numaux = syment->n_numaux; - unsigned short type = S_GET_DATA_TYPE(symbolP); - + + 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), + *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, syment->n_scnum, sizeof(syment->n_scnum)); - *where += sizeof(syment->n_scnum); - 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); + md_number_to_chars(*where, syment->n_value, sizeof(syment->n_value)); + *where += sizeof(syment->n_value); + md_number_to_chars(*where, 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)); + 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"); - } /* too many auxents */ - - for (i = 0; i < numaux; ++i) { + + /* 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"); + } /* too many auxents */ + + for (i = 0; i < numaux; ++i) { #ifdef CROSS_COMPILE #if 0 /* This code has never been tested */ - /* The most common case, x_sym entry. */ - if ((SF_GET(symbolP) & (SF_FILE | 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)) { - register 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 (SF_GET_FILE(symbolP)) { /* .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); - } + /* The most common case, x_sym entry. */ + if ((SF_GET(symbolP) & (SF_FILE | 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)) { + register 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 (SF_GET_FILE(symbolP)) { /* .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); + } #endif /* 0 */ #else /* CROSS_COMPILE */ - append(where, (char *) &symbolP->sy_symbol.ost_auxent[i], sizeof(symbolP->sy_symbol.ost_auxent[i])); + append(where, (char *) &symbolP->sy_symbol.ost_auxent[i], sizeof(symbolP->sy_symbol.ost_auxent[i])); #endif /* CROSS_COMPILE */ - - }; /* for each aux in use */ + + }; /* for each aux in use */ #endif /* BFD_HEADERS */ - return; + return; } /* obj_symbol_to_chars() */ #ifdef BFD_HEADERS @@ -471,7 +473,7 @@ static void obj_coff_section_header_append(where, header) char **where; struct internal_scnhdr *header; { - *where += bfd_coff_swap_scnhdr_out(stdoutput, header, *where); + *where += bfd_coff_swap_scnhdr_out(stdoutput, header, *where); } #else static void obj_coff_section_header_append(where, header) @@ -513,13 +515,13 @@ SCNHDR *header; 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 */ - + return; } /* obj_coff_section_header_append() */ @@ -528,28 +530,28 @@ 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 { - bzero(symbolP->sy_symbol.ost_entry.n_name, SYMNMLEN); - strncpy(symbolP->sy_symbol.ost_entry.n_name, temp, SYMNMLEN); - } - obj_symbol_to_chars(where, symbolP); - S_SET_NAME(symbolP,temp); - } + 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 { + bzero(symbolP->sy_symbol.ost_entry.n_name, 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() */ /* Merge a debug symbol containing debug information into a normal symbol. */ @@ -560,15 +562,15 @@ symbolS *normal; { S_SET_DATA_TYPE(normal, S_GET_DATA_TYPE(debug)); S_SET_STORAGE_CLASS(normal, S_GET_STORAGE_CLASS(debug)); - + if (S_GET_NUMBER_AUXILIARY(debug) > S_GET_NUMBER_AUXILIARY(normal)) { S_SET_NUMBER_AUXILIARY(normal, S_GET_NUMBER_AUXILIARY(debug)); } /* take the most we have */ - + if (S_GET_NUMBER_AUXILIARY(debug) > 0) { memcpy((char*)&normal->sy_symbol.ost_auxent[0], (char*)&debug->sy_symbol.ost_auxent[0], S_GET_NUMBER_AUXILIARY(debug) * AUXESZ); } /* Move all the auxiliary information */ - + /* Move the debug flags. */ SF_SET_DEBUG_FIELD(normal, SF_GET_DEBUG_FIELD(debug)); } /* c_symbol_merge() */ @@ -578,32 +580,32 @@ static symbolS *previous_file_symbol = NULL; void c_dot_file_symbol(filename) char *filename; { - symbolS* symbolP; - - symbolP = symbol_new(".file", - SEG_DEBUG, - 0, - &zero_address_frag); - - S_SET_STORAGE_CLASS(symbolP, C_FILE); - S_SET_NUMBER_AUXILIARY(symbolP, 1); - SA_SET_FILE_FNAME(symbolP, filename); - SF_SET_DEBUG(symbolP); - S_SET_VALUE(symbolP, (long) previous_file_symbol); - - previous_file_symbol = symbolP; - - /* Make sure that the symbol is first on the symbol chain */ - if (symbol_rootP != symbolP) { - if (symbolP == symbol_lastP) { - symbol_lastP = symbol_lastP->sy_previous; - } /* if it was the last thing on the list */ - - symbol_remove(symbolP, &symbol_rootP, &symbol_lastP); - symbol_insert(symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP); - symbol_rootP = symbolP; - } /* if not first on the list */ - + symbolS* symbolP; + + symbolP = symbol_new(".file", + SEG_DEBUG, + 0, + &zero_address_frag); + + S_SET_STORAGE_CLASS(symbolP, C_FILE); + S_SET_NUMBER_AUXILIARY(symbolP, 1); + SA_SET_FILE_FNAME(symbolP, filename); + SF_SET_DEBUG(symbolP); + S_SET_VALUE(symbolP, (long) previous_file_symbol); + + previous_file_symbol = symbolP; + + /* Make sure that the symbol is first on the symbol chain */ + if (symbol_rootP != symbolP) { + if (symbolP == symbol_lastP) { + symbol_lastP = symbol_lastP->sy_previous; + } /* if it was the last thing on the list */ + + symbol_remove(symbolP, &symbol_rootP, &symbol_lastP); + symbol_insert(symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP); + symbol_rootP = symbolP; + } /* if not first on the list */ + } /* c_dot_file_symbol() */ /* * Build a 'section static' symbol. @@ -616,27 +618,27 @@ long length; unsigned short nreloc; unsigned short nlnno; { - symbolS *symbolP; - - symbolP = symbol_new(name, - (name[1] == 't' - ? SEG_TEXT - : (name[1] == 'd' - ? SEG_DATA - : SEG_BSS)), - value, - &zero_address_frag); - - S_SET_STORAGE_CLASS(symbolP, C_STAT); - S_SET_NUMBER_AUXILIARY(symbolP, 1); - - SA_SET_SCN_SCNLEN(symbolP, length); - SA_SET_SCN_NRELOC(symbolP, nreloc); - SA_SET_SCN_NLINNO(symbolP, nlnno); - - SF_SET_STATICS(symbolP); - - return (char*)symbolP; + symbolS *symbolP; + + symbolP = symbol_new(name, + (name[1] == 't' + ? SEG_TEXT + : (name[1] == 'd' + ? SEG_DATA + : SEG_BSS)), + value, + &zero_address_frag); + + S_SET_STORAGE_CLASS(symbolP, C_STAT); + S_SET_NUMBER_AUXILIARY(symbolP, 1); + + SA_SET_SCN_SCNLEN(symbolP, length); + SA_SET_SCN_NRELOC(symbolP, nreloc); + SA_SET_SCN_NLINNO(symbolP, nlnno); + + SF_SET_STATICS(symbolP); + + return (char*)symbolP; } /* c_section_symbol() */ void c_section_header(header, @@ -671,7 +673,7 @@ long alignment; 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); @@ -681,7 +683,7 @@ long alignment; : (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' @@ -705,24 +707,24 @@ int our_lineno_number = 0; /* we use this to build pointers from .bf's lineno* lineno_lastP = (lineno*)0; int -c_line_new(paddr, line_number, frag) + 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++; + 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) @@ -737,23 +739,23 @@ char *file_start; #endif 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. */ - + + /* 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. */ -/* char *name; */ + /* char *name; */ 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 = *where - file_start; - + } /* if this is a function linno */ #ifdef BFD_HEADERS *where += bfd_coff_swap_lineno_out(stdoutput, line_entry, *where); @@ -763,15 +765,23 @@ char *file_start; #ifdef CROSS_COMPILE md_number_to_chars(*where, line_entry->l_addr.l_paddr, sizeof(line_entry->l_addr.l_paddr)); *where += sizeof(line_entry->l_addr.l_paddr); - + md_number_to_chars(*where, line_entry->l_lnno, sizeof(line_entry->l_lnno)); *where += sizeof(line_entry->l_lnno); + +#ifdef TC_I960 + **where = '0'; + ++*where; + **where = '0'; + ++*where; +#endif /* TC_I960 */ + #else /* CROSS_COMPILE */ append(where, (char *) line_entry, LINESZ); #endif /* CROSS_COMPILE */ -#endif +#endif /* BFD_HEADERS */ } /* for each line number */ - + return ; } /* obj_emit_lineno() */ @@ -779,7 +789,7 @@ void obj_symbol_new_hook(symbolP) symbolS *symbolP; { char underscore = 0; /* Symbol has leading _ */ - + /* Effective symbol */ /* Store the pointer in the offset. */ S_SET_ZEROES(symbolP, 0L); @@ -790,8 +800,8 @@ symbolS *symbolP; symbolP->sy_symbol.ost_flags = 0; /* Auxiliary entries */ bzero((char*)&symbolP->sy_symbol.ost_auxent[0], AUXESZ); - -#if STRIP_UNDERSCORE + +#ifdef STRIP_UNDERSCORE /* Remove leading underscore at the beginning of the symbol. * This is to be compatible with the standard librairies. */ @@ -800,22 +810,22 @@ symbolS *symbolP; S_SET_NAME(symbolP, S_GET_NAME(symbolP) + 1); } /* strip underscore */ #endif /* STRIP_UNDERSCORE */ - + if (S_IS_STRING(symbolP)) SF_SET_STRING(symbolP); if (!underscore && S_IS_LOCAL(symbolP)) SF_SET_LOCAL(symbolP); - + return; } /* obj_symbol_new_hook() */ - /* stack stuff */ +/* stack stuff */ stack* stack_init(chunk_size, element_size) unsigned long chunk_size; unsigned long element_size; { stack* st; - + if ((st = (stack*)malloc(sizeof(stack))) == (stack*)0) return (stack*)0; if ((st->data = malloc(chunk_size)) == (char*)0) { @@ -832,8 +842,8 @@ unsigned long element_size; void stack_delete(st) stack* st; { - free(st->data); - free(st); + free(st->data); + free(st); } char *stack_push(st, element) @@ -853,17 +863,17 @@ char *element; char* stack_pop(st) stack* st; { - if ((st->pointer -= st->element_size) < 0) { - st->pointer = 0; - return (char*)0; - } - return st->data + st->pointer; + if ((st->pointer -= st->element_size) < 0) { + st->pointer = 0; + return (char*)0; + } + return st->data + st->pointer; } char* stack_top(st) stack* st; { - return st->data + st->pointer - st->element_size; + return st->data + st->pointer - st->element_size; } @@ -877,11 +887,11 @@ static void obj_coff_ln() { demand_empty_rest_of_line(); return; } /* wrong context */ - + c_line_new(obstack_next_free(&frags) - frag_now->fr_literal, get_absolute_expression(), frag_now); - + demand_empty_rest_of_line(); return; } /* obj_coff_line() */ @@ -902,71 +912,71 @@ static void obj_coff_ln() { #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';') #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \ - *input_line_pointer == '\t') \ - input_line_pointer++; + *input_line_pointer == '\t') \ + input_line_pointer++; static void obj_coff_def(what) int what; { - char name_end; /* Char after the end of name */ - char *symbol_name; /* Name of the debug symbol */ - char *symbol_name_copy; /* Temporary copy of the name */ - unsigned int symbol_name_length; - /*$char* directiveP;$ */ /* Name of the pseudo opcode */ - /*$char directive[MAX_DIRECTIVE];$ */ /* Backup of the directive */ - /*$char end = 0;$ */ /* If 1, stop parsing */ - - if (def_symbol_in_progress != NULL) { - as_warn(".def pseudo-op used inside of .def/.endef: ignored."); - demand_empty_rest_of_line(); - return; - } /* if not inside .def/.endef */ - - SKIP_WHITESPACES(); - - def_symbol_in_progress = (symbolS *) obstack_alloc(¬es, sizeof(*def_symbol_in_progress)); - bzero(def_symbol_in_progress, sizeof(*def_symbol_in_progress)); - - symbol_name = input_line_pointer; - name_end = get_symbol_end(); - symbol_name_length = strlen(symbol_name); - symbol_name_copy = xmalloc(symbol_name_length + 1); - strcpy(symbol_name_copy, symbol_name); - - /* Initialize the new symbol */ -#if STRIP_UNDERSCORE - S_SET_NAME(def_symbol_in_progress, (*symbol_name_copy == '_' - ? symbol_name_copy + 1 - : symbol_name_copy)); + char name_end; /* Char after the end of name */ + char *symbol_name; /* Name of the debug symbol */ + char *symbol_name_copy; /* Temporary copy of the name */ + unsigned int symbol_name_length; + /*$char* directiveP;$ */ /* Name of the pseudo opcode */ + /*$char directive[MAX_DIRECTIVE];$ */ /* Backup of the directive */ + /*$char end = 0;$ */ /* If 1, stop parsing */ + + if (def_symbol_in_progress != NULL) { + as_warn(".def pseudo-op used inside of .def/.endef: ignored."); + demand_empty_rest_of_line(); + return; + } /* if not inside .def/.endef */ + + SKIP_WHITESPACES(); + + def_symbol_in_progress = (symbolS *) obstack_alloc(¬es, sizeof(*def_symbol_in_progress)); + bzero(def_symbol_in_progress, sizeof(*def_symbol_in_progress)); + + symbol_name = input_line_pointer; + name_end = get_symbol_end(); + symbol_name_length = strlen(symbol_name); + symbol_name_copy = xmalloc(symbol_name_length + 1); + strcpy(symbol_name_copy, symbol_name); + + /* Initialize the new symbol */ +#ifdef STRIP_UNDERSCORE + S_SET_NAME(def_symbol_in_progress, (*symbol_name_copy == '_' + ? symbol_name_copy + 1 + : symbol_name_copy)); #else /* STRIP_UNDERSCORE */ - S_SET_NAME(def_symbol_in_progress, symbol_name_copy); + S_SET_NAME(def_symbol_in_progress, symbol_name_copy); #endif /* STRIP_UNDERSCORE */ - /* free(symbol_name_copy); */ - def_symbol_in_progress->sy_name_offset = ~0; - def_symbol_in_progress->sy_number = ~0; - def_symbol_in_progress->sy_frag = &zero_address_frag; - - if (S_IS_STRING(def_symbol_in_progress)) { - SF_SET_STRING(def_symbol_in_progress); - } /* "long" name */ - - *input_line_pointer = name_end; - - demand_empty_rest_of_line(); - return; + /* free(symbol_name_copy); */ + def_symbol_in_progress->sy_name_offset = ~0; + def_symbol_in_progress->sy_number = ~0; + def_symbol_in_progress->sy_frag = &zero_address_frag; + + if (S_IS_STRING(def_symbol_in_progress)) { + SF_SET_STRING(def_symbol_in_progress); + } /* "long" name */ + + *input_line_pointer = name_end; + + demand_empty_rest_of_line(); + return; } /* obj_coff_def() */ unsigned int dim_index; static void obj_coff_endef() { symbolS *symbolP; -/* DIM BUG FIX sac@cygnus.com */ + /* DIM BUG FIX sac@cygnus.com */ dim_index =0; if (def_symbol_in_progress == NULL) { as_warn(".endef pseudo-op used outside of .def/.endef: ignored."); demand_empty_rest_of_line(); return; } /* if not inside .def/.endef */ - + /* Set the section number according to storage class. */ switch (S_GET_STORAGE_CLASS(def_symbol_in_progress)) { case C_STRTAG: @@ -979,7 +989,7 @@ static void obj_coff_endef() { SF_SET_DEBUG(def_symbol_in_progress); S_SET_SEGMENT(def_symbol_in_progress, SEG_DEBUG); break; - + case C_EFCN: SF_SET_LOCAL(def_symbol_in_progress); /* Do not emit this symbol. */ /* intentional fallthrough */ @@ -988,7 +998,7 @@ static void obj_coff_endef() { /* intentional fallthrough */ case C_FCN: S_SET_SEGMENT(def_symbol_in_progress, SEG_TEXT); - + if (def_symbol_in_progress->sy_symbol.ost_entry.n_name[1] == 'b') { /* .bf */ if (function_lineoff < 0) { fprintf(stderr, "`.bf' symbol without preceding function\n"); @@ -998,7 +1008,7 @@ static void obj_coff_endef() { function_lineoff = -1; } break; - + #ifdef C_AUTOARG case C_AUTOARG: #endif /* C_AUTOARG */ @@ -1014,25 +1024,25 @@ static void obj_coff_endef() { SF_SET_DEBUG(def_symbol_in_progress); S_SET_SEGMENT(def_symbol_in_progress, SEG_ABSOLUTE); break; - + case C_EXT: case C_STAT: case C_LABEL: - /* Valid but set somewhere else (s_comm, s_lcomm, colon) */ + /* Valid but set somewhere else (s_comm, s_lcomm, colon) */ break; - + case C_USTATIC: case C_EXTDEF: case C_ULABEL: as_warn("unexpected storage class %d", S_GET_STORAGE_CLASS(def_symbol_in_progress)); break; } /* switch on storage class */ - + /* Now that we have built a debug symbol, try to find if we should merge with an existing symbol or not. If a symbol is C_EFCN or SEG_ABSOLUTE or untagged SEG_DEBUG it never merges. */ - + /* Two cases for functions. Either debug followed by definition or definition followed by debug. For definition first, we will merge the debug @@ -1043,19 +1053,19 @@ static void obj_coff_endef() { symbol into the real symbol. Therefor, let's presume the debug symbol is a real function reference. */ - + /* FIXME-SOON If for some reason the definition label/symbol is never seen, this will probably leave an undefined symbol at link time. */ - + if (S_GET_STORAGE_CLASS(def_symbol_in_progress) == C_EFCN || (S_GET_SEGMENT(def_symbol_in_progress) == SEG_DEBUG && !SF_GET_TAG(def_symbol_in_progress)) || S_GET_SEGMENT(def_symbol_in_progress) == SEG_ABSOLUTE || (symbolP = symbol_find_base(S_GET_NAME(def_symbol_in_progress), DO_NOT_STRIP)) == NULL) { - + symbol_append(def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP); - + } else { /* This symbol already exists, merge the newly created symbol into the old one. @@ -1064,14 +1074,14 @@ static void obj_coff_endef() { guess that it save a *lot* of space if the assembly file defines a lot of symbols. [loic] */ - + /* The debug entry (def_symbol_in_progress) is merged into the previous definition. */ - + c_symbol_merge(def_symbol_in_progress, symbolP); /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */ def_symbol_in_progress = symbolP; - + if (SF_GET_FUNCTION(def_symbol_in_progress) || SF_GET_TAG(def_symbol_in_progress)) { /* For functions, and tags, the symbol *must* be where the debug symbol @@ -1083,106 +1093,74 @@ static void obj_coff_endef() { } /* if not already in place */ } /* if function */ } /* normal or mergable */ - + if (SF_GET_TAG(def_symbol_in_progress) && symbol_find_base(S_GET_NAME(def_symbol_in_progress), DO_NOT_STRIP) == NULL) { tag_insert(S_GET_NAME(def_symbol_in_progress), def_symbol_in_progress); } /* If symbol is a {structure,union} tag, associate symbol to its name. */ - + if (SF_GET_FUNCTION(def_symbol_in_progress)) { know(sizeof(def_symbol_in_progress) <= sizeof(long)); function_lineoff = c_line_new((long) def_symbol_in_progress, 0, &zero_address_frag); SF_SET_PROCESS(def_symbol_in_progress); - + if (symbolP == NULL) { /* That is, if this is the first time we've seen the function... */ symbol_table_insert(def_symbol_in_progress); } /* definition follows debug */ } /* Create the line number entry pointing to the function being defined */ - + def_symbol_in_progress = NULL; demand_empty_rest_of_line(); return; } /* obj_coff_endef() */ -#ifndef TC_I960 -/*This code expects all the dims to be after one another, and that is not true -for gcc960 -sac@cygnus.com */ -static void obj_coff_dim() { - register int dim_index; +static void obj_coff_dim() +{ + register int dim_index; + if (def_symbol_in_progress == NULL) { as_warn(".dim pseudo-op used outside of .def/.endef: ignored."); demand_empty_rest_of_line(); return; } /* if not inside .def/.endef */ - + S_SET_NUMBER_AUXILIARY(def_symbol_in_progress, 1); - + for (dim_index = 0; dim_index < DIMNUM; dim_index++) { SKIP_WHITESPACES(); SA_SET_SYM_DIMEN(def_symbol_in_progress, dim_index, get_absolute_expression()); - + switch (*input_line_pointer) { - + case ',': input_line_pointer++; break; - + default: as_warn("badly formed .dim directive ignored"); /* intentional fallthrough */ + case '\n': case ';': dim_index = DIMNUM; break; } /* switch on following character */ } /* for each dimension */ - - demand_empty_rest_of_line(); - return; -} /* obj_coff_dim() */ -#else - -static void -obj_coff_dim() -{ - if (def_symbol_in_progress == NULL) { - as_warn(".dim pseudo-op used outside of .def/.endef: ignored."); + demand_empty_rest_of_line(); return; - } /* if not inside .def/.endef */ - - - S_SET_NUMBER_AUXILIARY(def_symbol_in_progress, 1); - - /* Grab as many dims as we can fit, until ; or full */ - while (dim_index < DIMNUM) - { - SKIP_WHITESPACES(); - SA_SET_SYM_DIMEN(def_symbol_in_progress, dim_index, get_absolute_expression()); - dim_index++; - if (*input_line_pointer == ';') break; - if (*input_line_pointer != ',') { - as_warn("badly formed .dim directive ignored"); - break; - } - input_line_pointer++; - } - demand_empty_rest_of_line(); - return; } /* obj_coff_dim() */ -#endif static void obj_coff_line() { if (def_symbol_in_progress == NULL) { obj_coff_ln(); return; } /* if it looks like a stabs style line */ - + S_SET_NUMBER_AUXILIARY(def_symbol_in_progress, 1); SA_SET_SYM_LNNO(def_symbol_in_progress, get_absolute_expression()); - + demand_empty_rest_of_line(); return; } /* obj_coff_line() */ @@ -1193,7 +1171,7 @@ static void obj_coff_size() { demand_empty_rest_of_line(); return; } /* if not inside .def/.endef */ - + S_SET_NUMBER_AUXILIARY(def_symbol_in_progress, 1); SA_SET_SYM_SIZE(def_symbol_in_progress, get_absolute_expression()); demand_empty_rest_of_line(); @@ -1206,7 +1184,7 @@ static void obj_coff_scl() { demand_empty_rest_of_line(); return; } /* if not inside .def/.endef */ - + S_SET_STORAGE_CLASS(def_symbol_in_progress, get_absolute_expression()); demand_empty_rest_of_line(); return; @@ -1215,27 +1193,27 @@ static void obj_coff_scl() { static void obj_coff_tag() { char *symbol_name; char name_end; - + if (def_symbol_in_progress == NULL) { as_warn(".tag pseudo-op used outside of .def/.endef ignored."); demand_empty_rest_of_line(); return; } /* if not inside .def/.endef */ - + S_SET_NUMBER_AUXILIARY(def_symbol_in_progress, 1); symbol_name = input_line_pointer; name_end = get_symbol_end(); - + /* Assume that the symbol referred to by .tag is always defined. */ /* This was a bad assumption. I've added find_or_make. xoxorich. */ SA_SET_SYM_TAGNDX(def_symbol_in_progress, (long) tag_find_or_make(symbol_name)); if (SA_GET_SYM_TAGNDX(def_symbol_in_progress) == 0L) { as_warn("tag not found for .tag %s", symbol_name); } /* not defined */ - + SF_SET_TAGGED(def_symbol_in_progress); *input_line_pointer = name_end; - + demand_empty_rest_of_line(); return; } /* obj_coff_tag() */ @@ -1246,14 +1224,14 @@ static void obj_coff_type() { demand_empty_rest_of_line(); return; } /* if not inside .def/.endef */ - + S_SET_DATA_TYPE(def_symbol_in_progress, get_absolute_expression()); - + if (ISFCN(S_GET_DATA_TYPE(def_symbol_in_progress)) && S_GET_STORAGE_CLASS(def_symbol_in_progress) != C_TPDEF) { SF_SET_FUNCTION(def_symbol_in_progress); } /* is a function */ - + demand_empty_rest_of_line(); return; } /* obj_coff_type() */ @@ -1264,18 +1242,18 @@ static void obj_coff_val() { demand_empty_rest_of_line(); return; } /* if not inside .def/.endef */ - + if (is_name_beginner(*input_line_pointer)) { char *symbol_name = input_line_pointer; char name_end = get_symbol_end(); - + if (!strcmp(symbol_name, ".")) { def_symbol_in_progress->sy_frag = frag_now; S_SET_VALUE(def_symbol_in_progress, obstack_next_free(&frags) - frag_now->fr_literal); /* If the .val is != from the .def (e.g. statics) */ } else if (strcmp(S_GET_NAME(def_symbol_in_progress), symbol_name)) { def_symbol_in_progress->sy_forward = symbol_find_or_make(symbol_name); - + /* If the segment is undefined when the forward reference is solved, then copy the segment id from the forward symbol. */ @@ -1286,7 +1264,7 @@ static void obj_coff_val() { } else { S_SET_VALUE(def_symbol_in_progress, get_absolute_expression()); } /* if symbol based */ - + demand_empty_rest_of_line(); return; } /* obj_coff_val() */ @@ -1296,8 +1274,8 @@ static void obj_coff_val() { */ static void tag_init() { - tag_hash = hash_new(); - return ; + tag_hash = hash_new(); + return ; } /* tag_init() */ static void tag_insert(name, symbolP) @@ -1305,7 +1283,7 @@ char *name; symbolS *symbolP; { register char * error_string; - + if (*(error_string = hash_jam(tag_hash, name, (char *)symbolP))) { as_fatal("Inserting \"%s\" into structure table failed: %s", name, error_string); @@ -1317,37 +1295,37 @@ static symbolS *tag_find_or_make(name) char *name; { symbolS *symbolP; - + if ((symbolP = tag_find(name)) == NULL) { symbolP = symbol_new(name, SEG_UNKNOWN, 0, &zero_address_frag); - + tag_insert(S_GET_NAME(symbolP), symbolP); symbol_table_insert(symbolP); } /* not found */ - + return(symbolP); } /* tag_find_or_make() */ static symbolS *tag_find(name) char *name; { -#if STRIP_UNDERSCORE +#ifdef STRIP_UNDERSCORE if (*name == '_') name++; #endif /* STRIP_UNDERSCORE */ return((symbolS*)hash_find(tag_hash, name)); } /* tag_find() */ void obj_read_begin_hook() { - /* These had better be the same. Usually 18 bytes. */ + /* These had better be the same. Usually 18 bytes. */ #ifndef BFD_HEADERS know(sizeof(SYMENT) == sizeof(AUXENT)); know(SYMESZ == AUXESZ); #endif tag_init(); - + return; } /* obj_read_begin_hook() */ @@ -1361,28 +1339,28 @@ object_headers *headers; 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*)); - + /* JF deal with forward references first... */ for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next(symbolP)) { - + if (symbolP->sy_forward) { S_SET_VALUE(symbolP, (S_GET_VALUE(symbolP) + S_GET_VALUE(symbolP->sy_forward) + symbolP->sy_forward->sy_frag->fr_address)); - + if (SF_GET_GET_SEGMENT(symbolP)) { S_SET_SEGMENT(symbolP, S_GET_SEGMENT(symbolP->sy_forward)); } /* forward segment also */ - + symbolP->sy_forward=0; } /* if it has a forward reference */ } /* walk the symbol chain */ - + tc_crawl_symbol_chain(headers); - + /* The symbol list should be ordered according to the following sequence * order : * . .file symbol @@ -1393,13 +1371,13 @@ object_headers *headers; * 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 */ @@ -1409,25 +1387,25 @@ object_headers *headers; H_GET_TEXT_SIZE(headers), 0/*text_relocation_number */, 0/*text_lineno_number */); - + 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 */ - + 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 */ - + #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 @@ -1441,7 +1419,7 @@ object_headers *headers; 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 @@ -1450,10 +1428,10 @@ object_headers *headers; for (symbolP = symbol_rootP; symbolP; symbolP = symbolP ? symbol_next(symbolP) : symbol_rootP) { - if (!SF_GET_DEBUG(symbolP)) { + 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)) @@ -1474,13 +1452,13 @@ object_headers *headers; 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 */ - + S_SET_VALUE(symbolP, S_GET_VALUE(symbolP) + symbolP->sy_frag->fr_address); - + if (!S_IS_DEFINED(symbolP) && !SF_GET_LOCAL(symbolP)) { S_SET_EXTERNAL(symbolP); } else if (S_GET_STORAGE_CLASS(symbolP) == C_NULL) { @@ -1490,7 +1468,7 @@ object_headers *headers; 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. */ @@ -1513,11 +1491,11 @@ object_headers *headers; 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. */ bzero(symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen, sizeof(symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen)); @@ -1540,7 +1518,7 @@ object_headers *headers; /* 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); @@ -1550,7 +1528,7 @@ object_headers *headers; 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 @@ -1561,18 +1539,18 @@ object_headers *headers; [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 (!S_IS_DEFINED(symbolP) && !S_IS_DEBUG(symbolP) && !SF_GET_STATICS(symbolP)) { -/* S_GET_STORAGE_CLASS(symbolP) == C_EXT && !SF_GET_FUNCTION(symbolP)) { */ + /* S_GET_STORAGE_CLASS(symbolP) == C_EXT && !SF_GET_FUNCTION(symbolP)) { */ /* 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); @@ -1584,19 +1562,19 @@ object_headers *headers; } 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; @@ -1604,31 +1582,31 @@ object_headers *headers; } 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); } /* If the symbol has a tagndx entry, resolve it */ } /* second traversal */ - + 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; @@ -1637,9 +1615,9 @@ object_headers *headers; } text_lineno_number++; } /* for each line number */ - + H_SET_SYMBOL_TABLE_SIZE(headers, symbol_number); - + return; } /* obj_crawl_symbol_chain() */ @@ -1651,7 +1629,7 @@ 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)); @@ -1659,13 +1637,13 @@ char **where; #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 (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 */ - + return; } /* obj_emit_strings() */ @@ -1675,7 +1653,7 @@ 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. */ @@ -1691,52 +1669,52 @@ object_headers *headers; #endif /* TC_I960 */ #ifdef TC_A29K /* Count 2 for a constH */ - if (fixP->fx_r_type == RELOC_CONSTH) { - ++text_relocation_number; - } + 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_addsy) { ++data_relocation_number; } /* if still relocatable */ #ifdef TC_A29K - /* Count 2 for a constH */ - if (fixP->fx_r_type == RELOC_CONSTH) { - ++data_relocation_number; - } + /* Count 2 for a constH */ + if (fixP->fx_r_type == RELOC_CONSTH) { + ++data_relocation_number; + } #endif - + } /* for each fix */ - - + + 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 */ + + /* pre write hook can add relocs (for 960 and 29k coff) so */ headers->relocation_size = text_relocation_number * RELSZ + - data_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 */ @@ -1747,27 +1725,27 @@ object_headers *headers; #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)); + 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); H_SET_FLAGS(headers, (text_lineno_number == 0 ? F_LNNO : 0) | ((text_relocation_number + data_relocation_number) ? 0 : F_RELFLG) | BYTE_ORDERING); - + /* 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, @@ -1782,7 +1760,7 @@ printf("get lineno size %x\n", H_GET_LINENO_SIZE(headers)); 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), @@ -1798,7 +1776,7 @@ printf("get lineno size %x\n", H_GET_LINENO_SIZE(headers)); 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), @@ -1809,7 +1787,7 @@ printf("get lineno size %x\n", H_GET_LINENO_SIZE(headers)); 0, /* No relocation information */ 0, /* No line number information */ section_alignment[(int) SEG_BSS]); - + return; } /* obj_pre_write_hook() */ @@ -1825,11 +1803,11 @@ int what; int saved_type = 0; long longint; symbolS *symbolP = 0; - + if (what == 's') { string = demand_copy_C_string(&length); SKIP_WHITESPACE(); - + if (*input_line_pointer == ',') { input_line_pointer++; } else { @@ -1837,7 +1815,7 @@ int what; goof = 1; } /* better be a comma */ } /* skip the string */ - + /* * Input_line_pointer->after ','. String->symbol name. */ @@ -1848,7 +1826,7 @@ int what; input_line_pointer--; /* Backup over a non-',' char. */ } /* on error */ } /* no error */ - + if (!goof) { if (get_absolute_expression_and_terminator(&longint) != ',') { as_bad("I want a comma after the n_other expression"); @@ -1856,10 +1834,10 @@ int what; input_line_pointer--; /* Backup over a non-',' char. */ } /* on error */ } /* no error */ - + if (!goof) { get_absolute_expression(); - + if (what == 's' || what == 'n') { if (*input_line_pointer != ',') { as_bad("I want a comma after the n_desc expression"); @@ -1869,9 +1847,9 @@ int what; } /* on goof */ } /* not stabd */ } /* no error */ - + expression(&e); - + if (goof) { ignore_rest_of_line(); } else { @@ -1880,7 +1858,7 @@ int what; } /* obj_coff_stab() */ #ifdef DEBUG - /* for debugging */ +/* for debugging */ char *s_get_name(s) symbolS *s; { @@ -1889,7 +1867,7 @@ symbolS *s; void symbol_dump() { symbolS *symbolP; - + for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next(symbolP)) { printf("%3ld: 0x%lx \"%s\" type = %ld, class = %d, segment = %d\n", symbolP->sy_number, @@ -1899,7 +1877,7 @@ void symbol_dump() { S_GET_STORAGE_CLASS(symbolP), (int) S_GET_SEGMENT(symbolP)); } /* traverse symbols */ - + return; } /* symbol_dump() */ #endif /* DEBUG */ |