This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Adjust _Unwind_Word in unwind.h to version in libgcc.
- From: Stefan Liebler <stli at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Tue, 28 Jul 2015 09:31:21 +0200
- Subject: [PATCH] Adjust _Unwind_Word in unwind.h to version in libgcc.
- Authentication-results: sourceware.org; auth=none
Hi,
I get the following warning while building glibc on s390-32 with gcc
option -mzarch:
In file included from unwind.c:26:0:
unwind.c: In function 'unwind_stop':
../sysdeps/s390/jmpbuf-unwind.h:37:10: error: cast to pointer from
integer of different size [-Werror=int-to-pointer-cast]
(void *) (_Unwind_GetCFA (_context) \
^
../sysdeps/s390/jmpbuf-unwind.h:51:17: note: in definition of macro
'_JMPBUF_UNWINDS_ADJ'
((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
^
unwind.c:62:12: note: in expansion of macro '_JMPBUF_CFA_UNWINDS_ADJ'
|| ! _JMPBUF_CFA_UNWINDS_ADJ (buf->cancel_jmp_buf[0].jmp_buf,
context,
Building on s390-32 in esa-mode or s390-64 is fine.
_Unwind_GetCFA returns an _Unwind_Word which is an unsigned
with a size of 4 bytes on s390-32 (esa-mode) and 8 bytes on s390-64.
On s390-32 (zarch-mode), _Unwind_Word has a size of 8 bytes, too.
_Unwind_Word is defined in sysdeps/generic/unwind.h as
typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
In libgcc unwind header (<gcc-src>/libgcc/unwind-generic.h) this typedef
has changed to
"typedef unsigned _Unwind_Word
__attribute__((__mode__(__unwind_word__)));" in June 2008.
With this mode, _Unwind_Word has a size of 4 bytes on s390-32 (zarch-mode).
The same change applies to _Unwind_Sword.
Thus this patch updates the unwind header according to these changes.
Afterwards, the int-to-pointer-cast-warning is gone away on s390-32
(zarch-mode) and the testsuite runs with the same test-failures as
s390-32 (esa-mode) plus FAIL: c++-types-check. Here register_t is
expected to has a size of 4 bytes, but it has a size of 8 bytes
due to
posix/sys/types.h:205:typedef int register_t __attribute__ ((__mode__
(__word__)));
The libgcc-patch for gcc 4.4 can be found here:
"[PATCH, spu, unwind] Remove attribute ((mode (word))) from unwind.h"
https://gcc.gnu.org/ml/gcc-patches/2008-06/msg00969.html
Ok to commit?
Bye
Stefan
2015-07-28 Stefan Liebler <stli@linux.vnet.ibm.com>
* sysdeps/generic/unwind.h
(_Unwind_Word): Use __mode__(__unwind_word__)
instead of __mode__(__word__).
(_Unwind_Sword): Likewise.
diff --git a/sysdeps/generic/unwind.h b/sysdeps/generic/unwind.h
index 41b6aec..75d3084 100644
--- a/sysdeps/generic/unwind.h
+++ b/sysdeps/generic/unwind.h
@@ -31,8 +31,8 @@ extern "C" {
/* @@@ The IA-64 ABI uses uint64 throughout. Most places this is
inefficient for 32-bit and smaller machines. */
-typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
-typedef signed _Unwind_Sword __attribute__((__mode__(__word__)));
+typedef unsigned _Unwind_Word __attribute__((__mode__(__unwind_word__)));
+typedef signed _Unwind_Sword __attribute__((__mode__(__unwind_word__)));
#if defined(__ia64__) && defined(__hpux__)
typedef unsigned _Unwind_Ptr __attribute__((__mode__(__word__)));
#else