tcg: Pass the locked filepointer to tcg_dump_ops
We have already looked up and locked the filepointer. Use fprintf instead of qemu_log directly for output in and around tcg_dump_ops. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220417183019.755276-12-richard.henderson@linaro.org>
This commit is contained in:
parent
3fb659605f
commit
b7a83ff8df
109
tcg/tcg.c
109
tcg/tcg.c
@ -1808,7 +1808,11 @@ static inline TCGReg tcg_regset_first(TCGRegSet d)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
/* Return only the number of characters output -- no error return. */
|
||||||
|
#define ne_fprintf(...) \
|
||||||
|
({ int ret_ = fprintf(__VA_ARGS__); ret_ >= 0 ? ret_ : 0; })
|
||||||
|
|
||||||
|
static void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
|
||||||
{
|
{
|
||||||
char buf[128];
|
char buf[128];
|
||||||
TCGOp *op;
|
TCGOp *op;
|
||||||
@ -1824,7 +1828,7 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
|
|
||||||
if (c == INDEX_op_insn_start) {
|
if (c == INDEX_op_insn_start) {
|
||||||
nb_oargs = 0;
|
nb_oargs = 0;
|
||||||
col += qemu_log("\n ----");
|
col += ne_fprintf(f, "\n ----");
|
||||||
|
|
||||||
for (i = 0; i < TARGET_INSN_START_WORDS; ++i) {
|
for (i = 0; i < TARGET_INSN_START_WORDS; ++i) {
|
||||||
target_ulong a;
|
target_ulong a;
|
||||||
@ -1833,7 +1837,7 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
#else
|
#else
|
||||||
a = op->args[i];
|
a = op->args[i];
|
||||||
#endif
|
#endif
|
||||||
col += qemu_log(" " TARGET_FMT_lx, a);
|
col += ne_fprintf(f, " " TARGET_FMT_lx, a);
|
||||||
}
|
}
|
||||||
} else if (c == INDEX_op_call) {
|
} else if (c == INDEX_op_call) {
|
||||||
const TCGHelperInfo *info = tcg_call_info(op);
|
const TCGHelperInfo *info = tcg_call_info(op);
|
||||||
@ -1844,7 +1848,7 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
nb_iargs = TCGOP_CALLI(op);
|
nb_iargs = TCGOP_CALLI(op);
|
||||||
nb_cargs = def->nb_cargs;
|
nb_cargs = def->nb_cargs;
|
||||||
|
|
||||||
col += qemu_log(" %s ", def->name);
|
col += ne_fprintf(f, " %s ", def->name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Print the function name from TCGHelperInfo, if available.
|
* Print the function name from TCGHelperInfo, if available.
|
||||||
@ -1852,15 +1856,15 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
* but the actual function pointer comes from the plugin.
|
* but the actual function pointer comes from the plugin.
|
||||||
*/
|
*/
|
||||||
if (func == info->func) {
|
if (func == info->func) {
|
||||||
col += qemu_log("%s", info->name);
|
col += ne_fprintf(f, "%s", info->name);
|
||||||
} else {
|
} else {
|
||||||
col += qemu_log("plugin(%p)", func);
|
col += ne_fprintf(f, "plugin(%p)", func);
|
||||||
}
|
}
|
||||||
|
|
||||||
col += qemu_log(",$0x%x,$%d", info->flags, nb_oargs);
|
col += ne_fprintf(f, ",$0x%x,$%d", info->flags, nb_oargs);
|
||||||
for (i = 0; i < nb_oargs; i++) {
|
for (i = 0; i < nb_oargs; i++) {
|
||||||
col += qemu_log(",%s", tcg_get_arg_str(s, buf, sizeof(buf),
|
col += ne_fprintf(f, ",%s", tcg_get_arg_str(s, buf, sizeof(buf),
|
||||||
op->args[i]));
|
op->args[i]));
|
||||||
}
|
}
|
||||||
for (i = 0; i < nb_iargs; i++) {
|
for (i = 0; i < nb_iargs; i++) {
|
||||||
TCGArg arg = op->args[nb_oargs + i];
|
TCGArg arg = op->args[nb_oargs + i];
|
||||||
@ -1868,34 +1872,32 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
if (arg != TCG_CALL_DUMMY_ARG) {
|
if (arg != TCG_CALL_DUMMY_ARG) {
|
||||||
t = tcg_get_arg_str(s, buf, sizeof(buf), arg);
|
t = tcg_get_arg_str(s, buf, sizeof(buf), arg);
|
||||||
}
|
}
|
||||||
col += qemu_log(",%s", t);
|
col += ne_fprintf(f, ",%s", t);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
col += qemu_log(" %s ", def->name);
|
col += ne_fprintf(f, " %s ", def->name);
|
||||||
|
|
||||||
nb_oargs = def->nb_oargs;
|
nb_oargs = def->nb_oargs;
|
||||||
nb_iargs = def->nb_iargs;
|
nb_iargs = def->nb_iargs;
|
||||||
nb_cargs = def->nb_cargs;
|
nb_cargs = def->nb_cargs;
|
||||||
|
|
||||||
if (def->flags & TCG_OPF_VECTOR) {
|
if (def->flags & TCG_OPF_VECTOR) {
|
||||||
col += qemu_log("v%d,e%d,", 64 << TCGOP_VECL(op),
|
col += ne_fprintf(f, "v%d,e%d,", 64 << TCGOP_VECL(op),
|
||||||
8 << TCGOP_VECE(op));
|
8 << TCGOP_VECE(op));
|
||||||
}
|
}
|
||||||
|
|
||||||
k = 0;
|
k = 0;
|
||||||
for (i = 0; i < nb_oargs; i++) {
|
for (i = 0; i < nb_oargs; i++) {
|
||||||
if (k != 0) {
|
const char *sep = k ? "," : "";
|
||||||
col += qemu_log(",");
|
col += ne_fprintf(f, "%s%s", sep,
|
||||||
}
|
tcg_get_arg_str(s, buf, sizeof(buf),
|
||||||
col += qemu_log("%s", tcg_get_arg_str(s, buf, sizeof(buf),
|
op->args[k++]));
|
||||||
op->args[k++]));
|
|
||||||
}
|
}
|
||||||
for (i = 0; i < nb_iargs; i++) {
|
for (i = 0; i < nb_iargs; i++) {
|
||||||
if (k != 0) {
|
const char *sep = k ? "," : "";
|
||||||
col += qemu_log(",");
|
col += ne_fprintf(f, "%s%s", sep,
|
||||||
}
|
tcg_get_arg_str(s, buf, sizeof(buf),
|
||||||
col += qemu_log("%s", tcg_get_arg_str(s, buf, sizeof(buf),
|
op->args[k++]));
|
||||||
op->args[k++]));
|
|
||||||
}
|
}
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case INDEX_op_brcond_i32:
|
case INDEX_op_brcond_i32:
|
||||||
@ -1910,9 +1912,9 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
case INDEX_op_cmpsel_vec:
|
case INDEX_op_cmpsel_vec:
|
||||||
if (op->args[k] < ARRAY_SIZE(cond_name)
|
if (op->args[k] < ARRAY_SIZE(cond_name)
|
||||||
&& cond_name[op->args[k]]) {
|
&& cond_name[op->args[k]]) {
|
||||||
col += qemu_log(",%s", cond_name[op->args[k++]]);
|
col += ne_fprintf(f, ",%s", cond_name[op->args[k++]]);
|
||||||
} else {
|
} else {
|
||||||
col += qemu_log(",$0x%" TCG_PRIlx, op->args[k++]);
|
col += ne_fprintf(f, ",$0x%" TCG_PRIlx, op->args[k++]);
|
||||||
}
|
}
|
||||||
i = 1;
|
i = 1;
|
||||||
break;
|
break;
|
||||||
@ -1927,12 +1929,12 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
unsigned ix = get_mmuidx(oi);
|
unsigned ix = get_mmuidx(oi);
|
||||||
|
|
||||||
if (op & ~(MO_AMASK | MO_BSWAP | MO_SSIZE)) {
|
if (op & ~(MO_AMASK | MO_BSWAP | MO_SSIZE)) {
|
||||||
col += qemu_log(",$0x%x,%u", op, ix);
|
col += ne_fprintf(f, ",$0x%x,%u", op, ix);
|
||||||
} else {
|
} else {
|
||||||
const char *s_al, *s_op;
|
const char *s_al, *s_op;
|
||||||
s_al = alignment_name[(op & MO_AMASK) >> MO_ASHIFT];
|
s_al = alignment_name[(op & MO_AMASK) >> MO_ASHIFT];
|
||||||
s_op = ldst_name[op & (MO_BSWAP | MO_SSIZE)];
|
s_op = ldst_name[op & (MO_BSWAP | MO_SSIZE)];
|
||||||
col += qemu_log(",%s%s,%u", s_al, s_op, ix);
|
col += ne_fprintf(f, ",%s%s,%u", s_al, s_op, ix);
|
||||||
}
|
}
|
||||||
i = 1;
|
i = 1;
|
||||||
}
|
}
|
||||||
@ -1950,9 +1952,9 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
name = bswap_flag_name[flags];
|
name = bswap_flag_name[flags];
|
||||||
}
|
}
|
||||||
if (name) {
|
if (name) {
|
||||||
col += qemu_log(",%s", name);
|
col += ne_fprintf(f, ",%s", name);
|
||||||
} else {
|
} else {
|
||||||
col += qemu_log(",$0x%" TCG_PRIlx, flags);
|
col += ne_fprintf(f, ",$0x%" TCG_PRIlx, flags);
|
||||||
}
|
}
|
||||||
i = k = 1;
|
i = k = 1;
|
||||||
}
|
}
|
||||||
@ -1967,49 +1969,42 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
case INDEX_op_brcond_i32:
|
case INDEX_op_brcond_i32:
|
||||||
case INDEX_op_brcond_i64:
|
case INDEX_op_brcond_i64:
|
||||||
case INDEX_op_brcond2_i32:
|
case INDEX_op_brcond2_i32:
|
||||||
col += qemu_log("%s$L%d", k ? "," : "",
|
col += ne_fprintf(f, "%s$L%d", k ? "," : "",
|
||||||
arg_label(op->args[k])->id);
|
arg_label(op->args[k])->id);
|
||||||
i++, k++;
|
i++, k++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (; i < nb_cargs; i++, k++) {
|
for (; i < nb_cargs; i++, k++) {
|
||||||
col += qemu_log("%s$0x%" TCG_PRIlx, k ? "," : "", op->args[k]);
|
col += ne_fprintf(f, "%s$0x%" TCG_PRIlx, k ? "," : "",
|
||||||
|
op->args[k]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (have_prefs || op->life) {
|
if (have_prefs || op->life) {
|
||||||
|
for (; col < 40; ++col) {
|
||||||
QemuLogFile *logfile;
|
putc(' ', f);
|
||||||
|
|
||||||
rcu_read_lock();
|
|
||||||
logfile = qatomic_rcu_read(&qemu_logfile);
|
|
||||||
if (logfile) {
|
|
||||||
for (; col < 40; ++col) {
|
|
||||||
putc(' ', logfile->fd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op->life) {
|
if (op->life) {
|
||||||
unsigned life = op->life;
|
unsigned life = op->life;
|
||||||
|
|
||||||
if (life & (SYNC_ARG * 3)) {
|
if (life & (SYNC_ARG * 3)) {
|
||||||
qemu_log(" sync:");
|
ne_fprintf(f, " sync:");
|
||||||
for (i = 0; i < 2; ++i) {
|
for (i = 0; i < 2; ++i) {
|
||||||
if (life & (SYNC_ARG << i)) {
|
if (life & (SYNC_ARG << i)) {
|
||||||
qemu_log(" %d", i);
|
ne_fprintf(f, " %d", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
life /= DEAD_ARG;
|
life /= DEAD_ARG;
|
||||||
if (life) {
|
if (life) {
|
||||||
qemu_log(" dead:");
|
ne_fprintf(f, " dead:");
|
||||||
for (i = 0; life; ++i, life >>= 1) {
|
for (i = 0; life; ++i, life >>= 1) {
|
||||||
if (life & 1) {
|
if (life & 1) {
|
||||||
qemu_log(" %d", i);
|
ne_fprintf(f, " %d", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2020,28 +2015,28 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
|
|||||||
TCGRegSet set = op->output_pref[i];
|
TCGRegSet set = op->output_pref[i];
|
||||||
|
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
qemu_log(" pref=");
|
ne_fprintf(f, " pref=");
|
||||||
} else {
|
} else {
|
||||||
qemu_log(",");
|
ne_fprintf(f, ",");
|
||||||
}
|
}
|
||||||
if (set == 0) {
|
if (set == 0) {
|
||||||
qemu_log("none");
|
ne_fprintf(f, "none");
|
||||||
} else if (set == MAKE_64BIT_MASK(0, TCG_TARGET_NB_REGS)) {
|
} else if (set == MAKE_64BIT_MASK(0, TCG_TARGET_NB_REGS)) {
|
||||||
qemu_log("all");
|
ne_fprintf(f, "all");
|
||||||
#ifdef CONFIG_DEBUG_TCG
|
#ifdef CONFIG_DEBUG_TCG
|
||||||
} else if (tcg_regset_single(set)) {
|
} else if (tcg_regset_single(set)) {
|
||||||
TCGReg reg = tcg_regset_first(set);
|
TCGReg reg = tcg_regset_first(set);
|
||||||
qemu_log("%s", tcg_target_reg_names[reg]);
|
ne_fprintf(f, "%s", tcg_target_reg_names[reg]);
|
||||||
#endif
|
#endif
|
||||||
} else if (TCG_TARGET_NB_REGS <= 32) {
|
} else if (TCG_TARGET_NB_REGS <= 32) {
|
||||||
qemu_log("%#x", (uint32_t)set);
|
ne_fprintf(f, "0x%x", (uint32_t)set);
|
||||||
} else {
|
} else {
|
||||||
qemu_log("%#" PRIx64, (uint64_t)set);
|
ne_fprintf(f, "0x%" PRIx64, (uint64_t)set);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_log("\n");
|
putc('\n', f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4207,7 +4202,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
|
|||||||
FILE *logfile = qemu_log_trylock();
|
FILE *logfile = qemu_log_trylock();
|
||||||
if (logfile) {
|
if (logfile) {
|
||||||
fprintf(logfile, "OP:\n");
|
fprintf(logfile, "OP:\n");
|
||||||
tcg_dump_ops(s, false);
|
tcg_dump_ops(s, logfile, false);
|
||||||
fprintf(logfile, "\n");
|
fprintf(logfile, "\n");
|
||||||
qemu_log_unlock(logfile);
|
qemu_log_unlock(logfile);
|
||||||
}
|
}
|
||||||
@ -4254,7 +4249,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
|
|||||||
FILE *logfile = qemu_log_trylock();
|
FILE *logfile = qemu_log_trylock();
|
||||||
if (logfile) {
|
if (logfile) {
|
||||||
fprintf(logfile, "OP before indirect lowering:\n");
|
fprintf(logfile, "OP before indirect lowering:\n");
|
||||||
tcg_dump_ops(s, false);
|
tcg_dump_ops(s, logfile, false);
|
||||||
fprintf(logfile, "\n");
|
fprintf(logfile, "\n");
|
||||||
qemu_log_unlock(logfile);
|
qemu_log_unlock(logfile);
|
||||||
}
|
}
|
||||||
@ -4277,7 +4272,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
|
|||||||
FILE *logfile = qemu_log_trylock();
|
FILE *logfile = qemu_log_trylock();
|
||||||
if (logfile) {
|
if (logfile) {
|
||||||
fprintf(logfile, "OP after optimization and liveness analysis:\n");
|
fprintf(logfile, "OP after optimization and liveness analysis:\n");
|
||||||
tcg_dump_ops(s, true);
|
tcg_dump_ops(s, logfile, true);
|
||||||
fprintf(logfile, "\n");
|
fprintf(logfile, "\n");
|
||||||
qemu_log_unlock(logfile);
|
qemu_log_unlock(logfile);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user