dev-libs/libffi: Sync with Gentoo

It's from Gentoo commit 8ac8a253745bf7a024857d743a29ad7d6d942e9c.
This commit is contained in:
Flatcar Buildbot 2025-06-16 07:08:07 +00:00 committed by Krzesimir Nowak
parent 90b92a2e5f
commit 5285ec1fee
18 changed files with 93 additions and 1053 deletions

View File

@ -1,4 +1,4 @@
DIST libffi-3.4.4.tar.gz 1362394 BLAKE2B 189fe1ffe9507f204581b0ab09995dc7e7b761bb4eac7e338e9f5ff81431aebcef6c182c1839c9f9acb2706697a260c67e6d1351cf7e2aed7c4eb5d694f6f8fd SHA512 88680aeb0fa0dc0319e5cd2ba45b4b5a340bc9b4bcf20b1e0613b39cd898f177a3863aa94034d8e23a7f6f44d858a53dcd36d1bb8dee13b751ef814224061889
DIST libffi-3.4.6.tar.gz 1391684 BLAKE2B af8402a09bdbd59b4e9400d2d71bd5ce98f6f1d981d35d1ab40d77a831b13b32c5bd34ca54ff75999e39f0d8a9c066381fae7a8d6c5216d955e064f929f08b88 SHA512 033d2600e879b83c6bce0eb80f69c5f32aa775bf2e962c9d39fbd21226fa19d1e79173d8eaa0d0157014d54509ea73315ad86842356fc3a303c0831c94c6ab39
DIST libffi-3.4.7.tar.gz 1393979 BLAKE2B 0dd17b4fd358beb9842889168437443137445a5dba1f0a7e8669ae420d8efb927815c08602c1b1b141acfdfdbaa12b417863402a5c8df5f36519fd3e772d3f37 SHA512 d19f59a5b5d61bd7d9e8a7a74b8bf2e697201a19c247c410c789e93ca8678a4eb9f13c9bee19f129be80ade8514f6b1acb38d66f44d86edd32644ed7bbe31dd6
DIST libffi-3.4.8.tar.gz 1397992 BLAKE2B 10b3d970dc598fb8689bca49751cda499ddc5216baf89d38625385b0d42d57f10d15cce3c4c044c9c73a4fce384c26f2a8e1b99269e9db1174c2631201c6bfd4 SHA512 05344c6c1a1a5b44704f6cf99277098d1ea3ac1dc11c2a691c501786a214f76184ec0637135588630db609ce79e49df3dbd00282dd61e7f21137afba70e24ffe
DIST libffi-3.5.0.tar.gz 1420475 BLAKE2B 19e278ef86d23c6955b53e2e1c0e1297fd603975d47763c5febd1eca28a475a6ba4dc3c3b1eef630f744c7d3e95cc1d0c6876ae242c21b666e2c2571a4c1132e SHA512 1d47980185abc91d81ba6dfa775b673e83d42bad31a5ca1407068b319113a1f7e79da241204e41f096e1d3072ada1364d64bb9641cfb0b82fbe3821da2feb6ac
DIST libffi-3.5.1.tar.gz 1419757 BLAKE2B eaeb04beeb4ab6e0ef5652175d5c9d29a18b6f1edbf05db819a3a6ac9c8ed47de32c54fca4c3a9a476283c0771650d5a577e7868f16c671ee46e25db27369066 SHA512 3da9e21fdb920e7962ceb01ee671ef36196df4d5dad62e0cdd8e87cc60e350f241c204350560ae26ea04cc898161b5585c8a5a5125bdbcc84508efbb7ea61eb8

View File

