123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /* 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 */
|