glibc 2.2.4pre2
Andreas Jaeger
aj@suse.de
Thu Aug 9 01:26:00 GMT 2001
Jakub, your patch to crtstuff.c was broken. You didn't include
"auto-host.h" and therefore HAVE_GAS_HIDDEN was never defined. Also
__cxa_finalize was not run at all.
I've fixed your patch and generated a new version. It passed make
check in glibc (current CVS version) on i686-linux including the
tstcxaatexit test.
Bernd, can you add this to 2.95.x, please?
Andreas
--- gcc-2.95.x/gcc/config/alpha/crtbegin.asm.jj Wed Dec 16 22:00:53 1998
+++ gcc-2.95.x/gcc/config/alpha/crtbegin.asm Wed Jun 13 12:41:28 2001
@@ -97,6 +97,31 @@ __EH_FRAME_BEGIN__:
# Support recursive calls to exit.
$ptr: .quad __DTOR_LIST__
+/* A globally unique widget for c++ local destructors to hang off.
+
+ This has a unique value in every dso; in the main program its
+ value is zero. The object should be protected. This means the
+ instance in any dso or the main program is not used in any other
+ dso. The dynamic linker takes care of this. */
+
+ .global __dso_handle
+ .type __dso_handle,@object
+ .size __dso_handle,8
+#ifdef SHARED
+.section .data
+ .align 3
+__dso_handle:
+ .quad __dso_handle
+#else
+.section .bss
+ .align 3
+__dso_handle:
+ .zero 8
+#endif
+#ifdef HAVE_GAS_HIDDEN
+ .hidden __dso_handle
+#endif
+
.text
.align 3
============================================================
Index: gcc/crtstuff.c
--- gcc-2.95.x/gcc/crtstuff.c 2001/04/03 10:34:32 1.18.4.1
+++ gcc-2.95.x/gcc/crtstuff.c 2001/08/09 06:56:33
@@ -55,6 +55,7 @@ Boston, MA 02111-1307, USA. */
#include "defaults.h"
#include <stddef.h>
#include "frame.h"
+#include "auto-host.h"
/* We do not want to add the weak attribute to the declarations of these
routines in frame.h because that will cause the definition of these
@@ -134,7 +135,29 @@ typedef void (*func_ptr) (void);
#ifdef INIT_SECTION_ASM_OP
#ifdef OBJECT_FORMAT_ELF
+/* Declare the __dso_handle variable. It should have a unique value
+ in every shared-object; in a main program its value is zero. The
+ object should in any case be protected. This means the instance
+ in one DSO or the main program is not used in another object. The
+ dynamic linker takes care of this. */
+
+/* XXX Ideally the following should be implemented using
+ __attribute__ ((__visibility__ ("hidden")))
+ but the __attribute__ support is not yet there. */
+#ifdef HAVE_GAS_HIDDEN
+asm (".hidden\t__dso_handle");
+#endif
+
+#ifdef CRTSTUFFS_O
+void *__dso_handle = &__dso_handle;
+#else
+void *__dso_handle = 0;
+#endif
+/* The __cxa_finalize function may not be available so we use only a
+ weak declaration. */
+extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;
+
/* Run all the global destructors on exit from the program. */
/* Some systems place the number of pointers in the first word of the
@@ -164,6 +187,11 @@ __do_global_dtors_aux (void)
if (completed)
return;
+
+#ifdef CRTSTUFFS_O
+ if (__cxa_finalize)
+ __cxa_finalize (__dso_handle);
+#endif
while (*p)
{
--- gcc-2.95.x/gcc/configure.in.jj Wed Oct 13 09:58:02 1999
+++ gcc-2.95.x/gcc/configure.in Wed Jun 13 12:44:34 2001
@@ -4053,6 +4053,21 @@ EOF
fi
AC_MSG_RESULT($gcc_cv_as_subsections)
+AC_MSG_CHECKING(assembler hidden support)
+gcc_cv_as_hidden=
+if test x$gcc_cv_as != x; then
+ # Check if we have .hidden
+ echo " .hidden foobar" > conftest.s
+ echo "foobar:" >> conftest.s
+ if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
+ AC_DEFINE(HAVE_GAS_HIDDEN, 1,
+ [Define if your assembler supports .hidden.])
+ gcc_cv_as_hidden="yes"
+ fi
+ rm -f conftest.s conftest.o conftest.nm1 conftest.nm2
+fi
+AC_MSG_RESULT($gcc_cv_as_hidden)
+
AC_MSG_CHECKING(assembler instructions)
gcc_cv_as_instructions=
if test x$gcc_cv_as != x; then
--- gcc-2.95.x/gcc/config.in.jj Mon Oct 25 10:02:08 1999
+++ gcc-2.95.x/gcc/config.in Wed Jun 13 12:45:56 2001
2 the beginning of your section */
#undef HAVE_GAS_SUBSECTION_ORDERING
+/* Define if your assembler supports .hidden. */
+#undef HAVE_GAS_HIDDEN
+
/* Define if your assembler uses the old HImode fild and fist notation. */
#undef HAVE_GAS_FILDS_FISTS
--
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iD8DBQE7ckkVOJpWPMJyoSYRAk//AJ4z7cjDCYOThG9gHh3e3dcKtdj7JQCfXvQh
8Szhp0L8mp0a0h1u9EKYXm8=
=xy9U
-----END PGP SIGNATURE-----From isamu@yamato.ibm.com Thu Aug 09 03:19:00 2001
From: Isamu Hasegawa <isamu@yamato.ibm.com>
To: libc-alpha@sourceware.cygnus.com
Cc: shoji@jp.ibm.com
Subject: Bugs in ld-collate.c?
Date: Thu, 09 Aug 2001 03:19:00 -0000
Message-id: <u3d71r0wh.wl@YMTISAMU-H.yamato.ibm.com>
X-SW-Source: 2001-08/msg00115.html
Content-length: 4241
Hello again,
In locale/programs/ld-collate.c, line.2459...2502:
> if (elem_table[idx * 2] != 0)
> {
> /* The spot is already take. Try iterating using the value
> from the secondary hashing function. */
[snip]
> while (elem_table[idx * 2] != 0);
>
> /* This is the spot where we will insert the value. */
[snip]
> obstack_int32_grow (&extrapool, runp->wcseqorder);
> }
In case of (elem_table[idx * 2] == 0), current collating element
isn't writed to elem_table. I think if clause should close at just
after do-while clause.
And in line.2452:
> if (runp->mbs != NULL && runp->weights != NULL)
I'm not sure, but I think characters are also exclude from elem_table,
because the max size of elem_size is 257. Then the condition should
be like this?
if (runp->mbs != NULL && runp->weights != NULL && !runp->is_character)
If my interpretations are correct, how about the attached patch?
# It seems to be a bit longer, but it is because of just reformating.
Changelog entry:
2001-08-09 Isamu Hasegawa <isamu@yamato.ibm.com>
* locale/programs/ld-collate.c (collate_output): Exclude
characters from elem_table.
Reduce if clause to write collating elements correctly.
Thanks,
--
Isamu Hasegawa
IBM Japan, Ltd.
Index: locale/programs/ld-collate.c
===================================================================
RCS file: /cvs/glibc/libc/locale/programs/ld-collate.c,v
retrieving revision 1.96
diff -u -r1.96 ld-collate.c
--- ld-collate.c 2001/08/04 05:12:33 1.96
+++ ld-collate.c 2001/08/09 09:48:39
@@ -2449,7 +2449,7 @@
runp = collate->start;
while (runp != NULL)
{
- if (runp->mbs != NULL && runp->weights != NULL)
+ if (runp->mbs != NULL && runp->weights != NULL && !runp->is_character)
{
/* Compute the hash value of the name. */
uint32_t namelen = strlen (runp->name);
@@ -2469,37 +2469,36 @@
idx -= elem_size;
}
while (elem_table[idx * 2] != 0);
-
- /* This is the spot where we will insert the value. */
- elem_table[idx * 2] = hash;
- elem_table[idx * 2 + 1] = obstack_object_size (&extrapool);
-
- /* The the string itself including length. */
- obstack_1grow (&extrapool, namelen);
- obstack_grow (&extrapool, runp->name, namelen);
-
- /* And the multibyte representation. */
- obstack_1grow (&extrapool, runp->nmbs);
- obstack_grow (&extrapool, runp->mbs, runp->nmbs);
-
- /* And align again to 32 bits. */
- if ((1 + namelen + 1 + runp->nmbs) % sizeof (int32_t) != 0)
- obstack_grow (&extrapool, "\0\0",
- (sizeof (int32_t)
- - ((1 + namelen + 1 + runp->nmbs)
- % sizeof (int32_t))));
-
- /* Now some 32-bit values: multibyte collation sequence,
- wide char string (including length), and wide char
- collation sequence. */
- obstack_int32_grow (&extrapool, runp->mbseqorder);
-
- obstack_int32_grow (&extrapool, runp->nwcs);
- obstack_grow (&extrapool, runp->wcs,
- runp->nwcs * sizeof (uint32_t));
-
- obstack_int32_grow (&extrapool, runp->wcseqorder);
}
+ /* This is the spot where we will insert the value. */
+ elem_table[idx * 2] = hash;
+ elem_table[idx * 2 + 1] = obstack_object_size (&extrapool);
+
+ /* The the string itself including length. */
+ obstack_1grow (&extrapool, namelen);
+ obstack_grow (&extrapool, runp->name, namelen);
+
+ /* And the multibyte representation. */
+ obstack_1grow (&extrapool, runp->nmbs);
+ obstack_grow (&extrapool, runp->mbs, runp->nmbs);
+
+ /* And align again to 32 bits. */
+ if ((1 + namelen + 1 + runp->nmbs) % sizeof (int32_t) != 0)
+ obstack_grow (&extrapool, "\0\0",
+ (sizeof (int32_t)
+ - ((1 + namelen + 1 + runp->nmbs)
+ % sizeof (int32_t))));
+
+ /* Now some 32-bit values: multibyte collation sequence,
+ wide char string (including length), and wide char
+ collation sequence. */
+ obstack_int32_grow (&extrapool, runp->mbseqorder);
+
+ obstack_int32_grow (&extrapool, runp->nwcs);
+ obstack_grow (&extrapool, runp->wcs,
+ runp->nwcs * sizeof (uint32_t));
+
+ obstack_int32_grow (&extrapool, runp->wcseqorder);
}
runp = runp->next;
More information about the Libc-alpha
mailing list