@ -1,170 +0,0 @@
https://github.com/libffi/libffi/commit/e58e22b22386ed0e0a95e97eb8eed016e3f01b02
From e58e22b22386ed0e0a95e97eb8eed016e3f01b02 Mon Sep 17 00:00:00 2001
From: Anthony Green <green@moxielogic.com>
Date: Thu, 2 Feb 2023 07:02:53 -0500
Subject: [PATCH] From Dave Anglin:
A couple of years ago the 32-bit hppa targets were converted from using a trampoline executed on the stack to the function descriptor technique used by ia64. This is more efficient and avoids having to have an executable stack. However, function pointers on 32-bit need the PLABEL bit set in the pointer. It distinguishes between pointers that point directly to the executable code and pointer that point to a function descriptor. We need the later for libffi. But as a result, it is not possible to convert using casts data pointers to function pointers.
The solution at the time was to set the PLABEL bit in hppa closure pointers using FFI_CLOSURE_PTR. However, I realized recently that this was a bad choice. Packages like python-cffi allocate their own closure pointers, so this isn't going to work well there.
A better solution is to leave closure pointers unchanged and only set the PLABEL bit in pointers used to point to executable code.
The attached patch drops the FFI_CLOSURE_PTR and FFI_RESTORE_PTR defines. This allows some cleanup in the hppa closure routines. The FFI_FN define is now used to set the PLABEL bit on hppa. ffi_closure_alloc is modified to set the PLABEL bit in the value set in *code.
I also added a FFI_CL define to convert a function pointer to a closure pointer. It is only used in one test case.
--- a/include/ffi.h.in
+++ b/include/ffi.h.in
@@ -361,14 +361,6 @@ typedef struct {
FFI_API void *ffi_closure_alloc (size_t size, void **code);
FFI_API void ffi_closure_free (void *);
-#if defined(PA_LINUX) || defined(PA_HPUX)
-#define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2))
-#define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3))
-#else
-#define FFI_CLOSURE_PTR(X) (X)
-#define FFI_RESTORE_PTR(X) (X)
-#endif
-
FFI_API ffi_status
ffi_prep_closure (ffi_closure*,
ffi_cif *,
@@ -515,8 +507,14 @@ FFI_API
ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type,
size_t *offsets);
-/* Useful for eliminating compiler warnings. */
+/* Convert between closure and function pointers. */
+#if defined(PA_LINUX) || defined(PA_HPUX)
+#define FFI_FN(f) ((void (*)(void))((unsigned int)(f) | 2))
+#define FFI_CL(f) ((void *)((unsigned int)(f) & ~3))
+#else
#define FFI_FN(f) ((void (*)(void))f)
+#define FFI_CL(f) ((void *)(f))
+#endif
/* ---- Definitions shared with assembly code ---------------------------- */
--- a/src/closures.c
+++ b/src/closures.c
@@ -993,23 +993,23 @@ ffi_closure_alloc (size_t size, void **code)
if (!code)
return NULL;
- ptr = FFI_CLOSURE_PTR (dlmalloc (size));
+ ptr = dlmalloc (size);
if (ptr)
{
msegmentptr seg = segment_holding (gm, ptr);
- *code = add_segment_exec_offset (ptr, seg);
+ *code = FFI_FN (add_segment_exec_offset (ptr, seg));
if (!ffi_tramp_is_supported ())
return ptr;
ftramp = ffi_tramp_alloc (0);
if (ftramp == NULL)
{
- dlfree (FFI_RESTORE_PTR (ptr));
+ dlfree (ptr);
return NULL;
}
- *code = ffi_tramp_get_addr (ftramp);
+ *code = FFI_FN (ffi_tramp_get_addr (ftramp));
((ffi_closure *) ptr)->ftramp = ftramp;
}
@@ -1050,7 +1050,7 @@ ffi_closure_free (void *ptr)
if (ffi_tramp_is_supported ())
ffi_tramp_free (((ffi_closure *) ptr)->ftramp);
- dlfree (FFI_RESTORE_PTR (ptr));
+ dlfree (ptr);
}
int
@@ -1070,16 +1070,20 @@ ffi_tramp_is_present (void *ptr)
void *
ffi_closure_alloc (size_t size, void **code)
{
+ void *c;
+
if (!code)
return NULL;
- return *code = FFI_CLOSURE_PTR (malloc (size));
+ c = malloc (size);
+ *code = FFI_FN (c);
+ return c;
}
void
ffi_closure_free (void *ptr)
{
- free (FFI_RESTORE_PTR (ptr));
+ free (ptr);
}
void *
--- a/src/pa/ffi.c
+++ b/src/pa/ffi.c
@@ -445,7 +445,6 @@ ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack)
int i, avn;
unsigned int slot = FIRST_ARG_SLOT;
register UINT32 r28 asm("r28");
- ffi_closure *c = (ffi_closure *)FFI_RESTORE_PTR (closure);
cif = closure->cif;
@@ -548,7 +547,7 @@ ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack)
}
/* Invoke the closure. */
- (c->fun) (cif, rvalue, avalue, c->user_data);
+ (closure->fun) (cif, rvalue, avalue, closure->user_data);
debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", u.ret[0],
u.ret[1]);
@@ -649,8 +648,6 @@ ffi_prep_closure_loc (ffi_closure* closure,
void *user_data,
void *codeloc)
{
- ffi_closure *c = (ffi_closure *)FFI_RESTORE_PTR (closure);
-
/* The layout of a function descriptor. A function pointer with the PLABEL
bit set points to a function descriptor. */
struct pa32_fd
@@ -676,14 +673,14 @@ ffi_prep_closure_loc (ffi_closure* closure,
fd = (struct pa32_fd *)((UINT32)ffi_closure_pa32 & ~3);
/* Setup trampoline. */
- tramp = (struct ffi_pa32_trampoline_struct *)c->tramp;
+ tramp = (struct ffi_pa32_trampoline_struct *)closure->tramp;
tramp->code_pointer = fd->code_pointer;
tramp->fake_gp = (UINT32)codeloc & ~3;
tramp->real_gp = fd->gp;
- c->cif = cif;
- c->user_data = user_data;
- c->fun = fun;
+ closure->cif = cif;
+ closure->user_data = user_data;
+ closure->fun = fun;
return FFI_OK;
}
--- a/testsuite/libffi.closures/closure_loc_fn0.c
+++ b/testsuite/libffi.closures/closure_loc_fn0.c
@@ -85,7 +85,7 @@ int main (void)
#ifndef FFI_EXEC_STATIC_TRAMP
/* With static trampolines, the codeloc does not point to closure */
- CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0);
+ CHECK(memcmp(pcl, FFI_CL(codeloc), sizeof(*pcl)) == 0);
#endif
res = (*((closure_loc_test_type0)codeloc))

View File

