From a242bfce4870f507b441ab134e7f6be55068a7a4 Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Thu, 24 Jun 2021 11:41:01 +0200 Subject: [PATCH] libports: ffi for x86_32 - Required by glib issue #4201 --- repos/libports/lib/import/import-ffi.mk | 4 ++++ repos/libports/lib/mk/spec/x86_32/ffi.mk | 23 +++++++++++++++++++++++ repos/libports/ports/ffi.hash | 2 +- repos/libports/ports/ffi.port | 19 +++++++++++++++++-- repos/libports/src/lib/ffi/dummies.c | 20 ++++++++++++++++++++ repos/libports/src/lib/ffi/fficonfig.h | 7 +++++++ 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 repos/libports/lib/mk/spec/x86_32/ffi.mk create mode 100644 repos/libports/src/lib/ffi/dummies.c diff --git a/repos/libports/lib/import/import-ffi.mk b/repos/libports/lib/import/import-ffi.mk index 49530ae2c4..ffc076b48f 100644 --- a/repos/libports/lib/import/import-ffi.mk +++ b/repos/libports/lib/import/import-ffi.mk @@ -1,3 +1,7 @@ +ifeq ($(filter-out $(SPECS),x86_32),) +INC_DIR += $(call select_from_ports,ffi)/include/ffi/spec/x86_32 +endif + ifeq ($(filter-out $(SPECS),x86_64),) INC_DIR += $(call select_from_ports,ffi)/include/ffi/spec/x86_64 endif diff --git a/repos/libports/lib/mk/spec/x86_32/ffi.mk b/repos/libports/lib/mk/spec/x86_32/ffi.mk new file mode 100644 index 0000000000..b0ffbf4a0e --- /dev/null +++ b/repos/libports/lib/mk/spec/x86_32/ffi.mk @@ -0,0 +1,23 @@ +SHARED_LIB = yes + +LIBS = libc + +FFI_PORT = $(call select_from_ports,ffi)/src/lib/ffi + +INC_DIR = $(FFI_PORT)/include + +INC_DIR += $(call select_from_ports,ffi)/include/ffi/spec/x86_32 \ + $(REP_DIR)/src/lib/ffi + +CC_OPT = -DFFI_NO_RAW_API=0 + +SRC_C = prep_cif.c types.c ffi.c dummies.c +SRC_S = sysv.S + +CC_OPT_sysv = -DHAVE_AS_ASCII_PSEUDO_OP=1 -DHAVE_AS_X86_PCREL=1 + +vpath prep_cif.c $(FFI_PORT)/src +vpath types.c $(FFI_PORT)/src +vpath ffi.c $(FFI_PORT)/src/x86 +vpath sysv.S $(FFI_PORT)/src/x86 +vpath dummies.c $(REP_DIR)/src/lib/ffi diff --git a/repos/libports/ports/ffi.hash b/repos/libports/ports/ffi.hash index 83163069c1..7b6185fe58 100644 --- a/repos/libports/ports/ffi.hash +++ b/repos/libports/ports/ffi.hash @@ -1 +1 @@ -5212feb1aca2937a6e3a9c09d9cf7c1a954a8b69 +f4bc2449b826b5884559d6ff453b06269270fff3 diff --git a/repos/libports/ports/ffi.port b/repos/libports/ports/ffi.port index 73f3c71bd7..3bc7537119 100644 --- a/repos/libports/ports/ffi.port +++ b/repos/libports/ports/ffi.port @@ -8,14 +8,18 @@ DIR(ffi) := src/lib/ffi $(call check_tool,sed) -DIRS := include/ffi/spec/x86_64 include/ffi/spec/arm include/ffi/spec/arm_64 +DIRS := include/ffi/spec/x86_32 include/ffi/spec/x86_64 \ + include/ffi/spec/arm include/ffi/spec/arm_64 + +DIR_CONTENT(include/ffi/spec/x86_32) := src/lib/ffi/src/x86/ffitarget.h DIR_CONTENT(include/ffi/spec/x86_64) := src/lib/ffi/src/x86/ffitarget.h DIR_CONTENT(include/ffi/spec/arm) := src/lib/ffi/src/arm/ffitarget.h DIR_CONTENT(include/ffi/spec/arm_64) := src/lib/ffi/src/aarch64/ffitarget.h gen_inc := ffi.h -gen_files := $(addprefix include/ffi/spec/x86_64/,$(gen_inc)) \ +gen_files := $(addprefix include/ffi/spec/x86_32/,$(gen_inc)) \ + $(addprefix include/ffi/spec/x86_64/,$(gen_inc)) \ $(addprefix include/ffi/spec/arm/,$(gen_inc)) \ $(addprefix include/ffi/spec/arm_64/,$(gen_inc)) @@ -23,6 +27,12 @@ default: $(gen_files) $(gen_files): _dirs +subst_x86_32 := \ + "@TARGET@/X86" \ + "@HAVE_LONG_DOUBLE@/0" \ + "@HAVE_LONG_DOUBLE_VARIANT@/0" \ + "@FFI_EXEC_TRAMPOLINE_TABLE@/0" + subst_x86_64 := \ "@TARGET@/X86_64" \ "@HAVE_LONG_DOUBLE@/1" \ @@ -43,6 +53,11 @@ subst_ARM_64 := \ apply_substitutions = $(VERBOSE)for i in $(2); do sed -i "s/$$i/g" $(1); done +include/ffi/spec/x86_32/ffi.h: + @$(MSG_GENERATE)$@ + $(VERBOSE)cp src/lib/ffi/include/ffi.h.in $@ + $(call apply_substitutions,$@,$(subst_x86_32)) + include/ffi/spec/x86_64/ffi.h: @$(MSG_GENERATE)$@ $(VERBOSE)cp src/lib/ffi/include/ffi.h.in $@ diff --git a/repos/libports/src/lib/ffi/dummies.c b/repos/libports/src/lib/ffi/dummies.c new file mode 100644 index 0000000000..b045a7d706 --- /dev/null +++ b/repos/libports/src/lib/ffi/dummies.c @@ -0,0 +1,20 @@ +/** + * \brief Dummy functions not supported by Genode + * \author Sebastian Sumpf + * \date 2021-06-24 + */ + +/* + * Copyright (C) 2017 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#include + +/* win32 specific functions for x86_32 */ +void ffi_closure_STDCALL (ffi_closure *c) { } +void ffi_closure_REGISTER (ffi_closure *c) { } +void ffi_closure_THISCALL (ffi_closure *c) { } +void ffi_closure_FASTCALL (ffi_closure *c) { } diff --git a/repos/libports/src/lib/ffi/fficonfig.h b/repos/libports/src/lib/ffi/fficonfig.h index be386280ea..10c51dbffe 100644 --- a/repos/libports/src/lib/ffi/fficonfig.h +++ b/repos/libports/src/lib/ffi/fficonfig.h @@ -1,7 +1,14 @@ #ifndef _FFICONFIG_H_ #define _FFICONFIG_H_ +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) .hidden name +#else #define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif + +#define EH_FRAME_FLAGS "a" + #define STDC_HEADERS 1 #define HAVE_MEMCPY 1