diff --git a/0001-add-loongarch64-objects.patch b/0001-add-loongarch64-objects.patch new file mode 100644 index 0000000000000000000000000000000000000000..96575727850d919a5cab4d9f687ea93cb6b4c4d8 --- /dev/null +++ b/0001-add-loongarch64-objects.patch @@ -0,0 +1,218 @@ +From 540161f121927926307b1902288372b9ed740959 Mon Sep 17 00:00:00 2001 +From: Liwei Ge +Date: Thu, 15 Sep 2022 21:47:08 +0800 +Subject: [PATCH] add loongarch64 objects + +Signed-off-by: Liwei Ge +--- + Makefile.am | 3 +++ + Makefile.in | 14 ++++++++------ + configure | 15 +++++++++++++++ + src/loongarch/ffi.c | 19 +++++++++++-------- + 4 files changed, 37 insertions(+), 14 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index e08402f..542179d 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -185,6 +185,9 @@ endif + if AARCH64 + nodist_libffi_la_SOURCES += src/aarch64/sysv.S src/aarch64/ffi.c + endif ++if LOONGARCH ++nodist_libffi_la_SOURCES += src/loongarch/sysv.S src/loongarch/ffi.c ++endif + if ARC + nodist_libffi_la_SOURCES += src/arc/arcompact.S src/arc/ffi.c + endif +diff --git a/Makefile.in b/Makefile.in +index cc45a98..556379c 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -122,6 +122,7 @@ target_triplet = @target@ + # Build debug. Define FFI_DEBUG on the commandline so that, when building with + # MSVC, it can link against the debug CRT. + @FFI_DEBUG_TRUE@am__append_40 = -DFFI_DEBUG ++@LOONGARCH_TRUE@am__append_50 = src/loongarch/sysv.S src/loongarch/ffi.c + subdir = . + DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ +@@ -244,6 +245,7 @@ am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ + @XTENSA_TRUE@am__objects_37 = src/xtensa/sysv.lo src/xtensa/ffi.lo + @METAG_TRUE@am__objects_38 = src/metag/sysv.lo src/metag/ffi.lo + @VAX_TRUE@am__objects_39 = src/vax/elfbsd.lo src/vax/ffi.lo ++@LOONGARCH_TRUE@am__objects_50 = src/loongarch/sysv.lo src/loongarch/ffi.lo + nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) $(am__objects_8) \ +@@ -257,7 +259,7 @@ nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_30) $(am__objects_31) $(am__objects_32) \ + $(am__objects_33) $(am__objects_34) $(am__objects_35) \ + $(am__objects_36) $(am__objects_37) $(am__objects_38) \ +- $(am__objects_39) ++ $(am__objects_39) $(am__objects_50) + libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ + $(nodist_libffi_la_OBJECTS) + AM_V_lt = $(am__v_lt_@AM_V@) +@@ -283,7 +285,8 @@ am__objects_41 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_28) $(am__objects_29) $(am__objects_30) \ + $(am__objects_31) $(am__objects_32) $(am__objects_33) \ + $(am__objects_34) $(am__objects_35) $(am__objects_36) \ +- $(am__objects_37) $(am__objects_38) $(am__objects_39) ++ $(am__objects_37) $(am__objects_38) $(am__objects_39) \ ++ $(am__objects_50) + nodist_libffi_convenience_la_OBJECTS = $(am__objects_41) + libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ + $(nodist_libffi_convenience_la_OBJECTS) +@@ -613,7 +616,6 @@ EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \ + src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ + src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ + src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ +- src/loongarch/ffi.c src/loongarch/sysv.S \ + src/mips/n32.S src/mips/o32.S src/metag/ffi.c \ + src/metag/ffitarget.h src/metag/sysv.S src/moxie/ffi.c \ + src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h \ +@@ -717,7 +719,7 @@ nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ + $(am__append_30) $(am__append_31) $(am__append_32) \ + $(am__append_33) $(am__append_34) $(am__append_35) \ + $(am__append_36) $(am__append_37) $(am__append_38) \ +- $(am__append_39) ++ $(am__append_39) $(am__append_50) + libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) + nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) + LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) +@@ -1980,7 +1982,7 @@ clean-am: clean-aminfo clean-generic clean-libtool \ + + distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) +- -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) ++ -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/loongarch/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) + -rm -f Makefile + distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags +@@ -2119,7 +2121,7 @@ installcheck-am: + maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache +- -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) ++ -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/loongarch/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) + -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti +diff --git a/configure b/configure +index 02c871b..b3c4f69 100755 +--- a/configure ++++ b/configure +@@ -680,6 +680,8 @@ ARC_FALSE + ARC_TRUE + AARCH64_FALSE + AARCH64_TRUE ++LOONGARCH_FALSE ++LOONGARCH_TRUE + POWERPC_FREEBSD_FALSE + POWERPC_FREEBSD_TRUE + POWERPC_DARWIN_FALSE +@@ -17593,6 +17595,15 @@ else + AARCH64_FALSE= + fi + ++ if test x$TARGET = xLOONGARCH; then ++ LOONGARCH_TRUE= ++ LOONGARCH_FALSE='#' ++else ++ LOONGARCH_TRUE='#' ++ LOONGARCH_FALSE= ++fi ++ ++ + if test x$TARGET = xARC; then + ARC_TRUE= + ARC_FALSE='#' +@@ -19087,6 +19098,10 @@ if test -z "${AARCH64_TRUE}" && test -z "${AARCH64_FALSE}"; then + as_fn_error $? "conditional \"AARCH64\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${LOONGARCH_TRUE}" && test -z "${LOONGARCH_FALSE}"; then ++ as_fn_error $? "conditional \"LOONGARCH\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${ARC_TRUE}" && test -z "${ARC_FALSE}"; then + as_fn_error $? "conditional \"ARC\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 +diff --git a/src/loongarch/ffi.c b/src/loongarch/ffi.c +index 310b4cb..1dc809d 100644 +--- a/src/loongarch/ffi.c ++++ b/src/loongarch/ffi.c +@@ -113,7 +113,7 @@ static float_struct_info struct_passed_as_elements(call_builder *cb, ffi_type *t + + ret.type1 = fields[0]->type; + ret.type2 = fields[1]->type; +- ret.offset2 = FFI_ALIGN(fields[0]->size, fields[1]->alignment); ++ ret.offset2 = ALIGN(fields[0]->size, fields[1]->alignment); + ret.as_elements = 1; + } + +@@ -240,8 +240,8 @@ static void marshal(call_builder *cb, ffi_type *type, int var, void *data) { + /* variadics are aligned even in registers */ + if (type->alignment > __SIZEOF_POINTER__) { + if (var) +- cb->used_integer = FFI_ALIGN(cb->used_integer, 2); +- cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); ++ cb->used_integer = ALIGN(cb->used_integer, 2); ++ cb->used_stack = (size_t *)ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); + } + + memcpy(realign, data, type->size); +@@ -295,8 +295,8 @@ static void *unmarshal(call_builder *cb, ffi_type *type, int var, void *data) { + /* variadics are aligned even in registers */ + if (type->alignment > __SIZEOF_POINTER__) { + if (var) +- cb->used_integer = FFI_ALIGN(cb->used_integer, 2); +- cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); ++ cb->used_integer = ALIGN(cb->used_integer, 2); ++ cb->used_stack = (size_t *)ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); + } + + if (type->size > 0) +@@ -343,10 +343,10 @@ ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, + /* this is a conservative estimate, assuming a complex return value and + that all remaining arguments are long long / __int128 */ + size_t arg_bytes = cif->nargs <= 3 ? 0 : +- FFI_ALIGN(2 * sizeof(size_t) * (cif->nargs - 3), STKALIGN); ++ ALIGN(2 * sizeof(size_t) * (cif->nargs - 3), STKALIGN); + size_t rval_bytes = 0; + if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__) +- rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN); ++ rval_bytes = ALIGN(cif->rtype->size, STKALIGN); + size_t alloc_size = arg_bytes + rval_bytes + sizeof(call_context); + + /* the assembly code will deallocate all stack data at lower addresses +@@ -359,7 +359,7 @@ ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, + guarantee alloca alignment to at least that much */ + alloc_base = (size_t)alloca(alloc_size); + } else { +- alloc_base = FFI_ALIGN(alloca(alloc_size + STKALIGN - 1), STKALIGN); ++ alloc_base = ALIGN(alloca(alloc_size + STKALIGN - 1), STKALIGN); + } + + if (rval_bytes) +@@ -431,6 +431,8 @@ ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void (*fun)( + return FFI_OK; + } + ++/* no go closure in libffi-3.1 */ ++/* + extern void ffi_go_closure_asm (void) FFI_HIDDEN; + + ffi_status +@@ -446,6 +448,7 @@ ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, + + return FFI_OK; + } ++*/ + + /* Called by the assembly code with aregs pointing to saved argument registers + and stack pointing to the stacked arguments. Return values passed in +-- +2.27.0 + diff --git a/libffi.spec b/libffi.spec index 69683f31acb84f7ba83dccee7e27a6ad474b296b..6af8a143f8fe595cfd251b61b9850385c2311722 100644 --- a/libffi.spec +++ b/libffi.spec @@ -1,4 +1,4 @@ -%define anolis_release .0.2 +%define anolis_release .0.3 %global multilib_arches %{ix86} ppc ppc64 ppc64p7 s390 s390x x86_64 @@ -22,6 +22,7 @@ Patch6: libffi-3.1-libffi_tmpdir.patch Patch7: libffi-3.1-memfd.patch Patch1000: 0001-arch-support-loongarch64-platform.patch +Patch1001: 0001-add-loongarch64-objects.patch %description Compilers for high level languages generate code that follow certain @@ -83,6 +84,7 @@ Doc pages for %{name}. %patch7 -p1 %patch1000 -p1 +%patch1001 -p1 %build @@ -145,6 +147,9 @@ fi %{_infodir}/libffi.info.gz %changelog +* Thu Sep 15 2022 Liwei Ge - 3.1-23.0.3 +- Link loongarch objects + * Wed Sep 7 2022 Liwei Ge - 3.1-23.0.2 - Support loongarch64 platform (chenglulu)