aboutsummaryrefslogtreecommitdiff
path: root/gas/obsolete/gdb-symbols.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/obsolete/gdb-symbols.c')
-rw-r--r--gas/obsolete/gdb-symbols.c129
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 */