This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: PR ld/5303: splay-tree doesn't support 64bit value on 32bit host


splay-tree can only handle types with size up to 32bit on 32bit host.
But BFD uses splay-tree on bfd_vma, which can be 64bit. So currently,
binutils is broken for 64bit targets on 32bit hosts.  This patch
adds a splay-tree for BFD and use it for BFD, instead of the one
in libiberty. Ok to install to both gcc and binutils?


H.J.
----
bfd/

2008-02-09  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/5303
	* Makefile.am (BFD32_LIBS): Add splay-tree.lo
	(BFD32_LIBS_CFILES): Add splay-tree.c.
	Run "make dep-am".
	* Makefile.in: Regenerated.

	* arange-set.c: Don't incldue splay-tree.h.
	(arange_set_delete_value_container): Add cast to ptrdiff_t.
	(arange_set_node_high): Likewise.
	(arange_set_node_set_high): Likewise.
	(arange_set_node_value): Likewise.
	(arange_set_node_set_value): Likewise.
	(arange_set_splay_tree_insert): Likewise.

	* bfd-in.h: Define splay tree interface for bfd_vma.
	* bfd-in2.: Regenerated.

	* splay-tree.c: New.

libiberty/

2008-02-09  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/5303
	* splay-tree.c: Include <stddef.h>.  Don't include any header
	files if BFD_ARCH_SIZE is defind.
	(splay_tree_delete_helper): Cast to ptrdiff_t instead.
	(splay_tree_compare_pointers): Likewise.

--- binutils/bfd/Makefile.am.splay	2007-11-09 11:30:56.000000000 -0800
+++ binutils/bfd/Makefile.am	2008-02-09 07:28:49.000000000 -0800
@@ -42,7 +42,7 @@ BFD32_LIBS = \
 	format.lo init.lo libbfd.lo opncls.lo reloc.lo \
 	section.lo syms.lo targets.lo hash.lo linker.lo \
 	srec.lo binary.lo tekhex.lo ihex.lo stabs.lo stab-syms.lo \
-	merge.lo dwarf2.lo simple.lo arange-set.lo
+	merge.lo dwarf2.lo simple.lo arange-set.lo splay-tree.lo
 
 BFD64_LIBS = archive64.lo
 
@@ -52,7 +52,7 @@ BFD32_LIBS_CFILES = \
 	format.c init.c libbfd.c opncls.c reloc.c \
 	section.c syms.c targets.c hash.c linker.c \
 	srec.c binary.c tekhex.c ihex.c stabs.c stab-syms.c \
-	merge.c dwarf2.c simple.c arange-set.c
+	merge.c dwarf2.c simple.c arange-set.c splay-tree.c
 
 BFD64_LIBS_CFILES = archive64.c
 
@@ -1053,7 +1053,9 @@ dwarf2.lo: dwarf2.c $(INCDIR)/filenames.
 simple.lo: simple.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
   $(INCDIR)/bfdlink.h
 arange-set.lo: arange-set.c $(INCDIR)/filenames.h $(INCDIR)/libiberty.h \
-  $(INCDIR)/hashtab.h arange-set.h $(INCDIR)/splay-tree.h
+  $(INCDIR)/hashtab.h arange-set.h
+splay-tree.lo: splay-tree.c $(INCDIR)/filenames.h $(INCDIR)/libiberty.h \
+  ../libiberty/splay-tree.c
 archive64.lo: archive64.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
   $(INCDIR)/aout/ar.h
 cpu-alpha.lo: cpu-alpha.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