@ -1,289 +0,0 @@
https://github.com/libffi/libffi/commit/222abd0c65babe2174b21753217145f5031a8b91
From 222abd0c65babe2174b21753217145f5031a8b91 Mon Sep 17 00:00:00 2001
From: Anthony Green <green@moxielogic.com>
Date: Thu, 2 Feb 2023 07:04:55 -0500
Subject: [PATCH] From Dave Anglin:
This patch is derived from the work done in implementing libffi for 64-bit hppa64-hpux target. Currently, the 32-bit hppa targets do a linear search for the return type of an ffi_call. This is slow and inefficient. A jump table can used to jump directly to the code used to process the return value. In most common cases, the return value can be processed in the jump table itself.
The patch also fixes return handling for FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16 and FFI_TYPE_SINT16.
--- a/src/pa/ffi.c
+++ b/src/pa/ffi.c
@@ -56,27 +56,12 @@ static inline int ffi_struct_type(ffi_type *t)
size_t sz = t->size;
/* Small structure results are passed in registers,
- larger ones are passed by pointer. Note that
- small structures of size 2, 4 and 8 differ from
- the corresponding integer types in that they have
- different alignment requirements. */
-
- if (sz <= 1)
- return FFI_TYPE_UINT8;
- else if (sz == 2)
- return FFI_TYPE_SMALL_STRUCT2;
- else if (sz == 3)
- return FFI_TYPE_SMALL_STRUCT3;
- else if (sz == 4)
- return FFI_TYPE_SMALL_STRUCT4;
- else if (sz == 5)
- return FFI_TYPE_SMALL_STRUCT5;
- else if (sz == 6)
- return FFI_TYPE_SMALL_STRUCT6;
- else if (sz == 7)
- return FFI_TYPE_SMALL_STRUCT7;
- else if (sz <= 8)
- return FFI_TYPE_SMALL_STRUCT8;
+ larger ones are passed by pointer. Note that small
+ structures differ from the corresponding integer
+ types in that they have different alignment requirements. */
+
+ if (sz <= 8)
+ return -sz;
else
return FFI_TYPE_STRUCT; /* else, we pass it by pointer. */
}
@@ -556,16 +541,16 @@ ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack)
switch (cif->flags)
{
case FFI_TYPE_UINT8:
- *(stack - FIRST_ARG_SLOT) = (UINT8)(u.ret[0] >> 24);
+ *(stack - FIRST_ARG_SLOT) = (UINT8)u.ret[0];
break;
case FFI_TYPE_SINT8:
- *(stack - FIRST_ARG_SLOT) = (SINT8)(u.ret[0] >> 24);
+ *(stack - FIRST_ARG_SLOT) = (SINT8)u.ret[0];
break;
case FFI_TYPE_UINT16:
- *(stack - FIRST_ARG_SLOT) = (UINT16)(u.ret[0] >> 16);
+ *(stack - FIRST_ARG_SLOT) = (UINT16)u.ret[0];
break;
case FFI_TYPE_SINT16:
- *(stack - FIRST_ARG_SLOT) = (SINT16)(u.ret[0] >> 16);
+ *(stack - FIRST_ARG_SLOT) = (SINT16)u.ret[0];
break;
case FFI_TYPE_INT:
case FFI_TYPE_SINT32:
@@ -590,6 +575,7 @@ ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack)
/* Don't need a return value, done by caller. */
break;
+ case FFI_TYPE_SMALL_STRUCT1:
case FFI_TYPE_SMALL_STRUCT2:
case FFI_TYPE_SMALL_STRUCT3:
case FFI_TYPE_SMALL_STRUCT4:
--- a/src/pa/ffitarget.h
+++ b/src/pa/ffitarget.h
@@ -73,11 +73,22 @@ typedef enum ffi_abi {
#define FFI_TRAMPOLINE_SIZE 12
#endif
-#define FFI_TYPE_SMALL_STRUCT2 -1
-#define FFI_TYPE_SMALL_STRUCT3 -2
-#define FFI_TYPE_SMALL_STRUCT4 -3
-#define FFI_TYPE_SMALL_STRUCT5 -4
-#define FFI_TYPE_SMALL_STRUCT6 -5
-#define FFI_TYPE_SMALL_STRUCT7 -6
-#define FFI_TYPE_SMALL_STRUCT8 -7
+#define FFI_TYPE_SMALL_STRUCT1 -1
+#define FFI_TYPE_SMALL_STRUCT2 -2
+#define FFI_TYPE_SMALL_STRUCT3 -3
+#define FFI_TYPE_SMALL_STRUCT4 -4
+#define FFI_TYPE_SMALL_STRUCT5 -5
+#define FFI_TYPE_SMALL_STRUCT6 -6
+#define FFI_TYPE_SMALL_STRUCT7 -7
+#define FFI_TYPE_SMALL_STRUCT8 -8
+
+/* linux.S and hpux32.S expect FFI_TYPE_COMPLEX is the last generic type. */
+#define FFI_PA_TYPE_LAST FFI_TYPE_COMPLEX
+
+/* If new generic types are added, the jump tables in linux.S and hpux32.S
+ likely need updating. */
+#if FFI_TYPE_LAST != FFI_PA_TYPE_LAST
+# error "You likely have broken jump tables"
+#endif
+
#endif
--- a/src/pa/linux.S
+++ b/src/pa/linux.S
@@ -103,51 +103,103 @@ ffi_call_pa32:
/* Prepare to store the result; we need to recover flags and rvalue. */
ldw -48(%r3), %r21 /* r21 <- flags */
- ldw -52(%r3), %r20 /* r20 <- rvalue */
- /* Store the result according to the return type. */
+ /* Adjust flags range from [-8, 15] to [0, 23]. */
+ addi 8, %r21, %r21
-.Lcheckint:
- comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8
- b .Ldone
- stw %ret0, 0(%r20)
+ blr %r21, %r0
+ ldw -52(%r3), %r20 /* r20 <- rvalue */
-.Lcheckint8:
- comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16
+ /* Giant jump table */
+ /* 8-byte small struct */
+ b,n .Lsmst8
+ nop
+ /* 7-byte small struct */
+ b,n .Lsmst7
+ nop
+ /* 6-byte small struct */
+ b,n .Lsmst6
+ nop
+ /* 5-byte small struct */
+ b,n .Lsmst5
+ nop
+ /* 4-byte small struct */
+ b,n .Lsmst4
+ nop
+ /* 3-byte small struct */
+ b,n .Lsmst3
+ nop
+ /* 2-byte small struct */
+ b,n .Lsmst2
+ nop
+ /* 1-byte small struct */
b .Ldone
stb %ret0, 0(%r20)
-
-.Lcheckint16:
- comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl
+ /* void */
+ b,n .Ldone
+ nop
+ /* int */
b .Ldone
- sth %ret0, 0(%r20)
-
-.Lcheckdbl:
- comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat
+ stw %ret0, 0(%r20)
+ /* float */
+ b .Ldone
+ fstw %fr4L,0(%r20)
+ /* double */
b .Ldone
fstd %fr4,0(%r20)
-
-.Lcheckfloat:
- comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll
+ /* long double */
b .Ldone
- fstw %fr4L,0(%r20)
+ fstd %fr4,0(%r20)
+ /* unsigned int8 */
+ b .Ldone
+ stw %ret0, 0(%r20)
+ /* sint8 */
+ b .Ldone
+ stw %ret0, 0(%r20)
+ /* unsigned int16 */
+ b .Ldone
+ stw %ret0, 0(%r20)
+ /* sint16 */
+ b .Ldone
+ stw %ret0, 0(%r20)
+ /* unsigned int32 */
+ b .Ldone
+ stw %ret0, 0(%r20)
+ /* sint32 */
+ b .Ldone
+ stw %ret0, 0(%r20)
+ /* unsigned int64 */
+ b,n .Luint64
+ nop
+ /* signed int64 */
+ b,n .Lsint64
+ nop
+ /* large struct */
+ b,n .Ldone
+ nop
+ /* pointer */
+ b .Ldone
+ stw %ret0, 0(%r20)
+ /* complex */
+ b,n .Ldone
+ nop
+
+ /* Store the result according to the return type. */
-.Lcheckll:
- comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2
+.Luint64:
+.Lsint64:
stw %ret0, 0(%r20)
b .Ldone
stw %ret1, 4(%r20)
-.Lchecksmst2:
- comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3
+.Lsmst2:
/* 2-byte structs are returned in ret0 as ????xxyy. */
extru %ret0, 23, 8, %r22
stbs,ma %r22, 1(%r20)
b .Ldone
stb %ret0, 0(%r20)
-.Lchecksmst3:
- comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4
+.Lsmst3:
/* 3-byte structs are returned in ret0 as ??xxyyzz. */
extru %ret0, 15, 8, %r22
stbs,ma %r22, 1(%r20)
@@ -156,8 +208,7 @@ ffi_call_pa32:
b .Ldone
stb %ret0, 0(%r20)
-.Lchecksmst4:
- comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5
+.Lsmst4:
/* 4-byte structs are returned in ret0 as wwxxyyzz. */
extru %ret0, 7, 8, %r22
stbs,ma %r22, 1(%r20)
@@ -168,8 +219,7 @@ ffi_call_pa32:
b .Ldone
stb %ret0, 0(%r20)
-.Lchecksmst5:
- comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6
+.Lsmst5:
/* 5 byte values are returned right justified:
ret0 ret1
5: ??????aa bbccddee */
@@ -183,8 +233,7 @@ ffi_call_pa32:
b .Ldone
stb %ret1, 0(%r20)
-.Lchecksmst6:
- comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7
+.Lsmst6:
/* 6 byte values are returned right justified:
ret0 ret1
6: ????aabb ccddeeff */
@@ -200,8 +249,7 @@ ffi_call_pa32:
b .Ldone
stb %ret1, 0(%r20)
-.Lchecksmst7:
- comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8
+.Lsmst7:
/* 7 byte values are returned right justified:
ret0 ret1
7: ??aabbcc ddeeffgg */
@@ -219,8 +267,7 @@ ffi_call_pa32:
b .Ldone
stb %ret1, 0(%r20)
-.Lchecksmst8:
- comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone
+.Lsmst8:
/* 8 byte values are returned right justified:
ret0 ret1
8: aabbccdd eeffgghh */

View File

@ -1,36 +0,0 @@
https://github.com/libffi/libffi/commit/c50c16d0bcb58952840184aa83e62c6d912bf779
From c50c16d0bcb58952840184aa83e62c6d912bf779 Mon Sep 17 00:00:00 2001
From: Anthony Green <green@moxielogic.com>
Date: Sun, 20 Nov 2022 12:20:40 -0500
Subject: [PATCH] Fix large struct passing on PA-RISC
--- a/src/pa/ffi.c
+++ b/src/pa/ffi.c
@@ -376,10 +376,26 @@ extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned),
void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{
extended_cif ecif;
+ size_t i, nargs = cif->nargs;
+ ffi_type **arg_types = cif->arg_types;
ecif.cif = cif;
ecif.avalue = avalue;
+ /* If we have any large structure arguments, make a copy so we are passing
+ by value. */
+ for (i = 0; i < nargs; i++)
+ {
+ ffi_type *at = arg_types[i];
+ int size = at->size;
+ if (at->type == FFI_TYPE_STRUCT && size > 8)
+ {
+ char *argcopy = alloca (size);
+ memcpy (argcopy, avalue[i], size);
+ avalue[i] = argcopy;
+ }
+ }
+
/* If the return value is a struct and we don't have a return
value address then we need to make one. */

View File

@ -1,34 +0,0 @@
https://bugs.gentoo.org/915086
https://github.com/libffi/libffi/pull/800
From 65f6869fd74630a9252ef89971b725b921f17061 Mon Sep 17 00:00:00 2001
From: Alfred Wingate <parona@protonmail.com>
Date: Tue, 10 Oct 2023 06:32:02 +0300
Subject: [PATCH] Put optional symbols behind ifdefs
Signed-off-by: Alfred Wingate <parona@protonmail.com>
--- a/libffi.map.in
+++ b/libffi.map.in
@@ -33,7 +33,10 @@ LIBFFI_BASE_8.0 {
ffi_raw_to_ptrarray;
ffi_raw_size;
+#if !FFI_NATIVE_RAW_API
ffi_java_raw_call;
+#endif
+
ffi_java_ptrarray_to_raw;
ffi_java_raw_to_ptrarray;
ffi_java_raw_size;
@@ -62,8 +65,10 @@ LIBFFI_CLOSURE_8.0 {
ffi_prep_closure_loc;
ffi_prep_raw_closure;
ffi_prep_raw_closure_loc;
+#if !FFI_NATIVE_RAW_API
ffi_prep_java_raw_closure;
ffi_prep_java_raw_closure_loc;
+#endif
} LIBFFI_BASE_8.0;
#endif

View File

@ -1,28 +0,0 @@
https://github.com/libffi/libffi/issues/778
https://bugs.gentoo.org/882071
Fix incorrect type for passing floats. Thanks to Petr Sumbera and Richard Henderson
for figuring it out on the upstream bug.
--- a/src/sparc/ffi64.c
+++ b/src/sparc/ffi64.c
@@ -382,13 +382,19 @@ ffi_prep_args_v9(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue)
*argp++ = *(SINT32 *)a;
break;
case FFI_TYPE_UINT32:
- case FFI_TYPE_FLOAT:
*argp++ = *(UINT32 *)a;
break;
case FFI_TYPE_SINT64:
case FFI_TYPE_UINT64:
case FFI_TYPE_POINTER:
+ *argp++ = *(UINT64 *)a;
+ break;
+ case FFI_TYPE_FLOAT:
+ flags |= SPARC_FLAG_FP_ARGS;
+ *argp++ = *(UINT32 *)a;
+ break;
case FFI_TYPE_DOUBLE:
+ flags |= SPARC_FLAG_FP_ARGS;
*argp++ = *(UINT64 *)a;
break;

View File

@ -1,39 +0,0 @@
https://github.com/libffi/libffi/issues/760
https://github.com/libffi/libffi/commit/ce077e5565366171aa1b4438749b0922fce887a4
From ce077e5565366171aa1b4438749b0922fce887a4 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <serge.guelton@telecom-bretagne.eu>
Date: Thu, 2 Feb 2023 14:46:29 +0000
Subject: [PATCH] Forward declare open_temp_exec_file (#764)
It's defined in closures.c and used in tramp.c.
Also declare it as an hidden symbol, as it should be.
Co-authored-by: serge-sans-paille <sguelton@mozilla.com>
--- a/include/ffi_common.h
+++ b/include/ffi_common.h
@@ -128,6 +128,10 @@ void *ffi_data_to_code_pointer (void *data) FFI_HIDDEN;
static trampoline. */
int ffi_tramp_is_present (void *closure) FFI_HIDDEN;
+/* Return a file descriptor of a temporary zero-sized file in a
+ writable and executable filesystem. */
+int open_temp_exec_file(void) FFI_HIDDEN;
+
/* Extended cif, used in callback from assembly routine */
typedef struct
{
--- a/src/tramp.c
+++ b/src/tramp.c
@@ -39,6 +39,10 @@
#ifdef __linux__
#define _GNU_SOURCE 1
#endif
+
+#include <ffi.h>
+#include <ffi_common.h>
+
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

View File

@ -1,104 +0,0 @@
https://github.com/libffi/libffi/commit/efb98a72d8b9bdb71b4f972efced073bee3b30fc
https://github.com/libffi/libffi/commit/92d384df196a099fde384f9178864dbfe8c6b0fc
From efb98a72d8b9bdb71b4f972efced073bee3b30fc Mon Sep 17 00:00:00 2001
From: Anthony Green <green@moxielogic.com>
Date: Sun, 15 Sep 2024 07:31:33 -0400
Subject: [PATCH] Robustify floating point comparison in test
---
testsuite/libffi.call/struct_int_float.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/testsuite/libffi.call/struct_int_float.c b/testsuite/libffi.call/struct_int_float.c
index dab1d1fed..82685814c 100644
--- a/testsuite/libffi.call/struct_int_float.c
+++ b/testsuite/libffi.call/struct_int_float.c
@@ -54,35 +54,35 @@ int main (void)
values[4] = &ts_arg[4];
args[5] = &ts_type;
values[5] = &ts_arg[5];
-
+
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, ABI_NUM, 6, &ffi_type_float, args) == FFI_OK);
-
+
ts_arg[0].i = 1;
- ts_arg[0].f = 1.11f;
+ ts_arg[0].f = 11.11f;
ts_arg[1].i = 2;
- ts_arg[1].f = 2.22f;
+ ts_arg[1].f = 22.22f;
ts_arg[2].i = 3;
- ts_arg[2].f = 3.33f;
+ ts_arg[2].f = 33.33f;
ts_arg[3].i = 4;
- ts_arg[3].f = 4.44f;
+ ts_arg[3].f = 44.44f;
ts_arg[4].i = 5;
- ts_arg[4].f = 5.55f;
+ ts_arg[4].f = 55.55f;
ts_arg[5].i = 6;
- ts_arg[5].f = 6.66f;
-
+ ts_arg[5].f = 66.66f;
+
printf ("%g\n", ts_arg[0].f);
printf ("%g\n", ts_arg[1].f);
printf ("%g\n", ts_arg[2].f);
printf ("%g\n", ts_arg[3].f);
printf ("%g\n", ts_arg[4].f);
printf ("%g\n", ts_arg[5].f);
-
+
ffi_call(&cif, FFI_FN(struct_int_float), &rfloat, values);
printf ("%g\n", rfloat);
-
- CHECK(rfloat == 1.11f);
+
+ CHECK(fabs(rfloat - 11.11) < FLT_EPSILON);
exit(0);
}
From 92d384df196a099fde384f9178864dbfe8c6b0fc Mon Sep 17 00:00:00 2001
From: Anthony Green <green@moxielogic.com>
Date: Sun, 15 Sep 2024 12:32:29 -0400
Subject: [PATCH] Fix floating point compare
---
testsuite/libffi.call/struct_int_float.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/testsuite/libffi.call/struct_int_float.c b/testsuite/libffi.call/struct_int_float.c
index 82685814..66ef6c45 100644
--- a/testsuite/libffi.call/struct_int_float.c
+++ b/testsuite/libffi.call/struct_int_float.c
@@ -14,11 +14,11 @@ typedef struct
} test_structure_int_float;
static float ABI_ATTR struct_int_float(test_structure_int_float ts1,
- test_structure_int_float ts2,
- test_structure_int_float ts3,
- test_structure_int_float ts4,
- test_structure_int_float ts5,
- test_structure_int_float ts6)
+ test_structure_int_float ts2 __UNUSED__,
+ test_structure_int_float ts3 __UNUSED__,
+ test_structure_int_float ts4 __UNUSED__,
+ test_structure_int_float ts5 __UNUSED__,
+ test_structure_int_float ts6 __UNUSED__)
{
return ts1.f;
}
@@ -82,7 +82,7 @@ int main (void)
printf ("%g\n", rfloat);
- CHECK(fabs(rfloat - 11.11) < FLT_EPSILON);
+ CHECK(fabs(rfloat - 11.11) < 3 * FLT_EPSILON);
exit(0);
}

