* coffgen.c (string_size): Remove static variable.

(debug_string_size, debug_string_section): Likewise.
	(coff_fix_symbol_name): Add string_size_p, debug_string_section_p,
	and debug_string_size_p parameters.  Use them instead of the
	global variables.  Change all callers.
	(coff_write_symbol): Likewise.
	(coff_write_alien_symbol, coff_write_native_symbol): Likewise.
	(coff_write_symbols): Add local variables to replace removed
	global variables.
This commit is contained in:
Ian Lance Taylor 1995-09-25 20:25:12 +00:00
parent 4ecbc1efea
commit f0500a41d0
2 changed files with 73 additions and 32 deletions

View file

@ -5,6 +5,16 @@ Mon Sep 25 16:04:09 1995 Michael Meissner <meissner@tiktok.cygnus.com>
Mon Sep 25 11:48:02 1995 Ian Lance Taylor <ian@cygnus.com>
* coffgen.c (string_size): Remove static variable.
(debug_string_size, debug_string_section): Likewise.
(coff_fix_symbol_name): Add string_size_p, debug_string_section_p,
and debug_string_size_p parameters. Use them instead of the
global variables. Change all callers.
(coff_write_symbol): Likewise.
(coff_write_alien_symbol, coff_write_native_symbol): Likewise.
(coff_write_symbols): Add local variables to replace removed
global variables.
* libcoff-in.h (struct coff_section_tdata): Add offset, i,
function, and line_base fields.
* libcoff.h: Rebuild.

View file