@@ -1580,7 +1582,7 @@ elf-eh-frame.lo: elf-eh-frame.c $(INCDIR
 elf-vxworks.lo: elf-vxworks.c $(INCDIR)/filenames.h \
   $(INCDIR)/hashtab.h elf-bfd.h $(INCDIR)/elf/common.h \
   $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \
-  $(INCDIR)/elf/vxworks.h elf-vxworks.h
+  elf-vxworks.h $(INCDIR)/elf/vxworks.h
 epoc-pe-arm.lo: epoc-pe-arm.c pe-arm.c $(INCDIR)/filenames.h \
   coff-arm.c $(INCDIR)/hashtab.h $(INCDIR)/coff/arm.h \
   $(INCDIR)/coff/external.h $(INCDIR)/coff/internal.h \
--- binutils/bfd/Makefile.in.splay	2007-11-09 11:30:56.000000000 -0800
+++ binutils/bfd/Makefile.in	2008-02-09 07:28:49.000000000 -0800
@@ -84,7 +84,8 @@ am__objects_1 = archive.lo archures.lo b
 	cache.lo coffgen.lo corefile.lo format.lo init.lo libbfd.lo \
 	opncls.lo reloc.lo section.lo syms.lo targets.lo hash.lo \
 	linker.lo srec.lo binary.lo tekhex.lo ihex.lo stabs.lo \
-	stab-syms.lo merge.lo dwarf2.lo simple.lo arange-set.lo
+	stab-syms.lo merge.lo dwarf2.lo simple.lo arange-set.lo \
+	splay-tree.lo
 am_libbfd_la_OBJECTS = $(am__objects_1)
 libbfd_la_OBJECTS = $(am_libbfd_la_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
@@ -202,11 +203,8 @@ WARN_CFLAGS = @WARN_CFLAGS@
 WIN32LDFLAGS = @WIN32LDFLAGS@
 WIN32LIBADD = @WIN32LIBADD@
 XGETTEXT = @XGETTEXT@
-ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
 all_backends = @all_backends@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
@@ -232,6 +230,7 @@ build_vendor = @build_vendor@
 datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
@@ -245,13 +244,16 @@ infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
 lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
@@ -292,7 +294,7 @@ BFD32_LIBS = \
 	format.lo init.lo libbfd.lo opncls.lo reloc.lo \
 	section.lo syms.lo targets.lo hash.lo linker.lo \
 	srec.lo binary.lo tekhex.lo ihex.lo stabs.lo stab-syms.lo \
-	merge.lo dwarf2.lo simple.lo arange-set.lo
+	merge.lo dwarf2.lo simple.lo arange-set.lo splay-tree.lo
 
 BFD64_LIBS = archive64.lo
 BFD32_LIBS_CFILES = \
@@ -301,7 +303,7 @@ BFD32_LIBS_CFILES = \
 	format.c init.c libbfd.c opncls.c reloc.c \
 	section.c syms.c targets.c hash.c linker.c \
 	srec.c binary.c tekhex.c ihex.c stabs.c stab-syms.c \
-	merge.c dwarf2.c simple.c arange-set.c
+	merge.c dwarf2.c simple.c arange-set.c splay-tree.c
 
 BFD64_LIBS_CFILES = archive64.c
 
@@ -1633,7 +1635,9 @@ dwarf2.lo: dwarf2.c $(INCDIR)/filenames.
 simple.lo: simple.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
   $(INCDIR)/bfdlink.h
 arange-set.lo: arange-set.c $(INCDIR)/filenames.h $(INCDIR)/libiberty.h \
-  $(INCDIR)/hashtab.h arange-set.h $(INCDIR)/splay-tree.h
+  $(INCDIR)/hashtab.h arange-set.h
+splay-tree.lo: splay-tree.c $(INCDIR)/filenames.h $(INCDIR)/libiberty.h \
+  ../libiberty/splay-tree.c
 archive64.lo: archive64.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
   $(INCDIR)/aout/ar.h
 cpu-alpha.lo: cpu-alpha.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
@@ -2160,7 +2164,7 @@ elf-eh-frame.lo: elf-eh-frame.c $(INCDIR
 elf-vxworks.lo: elf-vxworks.c $(INCDIR)/filenames.h \
   $(INCDIR)/hashtab.h elf-bfd.h $(INCDIR)/elf/common.h \
   $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \
-  $(INCDIR)/elf/vxworks.h elf-vxworks.h
+  elf-vxworks.h $(INCDIR)/elf/vxworks.h
 epoc-pe-arm.lo: epoc-pe-arm.c pe-arm.c $(INCDIR)/filenames.h \
   coff-arm.c $(INCDIR)/hashtab.h $(INCDIR)/coff/arm.h \
   $(INCDIR)/coff/external.h $(INCDIR)/coff/internal.h \
--- binutils/bfd/arange-set.c.splay	2007-09-21 09:16:17.000000000 -0700
+++ binutils/bfd/arange-set.c	2008-02-09 07:50:45.000000000 -0800
@@ -24,7 +24,6 @@
 #include "libiberty.h"
 #include "libbfd.h"
 #include "arange-set.h"
-#include "splay-tree.h"
 
 /* Implementation of an arange-set.  The set is implemented using the
    splay tree support in libiberty.  The advantage of using this is
@@ -142,7 +141,7 @@ arange_set_delete_value_container (splay
 {
   arange_value_container_t *container;
 
-  container = (arange_value_container_t*) value;
+  container = (arange_value_container_t*) (ptrdiff_t) value;
   arange_set_delete_value (container->set, container->value);
   arange_set_deallocate (container->set, container);
 }
@@ -255,7 +254,7 @@ arange_set_node_high (arange_set set, sp
 
   if (set->value_p)
     {
-      container = (arange_value_container_t*) node->value;
+      container = (arange_value_container_t*) (ptrdiff_t) node->value;
       return container->high;
     }
 
@@ -271,7 +270,7 @@ arange_set_node_set_high (arange_set set
 
   if (set->value_p)
     {
-      container = (arange_value_container_t*) node->value;
+      container = (arange_value_container_t*) (ptrdiff_t) node->value;
       container->high = address;
     }
   else
@@ -296,7 +295,7 @@ arange_set_node_value (arange_set set, s
 
   if (set->value_p)
     {
-      container = (arange_value_container_t*) node->value;
+      container = (arange_value_container_t*) (ptrdiff_t) node->value;
       return container->value;
     }
 
@@ -315,7 +314,7 @@ arange_set_node_set_value (arange_set se
 
   if (set->value_p)
     {
-      container = (arange_value_container_t*) node->value;
+      container = (arange_value_container_t*) (ptrdiff_t) node->value;
       container->value = value;
     }
 }
@@ -445,7 +444,7 @@ arange_set_splay_tree_insert (arange_set
       container->set = set;
 
       container->value = value;
-      sp_value = (splay_tree_value) container;
+      sp_value = (splay_tree_value) (ptrdiff_t) container;
     }
   else
     sp_value = (splay_tree_value) high;	
--- binutils/bfd/bfd-in.h.splay	2008-01-25 09:01:03.000000000 -0800
+++ binutils/bfd/bfd-in.h	2008-02-09 07:41:55.000000000 -0800
@@ -984,3 +984,130 @@ struct coff_comdat_info
 extern struct coff_comdat_info *bfd_coff_get_comdat_section
   (bfd *, struct bfd_section *);
 
+#define splay_tree_key bfd_splay_tree_key
+#define splay_tree_value bfd_splay_tree_value
+#define splay_tree_node_s bfd_splay_tree_node_s
+#define splay_tree_node bfd_splay_tree_node
+#define splay_tree_compare_fn bfd_splay_tree_compare_fn
+#define splay_tree_delete_key_fn bfd_splay_tree_delete_key_fn
+#define splay_tree_delete_value_fn bfd_splay_tree_delete_value_fn
+#define splay_tree_foreach_fn bfd_splay_tree_foreach_fn
+#define splay_tree_allocate_fn bfd_splay_tree_allocate_fn
+#define splay_tree_deallocate_fn bfd_splay_tree_deallocate_fn
+#define splay_tree_s bfd_splay_tree_s
+#define splay_tree bfd_splay_tree
+#define splay_tree_new bfd_splay_tree_new
+#define splay_tree_new_with_allocator bfd_splay_tree_new_with_allocator
+#define splay_tree_delete bfd_splay_tree_delete
+#define splay_tree_insert bfd_splay_tree_insert
+#define splay_tree_remove bfd_splay_tree_remove
+#define splay_tree_lookup bfd_splay_tree_lookup
+#define splay_tree_predecessor bfd_splay_tree_predecessor
+#define splay_tree_successor bfd_splay_tree_successor
+#define splay_tree_max bfd_splay_tree_max
+#define splay_tree_min bfd_splay_tree_min
+#define splay_tree_foreach bfd_splay_tree_foreach
+#define splay_tree_compare_ints bfd_splay_tree_compare_ints
+#define splay_tree_compare_pointers bfd_splay_tree_compare_pointers
+
+#ifndef GTY
+#define GTY(X)
+#endif
+
+/* Use typedefs for the key and data types to facilitate changing
+   these types, if necessary.  These types should be sufficiently wide
+   that any pointer or scalar can be cast to these types, and then
+   cast back, without loss of precision.  */
+typedef bfd_vma splay_tree_key;
+typedef bfd_vma splay_tree_value;
+
+/* Forward declaration for a node in the tree.  */
+typedef struct splay_tree_node_s *splay_tree_node;
+
+/* The type of a function which compares two splay-tree keys.  The
+   function should return values as for qsort.  */
+typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key);
+
+/* The type of a function used to deallocate any resources associated
+   with the key.  */
+typedef void (*splay_tree_delete_key_fn) (splay_tree_key);
+
+/* The type of a function used to deallocate any resources associated
+   with the value.  */
+typedef void (*splay_tree_delete_value_fn) (splay_tree_value);
+
+/* The type of a function used to iterate over the tree.  */
+typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*);
+
+/* The type of a function used to allocate memory for tree root and
+   node structures.  The first argument is the number of bytes needed;
+   the second is a data pointer the splay tree functions pass through
+   to the allocator.  This function must never return zero.  */
+typedef void *(*splay_tree_allocate_fn) (int, void *);
+
+/* The type of a function used to free memory allocated using the
+   corresponding splay_tree_allocate_fn.  The first argument is the
+   memory to be freed; the latter is a data pointer the splay tree
+   functions pass through to the freer.  */
+typedef void (*splay_tree_deallocate_fn) (void *, void *);
+
+/* The nodes in the splay tree.  */
+struct splay_tree_node_s GTY(())
+{
+  /* The key.  */
+  splay_tree_key GTY ((use_param1)) key;
+
+  /* The value.  */
+  splay_tree_value GTY ((use_param2)) value;
+
+  /* The left and right children, respectively.  */
+  splay_tree_node GTY ((use_params)) left;
+  splay_tree_node GTY ((use_params)) right;
+};
+
+/* The splay tree itself.  */
+struct splay_tree_s GTY(())
+{
+  /* The root of the tree.  */
+  splay_tree_node GTY ((use_params)) root;
+
+  /* The comparision function.  */
+  splay_tree_compare_fn comp;
+
+  /* The deallocate-key function.  NULL if no cleanup is necessary.  */
+  splay_tree_delete_key_fn delete_key;
+
+  /* The deallocate-value function.  NULL if no cleanup is necessary.  */
+  splay_tree_delete_value_fn delete_value;
+
+  /* Allocate/free functions, and a data pointer to pass to them.  */
+  splay_tree_allocate_fn allocate;
+  splay_tree_deallocate_fn deallocate;
+  void * GTY((skip)) allocate_data;
+};
+
+typedef struct splay_tree_s *splay_tree;
+
+extern splay_tree splay_tree_new (splay_tree_compare_fn,
+				  splay_tree_delete_key_fn,
+				  splay_tree_delete_value_fn);
+extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn,
+						 splay_tree_delete_key_fn,
+						 splay_tree_delete_value_fn,
+						 splay_tree_allocate_fn,
+						 splay_tree_deallocate_fn,
+						 void *);
+extern void splay_tree_delete (splay_tree);
+extern splay_tree_node splay_tree_insert (splay_tree,
+					  splay_tree_key,
+					  splay_tree_value);
+extern void splay_tree_remove	(splay_tree, splay_tree_key);
+extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key);
+extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key);
+extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key);
+extern splay_tree_node splay_tree_max (splay_tree);
+extern splay_tree_node splay_tree_min (splay_tree);
+extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*);
+extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key);
+extern int splay_tree_compare_pointers (splay_tree_key,	splay_tree_key);
+
--- binutils/bfd/bfd-in2.h.splay	2008-02-04 11:50:44.000000000 -0800
+++ binutils/bfd/bfd-in2.h	2008-02-09 07:45:56.000000000 -0800
@@ -991,6 +991,133 @@ struct coff_comdat_info
 extern struct coff_comdat_info *bfd_coff_get_comdat_section
   (bfd *, struct bfd_section *);
 