View File

@ -1,124 +0,0 @@
https://github.com/libffi/libffi/commit/d21881f55ed4a44d464c9091871e69b0bb47611a
From d21881f55ed4a44d464c9091871e69b0bb47611a Mon Sep 17 00:00:00 2001
From: kellda <59569234+kellda@users.noreply.github.com>
Date: Sun, 15 Sep 2024 13:29:42 +0200
Subject: [PATCH] Fix x86/ffi64 calls with 6 gp and some sse registers (#848)
* Fix x86/ffi64 calls with 6 gp and some sse registers
* Add test demonstating issue when mixing gp and sse registers
---
src/x86/ffi64.c | 2 +-
testsuite/libffi.call/struct_int_float.c | 88 ++++++++++++++++++++++++
2 files changed, 89 insertions(+), 1 deletion(-)
create mode 100644 testsuite/libffi.call/struct_int_float.c
diff --git a/src/x86/ffi64.c b/src/x86/ffi64.c
index 6a8e37fc5..39f0bfd33 100644
--- a/src/x86/ffi64.c
+++ b/src/x86/ffi64.c
@@ -651,7 +651,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
break;
default:
reg_args->gpr[gprcount] = 0;
- memcpy (&reg_args->gpr[gprcount], a, size);
+ memcpy (&reg_args->gpr[gprcount], a, sizeof(UINT64));
}
gprcount++;
break;
diff --git a/testsuite/libffi.call/struct_int_float.c b/testsuite/libffi.call/struct_int_float.c
new file mode 100644
index 000000000..dab1d1fed
--- /dev/null
+++ b/testsuite/libffi.call/struct_int_float.c
@@ -0,0 +1,88 @@
+/* Area: ffi_call
+ Purpose: Demonstrate structures with integers corrupting earlier floats
+ Limitations: none.
+ PR: #848
+ Originator: kellda */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct
+{
+ unsigned long i;
+ float f;
+} test_structure_int_float;
+
+static float ABI_ATTR struct_int_float(test_structure_int_float ts1,
+ test_structure_int_float ts2,
+ test_structure_int_float ts3,
+ test_structure_int_float ts4,
+ test_structure_int_float ts5,
+ test_structure_int_float ts6)
+{
+ return ts1.f;
+}
+
+int main (void)
+{
+ ffi_cif cif;
+ ffi_type *args[MAX_ARGS];
+ void *values[MAX_ARGS];
+ ffi_type ts_type;
+ ffi_type *ts_type_elements[3];
+ float rfloat;
+
+ test_structure_int_float ts_arg[6];
+
+ ts_type.size = 0;
+ ts_type.alignment = 0;
+ ts_type.type = FFI_TYPE_STRUCT;
+ ts_type.elements = ts_type_elements;
+ ts_type_elements[0] = &ffi_type_ulong;
+ ts_type_elements[1] = &ffi_type_float;
+ ts_type_elements[2] = NULL;
+
+ args[0] = &ts_type;
+ values[0] = &ts_arg[0];
+ args[1] = &ts_type;
+ values[1] = &ts_arg[1];
+ args[2] = &ts_type;
+ values[2] = &ts_arg[2];
+ args[3] = &ts_type;
+ values[3] = &ts_arg[3];
+ args[4] = &ts_type;
+ values[4] = &ts_arg[4];
+ args[5] = &ts_type;
+ values[5] = &ts_arg[5];
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, ABI_NUM, 6, &ffi_type_float, args) == FFI_OK);
+
+ ts_arg[0].i = 1;
+ ts_arg[0].f = 1.11f;
+ ts_arg[1].i = 2;
+ ts_arg[1].f = 2.22f;
+ ts_arg[2].i = 3;
+ ts_arg[2].f = 3.33f;
+ ts_arg[3].i = 4;
+ ts_arg[3].f = 4.44f;
+ ts_arg[4].i = 5;
+ ts_arg[4].f = 5.55f;
+ ts_arg[5].i = 6;
+ ts_arg[5].f = 6.66f;
+
+ printf ("%g\n", ts_arg[0].f);
+ printf ("%g\n", ts_arg[1].f);
+ printf ("%g\n", ts_arg[2].f);
+ printf ("%g\n", ts_arg[3].f);
+ printf ("%g\n", ts_arg[4].f);
+ printf ("%g\n", ts_arg[5].f);
+
+ ffi_call(&cif, FFI_FN(struct_int_float), &rfloat, values);
+
+ printf ("%g\n", rfloat);
+
+ CHECK(rfloat == 1.11f);
+
+ exit(0);
+}