@ -41,13 +41,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "coff/internal.h"
#include "libcoff.h"
static boolean coff_write_symbol PARAMS ((bfd *, asymbol *,
combined_entry_type *,
unsigned int *));
static boolean coff_write_alien_symbol PARAMS ((bfd *, asymbol *,
unsigned int *));
static boolean coff_write_native_symbol PARAMS ((bfd *, coff_symbol_type *,
unsigned int *));
static void coff_fix_symbol_name
PARAMS ((bfd *, asymbol *, combined_entry_type *, bfd_size_type *,
asection **, bfd_size_type *));
static boolean coff_write_symbol
PARAMS ((bfd *, asymbol *, combined_entry_type *, unsigned int *,
bfd_size_type *, asection **, bfd_size_type *));
static boolean coff_write_alien_symbol
PARAMS ((bfd *, asymbol *, unsigned int *, bfd_size_type *,
asection **, bfd_size_type *));
static boolean coff_write_native_symbol
PARAMS ((bfd *, coff_symbol_type *, unsigned int *, bfd_size_type *,
asection **, bfd_size_type *));
#define STRING_SIZE_SIZE (4)
@ -603,15 +608,15 @@ coff_mangle_symbols (bfd_ptr)
}
}
static bfd_size_type string_size;
static bfd_size_type debug_string_size;
static asection *debug_string_section;
static void
coff_fix_symbol_name (abfd, symbol, native)
coff_fix_symbol_name (abfd, symbol, native, string_size_p,
debug_string_section_p, debug_string_size_p)
bfd *abfd;
asymbol *symbol;
combined_entry_type *native;
bfd_size_type *string_size_p;
asection **debug_string_section_p;
bfd_size_type *debug_string_size_p;
{
unsigned int name_length;
union internal_auxent *auxent;
@ -638,9 +643,9 @@ coff_fix_symbol_name (abfd, symbol, native)
}
else
{
auxent->x_file.x_n.x_offset = string_size + STRING_SIZE_SIZE;
auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE;
auxent->x_file.x_n.x_zeroes = 0;
string_size += name_length + 1;
*string_size_p += name_length + 1;
}
}
else
@ -661,9 +666,10 @@ coff_fix_symbol_name (abfd, symbol, native)
}
else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
{
native->u.syment._n._n_n._n_offset = string_size + STRING_SIZE_SIZE;
native->u.syment._n._n_n._n_offset = (*string_size_p
+ STRING_SIZE_SIZE);
native->u.syment._n._n_n._n_zeroes = 0;
string_size += name_length + 1;
*string_size_p += name_length + 1;
}
else
{
@ -675,26 +681,27 @@ coff_fix_symbol_name (abfd, symbol, native)
and also followed by a null byte. FIXME: We assume that
the .debug section has already been created, and that it
is large enough. */
if (debug_string_section == (asection *) NULL)
debug_string_section = bfd_get_section_by_name (abfd, ".debug");
if (*debug_string_section_p == (asection *) NULL)
*debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
filepos = bfd_tell (abfd);
bfd_put_16 (abfd, name_length + 1, buf);
if (!bfd_set_section_contents (abfd,
debug_string_section,
*debug_string_section_p,
(PTR) buf,
(file_ptr) debug_string_size,
(file_ptr) *debug_string_size_p,
(bfd_size_type) 2)
|| !bfd_set_section_contents (abfd,
debug_string_section,
*debug_string_section_p,
(PTR) symbol->name,
(file_ptr) debug_string_size + 2,
((file_ptr) *debug_string_size_p
+ 2),
(bfd_size_type) name_length + 1))
abort ();
if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
abort ();
native->u.syment._n._n_n._n_offset = debug_string_size + 2;
native->u.syment._n._n_n._n_offset = *debug_string_size_p + 2;
native->u.syment._n._n_n._n_zeroes = 0;
debug_string_size += name_length + 3;
*debug_string_size_p += name_length + 3;
}
}
}
@ -708,11 +715,15 @@ coff_fix_symbol_name (abfd, symbol, native)
/* Write a symbol out to a COFF file. */
static boolean
coff_write_symbol (abfd, symbol, native, written)
coff_write_symbol (abfd, symbol, native, written, string_size_p,
debug_string_section_p, debug_string_size_p)
bfd *abfd;
asymbol *symbol;
combined_entry_type *native;
unsigned int *written;
bfd_size_type *string_size_p;
asection **debug_string_section_p;
bfd_size_type *debug_string_size_p;
{
unsigned int numaux = native->u.syment.n_numaux;
int type = native->u.syment.n_type;
@ -741,7 +752,8 @@ coff_write_symbol (abfd, symbol, native, written)
symbol->section->output_section->target_index;
}
coff_fix_symbol_name (abfd, symbol, native);
coff_fix_symbol_name (abfd, symbol, native, string_size_p,
debug_string_section_p, debug_string_size_p);
symesz = bfd_coff_symesz (abfd);
buf = bfd_alloc (abfd, symesz);
@ -794,10 +806,14 @@ coff_write_symbol (abfd, symbol, native, written)
or we may be linking a non COFF file to a COFF file. */
static boolean
coff_write_alien_symbol (abfd, symbol, written)
coff_write_alien_symbol (abfd, symbol, written, string_size_p,
debug_string_section_p, debug_string_size_p)
bfd *abfd;
asymbol *symbol;
unsigned int *written;
bfd_size_type *string_size_p;
asection **debug_string_section_p;
bfd_size_type *debug_string_size_p;
{
combined_entry_type *native;
combined_entry_type dummy;
@ -848,16 +864,21 @@ coff_write_alien_symbol (abfd, symbol, written)
native->u.syment.n_sclass = C_EXT;
native->u.syment.n_numaux = 0;
return coff_write_symbol (abfd, symbol, native, written);
return coff_write_symbol (abfd, symbol, native, written, string_size_p,
debug_string_section_p, debug_string_size_p);
}
/* Write a native symbol to a COFF file. */
static boolean
coff_write_native_symbol (abfd, symbol, written)
coff_write_native_symbol (abfd, symbol, written, string_size_p,
debug_string_section_p, debug_string_size_p)
bfd *abfd;
coff_symbol_type *symbol;
unsigned int *written;
bfd_size_type *string_size_p;
asection **debug_string_section_p;
bfd_size_type *debug_string_size_p;
{
combined_entry_type *native = symbol->native;
alent *lineno = symbol->lineno;
@ -911,7 +932,9 @@ coff_write_native_symbol (abfd, symbol, written)
count * bfd_coff_linesz (abfd);
}
return coff_write_symbol (abfd, &(symbol->symbol), native, written);
return coff_write_symbol (abfd, &(symbol->symbol), native, written,
string_size_p, debug_string_section_p,
debug_string_size_p);
}
/* Write out the COFF symbols. */
@ -920,12 +943,16 @@ boolean
coff_write_symbols (abfd)
bfd *abfd;
{
bfd_size_type string_size;
asection *debug_string_section;
bfd_size_type debug_string_size;
unsigned int i;
unsigned int limit = bfd_get_symcount (abfd);
unsigned int written = 0;
asymbol **p;
string_size = 0;
debug_string_section = NULL;
debug_string_size = 0;
/* Seek to the right place */
@ -943,12 +970,16 @@ coff_write_symbols (abfd)
if (c_symbol == (coff_symbol_type *) NULL
|| c_symbol->native == (combined_entry_type *) NULL)
{
if (!coff_write_alien_symbol (abfd, symbol, &written))
if (!coff_write_alien_symbol (abfd, symbol, &written, &string_size,
&debug_string_section,
&debug_string_size))
return false;
}
else
{
if (!coff_write_native_symbol (abfd, c_symbol, &written))
if (!coff_write_native_symbol (abfd, c_symbol, &written,
&string_size, &debug_string_section,
&debug_string_size))
return false;
}
}