+#define splay_tree_key bfd_splay_tree_key
+#define splay_tree_value bfd_splay_tree_value
+#define splay_tree_node_s bfd_splay_tree_node_s
+#define splay_tree_node bfd_splay_tree_node
+#define splay_tree_compare_fn bfd_splay_tree_compare_fn
+#define splay_tree_delete_key_fn bfd_splay_tree_delete_key_fn
+#define splay_tree_delete_value_fn bfd_splay_tree_delete_value_fn
+#define splay_tree_foreach_fn bfd_splay_tree_foreach_fn
+#define splay_tree_allocate_fn bfd_splay_tree_allocate_fn
+#define splay_tree_deallocate_fn bfd_splay_tree_deallocate_fn
+#define splay_tree_s bfd_splay_tree_s
+#define splay_tree bfd_splay_tree
+#define splay_tree_new bfd_splay_tree_new
+#define splay_tree_new_with_allocator bfd_splay_tree_new_with_allocator
+#define splay_tree_delete bfd_splay_tree_delete
+#define splay_tree_insert bfd_splay_tree_insert
+#define splay_tree_remove bfd_splay_tree_remove
+#define splay_tree_lookup bfd_splay_tree_lookup
+#define splay_tree_predecessor bfd_splay_tree_predecessor
+#define splay_tree_successor bfd_splay_tree_successor
+#define splay_tree_max bfd_splay_tree_max
+#define splay_tree_min bfd_splay_tree_min
+#define splay_tree_foreach bfd_splay_tree_foreach
+#define splay_tree_compare_ints bfd_splay_tree_compare_ints
+#define splay_tree_compare_pointers bfd_splay_tree_compare_pointers
+
+#ifndef GTY
+#define GTY(X)
+#endif
+
+/* Use typedefs for the key and data types to facilitate changing
+   these types, if necessary.  These types should be sufficiently wide
+   that any pointer or scalar can be cast to these types, and then
+   cast back, without loss of precision.  */
+typedef bfd_vma splay_tree_key;
+typedef bfd_vma splay_tree_value;
+
+/* Forward declaration for a node in the tree.  */
+typedef struct splay_tree_node_s *splay_tree_node;
+
+/* The type of a function which compares two splay-tree keys.  The
+   function should return values as for qsort.  */
+typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key);
+
+/* The type of a function used to deallocate any resources associated
+   with the key.  */
+typedef void (*splay_tree_delete_key_fn) (splay_tree_key);
+
+/* The type of a function used to deallocate any resources associated
+   with the value.  */
+typedef void (*splay_tree_delete_value_fn) (splay_tree_value);
+
+/* The type of a function used to iterate over the tree.  */
+typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*);
+
+/* The type of a function used to allocate memory for tree root and
+   node structures.  The first argument is the number of bytes needed;
+   the second is a data pointer the splay tree functions pass through
+   to the allocator.  This function must never return zero.  */
+typedef void *(*splay_tree_allocate_fn) (int, void *);
+
+/* The type of a function used to free memory allocated using the
+   corresponding splay_tree_allocate_fn.  The first argument is the
+   memory to be freed; the latter is a data pointer the splay tree
+   functions pass through to the freer.  */
+typedef void (*splay_tree_deallocate_fn) (void *, void *);
+
+/* The nodes in the splay tree.  */
+struct splay_tree_node_s GTY(())
+{
+  /* The key.  */
+  splay_tree_key GTY ((use_param1)) key;
+
+  /* The value.  */
+  splay_tree_value GTY ((use_param2)) value;
+
+  /* The left and right children, respectively.  */
+  splay_tree_node GTY ((use_params)) left;
+  splay_tree_node GTY ((use_params)) right;
+};
+
+/* The splay tree itself.  */
+struct splay_tree_s GTY(())
+{
+  /* The root of the tree.  */
+  splay_tree_node GTY ((use_params)) root;
+
+  /* The comparision function.  */
+  splay_tree_compare_fn comp;
+
+  /* The deallocate-key function.  NULL if no cleanup is necessary.  */
+  splay_tree_delete_key_fn delete_key;
+
+  /* The deallocate-value function.  NULL if no cleanup is necessary.  */
+  splay_tree_delete_value_fn delete_value;
+
+  /* Allocate/free functions, and a data pointer to pass to them.  */
+  splay_tree_allocate_fn allocate;
+  splay_tree_deallocate_fn deallocate;
+  void * GTY((skip)) allocate_data;
+};
+
+typedef struct splay_tree_s *splay_tree;
+
+extern splay_tree splay_tree_new (splay_tree_compare_fn,
+				  splay_tree_delete_key_fn,
+				  splay_tree_delete_value_fn);
+extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn,
+						 splay_tree_delete_key_fn,
+						 splay_tree_delete_value_fn,
+						 splay_tree_allocate_fn,
+						 splay_tree_deallocate_fn,
+						 void *);
+extern void splay_tree_delete (splay_tree);
+extern splay_tree_node splay_tree_insert (splay_tree,
+					  splay_tree_key,
+					  splay_tree_value);
+extern void splay_tree_remove	(splay_tree, splay_tree_key);
+extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key);
+extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key);
+extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key);
+extern splay_tree_node splay_tree_max (splay_tree);
+extern splay_tree_node splay_tree_min (splay_tree);
+extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*);
+extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key);
+extern int splay_tree_compare_pointers (splay_tree_key,	splay_tree_key);
+
 /* Extracted from init.c.  */
 void bfd_init (void);
 