View File

@ -1,38 +0,0 @@
From 4354fe1434a37b781ff19f5a6be51ec4e982ad5a Mon Sep 17 00:00:00 2001
Message-ID: <4354fe1434a37b781ff19f5a6be51ec4e982ad5a.1739062746.git.sam@gentoo.org>
From: Sam James <sam@gentoo.org>
Date: Sun, 9 Feb 2025 00:54:28 +0000
Subject: [PATCH] Revert "Fix x86/ffi64 calls with 6 gp and some sse registers
(#848)"
This reverts commit d21881f55ed4a44d464c9091871e69b0bb47611a.
Bug: https://github.com/libffi/libffi/issues/879
Bug: https://bugs.gentoo.org/949051
Signed-off-by: Sam James <sam@gentoo.org>
--- a/src/x86/ffi64.c
+++ b/src/x86/ffi64.c
@@ -654,7 +654,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
break;
default:
reg_args->gpr[gprcount] = 0;
- memcpy (&reg_args->gpr[gprcount], a, sizeof(UINT64));
+ memcpy (&reg_args->gpr[gprcount], a, size);
}
gprcount++;
break;
--- a/testsuite/libffi.call/struct_int_float.c
+++ b/testsuite/libffi.call/struct_int_float.c
@@ -5,6 +5,7 @@
Originator: kellda */
/* { dg-do run } */
+/* { dg-skip-if "libffi bug #879" { *-*-* } { "*" } } */
#include "ffitest.h"
typedef struct
base-commit: 1716f81e9a115d340429504563bc8e7fb2eeef2b
--
2.48.1

