[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 06/27] tcg: Store the TCGHelperInfo in the TCGOp for call
From: |
Richard Henderson |
Subject: |
[PATCH v7 06/27] tcg: Store the TCGHelperInfo in the TCGOp for call |
Date: |
Tue, 1 Jun 2021 08:00:45 -0700 |
This will give us both flags and typemask for use later.
We also fix a dumping bug, wherein calls generated for plugins
fail tcg_find_helper and print (null) instead of either a name
or the raw function pointer.
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/internal.h | 14 +++++++++++++-
tcg/tcg.c | 49 +++++++++++++++++++++----------------------------
2 files changed, 34 insertions(+), 29 deletions(-)
diff --git a/tcg/internal.h b/tcg/internal.h
index 35a8a0d9fa..c2d5e9c42f 100644
--- a/tcg/internal.h
+++ b/tcg/internal.h
@@ -25,9 +25,21 @@
#ifndef TCG_INTERNAL_H
#define TCG_INTERNAL_H 1
+typedef struct TCGHelperInfo {
+ void *func;
+ const char *name;
+ unsigned flags;
+ unsigned typemask;
+} TCGHelperInfo;
+
+static inline const TCGHelperInfo *tcg_call_info(TCGOp *op)
+{
+ return (void *)(uintptr_t)op->args[TCGOP_CALLO(op) + TCGOP_CALLI(op) + 1];
+}
+
static inline unsigned tcg_call_flags(TCGOp *op)
{
- return op->args[TCGOP_CALLO(op) + TCGOP_CALLI(op) + 1];
+ return tcg_call_info(op)->flags;
}
#endif /* TCG_INTERNAL_H */
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 1fb4604e45..6e5b70215a 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1084,13 +1084,6 @@ void tcg_pool_reset(TCGContext *s)
s->pool_current = NULL;
}
-typedef struct TCGHelperInfo {
- void *func;
- const char *name;
- unsigned flags;
- unsigned typemask;
-} TCGHelperInfo;
-
#include "exec/helper-proto.h"
static const TCGHelperInfo all_helpers[] = {
@@ -1963,12 +1956,11 @@ bool tcg_op_supported(TCGOpcode op)
void tcg_gen_callN(void *func, TCGTemp *ret, int nargs, TCGTemp **args)
{
int i, real_args, nb_rets, pi;
- unsigned typemask, flags;
- TCGHelperInfo *info;
+ unsigned typemask;
+ const TCGHelperInfo *info;
TCGOp *op;
info = g_hash_table_lookup(helper_table, (gpointer)func);
- flags = info->flags;
typemask = info->typemask;
#ifdef CONFIG_PLUGIN
@@ -2106,7 +2098,7 @@ void tcg_gen_callN(void *func, TCGTemp *ret, int nargs,
TCGTemp **args)
real_args++;
}
op->args[pi++] = (uintptr_t)func;
- op->args[pi++] = flags;
+ op->args[pi++] = (uintptr_t)info;
TCGOP_CALLI(op) = real_args;
/* Make sure the fields didn't overflow. */
@@ -2225,19 +2217,6 @@ static char *tcg_get_arg_str(TCGContext *s, char *buf,
return tcg_get_arg_str_ptr(s, buf, buf_size, arg_temp(arg));
}
-/* Find helper name. */
-static inline const char *tcg_find_helper(TCGContext *s, uintptr_t val)
-{
- const char *ret = NULL;
- if (helper_table) {
- TCGHelperInfo *info = g_hash_table_lookup(helper_table, (gpointer)val);
- if (info) {
- ret = info->name;
- }
- }
- return ret;
-}
-
static const char * const cond_name[] =
{
[TCG_COND_NEVER] = "never",
@@ -2328,15 +2307,29 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
col += qemu_log(" " TARGET_FMT_lx, a);
}
} else if (c == INDEX_op_call) {
+ const TCGHelperInfo *info = tcg_call_info(op);
+ void *func;
+
/* variable number of arguments */
nb_oargs = TCGOP_CALLO(op);
nb_iargs = TCGOP_CALLI(op);
nb_cargs = def->nb_cargs;
- /* function name, flags, out args */
- col += qemu_log(" %s %s,$0x%x,$%d", def->name,
- tcg_find_helper(s, op->args[nb_oargs + nb_iargs]),
- tcg_call_flags(op), nb_oargs);
+ col += qemu_log(" %s ", def->name);
+
+ /*
+ * Print the function name from TCGHelperInfo, if available.
+ * Note that plugins have a template function for the info,
+ * but the actual function pointer comes from the plugin.
+ */
+ func = (void *)(uintptr_t)op->args[nb_oargs + nb_iargs];
+ if (func == info->func) {
+ col += qemu_log("%s", info->name);
+ } else {
+ col += qemu_log("plugin(%p)", func);
+ }
+
+ col += qemu_log("$0x%x,$%d", info->flags, nb_oargs);
for (i = 0; i < nb_oargs; i++) {
col += qemu_log(",%s", tcg_get_arg_str(s, buf, sizeof(buf),
op->args[i]));
--
2.25.1
- [PATCH v7 00/27] TCI fixes and cleanups, Richard Henderson, 2021/06/01
- [PATCH v7 02/27] tcg: Add tcg_call_flags, Richard Henderson, 2021/06/01
- [PATCH v7 03/27] accel/tcg/plugin-gen: Drop inline markers, Richard Henderson, 2021/06/01
- [PATCH v7 01/27] tcg: Combine dh_is_64bit and dh_is_signed to dh_typecode, Richard Henderson, 2021/06/01
- [PATCH v7 04/27] plugins: Drop tcg_flags from struct qemu_plugin_dyn_cb, Richard Henderson, 2021/06/01
- [PATCH v7 07/27] tcg: Add tcg_call_func, Richard Henderson, 2021/06/01
- [PATCH v7 05/27] accel/tcg: Add tcg call flags to plugins helpers, Richard Henderson, 2021/06/01
- [PATCH v7 06/27] tcg: Store the TCGHelperInfo in the TCGOp for call,
Richard Henderson <=
- [PATCH v7 09/27] tcg/tci: Improve tcg_target_call_clobber_regs, Richard Henderson, 2021/06/01
- [PATCH v7 10/27] tcg/tci: Move call-return regs to end of tcg_target_reg_alloc_order, Richard Henderson, 2021/06/01
- [PATCH v7 13/27] tcg/tci: Emit setcond before brcond, Richard Henderson, 2021/06/01
- [PATCH v7 15/27] tcg/tci: Change encoding to uint32_t units, Richard Henderson, 2021/06/01