* bfd-in.h: Don't include obstack.h.
authorIan Lance Taylor <ian@airs.com>
Tue, 18 Mar 1997 00:47:04 +0000 (00:47 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 18 Mar 1997 00:47:04 +0000 (00:47 +0000)
(struct bfd_hash_table): Change memory field to PTR.
* bfd.c (struct _bfd): Change memory field to PTR.
* bfd-in2.h: Rebuild.
* libbfd-in.h (bfd_release): Declare as function, don't define as
macro.
* libbfd.h: Rebuild.
* opncls.c: Include "objalloc.h" rather than "obstack.h".  Use
objalloc routines rather than obstack routines.
(obstack_chunk_alloc, obstack_chunk_free): Don't define.
(getpagesize): Don't define.
(_bfd_new_bfd): Don't set _bfd_chunksize.
(bfd_openr): Free new bfd and objalloc on failure.
(bfd_fdopenr, bfd_openstreamr, bfd_openw): Likewise.
(bfd_alloc_size): Remove.
(bfd_release): New function.
* hash.c: Include "objalloc.h" rather than "obstack.h".  Use
objalloc routines rather than obstack routines.
(obstack_chunk_alloc, obstack_chunk_free): Don't define.
* ecofflink.c: Include "objalloc.h" rather than "obstack.h".  Use
objalloc routines rather than obstack routines.
(obstack_chunk_alloc, obstack_chunk_free): Don't define.
(struct accumulate): Change memory to struct objalloc *.
* liboasys.h (oasys_data_type): Remove oasys_obstack field.
* dep-in.sed: Don't remove obstack.h from dependency list.
* Makefile.in: Rebuild dependencies.
(BFD_H_DEPS): Remove obstack.h.
(install): Don't install obstack.h.
* Many files: Don't include "obstack.h".
* VERSION: Bump.

12 files changed:
bfd/ChangeLog
bfd/Makefile.in
bfd/VERSION
bfd/aoutx.h
bfd/bfd-in2.h
bfd/coff-a29k.c
bfd/coff-ppc.c
bfd/coff-rs6000.c
bfd/coffcode.h
bfd/ecofflink.c
bfd/opncls.c
bfd/syms.c

index b459de0..7b71d22 100644 (file)
@@ -1,5 +1,36 @@
 Mon Mar 17 11:32:53 1997  Ian Lance Taylor  <ian@cygnus.com>
 
+       * bfd-in.h: Don't include obstack.h.
+       (struct bfd_hash_table): Change memory field to PTR.
+       * bfd.c (struct _bfd): Change memory field to PTR.
+       * bfd-in2.h: Rebuild.
+       * libbfd-in.h (bfd_release): Declare as function, don't define as
+       macro.
+       * libbfd.h: Rebuild.
+       * opncls.c: Include "objalloc.h" rather than "obstack.h".  Use
+       objalloc routines rather than obstack routines.
+       (obstack_chunk_alloc, obstack_chunk_free): Don't define.
+       (getpagesize): Don't define.
+       (_bfd_new_bfd): Don't set _bfd_chunksize.
+       (bfd_openr): Free new bfd and objalloc on failure.
+       (bfd_fdopenr, bfd_openstreamr, bfd_openw): Likewise.
+       (bfd_alloc_size): Remove.
+       (bfd_release): New function.
+       * hash.c: Include "objalloc.h" rather than "obstack.h".  Use
+       objalloc routines rather than obstack routines.
+       (obstack_chunk_alloc, obstack_chunk_free): Don't define.
+       * ecofflink.c: Include "objalloc.h" rather than "obstack.h".  Use
+       objalloc routines rather than obstack routines.
+       (obstack_chunk_alloc, obstack_chunk_free): Don't define.
+       (struct accumulate): Change memory to struct objalloc *.
+       * liboasys.h (oasys_data_type): Remove oasys_obstack field.
+       * dep-in.sed: Don't remove obstack.h from dependency list.
+       * Makefile.in: Rebuild dependencies.
+       (BFD_H_DEPS): Remove obstack.h.
+       (install): Don't install obstack.h.
+       * Many files: Don't include "obstack.h".
+       * VERSION: Bump.
+
        * opncls.c (bfd_alloc_grow, bfd_alloc_finish): Remove.
        * libbfd-in.h (bfd_alloc_grow, bfd_alloc_finish): Don't declare.
        * libbfd.h: Rebuild.
index ada0662..628e820 100644 (file)
@@ -1,5 +1,5 @@
 #    Makefile template for Configure for the BFD library.
-#    Copyright (C) 1990, 91, 92, 93, 94, 95, 1996
+#    Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 1997
 #    Free Software Foundation, Inc.
 #    Written by Cygnus Support.
 # 
@@ -116,9 +116,7 @@ ALL_MACHINES = \
        cpu-arc.o \
        $(end-sanitize-arc) \
        cpu-arm.o \
-       $(start-sanitize-d10v) \
        cpu-d10v.o \
-       $(end-sanitize-d10v) \
        $(start-sanitize-d30v) \
        cpu-d30v.o \
        $(end-sanitize-d30v) \
@@ -220,9 +218,7 @@ BFD32_BACKENDS = \
        $(start-sanitize-arc) \
        elf32-arc.o \
        $(end-sanitize-arc) \
-       $(start-sanitize-d10v) \
        elf32-d10v.o \
-       $(end-sanitize-d10v) \
        $(start-sanitize-d30v) \
        elf32-d30v.o \
        $(end-sanitize-d30v) \
@@ -567,10 +563,10 @@ $(SHLINK): $(SHLIB)
        ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed -e '$(program_transform_name)'`; \
        if [ "$$ts" != "$(SHLIB)" ]; then \
          rm -f $$ts; \
-         ln -sf $(SHLIB) $$ts; \
+         ln -s $(SHLIB) $$ts; \
        else true; fi
        rm -f $(SHLINK)
-       ln -sf $(SHLIB) $(SHLINK)
+       ln -s $(SHLIB) $(SHLINK)
 
 # This target creates libTARGET-bfd.so.VERSION as a symlink to
 # libbfd.so.VERSION.  It is used on SunOS, which does not have SONAME.
@@ -578,7 +574,7 @@ stamp-tshlink: $(SHLIB)
        tf=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \
        if [ "$$tf" != "$(SHLIB)" ]; then \
          rm -f $$tf; \
-         ln -sf $(SHLIB) $$tf; \
+         ln -s $(SHLIB) $$tf; \
        else true; fi
        touch stamp-tshlink
 
@@ -655,7 +651,7 @@ clobber maintainer-clean realclean:
        $(MAKE) subdir_do DO=maintainer-clean "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS)
        $(MAKE) do_maintainer_clean
 
-BFD_H_DEPS= $(INCDIR)/ansidecl.h $(INCDIR)/obstack.h
+BFD_H_DEPS= $(INCDIR)/ansidecl.h
 LOCAL_H_DEPS= libbfd.h sysdep.h config.h
 $(BFD_LIBS): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS)
 $(BFD_MACHINES): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS)
@@ -723,7 +719,7 @@ install: $(ALLLIBS)
          rm -f $(libdir)/$$tf; \
          if [ "$$f" = "$(SHLINK)" ]; then \
            ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \
-           ln -sf $$ts $(libdir)/$$tf; \
+           ln -s $$ts $(libdir)/$$tf; \
          elif [ "$$f" = "$(SHLIB)" ]; then \
            @INSTALL_SHLIB@ \
          else \
@@ -738,13 +734,11 @@ install: $(ALLLIBS)
        $(INSTALL_DATA) $(BFD_H) $(includedir)/bfd.h
        $(INSTALL_DATA) $(INCDIR)/ansidecl.h $(includedir)/ansidecl.h
        $(INSTALL_DATA) $(INCDIR)/bfdlink.h $(includedir)/bfdlink.h
-       $(INSTALL_DATA) $(INCDIR)/obstack.h $(includedir)/obstack.h
        -if test -z "$(oldincludedir)"; then true; else \
        test -d $(oldincludedir) || mkdir $(oldincludedir); \
        $(INSTALL_DATA) $(BFD_H) $(oldincludedir)/bfd.h; \
        $(INSTALL_DATA) $(INCDIR)/ansidecl.h $(oldincludedir)/ansidecl.h; \
        $(INSTALL_DATA) $(INCDIR)/bfdlink.h $(oldincludedir)/bfdlink.h; \
-       $(INSTALL_DATA) $(INCDIR)/obstack.h $(oldincludedir)/obstack.h; \
        fi
        $(MAKE) subdir_do DO=install "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS)
 
@@ -857,11 +851,9 @@ elf32-arc.o: elf32-arc.c elf-bfd.h $(INCDIR)/elf/common.h \
   $(INCDIR)/elf/arc.h elf32-target.h
 end-sanitize-arc:
 
-start-sanitize-d10v:
 elf32-d10v.o: elf32-d10v.c elf-bfd.h $(INCDIR)/elf/common.h \
   $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \
   elf32-target.h
-end-sanitize-d10v:
 
 start-sanitize-d30v:
 elf32-d30v.o: elf32-d30v.c elf-bfd.h $(INCDIR)/elf/common.h \
@@ -913,13 +905,13 @@ corefile.o: corefile.c
 format.o: format.c
 init.o: init.c
 libbfd.o: libbfd.c
-opncls.o: opncls.c
+opncls.o: opncls.c $(INCDIR)/objalloc.h
 reloc.o: reloc.c $(INCDIR)/bfdlink.h
 section.o: section.c
 syms.o: syms.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \
   $(INCDIR)/aout/stab.def
 targets.o: targets.c $(INCDIR)/fnmatch.h targmatch.h
-hash.o: hash.c
+hash.o: hash.c $(INCDIR)/objalloc.h
 linker.o: linker.c $(INCDIR)/bfdlink.h genlink.h
 elf.o: elf.c $(INCDIR)/bfdlink.h elf-bfd.h $(INCDIR)/elf/common.h \
   $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h
@@ -1039,9 +1031,9 @@ ecoff.o: ecoff.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/ar.h \
   libaout.h $(INCDIR)/aout/aout64.h $(INCDIR)/coff/internal.h \
   $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \
   libcoff.h libecoff.h
-ecofflink.o: ecofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \
-  $(INCDIR)/aout/stab.def $(INCDIR)/coff/internal.h $(INCDIR)/coff/sym.h \
-  $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h
+ecofflink.o: ecofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/objalloc.h \
+  $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/coff/internal.h \
+  $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h
 elf32-gen.o: elf32-gen.c elf-bfd.h $(INCDIR)/elf/common.h \
   $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \
   elf32-target.h
@@ -1084,7 +1076,7 @@ elf32-sparc.o: elf32-sparc.c $(INCDIR)/bfdlink.h elf-bfd.h \
   $(INCDIR)/elf/sparc.h elf32-target.h
 elf32.o: elf32.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
-  elfcore.h elflink.h
+  $(INCDIR)/fnmatch.h elfcore.h elflink.h
 elflink.o: elflink.c $(INCDIR)/bfdlink.h elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h
 hp300bsd.o: hp300bsd.c libaout.h $(INCDIR)/bfdlink.h \
@@ -1231,7 +1223,7 @@ elf64-sparc.o: elf64-sparc.c elf-bfd.h $(INCDIR)/elf/common.h \
   $(INCDIR)/elf/sparc.h elf64-target.h
 elf64.o: elf64.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
-  elfcore.h elflink.h
+  $(INCDIR)/fnmatch.h elfcore.h elflink.h
 evax-alpha.o: evax-alpha.c $(INCDIR)/bfdlink.h evax.h
 evax-egsd.o: evax-egsd.c $(INCDIR)/bfdlink.h evax.h
 evax-etir.o: evax-etir.c $(INCDIR)/bfdlink.h evax.h
index c3be8ac..b9a40b7 100644 (file)
@@ -1 +1 @@
-cygnus-2.7.2
+cygnus-2.7.3
index df6d34a..f99383d 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD semi-generic back-end for a.out binaries.
-   Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -1236,7 +1236,7 @@ aout_get_external_symbols (abfd)
       syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
 #else
       /* We allocate using malloc to make the values easy to free
-        later on.  If we put them on the obstack it might not be
+        later on.  If we put them on the objalloc it might not be
         possible to free them.  */
       syms = ((struct external_nlist *)
              bfd_malloc ((size_t) count * EXTERNAL_NLIST_SIZE));
@@ -4263,10 +4263,7 @@ aout_link_write_symbols (finfo, input_bfd)
                  break;
                case discard_l:
                  if ((type & N_STAB) == 0
-                     && *name == *finfo->info->lprefix
-                     && (finfo->info->lprefix_len == 1
-                         || strncmp (name, finfo->info->lprefix,
-                                     finfo->info->lprefix_len) == 0))
+                     && bfd_is_local_label_name (input_bfd, name))
                    skip = true;
                  break;
                case discard_all:
index 631348a..bcead95 100644 (file)
@@ -49,7 +49,6 @@ extern "C" {
 #endif
 
 #include "ansidecl.h"
-#include "obstack.h"
 
 /* These two lines get substitutions done by commands in Makefile.in.  */
 #define BFD_VERSION  "@VERSION@"
@@ -380,8 +379,9 @@ struct bfd_hash_table
   struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
                                             struct bfd_hash_table *,
                                             const char *));
-  /* An obstack for this hash table.  */
-  struct obstack memory;
+   /* An objalloc for this hash table.  This is a struct objalloc *,
+     but we use PTR to avoid requiring the inclusion of objalloc.h.  */
+  PTR memory;
 };
 
 /* Initialize a hash table.  */
@@ -710,9 +710,6 @@ bfd_close PARAMS ((bfd *abfd));
 boolean 
 bfd_close_all_done PARAMS ((bfd *));
 
-bfd_size_type 
-bfd_alloc_size PARAMS ((bfd *abfd));
-
 bfd *
 bfd_create PARAMS ((CONST char *filename, bfd *templ));
 
@@ -2263,8 +2260,10 @@ struct _bfd
      /* Used by the application to hold private data*/
     PTR usrdata;
 
-     /* Where all the allocated stuff under this BFD goes */
-    struct obstack memory;
+   /* Where all the allocated stuff under this BFD goes.  This is a
+     struct objalloc *, but we use PTR to avoid requiring the inclusion of
+     objalloc.h.  */
+    PTR memory;
 };
 
 typedef enum bfd_error
@@ -2731,6 +2730,9 @@ CAT(NAME,_canonicalize_dynamic_reloc)
 
  PTR backend_data;
 } bfd_target;
+boolean 
+bfd_set_default_target  PARAMS ((const char *name));
+
 const bfd_target *
 bfd_find_target PARAMS ((CONST char *target_name, bfd *abfd));
 
index 3ceabfb..b1d15dc 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for AMD 29000 COFF binaries.
-   Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1990, 91, 92, 93, 94, 95, 1997 Free Software Foundation, Inc.
    Contributed by David Wood at New York University 7/8/91.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -23,7 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "bfd.h"
 #include "sysdep.h"
 #include "libbfd.h"
-#include "obstack.h"
 #include "coff/a29k.h"
 #include "coff/internal.h"
 #include "libcoff.h"
index b6a23c7..e93be51 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for PowerPC Microsoft Portable Executable files.
-   Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
 
    Original version pieced together by Kim Knuttila (krk@cygnus.com)
 
@@ -36,7 +36,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "sysdep.h"
 
 #include "libbfd.h"
-#include "obstack.h"
 
 #include "coff/powerpc.h"
 #include "coff/internal.h"
@@ -68,6 +67,33 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define MARK_AS_WRITTEN(x)  ((x) |= 1)
 #define MAKE_ADDR_AGAIN(x)  ((x) &= ~1)
 
+
+/* Turn on this check if you suspect something amiss in the hash tables */
+#ifdef DEBUG_HASH
+
+/* Need a 7 char string for an eye catcher */
+#define EYE "krkjunk"
+
+#define HASH_CHECK_DCL char eye_catcher[8];
+#define HASH_CHECK_INIT(ret)      strcpy(ret->eye_catcher, EYE)
+#define HASH_CHECK(addr) \
+ if (strcmp(addr->eye_catcher, EYE) != 0) \
+  { \
+    fprintf(stderr,\
+    "File %s, line %d, Hash check failure, bad eye %8s\n", \
+    __FILE__, __LINE__, addr->eye_catcher); \
+    abort(); \
+ }
+
+
+#else
+
+#define HASH_CHECK_DCL
+#define HASH_CHECK_INIT(ret)
+#define HASH_CHECK(addr)
+
+#endif
+
 /* In order not to add an int to every hash table item for every coff
    linker, we define our own hash table, derived from the coff one */
 
@@ -82,20 +108,10 @@ struct ppc_coff_link_hash_entry
   bfd_vma toc_offset;               /* Our addition, as required */
   int symbol_is_glue;
   unsigned long int glue_insn;
-  char eye_catcher[8];
+
+  HASH_CHECK_DCL
 };
 
-/* Need a 7 char string for an eye catcher */
-#define EYE "krkjunk"
-
-#define CHECK_EYE(addr) \
- if (strcmp(addr, EYE) != 0) \
-  { \
-    fprintf(stderr,\
-    "File %s, line %d, Hash check failure, bad eye %8s\n", \
-    __FILE__, __LINE__, addr); \
-    abort(); \
- }
 
 /* PE linker hash table.  */
 
@@ -140,7 +156,8 @@ ppc_coff_link_hash_newfunc (entry, table, string)
       SET_UNALLOCATED(ret->toc_offset);
       ret->symbol_is_glue = 0;
       ret->glue_insn = 0;
-      strcpy(ret->eye_catcher, EYE);
+
+      HASH_CHECK_INIT(ret);
     }
 
   return (struct bfd_hash_entry *) ret;
@@ -186,8 +203,8 @@ ppc_coff_link_hash_table_create (abfd)
 
 \f
 /* The nt loader points the toc register to &toc + 32768, in order to */
-/* use the complete range of a 16-bit displacement (I guess). We have */
-/* to adjust for this when we fix up loads displaced off the toc reg. */
+/* use the complete range of a 16-bit displacement. We have to adjust */
+/* for this when we fix up loads displaced off the toc reg.           */
 #define TOC_LOAD_ADJUSTMENT (-32768)
 #define TOC_SECTION_NAME ".private.toc"
 
@@ -852,7 +869,7 @@ record_toc(toc_section, our_toc_offset, cat, name)
 #ifdef COFF_IMAGE_WITH_PE
 
 /* record a toc offset against a symbol */
-static int
+static boolean
 ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
      bfd *abfd;
      struct bfd_link_info *info;
@@ -861,7 +878,6 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
      enum toc_type toc_kind;
 {
   struct ppc_coff_link_hash_entry *h;
-  int ret_val;
   const char *name;
 
   int *local_syms;
@@ -871,7 +887,7 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
   h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
   if (h != 0)
     {
-      CHECK_EYE(h->eye_catcher);
+      HASH_CHECK(h);
     }
 
   if (h == 0) 
@@ -896,31 +912,15 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
       if (IS_UNALLOCATED(local_syms[sym])) 
        {
          local_syms[sym] = global_toc_size;
-         ret_val = global_toc_size;
          global_toc_size += 4;
 
          /* The size must fit in a 16bit displacment */
-         if (global_toc_size >= 65535)
+         if (global_toc_size > 65535)
            {
-             fprintf(stderr,
-                     "Exceeded toc size of 65535\n");
-             abort();
+             (*_bfd_error_handler) ("TOC overflow");
+             bfd_set_error (bfd_error_file_too_big);
+             return false;
            }
-
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "Setting toc_offset for local sym %d to %d\n",
-                 sym, ret_val);
-#endif
-       }
-      else
-       {
-         ret_val = local_syms[sym];
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "toc_offset already set for local sym %d to %d\n",
-                 sym, ret_val);
-#endif
        }
     }
   else
@@ -932,155 +932,21 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
       if (IS_UNALLOCATED(h->toc_offset))
        {
          h->toc_offset = global_toc_size;
-         ret_val = global_toc_size;
          global_toc_size += 4;
 
          /* The size must fit in a 16bit displacment */
          if (global_toc_size >= 65535)
            {
-             fprintf(stderr,
-                     "Exceeded toc size of 65535\n");
-             abort();
-           }
-
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "Setting toc_offset for sym %d (%s) [h=%p] to %d\n",
-                 sym, name, h, ret_val);
-#endif
-       }
-      else
-       {
-         ret_val = h->toc_offset;
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "toc_offset already set for sym %d (%s) [h=%p] to %d\n",
-                 sym, name, h, ret_val);
-#endif
-       }
-    }
-
-  return ret_val;
-}
-
-#endif /* COFF_IMAGE_WITH_PE */
-
-#if 0
-
-/* FIXME: record a toc offset against a data-in-toc symbol */
-/* Now, there is currenly some confusion on what this means. In some 
-   compilers one sees the moral equivalent of:
-      .tocd
-      define some data
-      .text
-      refer to the data with a [tocv] qualifier
-   In general, one sees something to indicate that a tocd has been
-   seen, and that would trigger the allocation of data in toc. The IBM
-   docs seem to suggest that anything with the TOCDEFN qualifier should
-   never trigger storage allocation. However, in the kernel32.lib that 
-   we've been using for our test bed, there are a couple of variables
-   referenced that fail that test.
-
-   So it can't work that way.
-*/
-static int
-ppc_record_data_in_toc_entry(abfd, info, sec, sym, toc_kind)
-     bfd *abfd;
-     struct bfd_link_info *info;
-     asection *sec;
-     int sym;
-     enum toc_type toc_kind;
-{
-  struct ppc_coff_link_hash_entry *h = 0;
-  int ret_val;
-  const char *name;
-
-  int *local_syms;
-
-  h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
-
-  if (h == 0) 
-    { 
-      local_syms = obj_coff_local_toc_table(abfd);
-      if (local_syms == 0)
-       {
-         int i;
-         /* allocate a table */
-         local_syms = 
-           (int *) bfd_zalloc (abfd, 
-                               obj_raw_syment_count(abfd) * sizeof(int));
-         if (local_syms == 0)
-           return false;
-         obj_coff_local_toc_table(abfd) = local_syms;
-         for (i = 0; i < obj_raw_syment_count(abfd); ++i)
-           {
-             SET_UNALLOCATED(local_syms[i]);
+             (*_bfd_error_handler) ("TOC overflow");
+             bfd_set_error (bfd_error_file_too_big);
+             return false;
            }
        }
-
-      if (IS_UNALLOCATED(local_syms[sym])) 
-       {
-         local_syms[sym] = global_toc_size;
-         ret_val = global_toc_size;
-         global_toc_size += 4;
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "Setting data_in_toc_offset for local sym %d to %d\n",
-                 sym, ret_val);
-#endif
-       }
-      else
-       {
-         ret_val = local_syms[sym];
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "data_in_toc_offset already set for local sym %d to %d\n",
-                 sym, ret_val);
-#endif
-       }
-    }
-  else
-    {
-      CHECK_EYE(h->eye_catcher);
-
-      name = h->root.root.root.string;
-
-      /* check to see if there's a toc slot allocated. If not, do it
-        here. It will be used in relocate_section */
-      if (IS_UNALLOCATED(h->toc_offset))
-       {
-#if 0
-         h->toc_offset = global_toc_size;
-#endif
-         ret_val = global_toc_size;
-         /* We're allocating a chunk of the toc, as opposed to a slot */
-         /* FIXME: alignment? */
-         
-         global_toc_size += 4;
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "Setting data_in_toc_offset for sym %d (%s) [h=%p] to %d\n",
-                 sym, name, h, ret_val);
-#endif
-       }
-      else
-       {
-         ret_val = h->toc_offset;
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "data_in_toc_offset already set for sym %d (%s) [h=%p] to %d\n",
-                 sym, name, h, ret_val);
-#endif
-       }
     }
 
-  return ret_val;
+  return true;
 }
 
-#endif /* 0 */
-
-#ifdef COFF_IMAGE_WITH_PE
-
 /* record a toc offset against a symbol */
 static void
 ppc_mark_symbol_as_glue(abfd, sym, rel)
@@ -1091,11 +957,8 @@ ppc_mark_symbol_as_glue(abfd, sym, rel)
   struct ppc_coff_link_hash_entry *h;
 
   h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
-#ifdef DEBUG_RELOC
-  fprintf(stderr,
-         "ppc_mark_symbol_as_glue:\n");
-#endif
-  CHECK_EYE(h->eye_catcher);
+
+  HASH_CHECK(h);
 
   h->symbol_is_glue = 1;
   h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr);
@@ -1105,32 +968,6 @@ ppc_mark_symbol_as_glue(abfd, sym, rel)
 
 #endif /* COFF_IMAGE_WITH_PE */
 \f
-#if 0
-
-/* Provided the symbol, returns the value reffed */
-static long get_symbol_value PARAMS ((asymbol *));
-
-static long
-get_symbol_value (symbol)       
-     asymbol *symbol;
-{                                             
-  long relocation = 0;
-
-  if (bfd_is_com_section (symbol->section))
-    {
-      relocation = 0;                           
-    }
-  else 
-    {                                      
-      relocation = symbol->value +
-       symbol->section->output_section->vma +
-         symbol->section->output_offset;
-    }                                           
-
-  return(relocation);
-}
-
-#endif /* 0 */
 
 /* Return true if this relocation should
    appear in the output .reloc section. */
@@ -1180,8 +1017,6 @@ pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
   unsigned short r_type;
   unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/
        
-  fprintf(stderr, "pe_ppc_reloc (%s)\n", TARGET_LITTLE_NAME);
-
   r_type = reloc_entry->howto->type;
 
   if (output_bfd) 
@@ -1240,15 +1075,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
   bfd_vma relocation;
   reloc_howto_type *howto = 0;
   
-#ifdef DEBUG_RELOC
-  fprintf(stderr, 
-         "pe_ppc_relocate_section (%s) for %s in bfd %s\n", 
-         TARGET_LITTLE_NAME,
-         input_section->name,
-         input_bfd->filename);
-  
-#endif  
-
   /* If we are performing a relocateable link, we don't need to do a
      thing.  The caller will take care of adjusting the reloc
      addresses and symbol indices.  */
@@ -1274,23 +1100,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
       unsigned short r_type  = EXTRACT_TYPE (rel->r_type);
       unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
   
-#ifdef DEBUG_RELOC
-      /* now examine flags */
-      if (r_flags != 0) 
-       {
-         fprintf (stderr, "Reloc with flags found!");
-         if ( r_flags & IMAGE_REL_PPC_NEG ) 
-           fprintf (stderr, " NEG");
-         if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
-           fprintf (stderr, " BRTAKEN");
-         if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
-           fprintf (stderr, " BRNTAKEN");
-         if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-           fprintf (stderr, " TOCDEFN");
-         fprintf(stderr, "\n");
-       }
-#endif
-
       symndx = rel->r_symndx;
       loc = contents + rel->r_vaddr - input_section->vma;
 
@@ -1308,7 +1117,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
            (obj_coff_sym_hashes (input_bfd)[symndx]);
          if (h != 0) 
            {
-             CHECK_EYE(h->eye_catcher);
+             HASH_CHECK(h);
            }
 
          sym = syms + symndx;
@@ -1316,8 +1125,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
 
       if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
        {
-         fprintf(stderr,
-                 "relocate_section: IMGLUE reloc has no name!\n");
+         /* An IMGLUE reloc must have a name. Something is very wrong. */
          abort();
        }
 
@@ -1340,7 +1148,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
        }
       else
        {
-         CHECK_EYE(h->eye_catcher);
+         HASH_CHECK(h);
 
          if (h->root.root.type == bfd_link_hash_defined
              || h->root.root.type == bfd_link_hash_defweak)
@@ -1365,11 +1173,10 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
       switch (r_type)
        {
        default:
-         fprintf( stderr, 
-                 "ERROR: during reloc processing -- unsupported reloc %s\n", 
-                 howto->name);
+         (*_bfd_error_handler)
+           ("%s: unsupported relocation type 0x%02x",
+            bfd_get_filename (input_bfd), r_type);
          bfd_set_error (bfd_error_bad_value);
-         abort();
          return false;
        case IMAGE_REL_PPC_TOCREL16:
          {
@@ -1382,17 +1189,10 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
              {
                toc_section = bfd_get_section_by_name (bfd_of_toc_owner, 
                                                       TOC_SECTION_NAME);
-#ifdef TOC_DEBUG
-
-               fprintf(stderr,
-                       "BFD of toc owner %p (%s), section addr of %s %p\n",
-                        bfd_of_toc_owner, bfd_of_toc_owner->filename, 
-                       TOC_SECTION_NAME, toc_section);
-#endif
 
                if ( toc_section == NULL ) 
                  {
-                   fprintf(stderr, "No Toc section!\n");
+                   /* There is no toc section. Something is very wrong. */
                    abort();
                  }
              }
@@ -1423,27 +1223,14 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
                       again.
                     */
                    MAKE_ADDR_AGAIN(our_toc_offset);
-#ifdef TOC_DEBUG
-
-                   fprintf(stderr,
-                           "Not writing out toc_offset of %d for %s\n", 
-                           our_toc_offset, name);
-#endif
                  }
                else
                  {
                    /* write out the toc entry */
-                   record_toc(toc_section, our_toc_offset, priv, strdup(name));
-#ifdef TOC_DEBUG
-                   fprintf(stderr,
-                           "Writing out toc_offset "
-                           "toc_section (%p,%p)+%d val %d for %s\n", 
-                           toc_section,
-                           toc_section->contents,
-                           our_toc_offset, 
-                           val,
-                           name);
-#endif
+                   record_toc(toc_section, 
+                              our_toc_offset, 
+                              priv, 
+                              strdup(name));
 
                    bfd_put_32(output_bfd,
                               val,
@@ -1475,29 +1262,19 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
                       dll linkage, takes advantage of that and considers 
                       the IAT to be part of the toc, thus saving a load.
                    */
-#ifdef DEBUG_RELOC
-                   fprintf(stderr,
- "TOCDEFN is on, (%s) (%p) our_toc_offset = %x, val (%x) vma (%x) off (%x)\n", 
-                           name, h, our_toc_offset,
-                           val, toc_section->output_section->vma, 
-                           toc_section->output_offset);
-#endif
 
                    our_toc_offset = val - 
                      (toc_section->output_section->vma + 
                       toc_section->output_offset);
 
-#ifdef DEBUG_RELOC
-                   fprintf(stderr,
-                           "               our_toc_offset set to %x\n", our_toc_offset);
-#endif
-
                    /* The size must still fit in a 16bit displacment */
                    if (our_toc_offset >= 65535)
                      {
-                       fprintf(stderr,
-                               "Error: TOCDEFN Relocation of %d for %s exceeded displacement of 65535\n", our_toc_offset, name);
-                       abort();
+                       (*_bfd_error_handler)
+                         ("%s: Relocation for %s of %x exceeds Toc size limit", 
+                          bfd_get_filename (input_bfd), name, our_toc_offset);
+                       bfd_set_error (bfd_error_bad_value);
+                       return false;
                      }
 
                    record_toc(toc_section, our_toc_offset, pub, strdup(name));
@@ -1509,28 +1286,11 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
                       again.
                     */
                    MAKE_ADDR_AGAIN(our_toc_offset);
-#ifdef TOC_DEBUG
-                   fprintf(stderr,
-                           "Not writing out toc_offset of %d for %s\n", 
-                           our_toc_offset, name);
-#endif
                  }
                else
                  {
                    record_toc(toc_section, our_toc_offset, pub, strdup(name));
 
-#ifdef TOC_DEBUG
-                   /* write out the toc entry */
-                   fprintf(stderr,
-                           "Writing out toc_offset "
-                           "toc_section (%p,%p)+%d val %d for %s\n", 
-                           toc_section,
-                           toc_section->contents,
-                           our_toc_offset, 
-                           val,
-                           name);
-#endif
-
                    /* write out the toc entry */
                    bfd_put_32(output_bfd,
                               val,
@@ -1558,10 +1318,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
                if (coff_data(output_bfd)->pe)
                  addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
 
-#ifdef DEBUG_RELOC
-               fprintf(stderr,
-                       "  Toc Section .reloc candidate addr = %x\n", addr);
-#endif
                fwrite (&addr, 1,4, (FILE *) info->base_file);
              }
 
@@ -1570,9 +1326,12 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
            if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN &&
                our_toc_offset > toc_section->_raw_size)
              {
-               fprintf(stderr,
-                       "reloc offset is bigger than the toc size!\n");
-               abort();
+               (*_bfd_error_handler)
+                 ("%s: Relocation exceeds allocated TOC (%x)", 
+                  bfd_get_filename (input_bfd),
+                  toc_section->_raw_size);
+               bfd_set_error (bfd_error_bad_value);
+               return false;
              }
 
            /* Now we know the relocation for this toc reference */
@@ -1645,15 +1404,13 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
            if (h->symbol_is_glue == 1) 
              break;
            my_name = h->root.root.root.string;
-           fprintf(stderr, 
-                   "Warning: previously missed IMGLUE reloc %s <file %s, section %s>\n", 
-                   howto->name,
-                   bfd_get_filename(input_bfd),
-                   input_section->name);
-           break;
 
+           (*_bfd_error_handler)
+             ("%s: Out of order IMGLUE reloc for %s", 
+              bfd_get_filename (input_bfd), my_name);
+           bfd_set_error (bfd_error_bad_value);
+           return false;
          }
-         break;
 
        case IMAGE_REL_PPC_ADDR32NB:
          {
@@ -1684,12 +1441,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
                                             "__idata4_magic__",
                                             false, false, true);
                import_table_size = myh->root.u.def.value;
-#ifdef DEBUG_RELOC
-               fprintf(stderr,
-                       "first computation triggered fta %x, ts %d(%x), its %d(%x)\n",
-                       first_thunk_address, thunk_size, thunk_size, import_table_size,
-                       import_table_size);
-#endif
              }
 
            if (h == 0)
@@ -1718,7 +1469,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
                                                 false, false, true);
                    if (myh == 0) 
                      {
-                       fprintf(stderr, "Missing idata magic cookies, this cannot work anyway...\n");
+                       /* Missing magic cookies. Something is very wrong. */
                        abort();
                      }
                    
@@ -1745,13 +1496,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
                                                     "__idata4_magic__",
                                                     false, false, true);
                        import_table_size = myh->root.u.def.value;
-#ifdef DEBUG_RELOC
-
-                       fprintf(stderr,
-                               "second computation triggered fta %x, ts %d(%x), its %d(%x)\n",
-                               first_thunk_address, thunk_size, thunk_size, import_table_size,
-                               import_table_size);
-#endif
                      }
                  }
              }
@@ -1801,19 +1545,8 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
 
              if (coff_data(output_bfd)->pe)
                {
-#ifdef DEBUG_RELOC
-                 bfd_vma before_addr = addr;
-#endif
                  addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
-#ifdef DEBUG_RELOC
-                 fprintf(stderr,
-                         " adjusted down from %x to %x", before_addr, addr);
-#endif
                }
-#ifdef DEBUG_RELOC
-             fprintf(stderr, "\n");
-#endif
-
              fwrite (&addr, 1,4, (FILE *) info->base_file);
            }
        }
@@ -1844,28 +1577,12 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
                buf[SYMNMLEN] = '\0';
                name = buf;
              }
-#if 0
-           else
-             {
-               name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
-               if (name == NULL)
-                 return false;
-             }
-#endif
 
            if (! ((*info->callbacks->reloc_overflow)
                   (info, name, howto->name, 
                    (bfd_vma) 0, input_bfd,
                    input_section, rel->r_vaddr - input_section->vma)))
              {
-#ifdef DEBUG_RELOC
-               fprintf(stderr, 
-                       "pe_ppc_relocate_section (%s) for %s in bfd %s RETURNING TRUE\n", 
-                       TARGET_LITTLE_NAME,
-                       input_section->name,
-                       input_bfd->filename);
-  
-#endif  
                return false;
              }
          }
@@ -1873,15 +1590,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
 
     }     
 
-#ifdef DEBUG_RELOC
-  fprintf(stderr, 
-         "pe_ppc_relocate_section (%s) for %s in bfd %s RETURNING TRUE\n", 
-         TARGET_LITTLE_NAME,
-         input_section->name,
-         input_bfd->filename);
-  
-#endif  
-
   return true;
 }
 
@@ -1965,15 +1673,14 @@ ppc_allocate_toc_section (info)
 
   if (bfd_of_toc_owner == 0)
     {
-      fprintf(stderr,
-             "There is no bfd that owns the toc section!\n");
+      /* No toc owner? Something is very wrong. */
       abort();
     }
 
   s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
   if (s == NULL) 
     {
-      fprintf(stderr, "No Toc section!\n");
+      /* No toc section? Something is very wrong. */
       abort();
     }
 
@@ -1994,12 +1701,6 @@ ppc_process_before_allocation (abfd, info)
   asection *sec;
   struct internal_reloc *i, *rel;
 
-#ifdef DEBUG_RELOC
-  fprintf(stderr, 
-         "ppc_process_before_allocation: BFD %s\n", 
-         bfd_get_filename(abfd));
-#endif
-
   /* here we have a bfd that is to be included on the link. We have a hook
      to do reloc rummaging, before section sizes are nailed down. */
 
@@ -2015,15 +1716,6 @@ ppc_process_before_allocation (abfd, info)
 
   for (; sec != 0; sec = sec->next)
   {
-    int toc_offset;
-
-#ifdef DEBUG_RELOC
-    fprintf(stderr, 
-           "  section %s reloc count %d\n", 
-           sec->name, 
-           sec->reloc_count);
-#endif
-
     if (sec->reloc_count == 0) 
       continue;
 
@@ -2038,46 +1730,20 @@ ppc_process_before_allocation (abfd, info)
       {
        unsigned short r_type  = EXTRACT_TYPE (rel->r_type);
        unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
+       boolean ok = true;
 
-#ifdef DEBUG_RELOC
-       /* now examine flags */
-       if (r_flags != 0) 
-         {
-           fprintf (stderr, "Reloc with flags found!");
-           if ( r_flags & IMAGE_REL_PPC_NEG ) 
-             fprintf (stderr, " NEG");
-           if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
-             fprintf (stderr, " BRTAKEN");
-           if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
-             fprintf (stderr, " BRNTAKEN");
-           if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-               fprintf (stderr, " TOCDEFN");
-           fprintf(stderr, "\n");
-         }
-#endif
-       
        DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
 
        switch(r_type) 
          {
          case IMAGE_REL_PPC_TOCREL16:
-#if 0
-           /* FIXME:
-              This remains unimplemented for now, as it currently adds
-              un-necessary elements to the toc. All we need to do today
-              is not do anything if TOCDEFN is on.
-           */
-           if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-             toc_offset = ppc_record_data_in_toc_entry(abfd, info, sec, 
-                                                       rel->r_symndx, 
-                                                       default_toc);
-           else
-             toc_offset = ppc_record_toc_entry(abfd, info, sec, 
-                                               rel->r_symndx, default_toc);
-#endif
+           /* if TOCDEFN is on, ignore as someone else has allocated the
+              toc entry */
            if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN )
-             toc_offset = ppc_record_toc_entry(abfd, info, sec, 
-                                               rel->r_symndx, default_toc);
+             ok = ppc_record_toc_entry(abfd, info, sec, 
+                                       rel->r_symndx, default_toc);
+           if (!ok)
+             return false;
            break;
          case IMAGE_REL_PPC_IMGLUE:
            ppc_mark_symbol_as_glue(abfd, rel->r_symndx, rel);
@@ -2344,38 +2010,11 @@ ppc_coff_rtype2howto (relent, internal)
 
   /* the masking process only slices off the bottom byte for r_type. */
   if ( r_type > MAX_RELOC_INDEX ) 
-    {
-      fprintf(stderr, 
-             "ppc_coff_rtype2howto: reloc index %d out of range [%d, %ld]\n",
-             internal->r_type, 0, (long) MAX_RELOC_INDEX);
-      abort();
-    }
+    abort();
 
   /* check for absolute crap */
   if ( junk != 0 )
-    {
-      fprintf(stderr, 
-             "ppc_coff_rtype2howto: reloc index %d contains junk %d\n",
-             internal->r_type, junk);
-      abort();
-    }
-
-#ifdef DEBUG_RELOC
-  /* now examine flags */
-  if (r_flags != 0) 
-    {
-      fprintf (stderr, "Reloc with flags found!");
-      if ( r_flags & IMAGE_REL_PPC_NEG ) 
-       fprintf (stderr, " NEG");
-      if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
-       fprintf (stderr, " BRTAKEN");
-      if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
-       fprintf (stderr, " BRNTAKEN");
-      if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-       fprintf (stderr, " TOCDEFN");
-      fprintf(stderr, "\n");
-    }
-#endif
+    abort();
 
   switch(r_type) 
     {
@@ -2442,39 +2081,12 @@ coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
 
   /* the masking process only slices off the bottom byte for r_type. */
   if ( r_type > MAX_RELOC_INDEX ) 
-    {
-      fprintf(stderr, 
-             "coff_ppc_rtype_to_howto: index %d out of range [%d, %ld]\n",
-             r_type, 0, (long) MAX_RELOC_INDEX);
-      abort();
-    }
+    abort();
   
   /* check for absolute crap */
   if ( junk != 0 )
-    {
-      fprintf(stderr, 
-             "coff_ppc_rtype_to_howto: reloc index %d contains junk %d\n",
-             rel->r_type, junk);
-      abort();
-    }
-  
-#ifdef DEBUG_RELOC
-  /* now examine flags */
-  if (r_flags != 0) 
-    {
-      fprintf (stderr, "Reloc with flags found!");
-      if ( r_flags & IMAGE_REL_PPC_NEG ) 
-       fprintf (stderr, " NEG");
-      if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
-       fprintf (stderr, " BRTAKEN");
-      if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
-       fprintf (stderr, " BRNTAKEN");
-      if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-       fprintf (stderr, " TOCDEFN");
-      fprintf(stderr, "\n");
-    }
-#endif
-  
+    abort();
+    
   switch(r_type) 
     {
     case IMAGE_REL_PPC_ADDR32NB:
@@ -2528,12 +2140,6 @@ ppc_coff_reloc_type_lookup (abfd, code)
      bfd *abfd;
      bfd_reloc_code_real_type code;
 {
-  
-#ifdef DEBUG_RELOC
-  fprintf(stderr, "ppc_coff_reloc_type_lookup for %s\n",
-         bfd_get_reloc_code_name(code));
-#endif
-
   switch (code)
     {
       HOW2MAP(BFD_RELOC_32_GOTOFF,    IMAGE_REL_PPC_IMGLUE);
@@ -2623,20 +2229,13 @@ ppc_coff_swap_sym_in_hook (abfd, ext1, in1)
 
       flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ;
 
-#ifdef TOC_DEBUG
-      fprintf(stderr,
-             "ppc_coff_swap_sym_in_hook: about to create the %s section\n",
-             TOC_SECTION_NAME);
-#endif
-
       s = bfd_make_section (abfd, TOC_SECTION_NAME);
 
       if (s == NULL
          || !bfd_set_section_flags (abfd, s, flags)
          || !bfd_set_section_alignment (abfd, s, 2))
        {
-         fprintf(stderr,
-                 "toc section allocation failed!\n");
+         /* FIXME: set appropriate bfd error */
          abort();
        }
 
@@ -2738,7 +2337,10 @@ ppc_bfd_coff_final_link (abfd, info)
 
   /* Compute the file positions for all the sections.  */
   if (! abfd->output_has_begun)
-    bfd_coff_compute_section_file_positions (abfd);
+    {
+      if (! bfd_coff_compute_section_file_positions (abfd))
+       return false;
+    }
 
   /* Count the line numbers and relocation entries required for the
      output file.  Set the file positions for the relocs.  */
index 8389060..ba879d2 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for IBM RS/6000 "XCOFF" files.
-   Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
    FIXME: Can someone provide a transliteration of this name into ASCII?
    Using the following chars caused a compiler warning on HIUX (so I replaced
    them with octal escapes), and isn't useful without an understanding of what
@@ -31,7 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "bfd.h"
 #include "sysdep.h"
 #include "libbfd.h"
-#include "obstack.h"
 #include "coff/internal.h"
 #include "coff/rs6000.h"
 #include "libcoff.h"
@@ -40,6 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 static boolean xcoff_mkobject PARAMS ((bfd *));
 static boolean xcoff_copy_private_bfd_data PARAMS ((bfd *, bfd *));
+static boolean xcoff_is_local_label_name PARAMS ((bfd *, const char *));
 static void xcoff_rtype2howto
   PARAMS ((arelent *, struct internal_reloc *));
 static reloc_howto_type *xcoff_reloc_type_lookup
@@ -94,6 +94,7 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
      bfd *obfd;
 {
   struct xcoff_tdata *ix, *ox;
+  asection *sec;
 
   if (ibfd->xvec != obfd->xvec)
     return true;
@@ -101,14 +102,26 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
   ox = xcoff_data (obfd);
   ox->full_aouthdr = ix->full_aouthdr;
   ox->toc = ix->toc;
-  if (ix->toc_section == NULL)
-    ox->toc_section = NULL;
+  if (ix->sntoc == 0)
+    ox->sntoc = 0;
   else
-    ox->toc_section = ix->toc_section->output_section;
-  if (ix->entry_section == NULL)
-    ox->entry_section = NULL;
+    {
+      sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
+      if (sec == NULL)
+       ox->sntoc = 0;
+      else
+       ox->sntoc = sec->output_section->target_index;
+    }
+  if (ix->snentry == 0)
+    ox->snentry = 0;
   else
-    ox->entry_section = ix->entry_section->output_section;
+    {
+      sec = coff_section_from_bfd_index (ibfd, ix->snentry);
+      if (sec == NULL)
+       ox->snentry = 0;
+      else
+       ox->snentry = sec->output_section->target_index;
+    }
   ox->text_align_power = ix->text_align_power;
   ox->data_align_power = ix->data_align_power;
   ox->modtype = ix->modtype;
@@ -117,6 +130,19 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
   ox->maxstack = ix->maxstack;
   return true;
 }
+
+/* I don't think XCOFF really has a notion of local labels based on
+   name.  This will mean that ld -X doesn't actually strip anything.
+   The AIX native linker does not have a -X option, and it ignores the
+   -x option.  */
+
+static boolean
+xcoff_is_local_label_name (abfd, name)
+     bfd *abfd;
+     const char *name;
+{
+  return false;
+}
 \f
 /* The XCOFF reloc table.  Actually, XCOFF relocations specify the
    bitsize and whether they are signed or not, along with a
@@ -528,6 +554,7 @@ xcoff_reloc_type_lookup (abfd, code)
 
 #define coff_mkobject xcoff_mkobject
 #define coff_bfd_copy_private_bfd_data xcoff_copy_private_bfd_data
+#define coff_bfd_is_local_label_name xcoff_is_local_label_name
 #define coff_bfd_reloc_type_lookup xcoff_reloc_type_lookup
 #define coff_relocate_section _bfd_ppc_xcoff_relocate_section
 
@@ -1384,7 +1411,7 @@ const bfd_target
      BFD_JUMP_TABLE_RELOCS (coff),
      BFD_JUMP_TABLE_WRITE (coff),
      BFD_JUMP_TABLE_LINK (_bfd_xcoff),
-     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+     BFD_JUMP_TABLE_DYNAMIC (_bfd_xcoff),
 
   COFF_SWAP_TABLE,
 };
index 948165e..7679a44 100644 (file)
@@ -3114,8 +3114,7 @@ coff_close_and_cleanup (abfd)
        return false;
       }
 
-  /* We depend on bfd_close to free all the memory on the obstack.  */
-  /* FIXME if bfd_release is not using obstacks! */
+  /* We depend on bfd_close to free all the memory on the objalloc.  */
   return true;
 }
 
index af84d20..7982945 100644 (file)
@@ -1,5 +1,5 @@
 /* Routines to link ECOFF debugging information.
-   Copyright 1993 Free Software Foundation, Inc.
+   Copyright 1993, 94, 95, 96, 1997 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "sysdep.h"
 #include "bfdlink.h"
 #include "libbfd.h"
-#include "obstack.h"
+#include "objalloc.h"
 #include "aout/stab_gnu.h"
 #include "coff/internal.h"
 #include "coff/sym.h"
@@ -46,10 +46,9 @@ static boolean mk_fdrtab PARAMS ((bfd *,
                                  const struct ecoff_debug_swap * const,
                                  struct ecoff_find_line *));
 static long fdrtab_lookup PARAMS ((struct ecoff_find_line *, bfd_vma));
-
-/* Obstack allocation and deallocation routines.  */
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
+static boolean lookup_line
+  PARAMS ((bfd *, struct ecoff_debug_info * const,
+          const struct ecoff_debug_swap * const, struct ecoff_find_line *));
 \f
 /* Routines to swap auxiliary information in and out.  I am assuming
    that the auxiliary information format is always going to be target
@@ -392,8 +391,8 @@ struct accumulate
   struct shuffle *rfd_end;
   /* The size of the largest file shuffle.  */
   unsigned long largest_file_shuffle;
-  /* An obstack for debugging information.  */
-  struct obstack memory;
+  /* An objalloc for debugging information.  */
+  struct objalloc *memory;
 };
 
 /* Add a file entry to a shuffle list.  */
@@ -426,8 +425,8 @@ add_file_shuffle (ainfo, head, tail, input_bfd, offset, size)
       return true;
     }
 
-  n = (struct shuffle *) obstack_alloc (&ainfo->memory,
-                                       sizeof (struct shuffle));
+  n = (struct shuffle *) objalloc_alloc (ainfo->memory,
+                                        sizeof (struct shuffle));
   if (!n)
     {
       bfd_set_error (bfd_error_no_memory);
@@ -465,8 +464,8 @@ add_memory_shuffle (ainfo, head, tail, data, size)
 {
   struct shuffle *n;
      
-  n = (struct shuffle *) obstack_alloc (&ainfo->memory,
-                                       sizeof (struct shuffle));
+  n = (struct shuffle *) objalloc_alloc (ainfo->memory,
+                                        sizeof (struct shuffle));
   if (!n)
     {
       bfd_set_error (bfd_error_no_memory);
@@ -534,7 +533,8 @@ bfd_ecoff_debug_init (output_bfd, output_debug, output_swap, info)
       output_debug->symbolic_header.issMax = 1;
     }
 
-  if (!obstack_begin (&ainfo->memory, 4050))
+  ainfo->memory = objalloc_create ();
+  if (ainfo->memory == NULL)
     {
       bfd_set_error (bfd_error_no_memory);
       return NULL;
@@ -561,7 +561,7 @@ bfd_ecoff_debug_free (handle, output_bfd, output_debug, output_swap, info)
   if (! info->relocateable)
     bfd_hash_table_free (&ainfo->str_hash.table);
 
-  obstack_free (&ainfo->memory, (PTR) NULL);
+  objalloc_free (ainfo->memory);
 
   free (ainfo);
 }
@@ -666,7 +666,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
                                             * sizeof (RFDT)));
 
   sz = (input_symhdr->crfd + input_symhdr->ifdMax) * external_rfd_size;
-  rfd_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
+  rfd_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
   if (!input_debug->ifdmap || !rfd_out)
     {
       bfd_set_error (bfd_error_no_memory);
@@ -766,7 +766,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
   /* Look through the FDR's and copy over all associated debugging
      information.  */
   sz = copied * external_fdr_size;
-  fdr_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
+  fdr_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
   if (!fdr_out)
     {
       bfd_set_error (bfd_error_no_memory);
@@ -821,7 +821,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
         out again.  */
       fgotfilename = false;
       sz = fdr.csym * external_sym_size;
-      sym_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
+      sym_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
       if (!sym_out)
        {
          bfd_set_error (bfd_error_no_memory);
@@ -978,8 +978,8 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
          output_symhdr->issMax += fdr.cbSs;
        }
 
-      if ((output_bfd->xvec->header_byteorder_big_p
-          == input_bfd->xvec->header_byteorder_big_p)
+      if ((output_bfd->xvec->header_byteorder
+          == input_bfd->xvec->header_byteorder)
          && input_debug->adjust == (struct ecoff_value_adjust *) NULL)
        {
          /* The two BFD's have the same endianness, and we don't have
@@ -1022,7 +1022,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
                + fdr.ipdFirst * insz);
          end = in + fdr.cpd * insz;
          sz = fdr.cpd * outsz;
-         out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
+         out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
          if (!out)
            {
              bfd_set_error (bfd_error_no_memory);
@@ -1063,7 +1063,7 @@ bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
                + fdr.ioptBase * insz);
          end = in + fdr.copt * insz;
          sz = fdr.copt * outsz;
-         out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
+         out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
          if (!out)
            {
              bfd_set_error (bfd_error_no_memory);
@@ -1244,8 +1244,8 @@ bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
       internal_sym.sc = scUndefined;
       internal_sym.index = indexNil;
 
-      external_sym = (PTR) obstack_alloc (&ainfo->memory,
-                                         output_swap->external_sym_size);
+      external_sym = (PTR) objalloc_alloc (ainfo->memory,
+                                          output_swap->external_sym_size);
       if (!external_sym)
        {
          bfd_set_error (bfd_error_no_memory);
@@ -1264,8 +1264,8 @@ bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
      the lang field to be langC.  The fBigendian field will
      indicate little endian format, but it doesn't matter because
      it only applies to aux fields and there are none.  */
-  external_fdr = (PTR) obstack_alloc (&ainfo->memory,
-                                     output_swap->external_fdr_size);
+  external_fdr = (PTR) objalloc_alloc (ainfo->memory,
+                                      output_swap->external_fdr_size);
   if (!external_fdr)
     {
       bfd_set_error (bfd_error_no_memory);
@@ -1949,27 +1949,23 @@ fdrtab_lookup (line_info, offset)
   return mid;
 }
 
-/* Do the work of find_nearest_line.  */
+/* Look up a line given an address, storing the information in
+   LINE_INFO->cache.  */
 
-boolean
-_bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
-                       line_info, filename_ptr, functionname_ptr, retline_ptr)
+static boolean
+lookup_line (abfd, debug_info, debug_swap, line_info)
      bfd *abfd;
-     asection *section;
-     bfd_vma offset;
      struct ecoff_debug_info * const debug_info;
      const struct ecoff_debug_swap * const debug_swap;
      struct ecoff_find_line *line_info;
-     const char **filename_ptr;
-     const char **functionname_ptr;
-     unsigned int *retline_ptr;
 {
   struct ecoff_fdrtab_entry *tab;
+  bfd_vma offset;
   boolean stabs;
   FDR *fdr_ptr;
   int i;
   
-  offset += section->vma;
+  offset = line_info->cache.start;
      
   /* Build FDR table (sorted by object file's base-address) if we
      don't have it already.  */
@@ -2155,7 +2151,10 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
            }
          lineno += delta;
          if (offset < count * 4)
-           break;
+           {
+             line_info->cache.stop += count * 4 - offset;
+             break;
+           }
          offset -= count * 4;
        }
 
@@ -2163,9 +2162,9 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
          symbols, at least according to gdb/mipsread.c.  */
       if (fdr_ptr->rss == -1)
        {
-         *filename_ptr = NULL;
+         line_info->cache.filename = NULL;
          if (pdr.isym == -1)
-           *functionname_ptr = NULL;
+           line_info->cache.functionname = NULL;
          else
            {
              EXTR proc_ext;
@@ -2175,24 +2174,30 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
                 ((char *) debug_info->external_ext
                  + pdr.isym * debug_swap->external_ext_size),
                 &proc_ext);
-             *functionname_ptr = debug_info->ssext + proc_ext.asym.iss;
+             line_info->cache.functionname = (debug_info->ssext
+                                              + proc_ext.asym.iss);
            }
        }
       else
        {
          SYMR proc_sym;
 
-         *filename_ptr = debug_info->ss + fdr_ptr->issBase + fdr_ptr->rss;
+         line_info->cache.filename = (debug_info->ss
+                                      + fdr_ptr->issBase
+                                      + fdr_ptr->rss);
          (*debug_swap->swap_sym_in)
            (abfd,
             ((char *) debug_info->external_sym
-             + (fdr_ptr->isymBase + pdr.isym) * debug_swap->external_sym_size),
+             + ((fdr_ptr->isymBase + pdr.isym)
+                * debug_swap->external_sym_size)),
             &proc_sym);
-         *functionname_ptr = debug_info->ss + fdr_ptr->issBase + proc_sym.iss;
+         line_info->cache.functionname = (debug_info->ss
+                                          + fdr_ptr->issBase
+                                          + proc_sym.iss);
        }
       if (lineno == ilineNil)
        lineno = 0;
-      *retline_ptr = lineno;
+      line_info->cache.line_num = lineno;
     }
   else
     {
@@ -2220,9 +2225,9 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
         looking through the symbols until we find both a line number
         and a function name which are beyond the address we want.  */
 
-      *filename_ptr = NULL;
-      *functionname_ptr = NULL;
-      *retline_ptr = 0;
+      line_info->cache.filename = NULL;
+      line_info->cache.functionname = NULL;
+      line_info->cache.line_num = 0;
 
       directory_name = NULL;
       main_file_name = NULL;
@@ -2300,12 +2305,12 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
                {
                  low_line_vma = sym.value;
                  line_file_name = current_file_name;
-                 *retline_ptr = sym.index;
+                 line_info->cache.line_num = sym.index;
                }
            }
        }
 
-      if (*retline_ptr != 0)
+      if (line_info->cache.line_num != 0)
        main_file_name = line_file_name;
 
       /* We need to remove the stuff after the colon in the function
@@ -2339,24 +2344,63 @@ _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
          colon = strchr (buffer, ':');
          if (colon != NULL)
            *colon = '\0';
-         *functionname_ptr = buffer;
+         line_info->cache.functionname = buffer;
        }
 
       if (main_file_name != NULL)
        {
          if (directory_name == NULL || main_file_name[0] == '/')
-           *filename_ptr = main_file_name;
+           line_info->cache.filename = main_file_name;
          else
            {
              sprintf (buffer + funclen, "%s%s", directory_name,
                       main_file_name);
-             *filename_ptr = buffer + funclen;
+             line_info->cache.filename = buffer + funclen;
            }
        }
     }
 
   return true;
 }
+
+/* Do the work of find_nearest_line.  */
+
+boolean
+_bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
+                       line_info, filename_ptr, functionname_ptr, retline_ptr)
+     bfd *abfd;
+     asection *section;
+     bfd_vma offset;
+     struct ecoff_debug_info * const debug_info;
+     const struct ecoff_debug_swap * const debug_swap;
+     struct ecoff_find_line *line_info;
+     const char **filename_ptr;
+     const char **functionname_ptr;
+     unsigned int *retline_ptr;
+{
+  offset += section->vma;
+
+  if (line_info->cache.sect == NULL
+      || line_info->cache.sect != section
+      || offset < line_info->cache.start
+      || offset >= line_info->cache.stop)
+    {
+      line_info->cache.sect = section;
+      line_info->cache.start = offset;
+      line_info->cache.stop = offset;
+      if (! lookup_line (abfd, debug_info, debug_swap, line_info))
+       {
+         line_info->cache.sect = NULL;
+         return false;
+       }
+    }
+
+  *filename_ptr = line_info->cache.filename;
+  *functionname_ptr = line_info->cache.functionname;
+  *retline_ptr = line_info->cache.line_num;
+
+  return true;
+}
 \f
 /* These routines copy symbolic information into a memory buffer.
 
index 810df70..ebef3ca 100644 (file)
@@ -22,8 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
+#include "objalloc.h"
 #include "libbfd.h"
-#include "obstack.h"
 
 #ifndef S_IXUSR
 #define S_IXUSR 0100   /* Execute by owner.  */
@@ -38,14 +38,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 /* fdopen is a loser -- we should use stdio exclusively.  Unfortunately
    if we do that we can't use fcntl.  */
 
-
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-
-#ifndef HAVE_GETPAGESIZE
-#define getpagesize()  2048
-#endif
-
+/* FIXME: This is no longer used.  */
 long _bfd_chunksize = -1;
 
 /* Return a new BFD.  All BFD's are allocated through this routine.  */
@@ -55,25 +48,15 @@ _bfd_new_bfd ()
 {
   bfd *nbfd;
 
-  nbfd = (bfd *)bfd_zmalloc (sizeof (bfd));
-  if (!nbfd)
-    return 0;
-
-  if (_bfd_chunksize <= 0)
-    {
-      _bfd_chunksize = getpagesize ();
-      if (_bfd_chunksize <= 0)
-       _bfd_chunksize = 2048;
-      /* Leave some slush space, since many malloc implementations
-        prepend a header, and may wind up wasting another page
-        because of it.  */
-      _bfd_chunksize -= 32;
-    }
+  nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
+  if (nbfd == NULL)
+    return NULL;
 
-  if (!obstack_begin(&nbfd->memory, _bfd_chunksize))
+  nbfd->memory = (PTR) objalloc_create ();
+  if (nbfd->memory == NULL)
     {
       bfd_set_error (bfd_error_no_memory);
-      return 0;
+      return NULL;
     }
 
   nbfd->arch_info = &bfd_default_arch_struct;
@@ -81,14 +64,14 @@ _bfd_new_bfd ()
   nbfd->direction = no_direction;
   nbfd->iostream = NULL;
   nbfd->where = 0;
-  nbfd->sections = (asection *)NULL;
+  nbfd->sections = (asection *) NULL;
   nbfd->format = bfd_unknown;
-  nbfd->my_archive = (bfd *)NULL;
+  nbfd->my_archive = (bfd *) NULL;
   nbfd->origin = 0;                            
   nbfd->opened_once = false;
   nbfd->output_has_begun = false;
   nbfd->section_count = 0;
-  nbfd->usrdata = (PTR)NULL;
+  nbfd->usrdata = (PTR) NULL;
   nbfd->cacheable = false;
   nbfd->flags = BFD_NO_FLAGS;
   nbfd->mtime_set = false;
@@ -104,7 +87,7 @@ _bfd_new_bfd_contained_in (obfd)
 {
   bfd *nbfd;
 
-  nbfd = _bfd_new_bfd();
+  nbfd = _bfd_new_bfd ();
   nbfd->xvec = obfd->xvec;
   nbfd->my_archive = obfd;
   nbfd->direction = read_direction;
@@ -144,28 +127,34 @@ bfd_openr (filename, target)
   bfd *nbfd;
   const bfd_target *target_vec;
 
-  nbfd = _bfd_new_bfd();
+  nbfd = _bfd_new_bfd ();
   if (nbfd == NULL)
     return NULL;
 
   target_vec = bfd_find_target (target, nbfd);
-  if (target_vec == NULL) {
-    bfd_set_error (bfd_error_invalid_target);
-    return NULL;
-  }
+  if (target_vec == NULL)
+    {
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
+      bfd_set_error (bfd_error_invalid_target);
+      return NULL;
+    }
 
   nbfd->filename = filename;
   nbfd->direction = read_direction;
 
-  if (bfd_open_file (nbfd) == NULL) {
-    bfd_set_error (bfd_error_system_call);     /* File didn't exist, or some such */
-    bfd_release(nbfd,0);
-    return NULL;
-  }
+  if (bfd_open_file (nbfd) == NULL)
+    {
+      /* File didn't exist, or some such */
+      bfd_set_error (bfd_error_system_call);
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
+      return NULL;
+    }
+
   return nbfd;
 }
 
-
 /* Don't try to `optimize' this function:
 
    o - We lock using stack space so that interrupting the locking
@@ -218,16 +207,19 @@ bfd_fdopenr (filename, target, fd)
 #endif
   if (fdflags == -1) return NULL;
 
-  nbfd = _bfd_new_bfd();
-
+  nbfd = _bfd_new_bfd ();
   if (nbfd == NULL)
     return NULL;
 
   target_vec = bfd_find_target (target, nbfd);
-  if (target_vec == NULL) {
-    bfd_set_error (bfd_error_invalid_target);
-    return NULL;
-  }
+  if (target_vec == NULL)
+    {
+      bfd_set_error (bfd_error_invalid_target);
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
+      return NULL;
+    }
+
 #if defined(VMS) || defined(__GO32__)
   nbfd->iostream = (PTR)fopen(filename, FOPEN_RB);
 #else
@@ -239,10 +231,13 @@ bfd_fdopenr (filename, target, fd)
   default: abort ();
   }
 #endif