View File

@ -1,83 +0,0 @@
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
inherit multilib-minimal preserve-libs
MY_PV=${PV/_rc/-rc}
MY_P=${PN}-${MY_PV}
DESCRIPTION="Portable, high level programming interface to various calling conventions"
HOMEPAGE="https://sourceware.org/libffi/"
SRC_URI="https://github.com/libffi/libffi/releases/download/v${MY_PV}/${MY_P}.tar.gz"
S="${WORKDIR}"/${MY_P}
LICENSE="MIT"
# This is a core package which is depended on by e.g. Python
# Please use preserve-libs.eclass in pkg_{pre,post}inst to cover users
# with FEATURES="-preserved-libs" or another package manager if SONAME
# changes.
SLOT="0/8" # SONAME=libffi.so.8
KEYWORDS="~alpha amd64 arm arm64 hppa ~loong ~m68k ~mips ppc ppc64 ~riscv ~s390 sparc x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
IUSE="debug exec-static-trampoline pax-kernel static-libs test"
RESTRICT="!test? ( test )"
BDEPEND="test? ( dev-util/dejagnu )"
PATCHES=(
"${FILESDIR}"/${P}-hppa-large-struct.patch
"${FILESDIR}"/${P}-hppa-closure-function-ptrs.patch
"${FILESDIR}"/${P}-hppa-jump-table.patch
"${FILESDIR}"/${P}-sparc-float-typo.patch
"${FILESDIR}"/${P}-lld-17.patch
"${FILESDIR}"/${P}-trampoline-c99.patch
)
src_prepare() {
default
if [[ ${CHOST} == arm64-*-darwin* ]] ; then
# ensure we use aarch64 asm, not x86 on arm64
sed -i -e 's/aarch64\*-\*-\*/arm64*-*-*|&/' \
configure configure.host || die
fi
}
multilib_src_configure() {
# --includedir= path maintains a few properties:
# 1. have stable name across libffi versions: some packages like
# dev-lang/ghc or kde-frameworks/networkmanager-qt embed
# ${includedir} at build-time. Don't require those to be
# rebuilt unless SONAME changes. bug #695788
#
# We use /usr/.../${PN} (instead of former /usr/.../${P}).
#
# 2. have ${ABI}-specific location as ffi.h is target-dependent.
#
# We use /usr/$(get_libdir)/... to have ABI identifier.
ECONF_SOURCE="${S}" econf \
--includedir="${EPREFIX}"/usr/$(get_libdir)/${PN}/include \
--disable-multi-os-directory \
$(use_enable static-libs static) \
$(use_enable exec-static-trampoline exec-static-tramp) \
$(use_enable pax-kernel pax_emutramp) \
$(use_enable debug)
}
multilib_src_test() {
emake -Onone check
}
multilib_src_install_all() {
einstalldocs
find "${ED}" -name "*.la" -delete || die
}
pkg_preinst() {
preserve_old_lib /usr/$(get_libdir)/libffi.so.7
}
pkg_postinst() {
preserve_old_lib_notify /usr/$(get_libdir)/libffi.so.7
}

View File