--- binutils/bfd/splay-tree.c.splay	2008-02-09 07:28:49.000000000 -0800
+++ binutils/bfd/splay-tree.c	2008-02-09 07:28:49.000000000 -0800
@@ -0,0 +1,24 @@
+/* A splay-tree for BFD.
+   Copyright 2008 Free Software Foundation, Inc.
+
+   This file is part of BFD, the Binary File Descriptor library.
+
+   This program 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 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "sysdep.h"
+#include "bfd.h"
+#include "libiberty.h"
+#include "../libiberty/splay-tree.c"
--- binutils/libiberty/splay-tree.c.splay	2008-01-21 16:52:44.000000000 -0800
+++ binutils/libiberty/splay-tree.c	2008-02-09 07:57:54.000000000 -0800
@@ -24,6 +24,8 @@ Boston, MA 02110-1301, USA.  */
      Lewis, Harry R. and Denenberg, Larry.  Data Structures and Their
      Algorithms.  Harper-Collins, Inc.  1991.  */
 
+/* Include those header files only when built outside of BFD.  */
+#ifndef BFD_ARCH_SIZE
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -32,10 +34,12 @@ Boston, MA 02110-1301, USA.  */
 #include <stdlib.h>
 #endif
 
+#include <stddef.h>
 #include <stdio.h>
 
 #include "libiberty.h"
 #include "splay-tree.h"