-  if (nbfd->iostream == NULL) {
-    (void) obstack_free (&nbfd->memory, (PTR)0);
-    return NULL;
-  }
+
+  if (nbfd->iostream == NULL)
+    {
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
+      return NULL;
+    }
 
   /* OK, put everything where it belongs */
 
@@ -252,15 +247,20 @@ bfd_fdopenr (filename, target, fd)
      be written through, although doing so requires that we end
      the previous clause with a preposition.  */
   /* (O_ACCMODE) parens are to avoid Ultrix header file bug */
-  switch (fdflags & (O_ACCMODE)) {
-  case O_RDONLY: nbfd->direction = read_direction; break;
-  case O_WRONLY: nbfd->direction = write_direction; break;
-  case O_RDWR: nbfd->direction = both_direction; break;
-  default: abort ();
-  }
-                               
+  switch (fdflags & O_ACCMODE)
+    {
+    case O_RDONLY: nbfd->direction = read_direction; break;
+    case O_WRONLY: nbfd->direction = write_direction; break;
+    case O_RDWR: nbfd->direction = both_direction; break;
+    default: abort ();
+    }
+
   if (! bfd_cache_init (nbfd))
-    return NULL;
+    {
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
+      return NULL;
+    }
   nbfd->opened_once = true;
 
   return nbfd;
