mirror of https://github.com/xemu-project/xemu.git
plugins: Replace pr_ops with a proper debug dump flag
The DEBUG_PLUGIN_GEN_OPS ifdef is replaced with "-d op_plugin". The second pr_ops call can be obtained with "-d op". Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
ccd8f17e02
commit
b384c734ec
|
@ -44,6 +44,7 @@
|
||||||
*/
|
*/
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/plugin.h"
|
#include "qemu/plugin.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "tcg/tcg.h"
|
#include "tcg/tcg.h"
|
||||||
#include "tcg/tcg-temp-internal.h"
|
#include "tcg/tcg-temp-internal.h"
|
||||||
|
@ -186,66 +187,21 @@ static void gen_mem_cb(struct qemu_plugin_dyn_cb *cb,
|
||||||
tcg_temp_free_i32(cpu_index);
|
tcg_temp_free_i32(cpu_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* #define DEBUG_PLUGIN_GEN_OPS */
|
|
||||||
static void pr_ops(void)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_PLUGIN_GEN_OPS
|
|
||||||
TCGOp *op;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
QTAILQ_FOREACH(op, &tcg_ctx->ops, link) {
|
|
||||||
const char *name = "";
|
|
||||||
const char *type = "";
|
|
||||||
|
|
||||||
if (op->opc == INDEX_op_plugin_cb_start) {
|
|
||||||
switch (op->args[0]) {
|
|
||||||
case PLUGIN_GEN_FROM_TB:
|
|
||||||
name = "tb";
|
|
||||||
break;
|
|
||||||
case PLUGIN_GEN_FROM_INSN:
|
|
||||||
name = "insn";
|
|
||||||
break;
|
|
||||||
case PLUGIN_GEN_FROM_MEM:
|
|
||||||
name = "mem";
|
|
||||||
break;
|
|
||||||
case PLUGIN_GEN_AFTER_INSN:
|
|
||||||
name = "after insn";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (op->args[1]) {
|
|
||||||
case PLUGIN_GEN_CB_UDATA:
|
|
||||||
type = "udata";
|
|
||||||
break;
|
|
||||||
case PLUGIN_GEN_CB_INLINE:
|
|
||||||
type = "inline";
|
|
||||||
break;
|
|
||||||
case PLUGIN_GEN_CB_MEM:
|
|
||||||
type = "mem";
|
|
||||||
break;
|
|
||||||
case PLUGIN_GEN_ENABLE_MEM_HELPER:
|
|
||||||
type = "enable mem helper";
|
|
||||||
break;
|
|
||||||
case PLUGIN_GEN_DISABLE_MEM_HELPER:
|
|
||||||
type = "disable mem helper";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf("op[%2i]: %s %s %s\n", i, tcg_op_defs[op->opc].name, name, type);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
|
static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
|
||||||
{
|
{
|
||||||
TCGOp *op, *next;
|
TCGOp *op, *next;
|
||||||
int insn_idx = -1;
|
int insn_idx = -1;
|
||||||
|
|
||||||
pr_ops();
|
if (unlikely(qemu_loglevel_mask(LOG_TB_OP_PLUGIN)
|
||||||
|
&& qemu_log_in_addr_range(plugin_tb->vaddr))) {
|
||||||
|
FILE *logfile = qemu_log_trylock();
|
||||||
|
if (logfile) {
|
||||||
|
fprintf(logfile, "OP before plugin injection:\n");
|
||||||
|
tcg_dump_ops(tcg_ctx, logfile, false);
|
||||||
|
fprintf(logfile, "\n");
|
||||||
|
qemu_log_unlock(logfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* While injecting code, we cannot afford to reuse any ebb temps
|
* While injecting code, we cannot afford to reuse any ebb temps
|
||||||
|
@ -383,7 +339,6 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pr_ops();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db,
|
bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db,
|
||||||
|
|
|
@ -36,6 +36,7 @@ bool qemu_log_separate(void);
|
||||||
#define LOG_STRACE (1 << 19)
|
#define LOG_STRACE (1 << 19)
|
||||||
#define LOG_PER_THREAD (1 << 20)
|
#define LOG_PER_THREAD (1 << 20)
|
||||||
#define CPU_LOG_TB_VPU (1 << 21)
|
#define CPU_LOG_TB_VPU (1 << 21)
|
||||||
|
#define LOG_TB_OP_PLUGIN (1 << 22)
|
||||||
|
|
||||||
/* Lock/unlock output. */
|
/* Lock/unlock output. */
|
||||||
|
|
||||||
|
|
|
@ -1070,5 +1070,6 @@ static inline const TCGOpcode *tcg_swap_vecop_list(const TCGOpcode *n)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tcg_can_emit_vecop_list(const TCGOpcode *, TCGType, unsigned);
|
bool tcg_can_emit_vecop_list(const TCGOpcode *, TCGType, unsigned);
|
||||||
|
void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs);
|
||||||
|
|
||||||
#endif /* TCG_H */
|
#endif /* TCG_H */
|
||||||
|
|
29
tcg/tcg.c
29
tcg/tcg.c
|
@ -2540,6 +2540,15 @@ static const char bswap_flag_name[][6] = {
|
||||||
[TCG_BSWAP_IZ | TCG_BSWAP_OS] = "iz,os",
|
[TCG_BSWAP_IZ | TCG_BSWAP_OS] = "iz,os",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_PLUGIN
|
||||||
|
static const char * const plugin_from_name[] = {
|
||||||
|
"from-tb",
|
||||||
|
"from-insn",
|
||||||
|
"after-insn",
|
||||||
|
"after-tb",
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline bool tcg_regset_single(TCGRegSet d)
|
static inline bool tcg_regset_single(TCGRegSet d)
|
||||||
{
|
{
|
||||||
return (d & (d - 1)) == 0;
|
return (d & (d - 1)) == 0;
|
||||||
|
@ -2558,7 +2567,7 @@ static inline TCGReg tcg_regset_first(TCGRegSet d)
|
||||||
#define ne_fprintf(...) \
|
#define ne_fprintf(...) \
|
||||||
({ int ret_ = fprintf(__VA_ARGS__); ret_ >= 0 ? ret_ : 0; })
|
({ int ret_ = fprintf(__VA_ARGS__); ret_ >= 0 ? ret_ : 0; })
|
||||||
|
|
||||||
static void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
|
void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
|
||||||
{
|
{
|
||||||
char buf[128];
|
char buf[128];
|
||||||
TCGOp *op;
|
TCGOp *op;
|
||||||
|
@ -2714,6 +2723,24 @@ static void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
|
||||||
i = k = 1;
|
i = k = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#ifdef CONFIG_PLUGIN
|
||||||
|
case INDEX_op_plugin_cb:
|
||||||
|
{
|
||||||
|
TCGArg from = op->args[k++];
|
||||||
|
const char *name = NULL;
|
||||||
|
|
||||||
|
if (from < ARRAY_SIZE(plugin_from_name)) {
|
||||||
|
name = plugin_from_name[from];
|
||||||
|
}
|
||||||
|
if (name) {
|
||||||
|
col += ne_fprintf(f, "%s", name);
|
||||||
|
} else {
|
||||||
|
col += ne_fprintf(f, "$0x%" TCG_PRIlx, from);
|
||||||
|
}
|
||||||
|
i = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
i = 0;
|
i = 0;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -466,6 +466,10 @@ const QEMULogItem qemu_log_items[] = {
|
||||||
"show micro ops after optimization" },
|
"show micro ops after optimization" },
|
||||||
{ CPU_LOG_TB_OP_IND, "op_ind",
|
{ CPU_LOG_TB_OP_IND, "op_ind",
|
||||||
"show micro ops before indirect lowering" },
|
"show micro ops before indirect lowering" },
|
||||||
|
#ifdef CONFIG_PLUGIN
|
||||||
|
{ LOG_TB_OP_PLUGIN, "op_plugin",
|
||||||
|
"show micro ops before plugin injection" },
|
||||||
|
#endif
|
||||||
{ CPU_LOG_INT, "int",
|
{ CPU_LOG_INT, "int",
|
||||||
"show interrupts/exceptions in short format" },
|
"show interrupts/exceptions in short format" },
|
||||||
{ CPU_LOG_EXEC, "exec",
|
{ CPU_LOG_EXEC, "exec",
|
||||||
|
|
Loading…
Reference in New Issue