tcg: Move ffi_cif pointer into TCGHelperInfo

Instead of requiring a separate hash table lookup,
put a pointer to the CIF into TCGHelperInfo.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20221111074101.2069454-27-richard.henderson@linaro.org>
[PMD: Split from bigger patch]
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-Id: <20221122180804.938-4-philmd@linaro.org>
This commit is contained in:
Richard Henderson 2022-11-22 19:08:04 +01:00
parent 0c22e17658
commit f9c4bb804d
2 changed files with 21 additions and 16 deletions

View File

@ -25,6 +25,10 @@
#ifndef TCG_INTERNAL_H #ifndef TCG_INTERNAL_H
#define TCG_INTERNAL_H #define TCG_INTERNAL_H
#ifdef CONFIG_TCG_INTERPRETER
#include <ffi.h>
#endif
#define TCG_HIGHWATER 1024 #define TCG_HIGHWATER 1024
/* /*
@ -57,6 +61,9 @@ typedef struct TCGCallArgumentLoc {
typedef struct TCGHelperInfo { typedef struct TCGHelperInfo {
void *func; void *func;
const char *name; const char *name;
#ifdef CONFIG_TCG_INTERPRETER
ffi_cif *cif;
#endif
unsigned typemask : 32; unsigned typemask : 32;
unsigned flags : 8; unsigned flags : 8;
unsigned nr_in : 8; unsigned nr_in : 8;

View File

@ -62,10 +62,6 @@
#include "tcg/tcg-ldst.h" #include "tcg/tcg-ldst.h"
#include "tcg-internal.h" #include "tcg-internal.h"
#ifdef CONFIG_TCG_INTERPRETER
#include <ffi.h>
#endif
/* Forward declarations for functions declared in tcg-target.c.inc and /* Forward declarations for functions declared in tcg-target.c.inc and
used here. */ used here. */
static void tcg_target_init(TCGContext *s); static void tcg_target_init(TCGContext *s);
@ -553,8 +549,6 @@ static TCGHelperInfo all_helpers[] = {
static GHashTable *helper_table; static GHashTable *helper_table;
#ifdef CONFIG_TCG_INTERPRETER #ifdef CONFIG_TCG_INTERPRETER
static GHashTable *ffi_table;
static ffi_type *typecode_to_ffi(int argmask) static ffi_type *typecode_to_ffi(int argmask)
{ {
switch (argmask) { switch (argmask) {
@ -577,9 +571,11 @@ static ffi_type *typecode_to_ffi(int argmask)
static void init_ffi_layouts(void) static void init_ffi_layouts(void)
{ {
/* g_direct_hash/equal for direct comparisons on uint32_t. */ /* g_direct_hash/equal for direct comparisons on uint32_t. */
ffi_table = g_hash_table_new(NULL, NULL); GHashTable *ffi_table = g_hash_table_new(NULL, NULL);
for (int i = 0; i < ARRAY_SIZE(all_helpers); ++i) { for (int i = 0; i < ARRAY_SIZE(all_helpers); ++i) {
uint32_t typemask = all_helpers[i].typemask; TCGHelperInfo *info = &all_helpers[i];
unsigned typemask = info->typemask;
gpointer hash = (gpointer)(uintptr_t)typemask; gpointer hash = (gpointer)(uintptr_t)typemask;
struct { struct {
ffi_cif cif; ffi_cif cif;
@ -587,8 +583,11 @@ static void init_ffi_layouts(void)
} *ca; } *ca;
ffi_status status; ffi_status status;
int nargs; int nargs;
ffi_cif *cif;
if (g_hash_table_lookup(ffi_table, hash)) { cif = g_hash_table_lookup(ffi_table, hash);
if (cif) {
info->cif = cif;
continue; continue;
} }
@ -612,8 +611,12 @@ static void init_ffi_layouts(void)
ca->cif.rtype, ca->cif.arg_types); ca->cif.rtype, ca->cif.arg_types);
assert(status == FFI_OK); assert(status == FFI_OK);
g_hash_table_insert(ffi_table, hash, (gpointer)&ca->cif); cif = &ca->cif;
info->cif = cif;
g_hash_table_insert(ffi_table, hash, (gpointer)cif);
} }
g_hash_table_destroy(ffi_table);
} }
#endif /* CONFIG_TCG_INTERPRETER */ #endif /* CONFIG_TCG_INTERPRETER */
@ -4393,12 +4396,7 @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
} }
#ifdef CONFIG_TCG_INTERPRETER #ifdef CONFIG_TCG_INTERPRETER
{ tcg_out_call(s, tcg_call_func(op), info->cif);
gpointer hash = (gpointer)(uintptr_t)info->typemask;
ffi_cif *cif = g_hash_table_lookup(ffi_table, hash);
assert(cif != NULL);
tcg_out_call(s, tcg_call_func(op), cif);
}
#else #else
tcg_out_call(s, tcg_call_func(op)); tcg_out_call(s, tcg_call_func(op));
#endif #endif