@@ -296,6 +296,8 @@ bfd_openstreamr (filename, target, stream)
   if (target_vec == NULL)
     {
       bfd_set_error (bfd_error_invalid_target);
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
       return NULL;
     }
 
@@ -304,7 +306,11 @@ bfd_openstreamr (filename, target, stream)
   nbfd->direction = read_direction;
                                
   if (! bfd_cache_init (nbfd))
-    return NULL;
+    {
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
+      return NULL;
+    }
 
   return nbfd;
 }
@@ -342,21 +348,29 @@ bfd_openw (filename, target)
   /* nbfd has to point to head of malloc'ed block so that bfd_close may
      reclaim it correctly. */
 
-  nbfd = _bfd_new_bfd();
+  nbfd = _bfd_new_bfd ();
   if (nbfd == NULL)
     return NULL;
 
   target_vec = bfd_find_target (target, nbfd);
-  if (target_vec == NULL) return NULL;
+  if (target_vec == NULL)
+    {
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
+      return NULL;
+    }
 
   nbfd->filename = filename;
   nbfd->direction = write_direction;
 
-  if (bfd_open_file (nbfd) == NULL) {
-    bfd_set_error (bfd_error_system_call);     /* File not writeable, etc */
-    (void) obstack_free (&nbfd->memory, (PTR)0);
-    return NULL;
+  if (bfd_open_file (nbfd) == NULL)
+    {
+      bfd_set_error (bfd_error_system_call);   /* File not writeable, etc */
+      objalloc_free ((struct objalloc *) nbfd->memory);
+      free (nbfd);
+      return NULL;
   }
+
   return nbfd;
 }
 
