PATCH: PR ld/5303: splay-tree doesn't support 64bit value on 32bit host
H.J. Lu
hjl.tools@gmail.com
Sat Feb 9 16:22:00 GMT 2008
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;
More information about the Gcc-patches
mailing list