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:
parent
0c22e17658
commit
f9c4bb804d
@ -25,6 +25,10 @@
|
||||
#ifndef TCG_INTERNAL_H
|
||||
#define TCG_INTERNAL_H
|
||||
|
||||
#ifdef CONFIG_TCG_INTERPRETER
|
||||
#include <ffi.h>
|
||||
#endif
|
||||
|
||||
#define TCG_HIGHWATER 1024
|
||||
|
||||
/*
|
||||
@ -57,6 +61,9 @@ typedef struct TCGCallArgumentLoc {
|
||||
typedef struct TCGHelperInfo {
|
||||
void *func;
|
||||
const char *name;
|
||||
#ifdef CONFIG_TCG_INTERPRETER
|
||||
ffi_cif *cif;
|
||||
#endif
|
||||
unsigned typemask : 32;
|
||||
unsigned flags : 8;
|
||||
unsigned nr_in : 8;
|
||||
|
30
tcg/tcg.c
30
tcg/tcg.c
@ -62,10 +62,6 @@
|
||||
#include "tcg/tcg-ldst.h"
|
||||
#include "tcg-internal.h"
|
||||
|
||||
#ifdef CONFIG_TCG_INTERPRETER
|
||||
#include <ffi.h>
|
||||
#endif
|
||||
|
||||
/* Forward declarations for functions declared in tcg-target.c.inc and
|
||||
used here. */
|
||||
static void tcg_target_init(TCGContext *s);
|
||||
@ -553,8 +549,6 @@ static TCGHelperInfo all_helpers[] = {
|
||||
static GHashTable *helper_table;
|
||||
|
||||
#ifdef CONFIG_TCG_INTERPRETER
|
||||
static GHashTable *ffi_table;
|
||||
|
||||
static ffi_type *typecode_to_ffi(int argmask)
|
||||
{
|
||||
switch (argmask) {
|
||||
@ -577,9 +571,11 @@ static ffi_type *typecode_to_ffi(int argmask)
|
||||
static void init_ffi_layouts(void)
|
||||
{
|
||||
/* 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) {
|
||||
uint32_t typemask = all_helpers[i].typemask;
|
||||
TCGHelperInfo *info = &all_helpers[i];
|
||||
unsigned typemask = info->typemask;
|
||||
gpointer hash = (gpointer)(uintptr_t)typemask;
|
||||
struct {
|
||||
ffi_cif cif;
|
||||
@ -587,8 +583,11 @@ static void init_ffi_layouts(void)
|
||||
} *ca;
|
||||
ffi_status status;
|
||||
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;
|
||||
}
|
||||
|
||||
@ -612,8 +611,12 @@ static void init_ffi_layouts(void)
|
||||
ca->cif.rtype, ca->cif.arg_types);
|
||||
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 */
|
||||
|
||||
@ -4393,12 +4396,7 @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TCG_INTERPRETER
|
||||
{
|
||||
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);
|
||||
}
|
||||
tcg_out_call(s, tcg_call_func(op), info->cif);
|
||||
#else
|
||||
tcg_out_call(s, tcg_call_func(op));
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user