@@ -375,7 +389,7 @@ DESCRIPTION
        and closed. If the created file is executable, then
        <<chmod>> is called to mark it as such.
 
-       All memory attached to the BFD's obstacks is released.
+       All memory attached to the BFD is released.
 
        The file descriptor associated with the BFD is closed (even
        if it was passed in to BFD by <<bfd_fdopenr>>).
@@ -420,8 +434,8 @@ bfd_close (abfd)
        }
     }
 
-  (void) obstack_free (&abfd->memory, (PTR)0);
-  (void) free (abfd);
+  objalloc_free ((struct objalloc *) abfd->memory);
+  free (abfd);
 
   return ret;
 }
@@ -442,7 +456,7 @@ DESCRIPTION
        If the created file is executable, then <<chmod>> is called
        to mark it as such.
 
-       All memory attached to the BFD's obstacks is released.
+       All memory attached to the BFD is released.
 
 RETURNS
        <<true>> is returned if all is ok, otherwise <<false>>.
@@ -474,39 +488,13 @@ bfd_close_all_done (abfd)
                  & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
        }
     }
-  (void) obstack_free (&abfd->memory, (PTR)0);
-  (void) free(abfd);
-  return ret;
-}
 
+  objalloc_free ((struct objalloc *) abfd->memory);
+  free (abfd);
 
