This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch] libffi, fix powerpc-unknown-freebsd
- From: Andreas Tobler <andreast-list at fgznet dot ch>
- To: David Edelsohn <dje dot gcc at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Java Patches <java-patches at gcc dot gnu dot org>
- Date: Thu, 21 Aug 2008 23:53:50 +0200
- Subject: Re: [patch] libffi, fix powerpc-unknown-freebsd
- References: <303e1d290808200807p62fd1a4btc253c532e749da30@mail.gmail.com>
David Edelsohn wrote:
* src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and
FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum.
Adjust copyright notice.
* src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix bit position
calculation for FFI_SYSV_TYPE_SMALL_STRUCT.
(ffi_closure_helper_SYSV): Fix return type for
FFI_SYSV_TYPE_SMALL_STRUCT.
Adjust copyright notice.
Okay.
Please add more documentation for FFI_SYSV_TYPE_SMALL_STRUCT -- what
it represents and that it uses two bits.
Sigh, I expected that... I should know you :)
Here another iteration.
Instead of playing with FFI_SYSV_TYPE_SMALL_STRUCT for bit shifts I
introduced two new flags which tell us if we need r3 or r3 and r4 for
structs passing.
The issue is this, I need to tell the ppc_closure.S exactly which type I
expect when returning. And unfortunatley the implementation needs a
distinction for every type and size. Type 1 to 15 are already used, so I
can start with using type 16 and up.
If it is still not clear, let me know, I try to be more verbose then.
The attached patch was tested under fbsd-7.0 gcc-4.3 and trunk.
Currently a ppc-linux build is running for base config and also for
soft-float.
2008-08-21 Andreas Tobler <a.tobler@schweiz.org>
* src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and
FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum.
Adjust copyright notice.
* src/powerpc/ffi.c: Add two new flags to indicate if we have one
register or two register to use for FFI_SYSV structs.
(ffi_prep_cif_machdep): Pass the right register flag introduced above.
(ffi_closure_helper_SYSV): Fix the return type for
FFI_SYSV_TYPE_SMALL_STRUCT. Comment.
Adjust copyright notice.
Index: src/powerpc/ffitarget.h
===================================================================
--- src/powerpc/ffitarget.h (revision 139412)
+++ src/powerpc/ffitarget.h (working copy)
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
- Copyright (C) 2007 Free Software Foundation, Inc
+ Copyright (C) 2007, 2008 Free Software Foundation, Inc
Target configuration macros for PowerPC.
Permission is hereby granted, free of charge, to any person obtaining
@@ -77,6 +77,8 @@
FFI_SYSV,
FFI_GCC_SYSV,
FFI_LINUX64,
+ FFI_LINUX,
+ FFI_LINUX_SOFT_FLOAT,
FFI_DEFAULT_ABI = FFI_SYSV,
#endif
Index: src/powerpc/ffi.c
===================================================================
--- src/powerpc/ffi.c (revision 139412)
+++ src/powerpc/ffi.c (working copy)
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------------
ffi.c - Copyright (c) 1998 Geoffrey Keating
- Copyright (C) 2007 Free Software Foundation, Inc
+ Copyright (C) 2007, 2008 Free Software Foundation, Inc
PowerPC Foreign Function Interface
@@ -43,6 +43,10 @@
FLAG_RETURNS_128BITS = 1 << (31-27), /* cr6 */
+ FLAG_SYSV_SMST_R4 = 1 << (31-16), /* cr4, use r4 for FFI_SYSV 8 byte
+ structs. */
+ FLAG_SYSV_SMST_R3 = 1 << (31-15), /* cr3, use r3 for FFI_SYSV 4 byte
+ structs. */
FLAG_ARG_NEEDS_COPY = 1 << (31- 7),
FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */
FLAG_4_GPR_ARGUMENTS = 1 << (31- 5),
@@ -679,14 +683,14 @@
The same applies for the structs returned in r3/r4. */
if (size <= 4)
{
- flags |= 1 << (31 - FFI_SYSV_TYPE_SMALL_STRUCT - 1);
+ flags |= FLAG_SYSV_SMST_R3;
flags |= 8 * (4 - size) << 4;
break;
}
/* These structs are returned in r3 and r4. See above. */
if (size <= 8)
{
- flags |= 1 << (31 - FFI_SYSV_TYPE_SMALL_STRUCT - 2);
+ flags |= FLAG_SYSV_SMST_R4;
flags |= 8 * (8 - size) << 4;
break;
}
@@ -1248,10 +1252,15 @@
/* Tell ffi_closure_SYSV how to perform return type promotions.
Because the FFI_SYSV ABI returns the structures <= 8 bytes in r3/r4
- we have to tell ffi_closure_SYSV how to treat them. */
+ we have to tell ffi_closure_SYSV how to treat them. We combine the base
+ type FFI_SYSV_TYPE_SMALL_STRUCT - 1 with the size of the struct.
+ So a one byte struct gets the return type 16. Return type 1 to 15 are
+ already used and we never have a struct with size zero. That is the reason
+ for the subtraction of 1. See the comment in ffitarget.h about ordering.
+ */
if (cif->abi == FFI_SYSV && cif->rtype->type == FFI_TYPE_STRUCT
&& size <= 8)
- return FFI_SYSV_TYPE_SMALL_STRUCT + size;
+ return (FFI_SYSV_TYPE_SMALL_STRUCT - 1) + size;
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
else if (cif->rtype->type == FFI_TYPE_LONGDOUBLE
&& cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)