+#endif
 
 static void splay_tree_delete_helper (splay_tree, splay_tree_node);
 static inline void rotate_left (splay_tree_node *,
@@ -64,7 +68,7 @@ splay_tree_delete_helper (splay_tree sp,
   VDEL (node->value);
 
   /* We use the "key" field to hold the "next" pointer.  */
-  node->key = (splay_tree_key)pending;
+  node->key = (splay_tree_key) (ptrdiff_t) pending;
   pending = (splay_tree_node)node;
 
   /* Now, keep processing the pending list until there aren't any
@@ -86,19 +90,19 @@ splay_tree_delete_helper (splay_tree sp,
 	    {
 	      KDEL (active->left->key);
 	      VDEL (active->left->value);
-	      active->left->key = (splay_tree_key)pending;
+	      active->left->key = (splay_tree_key) (ptrdiff_t) pending;
 	      pending = (splay_tree_node)(active->left);
 	    }
 	  if (active->right)
 	    {
 	      KDEL (active->right->key);
 	      VDEL (active->right->value);
-	      active->right->key = (splay_tree_key)pending;
+	      active->right->key = (splay_tree_key) (ptrdiff_t) pending;
 	      pending = (splay_tree_node)(active->right);
 	    }
 
 	  temp = active;
-	  active = (splay_tree_node)(temp->key);
+	  active = (splay_tree_node) (ptrdiff_t) (temp->key);
 	  (*sp->deallocate) ((char*) temp, sp->allocate_data);
 	}
     }
@@ -517,9 +521,9 @@ splay_tree_compare_ints (splay_tree_key 
 int
 splay_tree_compare_pointers (splay_tree_key k1, splay_tree_key k2)
 {
-  if ((char*) k1 < (char*) k2)
+  if ((ptrdiff_t) k1 < (ptrdiff_t) k2)
     return -1;
-  else if ((char*) k1 > (char*) k2)
+  else if ((ptrdiff_t) k1 > (ptrdiff_t) k2)
     return 1;
   else 
     return 0;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]