Message ID | mp7b4a$8q4$1@ger.gmane.org |
---|---|
State | Committed |
Headers |
Received: (qmail 119254 invoked by alias); 28 Jul 2015 07:31:36 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: <libc-alpha.sourceware.org> List-Unsubscribe: <mailto:libc-alpha-unsubscribe-##L=##H@sourceware.org> List-Subscribe: <mailto:libc-alpha-subscribe@sourceware.org> List-Archive: <http://sourceware.org/ml/libc-alpha/> List-Post: <mailto:libc-alpha@sourceware.org> List-Help: <mailto:libc-alpha-help@sourceware.org>, <http://sourceware.org/ml/#faqs> Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 119243 invoked by uid 89); 28 Jul 2015 07:31:35 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: plane.gmane.org To: libc-alpha@sourceware.org From: Stefan Liebler <stli@linux.vnet.ibm.com> Subject: [PATCH] Adjust _Unwind_Word in unwind.h to version in libgcc. Date: Tue, 28 Jul 2015 09:31:21 +0200 Lines: 89 Message-ID: <mp7b4a$8q4$1@ger.gmane.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050709010308080602080408" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 |
Commit Message
Stefan Liebler
July 28, 2015, 7:31 a.m. UTC
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.
Comments
I see three uses of _Unwind_Word as a pointer: in sysdeps/generic/unwind-dw2.c _Unwind_GetGR and _Unwind_SetGR and in sysdeps/generic/unwind-pe.h read_uleb128. Is the new definition correct for them? Andreas.
On 07/28/2015 10:05 AM, Andreas Schwab wrote: > I see three uses of _Unwind_Word as a pointer: in > sysdeps/generic/unwind-dw2.c _Unwind_GetGR and _Unwind_SetGR and in > sysdeps/generic/unwind-pe.h read_uleb128. Is the new definition correct > for them? > > Andreas. > sysdeps/generic/unwind-pe.h read_uleb128: _Unwind_Word has now a size of 4bytes on s390-32 (esa or zarch mode), which can store a pointer, which has 4bytes on s390-32 (esa or zarch mode). On s390-64 both _Unwind_Word and a pointer have a size of 8 bytes. sysdeps/generic/unwind-dw2.c _Unwind_GetGR and _Unwind_SetGR: Here the 4 bytes on s390-32 (esa or zarch mode) is correct, too. Without this patch, 8 bytes would be dereferenced on s390-32 (zarch-mode), which is incorrect. For s390-64, 8 bytes is correct.
On 07/28/2015 09:32 AM, Stefan Liebler wrote: > On 07/28/2015 10:05 AM, Andreas Schwab wrote: >> I see three uses of _Unwind_Word as a pointer: in >> sysdeps/generic/unwind-dw2.c _Unwind_GetGR and _Unwind_SetGR and in >> sysdeps/generic/unwind-pe.h read_uleb128. Is the new definition correct >> for them? >> >> Andreas. >> > > sysdeps/generic/unwind-pe.h read_uleb128: > _Unwind_Word has now a size of 4bytes on s390-32 (esa or zarch mode), > which can store a pointer, which has 4bytes on s390-32 (esa or zarch mode). On s390-64 both _Unwind_Word and a pointer have a size of 8 bytes. > > sysdeps/generic/unwind-dw2.c _Unwind_GetGR and _Unwind_SetGR: > Here the 4 bytes on s390-32 (esa or zarch mode) is correct, too. > Without this patch, 8 bytes would be dereferenced on s390-32 (zarch-mode), which is incorrect. > For s390-64, 8 bytes is correct. > Does this mean s390 has 2 supported ABIs for 32-bit? If so, we should adjust: https://sourceware.org/glibc/wiki/ABIList?highlight=%28ABI%29#s390 Cheers, Carlos.
On Fri, Jul 31, 2015 at 09:18:46AM -0400, Carlos O'Donell wrote: > > Does this mean s390 has 2 supported ABIs for 32-bit? > > If so, we should adjust: > > https://sourceware.org/glibc/wiki/ABIList?highlight=%28ABI%29#s390 No, there is only one ABI for s390-32. s390-32 ESA and s390-32 ZARCH both are supposed to adhere to the 31 bit ABI. The latter will use 64 bit registers only in non-ABI relevant situations. In order to achieve this in GCC we had to increase the register size to 64 bit even when compiling with -m31. Unfortunately the register size was exposed to outside GCC in some places (e.g. mode(__word__)). That's why something like __unwind_word__ was invented (there are others). mode("__unwind_word__") changes only with ABI switches (-m31/-m64) while mode("__word__") does change with -mesa/-mzarch. What Stefan just fixed was a problem where the libgcc and Glibc unwind code was out of sync. Bye, -Andreas-
On 07/31/2015 09:53 AM, Andreas Krebbel wrote: > On Fri, Jul 31, 2015 at 09:18:46AM -0400, Carlos O'Donell wrote: >> >> Does this mean s390 has 2 supported ABIs for 32-bit? >> >> If so, we should adjust: >> >> https://sourceware.org/glibc/wiki/ABIList?highlight=%28ABI%29#s390 > > No, there is only one ABI for s390-32. s390-32 ESA and s390-32 ZARCH > both are supposed to adhere to the 31 bit ABI. The latter will use 64 > bit registers only in non-ABI relevant situations. In order to > achieve this in GCC we had to increase the register size to 64 bit > even when compiling with -m31. Unfortunately the register size was > exposed to outside GCC in some places (e.g. mode(__word__)). That's > why something like __unwind_word__ was invented (there are others). > mode("__unwind_word__") changes only with ABI switches (-m31/-m64) > while mode("__word__") does change with -mesa/-mzarch. > > What Stefan just fixed was a problem where the libgcc and Glibc unwind > code was out of sync. Thanks for explaining that. Cheers, Carlos.
ping Ok to commit? On 07/28/2015 09:31 AM, Stefan Liebler wrote: > 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.
Stefan Liebler <stli@linux.vnet.ibm.com> writes: > 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. Ok. Andreas.
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