-/*
-FUNCTION       
-       bfd_alloc_size
-
-SYNOPSIS
-       bfd_size_type bfd_alloc_size(bfd *abfd);
-
-DESCRIPTION
-        Return the number of bytes in the obstacks connected to @var{abfd}.
-
-*/
-
-bfd_size_type
-bfd_alloc_size (abfd)
-     bfd *abfd;
-{
-  struct _obstack_chunk *chunk = abfd->memory.chunk;
-  size_t size = 0;
-  while (chunk) {
-    size += chunk->limit - &(chunk->contents[0]);
-    chunk = chunk->prev;
-  }
-  return size;
+  return ret;
 }
 
-
-
 /*
 FUNCTION
        bfd_create
@@ -527,15 +515,16 @@ bfd_create (filename, templ)
      CONST char *filename;
      bfd *templ;
 {
-  bfd *nbfd = _bfd_new_bfd();
-  if (nbfd == (bfd *)NULL)
-    return (bfd *)NULL;
+  bfd *nbfd;
+
+  nbfd = _bfd_new_bfd ();
+  if (nbfd == NULL)
+    return NULL;
   nbfd->filename = filename;
-  if(templ) {
+  if (templ)
     nbfd->xvec = templ->xvec;
-  }
   nbfd->direction = no_direction;
-  bfd_set_format(nbfd, bfd_object);
+  bfd_set_format (nbfd, bfd_object);
   return nbfd;
 }
 
@@ -547,8 +536,8 @@ SYNOPSIS
        PTR bfd_alloc (bfd *abfd, size_t wanted);
 
 DESCRIPTION
-       Allocate a block of @var{wanted} bytes of memory in the obstack
-       attached to <<abfd>> and return a pointer to it.
+       Allocate a block of @var{wanted} bytes of memory attached to
+       <<abfd>> and return a pointer to it.
 */
 
 