@ -3,7 +3,7 @@
EAPI=8
inherit multilib-minimal preserve-libs
inherit dot-a multilib-minimal preserve-libs
MY_PV=${PV/_rc/-rc}
MY_P=${PN}-${MY_PV}
@ -17,7 +17,7 @@ if [[ ${PV} == 9999 ]] ; then
else
SRC_URI="https://github.com/libffi/libffi/releases/download/v${MY_PV}/${MY_P}.tar.gz"
KEYWORDS="~alpha amd64 arm arm64 hppa ~loong ~m68k ~mips ppc ppc64 ~riscv ~s390 ~sparc x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
KEYWORDS="~alpha amd64 arm arm64 hppa ~loong ~m68k ~mips ppc ppc64 ~riscv ~s390 sparc x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
fi
S="${WORKDIR}"/${MY_P}
@ -55,6 +55,11 @@ src_prepare() {
fi
}
src_configure() {
use static-libs && lto-guarantee-fat
multilib-minimal_src_configure
}
multilib_src_configure() {
# --includedir= path maintains a few properties:
# 1. have stable name across libffi versions: some packages like
@ -83,6 +88,7 @@ multilib_src_test() {
multilib_src_install_all() {
einstalldocs
find "${ED}" -name "*.la" -delete || die
strip-lto-bytecode
}
pkg_preinst() {

View File

@ -1,73 +0,0 @@
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
inherit multilib-minimal preserve-libs
MY_PV=${PV/_rc/-rc}
MY_P=${PN}-${MY_PV}
DESCRIPTION="Portable, high level programming interface to various calling conventions"
HOMEPAGE="https://sourceware.org/libffi/"
SRC_URI="https://github.com/libffi/libffi/releases/download/v${MY_PV}/${MY_P}.tar.gz"
S="${WORKDIR}"/${MY_P}
LICENSE="MIT"
# This is a core package which is depended on by e.g. Python.
# Please use preserve-libs.eclass in pkg_{pre,post}inst to cover users
# with FEATURES="-preserved-libs" or another package manager if SONAME changes.
SLOT="0/8" # SONAME=libffi.so.8
KEYWORDS="~alpha amd64 arm arm64 hppa ~loong ~m68k ~mips ppc ppc64 ~riscv ~s390 sparc x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
IUSE="debug exec-static-trampoline pax-kernel static-libs test"
RESTRICT="!test? ( test )"
BDEPEND="test? ( dev-util/dejagnu )"
src_prepare() {
default
if [[ ${CHOST} == arm64-*-darwin* ]] ; then
# ensure we use aarch64 asm, not x86 on arm64
sed -i -e 's/aarch64\*-\*-\*/arm64*-*-*|&/' \
configure configure.host || die
fi
}
multilib_src_configure() {
# --includedir= path maintains a few properties:
# 1. have stable name across libffi versions: some packages like
# dev-lang/ghc or kde-frameworks/networkmanager-qt embed
# ${includedir} at build-time. Don't require those to be
# rebuilt unless SONAME changes. bug #695788
#
# We use /usr/.../${PN} (instead of former /usr/.../${P}).
#
# 2. have ${ABI}-specific location as ffi.h is target-dependent.
#
# We use /usr/$(get_libdir)/... to have ABI identifier.
ECONF_SOURCE="${S}" econf \
--includedir="${EPREFIX}"/usr/$(get_libdir)/${PN}/include \
--disable-multi-os-directory \
$(use_enable static-libs static) \
$(use_enable exec-static-trampoline exec-static-tramp) \
$(use_enable pax-kernel pax_emutramp) \
$(use_enable debug)
}
multilib_src_test() {
emake -Onone check
}
multilib_src_install_all() {
einstalldocs
find "${ED}" -name "*.la" -delete || die
}
pkg_preinst() {
preserve_old_lib /usr/$(get_libdir)/libffi.so.7
}
pkg_postinst() {
preserve_old_lib_notify /usr/$(get_libdir)/libffi.so.7
}

View File

@ -3,7 +3,7 @@
EAPI=8
inherit multilib-minimal preserve-libs
inherit dot-a multilib-minimal preserve-libs
MY_PV=${PV/_rc/-rc}
MY_P=${PN}-${MY_PV}
@ -15,9 +15,10 @@ if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://github.com/libffi/libffi"
inherit autotools git-r3
else
inherit libtool
SRC_URI="https://github.com/libffi/libffi/releases/download/v${MY_PV}/${MY_P}.tar.gz"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
KEYWORDS="~alpha amd64 arm arm64 ~hppa ~loong ~m68k ~mips ppc ppc64 ~riscv ~s390 ~sparc x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
fi
S="${WORKDIR}"/${MY_P}
@ -39,7 +40,11 @@ PATCHES=(
src_prepare() {
default
[[ ${PV} == 9999 ]] && eautoreconf
if [[ ${PV} == 9999 ]] ; then
eautoreconf
else
elibtoolize
fi
if [[ ${CHOST} == arm64-*-darwin* ]] ; then
# ensure we use aarch64 asm, not x86 on arm64
@ -48,6 +53,11 @@ src_prepare() {
fi
}
src_configure() {
use static-libs && lto-guarantee-fat
multilib-minimal_src_configure
}
multilib_src_configure() {
# --includedir= path maintains a few properties:
# 1. have stable name across libffi versions: some packages like
@ -76,6 +86,7 @@ multilib_src_test() {
multilib_src_install_all() {
einstalldocs
find "${ED}" -name "*.la" -delete || die
strip-lto-bytecode
}
pkg_preinst() {

View File

@ -3,7 +3,7 @@
EAPI=8
inherit multilib-minimal preserve-libs
inherit dot-a multilib-minimal preserve-libs
MY_PV=${PV/_rc/-rc}
MY_P=${PN}-${MY_PV}
@ -15,6 +15,7 @@ if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://github.com/libffi/libffi"
inherit autotools git-r3
else
inherit libtool
SRC_URI="https://github.com/libffi/libffi/releases/download/v${MY_PV}/${MY_P}.tar.gz"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
@ -33,13 +34,17 @@ RESTRICT="!test? ( test )"
BDEPEND="test? ( dev-util/dejagnu )"
PATCHES=(
"${FILESDIR}"/${PN}-3.4.7-Revert-Fix-x86-ffi64-calls-with-6-gp-and-some-sse-re.patch
"${FILESDIR}"/${PN}-3.4.8-pa-add-.note.GNU-stack-marker-to-linux.S.patch
)
src_prepare() {
default
[[ ${PV} == 9999 ]] && eautoreconf
if [[ ${PV} == 9999 ]] ; then
eautoreconf
else
elibtoolize
fi
if [[ ${CHOST} == arm64-*-darwin* ]] ; then
# ensure we use aarch64 asm, not x86 on arm64
@ -48,6 +53,11 @@ src_prepare() {
fi
}
src_configure() {
use static-libs && lto-guarantee-fat
multilib-minimal_src_configure
}
multilib_src_configure() {
# --includedir= path maintains a few properties:
# 1. have stable name across libffi versions: some packages like
@ -63,6 +73,7 @@ multilib_src_configure() {
ECONF_SOURCE="${S}" econf \
--includedir="${EPREFIX}"/usr/$(get_libdir)/${PN}/include \
--disable-multi-os-directory \
--with-pic \
$(use_enable static-libs static) \
$(use_enable exec-static-trampoline exec-static-tramp) \
$(use_enable pax-kernel pax_emutramp) \
@ -76,6 +87,7 @@ multilib_src_test() {
multilib_src_install_all() {
einstalldocs
find "${ED}" -name "*.la" -delete || die
strip-lto-bytecode
}
pkg_preinst() {

View File

@ -3,7 +3,7 @@
EAPI=8
inherit multilib-minimal preserve-libs
inherit dot-a multilib-minimal preserve-libs
MY_PV=${PV/_rc/-rc}
MY_P=${PN}-${MY_PV}
@ -15,9 +15,12 @@ if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://github.com/libffi/libffi"
inherit autotools git-r3
else
inherit libtool
SRC_URI="https://github.com/libffi/libffi/releases/download/v${MY_PV}/${MY_P}.tar.gz"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
if [[ ${PV} != *@(alpha|beta|pre|rc)* ]] ; then
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
fi
fi
S="${WORKDIR}"/${MY_P}
@ -35,7 +38,11 @@ BDEPEND="test? ( dev-util/dejagnu )"
src_prepare() {
default
[[ ${PV} == 9999 ]] && eautoreconf
if [[ ${PV} == 9999 ]] ; then
eautoreconf
else
elibtoolize
fi
if [[ ${CHOST} == arm64-*-darwin* ]] ; then
# ensure we use aarch64 asm, not x86 on arm64
@ -44,6 +51,11 @@ src_prepare() {
fi
}
src_configure() {
use static-libs && lto-guarantee-fat
multilib-minimal_src_configure
}
multilib_src_configure() {
# --includedir= path maintains a few properties:
# 1. have stable name across libffi versions: some packages like
@ -59,6 +71,7 @@ multilib_src_configure() {
ECONF_SOURCE="${S}" econf \
--includedir="${EPREFIX}"/usr/$(get_libdir)/${PN}/include \
--disable-multi-os-directory \
--with-pic \
$(use_enable static-libs static) \
$(use_enable exec-static-trampoline exec-static-tramp) \
$(use_enable pax-kernel pax_emutramp) \
@ -72,6 +85,7 @@ multilib_src_test() {
multilib_src_install_all() {
einstalldocs
find "${ED}" -name "*.la" -delete || die
strip-lto-bytecode
}
pkg_preinst() {

View File

@ -3,7 +3,7 @@
EAPI=8
inherit multilib-minimal preserve-libs
inherit dot-a multilib-minimal preserve-libs
MY_PV=${PV/_rc/-rc}
MY_P=${PN}-${MY_PV}
@ -13,11 +13,14 @@ HOMEPAGE="https://sourceware.org/libffi/"
if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://github.com/libffi/libffi"
inherit git-r3
inherit autotools git-r3
else
inherit libtool
SRC_URI="https://github.com/libffi/libffi/releases/download/v${MY_PV}/${MY_P}.tar.gz"
KEYWORDS="~alpha amd64 arm arm64 hppa ~loong ~m68k ~mips ppc ppc64 ~riscv ~s390 ~sparc x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
if [[ ${PV} != *@(alpha|beta|pre|rc)* ]] ; then
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
fi
fi
S="${WORKDIR}"/${MY_P}
@ -27,29 +30,20 @@ LICENSE="MIT"
# Please use preserve-libs.eclass in pkg_{pre,post}inst to cover users
# with FEATURES="-preserved-libs" or another package manager if SONAME changes.
SLOT="0/8" # SONAME=libffi.so.8
IUSE="debug exec-static-trampoline pax-kernel static-libs test"
IUSE="debug +exec-static-trampoline pax-kernel static-libs test"
RESTRICT="!test? ( test )"
BDEPEND="test? ( dev-util/dejagnu )"
PATCHES=(
"${FILESDIR}"/${P}-arm64-bti.patch
"${FILESDIR}"/${P}-arm64-bti-spelling.patch
"${FILESDIR}"/${P}-arm64-support-pac.patch
"${FILESDIR}"/${P}-arm64-fix-build.patch
"${FILESDIR}"/${P}-sparc-struct-targs.patch
"${FILESDIR}"/${P}-test-typo.patch
"${FILESDIR}"/${P}-x86-sse.patch
"${FILESDIR}"/${P}-arm64-cfi.patch
"${FILESDIR}"/${P}-asan.patch
"${FILESDIR}"/${P}-tests.patch
"${FILESDIR}"/${P}-regenerate-autotools.patch
"${FILESDIR}"/${P}-c23-tests.patch
)
src_prepare() {
default
if [[ ${PV} == 9999 ]] ; then
eautoreconf
else
elibtoolize
fi
if [[ ${CHOST} == arm64-*-darwin* ]] ; then
# ensure we use aarch64 asm, not x86 on arm64
sed -i -e 's/aarch64\*-\*-\*/arm64*-*-*|&/' \
@ -57,6 +51,11 @@ src_prepare() {
fi
}
src_configure() {
use static-libs && lto-guarantee-fat
multilib-minimal_src_configure
}
multilib_src_configure() {
# --includedir= path maintains a few properties:
# 1. have stable name across libffi versions: some packages like
@ -72,6 +71,7 @@ multilib_src_configure() {
ECONF_SOURCE="${S}" econf \
--includedir="${EPREFIX}"/usr/$(get_libdir)/${PN}/include \
--disable-multi-os-directory \
--with-pic \
$(use_enable static-libs static) \
$(use_enable exec-static-trampoline exec-static-tramp) \
$(use_enable pax-kernel pax_emutramp) \
@ -85,6 +85,7 @@ multilib_src_test() {
multilib_src_install_all() {
einstalldocs
find "${ED}" -name "*.la" -delete || die
strip-lto-bytecode
}
pkg_preinst() {

View File

@ -3,7 +3,7 @@
EAPI=8
inherit multilib-minimal preserve-libs
inherit dot-a multilib-minimal preserve-libs
MY_PV=${PV/_rc/-rc}
MY_P=${PN}-${MY_PV}
@ -15,9 +15,12 @@ if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://github.com/libffi/libffi"
inherit autotools git-r3
else
inherit libtool
SRC_URI="https://github.com/libffi/libffi/releases/download/v${MY_PV}/${MY_P}.tar.gz"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
if [[ ${PV} != *@(alpha|beta|pre|rc)* ]] ; then
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
fi
fi
S="${WORKDIR}"/${MY_P}
@ -35,7 +38,11 @@ BDEPEND="test? ( dev-util/dejagnu )"
src_prepare() {
default
[[ ${PV} == 9999 ]] && eautoreconf
if [[ ${PV} == 9999 ]] ; then
eautoreconf
else
elibtoolize
fi
if [[ ${CHOST} == arm64-*-darwin* ]] ; then
# ensure we use aarch64 asm, not x86 on arm64
@ -44,6 +51,11 @@ src_prepare() {
fi
}
src_configure() {
use static-libs && lto-guarantee-fat
multilib-minimal_src_configure
}
multilib_src_configure() {
# --includedir= path maintains a few properties:
# 1. have stable name across libffi versions: some packages like
@ -59,6 +71,7 @@ multilib_src_configure() {
ECONF_SOURCE="${S}" econf \
--includedir="${EPREFIX}"/usr/$(get_libdir)/${PN}/include \
--disable-multi-os-directory \
--with-pic \
$(use_enable static-libs static) \
$(use_enable exec-static-trampoline exec-static-tramp) \
$(use_enable pax-kernel pax_emutramp) \
@ -72,6 +85,7 @@ multilib_src_test() {
multilib_src_install_all() {
einstalldocs
find "${ED}" -name "*.la" -delete || die
strip-lto-bytecode
}
pkg_preinst() {