tcg: Convert typecode_to_ffi from array to function
In the unlikely case of invalid typecode mask, the function will abort instead of returning a NULL pointer. 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-2-philmd@linaro.org>
This commit is contained in:
parent
39004a71d8
commit
c6ef8c7b35
30
tcg/tcg.c
30
tcg/tcg.c
@ -555,14 +555,24 @@ static GHashTable *helper_table;
|
||||
#ifdef CONFIG_TCG_INTERPRETER
|
||||
static GHashTable *ffi_table;
|
||||
|
||||
static ffi_type * const typecode_to_ffi[8] = {
|
||||
[dh_typecode_void] = &ffi_type_void,
|
||||
[dh_typecode_i32] = &ffi_type_uint32,
|
||||
[dh_typecode_s32] = &ffi_type_sint32,
|
||||
[dh_typecode_i64] = &ffi_type_uint64,
|
||||
[dh_typecode_s64] = &ffi_type_sint64,
|
||||
[dh_typecode_ptr] = &ffi_type_pointer,
|
||||
};
|
||||
static ffi_type *typecode_to_ffi(int argmask)
|
||||
{
|
||||
switch (argmask) {
|
||||
case dh_typecode_void:
|
||||
return &ffi_type_void;
|
||||
case dh_typecode_i32:
|
||||
return &ffi_type_uint32;
|
||||
case dh_typecode_s32:
|
||||
return &ffi_type_sint32;
|
||||
case dh_typecode_i64:
|
||||
return &ffi_type_uint64;
|
||||
case dh_typecode_s64:
|
||||
return &ffi_type_sint64;
|
||||
case dh_typecode_ptr:
|
||||
return &ffi_type_pointer;
|
||||
}
|
||||
g_assert_not_reached();
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef struct TCGCumulativeArgs {
|
||||
@ -779,14 +789,14 @@ static void tcg_context_init(unsigned max_cpus)
|
||||
nargs = DIV_ROUND_UP(nargs, 3);
|
||||
|
||||
ca = g_malloc0(sizeof(*ca) + nargs * sizeof(ffi_type *));
|
||||
ca->cif.rtype = typecode_to_ffi[typemask & 7];
|
||||
ca->cif.rtype = typecode_to_ffi(typemask & 7);
|
||||
ca->cif.nargs = nargs;
|
||||
|
||||
if (nargs != 0) {
|
||||
ca->cif.arg_types = ca->args;
|
||||
for (int j = 0; j < nargs; ++j) {
|
||||
int typecode = extract32(typemask, (j + 1) * 3, 3);
|
||||
ca->args[j] = typecode_to_ffi[typecode];
|
||||
ca->args[j] = typecode_to_ffi(typecode);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user