diff options
Diffstat (limited to 'gas/obsolete/gdb-symbols.c')
-rw-r--r-- | gas/obsolete/gdb-symbols.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/gas/obsolete/gdb-symbols.c b/gas/obsolete/gdb-symbols.c new file mode 100644 index 0000000..8bd8f7d --- /dev/null +++ b/gas/obsolete/gdb-symbols.c @@ -0,0 +1,129 @@ +/* gdb_symbols.c - Deal with symbols for GDB format + Copyright (C) 1987 Free Software Foundation, Inc. + +This file is part of GAS, the GNU Assembler. + +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 1, 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. */ + +/* + * During assembly, note requests to place symbol values in the GDB + * symbol file. When symbol values are known and the symbol file is + * in memory, place the symbol values in the memory image of the file. + * + * This has static data: it is not data_sharable. + * + * gdb_symbols_begin () + * Call once before using this package. + * + * gdb_symbols_fixup (symbolP, offset_in_file) + * Remember to put the value of a symbol into the GDB file. + * + * gdb_symbols_emit () + * Perform all the symbol fixups. + * + * uses: + * xmalloc() + * gdb_alter() + */ + +#include "as.h" +#include "struc-symbol.h" + +#define SYM_GROUP (100) /* We allocate storage in lumps this big. */ + + +struct gdb_symbol /* 1 fixup request. */ +{ + symbolS * gs_symbol; + long int gs_offset; /* Where in GDB symbol file. */ +}; +typedef struct gdb_symbol gdb_symbolS; + +struct symbol_fixup_group +{ + struct symbol_fixup_group * sfg_next; + gdb_symbolS sfg_item [SYM_GROUP]; +}; +typedef struct symbol_fixup_group symbol_fixup_groupS; + +static symbol_fixup_groupS * root; +static short int used; /* # of last slot used. */ + /* Counts down from SYM_GROUP. */ + +static symbol_fixup_groupS * /* Make storage for some more reminders. */ +new_sfg () +{ + symbol_fixup_groupS * newP; + char * xmalloc(); + + newP = (symbol_fixup_groupS *) xmalloc ((long)sizeof(symbol_fixup_groupS)); + newP -> sfg_next = root; + used = SYM_GROUP; + root = newP; + return (newP); +} + + +void +gdb_symbols_begin () +{ + root = 0; + (void)new_sfg (); +} + + +void /* Build a reminder to put a symbol value */ +gdb_symbols_fixup (sy, offset) /* into the GDB symbol file. */ + symbolS * sy; /* Which symbol. */ + long int offset; /* Where in GDB symbol file. */ +{ + register symbol_fixup_groupS * p; + register gdb_symbolS * q; + + p = root; + know( used >= 0 ); + if ( used == 0) + { + p = new_sfg (); + } + q = p -> sfg_item + -- used; + q -> gs_symbol = sy; + q -> gs_offset = offset; +} + +void +gdb_symbols_emit () /* Append GDB symbols to object file. */ +{ + symbol_fixup_groupS * sfgP; + void gdb_alter(); + + for (sfgP = root; sfgP; sfgP = sfgP -> sfg_next) + { + register gdb_symbolS * gsP; + register gdb_symbolS * limit; + + limit = sfgP -> sfg_item + + (sfgP -> sfg_next ? 0 : used); + for (gsP = sfgP -> sfg_item + SYM_GROUP - 1; + gsP >= limit; + gsP --) + { + gdb_alter (gsP -> gs_offset, + (long int) gsP -> gs_symbol -> sy_value); + } + } +} + +/* end: gdb_symbols.c */ |