Skip to content

Commit

Permalink
PR libffi/60073
Browse files Browse the repository at this point in the history
	* src/sparc/ffitarget.h (FFI_TARGET_SPECIFIC_VARIADIC): Define.
	(FFI_EXTRA_CIF_FIELDS): Likewise.
	(FFI_NATIVE_RAW_API): Move around.
	* src/sparc/ffi.c (ffi_prep_cif_machdep_core): New function from...
	(ffi_prep_cif_machdep): ...here.  Call ffi_prep_cif_machdep_core.
	(ffi_prep_cif_machdep_var): New function.
	(ffi_closure_sparc_inner_v9): Do not pass anonymous FP arguments in
	FP registers.
	* doc/libffi.texi (Introduction): Fix inaccuracy.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207763 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
ebotcazou committed Feb 13, 2014
1 parent c59e4c4 commit be24203
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 12 deletions.
15 changes: 14 additions & 1 deletion libffi/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
2014-02-13 Eric Botcazou <ebotcazou@adacore.com>

PR libffi/60073
* src/sparc/ffitarget.h (FFI_TARGET_SPECIFIC_VARIADIC): Define.
(FFI_EXTRA_CIF_FIELDS): Likewise.
(FFI_NATIVE_RAW_API): Move around.
* src/sparc/ffi.c (ffi_prep_cif_machdep_core): New function from...
(ffi_prep_cif_machdep): ...here. Call ffi_prep_cif_machdep_core.
(ffi_prep_cif_machdep_var): New function.
(ffi_closure_sparc_inner_v9): Do not pass anonymous FP arguments in
FP registers.
* doc/libffi.texi (Introduction): Fix inaccuracy.

2013-12-10 Alan Modra <amodra@gmail.com>

* src/powerpc/ffitarget.h: Import from upstream.
Expand Down Expand Up @@ -729,7 +742,7 @@
* src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
just return FFI_BAD_ABI when things are wrong.

2012-02-11 Eric Botcazou <ebotcazou@adacore.com>
2011-02-11 Eric Botcazou <ebotcazou@adacore.com>

* src/sparc/v9.S (STACKFRAME): Bump to 176.

Expand Down
6 changes: 3 additions & 3 deletions libffi/doc/libffi.texi
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,14 @@ section entitled ``GNU General Public License''.
@node Introduction
@chapter What is libffi?

Compilers for high level languages generate code that follow certain
Compilers for high-level languages generate code that follow certain
conventions. These conventions are necessary, in part, for separate
compilation to work. One such convention is the @dfn{calling
convention}. The calling convention is a set of assumptions made by
the compiler about where function arguments will be found on entry to
a function. A calling convention also specifies where the return
value for a function is found. The calling convention is also
sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}.
value for a function is found. The calling convention is part of
what is called the @dfn{ABI} or @dfn{Application Binary Interface}.
@cindex calling convention
@cindex ABI
@cindex Application Binary Interface
Expand Down
29 changes: 24 additions & 5 deletions libffi/src/sparc/ffi.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ int ffi_prep_args_v9(char *stack, extended_cif *ecif)
}

/* Perform machine dependent cif processing */
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
static ffi_status ffi_prep_cif_machdep_core(ffi_cif *cif)
{
int wordsize;

Expand Down Expand Up @@ -334,6 +334,19 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
return FFI_OK;
}

ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
{
cif->nfixedargs = cif->nargs;
return ffi_prep_cif_machdep_core (cif);
}

ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs,
unsigned int ntotalargs)
{
cif->nfixedargs = nfixedargs;
return ffi_prep_cif_machdep_core (cif);
}

int ffi_v9_layout_struct(ffi_type *arg, int off, char *ret, char *intg, char *flt)
{
ffi_type **ptr = &arg->elements[0];
Expand Down Expand Up @@ -604,8 +617,7 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,

/* Copy the caller's structure return address so that the closure
returns the data directly to the caller. */
if (cif->flags == FFI_TYPE_VOID
&& cif->rtype->type == FFI_TYPE_STRUCT)
if (cif->flags == FFI_TYPE_VOID && cif->rtype->type == FFI_TYPE_STRUCT)
{
rvalue = (void *) gpr[0];
/* Skip the structure return address. */
Expand All @@ -619,6 +631,10 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
/* Grab the addresses of the arguments from the stack frame. */
for (i = 0; i < cif->nargs; i++)
{
/* If the function is variadic, FP arguments are passed in FP
registers only if the corresponding parameter is named. */
const int named = (i < cif->nfixedargs);

if (arg_types[i]->type == FFI_TYPE_STRUCT)
{
if (arg_types[i]->size > 16)
Expand All @@ -633,7 +649,9 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
0,
(char *) &gpr[argn],
(char *) &gpr[argn],
(char *) &fpr[argn]);
named
? (char *) &fpr[argn]
: (char *) &gpr[argn]);
avalue[i] = &gpr[argn];
argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
}
Expand All @@ -649,6 +667,7 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
argn++;
#endif
if (i < fp_slot_max
&& named
&& (arg_types[i]->type == FFI_TYPE_FLOAT
|| arg_types[i]->type == FFI_TYPE_DOUBLE
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
Expand All @@ -662,7 +681,7 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
}

/* Invoke the closure. */
(closure->fun) (cif, rvalue, avalue, closure->user_data);
closure->fun (cif, rvalue, avalue, closure->user_data);

/* Tell ffi_closure_sparc how to perform return type promotions. */
return cif->rtype->type;
Expand Down
7 changes: 4 additions & 3 deletions libffi/src/sparc/ffitarget.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,16 +58,17 @@ typedef enum ffi_abi {
} ffi_abi;
#endif

#define FFI_TARGET_SPECIFIC_VARIADIC 1
#define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs

/* ---- Definitions for closures ----------------------------------------- */

#define FFI_CLOSURES 1
#define FFI_NATIVE_RAW_API 0

#ifdef SPARC64
#define FFI_TRAMPOLINE_SIZE 24
#else
#define FFI_TRAMPOLINE_SIZE 16
#endif
#define FFI_NATIVE_RAW_API 0

#endif

0 comments on commit be24203

Please sign in to comment.