@@ -559,7 +548,7 @@ bfd_alloc (abfd, size)
 {
   PTR ret;
 
-  ret = obstack_alloc (&(abfd->memory), size);
+  ret = objalloc_alloc (abfd->memory, (unsigned long) size);
   if (ret == NULL)
     bfd_set_error (bfd_error_no_memory);
   return ret;
@@ -571,8 +560,19 @@ bfd_zalloc (abfd, size)
      size_t size;
 {
   PTR res;
-  res = bfd_alloc(abfd, size);
+
+  res = bfd_alloc (abfd, size);
   if (res)
-    memset(res, 0, (size_t)size);
+    memset (res, 0, size);
   return res;
 }
+
+/* Free a block allocated for a BFD.  */
+
+void
+bfd_release (abfd, block)
+     bfd *abfd;
+     PTR block;
+{
+  objalloc_free_block ((struct objalloc *) abfd->memory, block);
+}
index 23a1c19..feaddd6 100644 (file)
@@ -88,7 +88,7 @@ SUBSECTION
 |           process_symbol (symbol_table[i]);
 |        }
 
-       All storage for the symbols themselves is in an obstack
+       All storage for the symbols themselves is in an objalloc
        connected to the BFD; it is freed when the BFD is closed.
 
 
@@ -352,6 +352,8 @@ bfd_is_local_label (abfd, sym)
 {
   if ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
     return false;
+  if (sym->name == NULL)
+    return false;
   return bfd_is_local_label_name (abfd, sym->name);
 }