aboutsummaryrefslogtreecommitdiff
path: root/tcg
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2022-04-20 12:47:15 -0700
committerRichard Henderson <richard.henderson@linaro.org>2022-04-20 12:47:15 -0700
commit27a985159a80430a0a43161797ca14ef946962b8 (patch)
tree54708343e87dc25dd9abf5230f43482ab5662ad5 /tcg
parent2d20a57453f6a206938cbbf77bed0b378c806c1f (diff)
parent4e51069d679348d2617512e56e28cdc7bb34c833 (diff)
downloadqemu-27a985159a80430a0a43161797ca14ef946962b8.zip
qemu-27a985159a80430a0a43161797ca14ef946962b8.tar.gz
qemu-27a985159a80430a0a43161797ca14ef946962b8.tar.bz2
Merge tag 'pull-log-20220420' of https://gitlab.com/rth7680/qemu into staging
Clean up log locking. Use the FILE* from qemu_log_trylock more often. Support per-thread log files with -d tid. # -----BEGIN PGP SIGNATURE----- # # iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmJgStUdHHJpY2hhcmQu # aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV+c9Af/ZXnKe6bz5yjXy1mS # mNIBJUPKrz1RXFfJxuCfEDWrtNc/gvQyvc3weZG5X0cXpiczeWA5V/9xbE9hu5gV # 4rePiIHWmOrais6GZlqEu2F8P3/XyqdPHtcdBfa1hDneixtpqMHCqnh36nQjHyiU # ogFxEJ/M9tTwhuWZrXe/JSYAiALEDYMK9bk4RUMOP1c4v37rXqUNOAM1IPhfxLL/ # bK9DQMpz5oUNsWWaqBQ2wQWHkNTOpUEkKGQv0xcQF5SdpYwaxakW9B7/h4QSeOUn # oY6MFTmkJ4BPrLnkcubn+3PICc9LW0OFuzNnUdMCbeqVbjAUQrdMDalKpy4uNFv9 # U1VqHg== # =Mt5s # -----END PGP SIGNATURE----- # gpg: Signature made Wed 20 Apr 2022 11:03:01 AM PDT # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [ultimate] * tag 'pull-log-20220420' of https://gitlab.com/rth7680/qemu: (39 commits) util/log: Support per-thread log files util/log: Limit RCUCloseFILE to file closing util/log: Rename QemuLogFile to RCUCloseFILE util/log: Combine two logfile closes util/log: Hoist the eval of is_daemonized in qemu_set_log_internal util/log: Rename qemu_logfile_mutex to global_mutex util/log: Rename qemu_logfile to global_file util/log: Rename logfilename to global_filename util/log: Remove qemu_log_close softmmu: Use qemu_set_log_filename_flags linux-user: Use qemu_set_log_filename_flags bsd-user: Use qemu_set_log_filename_flags util/log: Introduce qemu_set_log_filename_flags sysemu/os-win32: Test for and use _lock_file/_unlock_file include/qemu/log: Move entire implementation out-of-line include/exec/log: Do not reference QemuLogFile directly tests/unit: Do not reference QemuLogFile directly linux-user: Expand log_page_dump inline bsd-user: Expand log_page_dump inline util/log: Drop call to setvbuf ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'tcg')
-rw-r--r--tcg/tcg.c188
1 files changed, 96 insertions, 92 deletions
diff --git a/tcg/tcg.c b/tcg/tcg.c
index f854252..13c16c2 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -756,32 +756,35 @@ void tcg_prologue_init(TCGContext *s)
#ifdef DEBUG_DISAS
if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
- FILE *logfile = qemu_log_lock();
- qemu_log("PROLOGUE: [size=%zu]\n", prologue_size);
- if (s->data_gen_ptr) {
- size_t code_size = s->data_gen_ptr - s->code_gen_ptr;
- size_t data_size = prologue_size - code_size;
- size_t i;
-
- log_disas(s->code_gen_ptr, code_size);
-
- for (i = 0; i < data_size; i += sizeof(tcg_target_ulong)) {
- if (sizeof(tcg_target_ulong) == 8) {
- qemu_log("0x%08" PRIxPTR ": .quad 0x%016" PRIx64 "\n",
- (uintptr_t)s->data_gen_ptr + i,
- *(uint64_t *)(s->data_gen_ptr + i));
- } else {
- qemu_log("0x%08" PRIxPTR ": .long 0x%08x\n",
- (uintptr_t)s->data_gen_ptr + i,
- *(uint32_t *)(s->data_gen_ptr + i));
+ FILE *logfile = qemu_log_trylock();
+ if (logfile) {
+ fprintf(logfile, "PROLOGUE: [size=%zu]\n", prologue_size);
+ if (s->data_gen_ptr) {
+ size_t code_size = s->data_gen_ptr - s->code_gen_ptr;
+ size_t data_size = prologue_size - code_size;
+ size_t i;
+
+ disas(logfile, s->code_gen_ptr, code_size);
+
+ for (i = 0; i < data_size; i += sizeof(tcg_target_ulong)) {
+ if (sizeof(tcg_target_ulong) == 8) {
+ fprintf(logfile,
+ "0x%08" PRIxPTR ": .quad 0x%016" PRIx64 "\n",
+ (uintptr_t)s->data_gen_ptr + i,
+ *(uint64_t *)(s->data_gen_ptr + i));
+ } else {
+ fprintf(logfile,
+ "0x%08" PRIxPTR ": .long 0x%08x\n",
+ (uintptr_t)s->data_gen_ptr + i,
+ *(uint32_t *)(s->data_gen_ptr + i));
+ }
}
+ } else {
+ disas(logfile, s->code_gen_ptr, prologue_size);
}
- } else {
- log_disas(s->code_gen_ptr, prologue_size);
+ fprintf(logfile, "\n");
+ qemu_log_unlock(logfile);
}
- qemu_log("\n");
- qemu_log_flush();
- qemu_log_unlock(logfile);
}
#endif
@@ -1804,7 +1807,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];
TCGOp *op;
@@ -1820,7 +1827,7 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
if (c == INDEX_op_insn_start) {
nb_oargs = 0;
- col += qemu_log("\n ----");
+ col += ne_fprintf(f, "\n ----");
for (i = 0; i < TARGET_INSN_START_WORDS; ++i) {
target_ulong a;
@@ -1829,7 +1836,7 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
#else
a = op->args[i];
#endif
- col += qemu_log(" " TARGET_FMT_lx, a);
+ col += ne_fprintf(f, " " TARGET_FMT_lx, a);
}
} else if (c == INDEX_op_call) {
const TCGHelperInfo *info = tcg_call_info(op);
@@ -1840,7 +1847,7 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
nb_iargs = TCGOP_CALLI(op);
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.
@@ -1848,15 +1855,15 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
* but the actual function pointer comes from the plugin.
*/
if (func == info->func) {
- col += qemu_log("%s", info->name);
+ col += ne_fprintf(f, "%s", info->name);
} 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++) {
- col += qemu_log(",%s", tcg_get_arg_str(s, buf, sizeof(buf),
- op->args[i]));
+ col += ne_fprintf(f, ",%s", tcg_get_arg_str(s, buf, sizeof(buf),
+ op->args[i]));
}
for (i = 0; i < nb_iargs; i++) {
TCGArg arg = op->args[nb_oargs + i];
@@ -1864,34 +1871,32 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
if (arg != TCG_CALL_DUMMY_ARG) {
t = tcg_get_arg_str(s, buf, sizeof(buf), arg);
}
- col += qemu_log(",%s", t);
+ col += ne_fprintf(f, ",%s", t);
}
} else {
- col += qemu_log(" %s ", def->name);
+ col += ne_fprintf(f, " %s ", def->name);
nb_oargs = def->nb_oargs;
nb_iargs = def->nb_iargs;
nb_cargs = def->nb_cargs;
if (def->flags & TCG_OPF_VECTOR) {
- col += qemu_log("v%d,e%d,", 64 << TCGOP_VECL(op),
- 8 << TCGOP_VECE(op));
+ col += ne_fprintf(f, "v%d,e%d,", 64 << TCGOP_VECL(op),
+ 8 << TCGOP_VECE(op));
}
k = 0;
for (i = 0; i < nb_oargs; i++) {
- if (k != 0) {
- col += qemu_log(",");
- }
- col += qemu_log("%s", tcg_get_arg_str(s, buf, sizeof(buf),
- op->args[k++]));
+ const char *sep = k ? "," : "";
+ col += ne_fprintf(f, "%s%s", sep,
+ tcg_get_arg_str(s, buf, sizeof(buf),
+ op->args[k++]));
}
for (i = 0; i < nb_iargs; i++) {
- if (k != 0) {
- col += qemu_log(",");
- }
- col += qemu_log("%s", tcg_get_arg_str(s, buf, sizeof(buf),
- op->args[k++]));
+ const char *sep = k ? "," : "";
+ col += ne_fprintf(f, "%s%s", sep,
+ tcg_get_arg_str(s, buf, sizeof(buf),
+ op->args[k++]));
}
switch (c) {
case INDEX_op_brcond_i32:
@@ -1906,9 +1911,9 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
case INDEX_op_cmpsel_vec:
if (op->args[k] < ARRAY_SIZE(cond_name)
&& 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 {
- col += qemu_log(",$0x%" TCG_PRIlx, op->args[k++]);
+ col += ne_fprintf(f, ",$0x%" TCG_PRIlx, op->args[k++]);
}
i = 1;
break;
@@ -1923,12 +1928,12 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
unsigned ix = get_mmuidx(oi);
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 {
const char *s_al, *s_op;
s_al = alignment_name[(op & MO_AMASK) >> MO_ASHIFT];
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;
}
@@ -1946,9 +1951,9 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
name = bswap_flag_name[flags];
}
if (name) {
- col += qemu_log(",%s", name);
+ col += ne_fprintf(f, ",%s", name);
} else {
- col += qemu_log(",$0x%" TCG_PRIlx, flags);
+ col += ne_fprintf(f, ",$0x%" TCG_PRIlx, flags);
}
i = k = 1;
}
@@ -1963,49 +1968,42 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
case INDEX_op_brcond_i32:
case INDEX_op_brcond_i64:
case INDEX_op_brcond2_i32:
- col += qemu_log("%s$L%d", k ? "," : "",
- arg_label(op->args[k])->id);
+ col += ne_fprintf(f, "%s$L%d", k ? "," : "",
+ arg_label(op->args[k])->id);
i++, k++;
break;
default:
break;
}
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) {
-
- QemuLogFile *logfile;
-
- rcu_read_lock();
- logfile = qatomic_rcu_read(&qemu_logfile);
- if (logfile) {
- for (; col < 40; ++col) {
- putc(' ', logfile->fd);
- }
+ for (; col < 40; ++col) {
+ putc(' ', f);
}
- rcu_read_unlock();
}
if (op->life) {
unsigned life = op->life;
if (life & (SYNC_ARG * 3)) {
- qemu_log(" sync:");
+ ne_fprintf(f, " sync:");
for (i = 0; i < 2; ++i) {
if (life & (SYNC_ARG << i)) {
- qemu_log(" %d", i);
+ ne_fprintf(f, " %d", i);
}
}
}
life /= DEAD_ARG;
if (life) {
- qemu_log(" dead:");
+ ne_fprintf(f, " dead:");
for (i = 0; life; ++i, life >>= 1) {
if (life & 1) {
- qemu_log(" %d", i);
+ ne_fprintf(f, " %d", i);
}
}
}
@@ -2016,28 +2014,28 @@ static void tcg_dump_ops(TCGContext *s, bool have_prefs)
TCGRegSet set = op->output_pref[i];
if (i == 0) {
- qemu_log(" pref=");
+ ne_fprintf(f, " pref=");
} else {
- qemu_log(",");
+ ne_fprintf(f, ",");
}
if (set == 0) {
- qemu_log("none");
+ ne_fprintf(f, "none");
} else if (set == MAKE_64BIT_MASK(0, TCG_TARGET_NB_REGS)) {
- qemu_log("all");
+ ne_fprintf(f, "all");
#ifdef CONFIG_DEBUG_TCG
} else if (tcg_regset_single(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
} else if (TCG_TARGET_NB_REGS <= 32) {
- qemu_log("%#x", (uint32_t)set);
+ ne_fprintf(f, "0x%x", (uint32_t)set);
} else {
- qemu_log("%#" PRIx64, (uint64_t)set);
+ ne_fprintf(f, "0x%" PRIx64, (uint64_t)set);
}
}
}
- qemu_log("\n");
+ putc('\n', f);
}
}
@@ -4200,11 +4198,13 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
#ifdef DEBUG_DISAS
if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP)
&& qemu_log_in_addr_range(tb->pc))) {
- FILE *logfile = qemu_log_lock();
- qemu_log("OP:\n");
- tcg_dump_ops(s, false);
- qemu_log("\n");
- qemu_log_unlock(logfile);
+ FILE *logfile = qemu_log_trylock();
+ if (logfile) {
+ fprintf(logfile, "OP:\n");
+ tcg_dump_ops(s, logfile, false);
+ fprintf(logfile, "\n");
+ qemu_log_unlock(logfile);
+ }
}
#endif
@@ -4245,11 +4245,13 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
#ifdef DEBUG_DISAS
if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP_IND)
&& qemu_log_in_addr_range(tb->pc))) {
- FILE *logfile = qemu_log_lock();
- qemu_log("OP before indirect lowering:\n");
- tcg_dump_ops(s, false);
- qemu_log("\n");
- qemu_log_unlock(logfile);
+ FILE *logfile = qemu_log_trylock();
+ if (logfile) {
+ fprintf(logfile, "OP before indirect lowering:\n");
+ tcg_dump_ops(s, logfile, false);
+ fprintf(logfile, "\n");
+ qemu_log_unlock(logfile);
+ }
}
#endif
/* Replace indirect temps with direct temps. */
@@ -4266,11 +4268,13 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
#ifdef DEBUG_DISAS
if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP_OPT)
&& qemu_log_in_addr_range(tb->pc))) {
- FILE *logfile = qemu_log_lock();
- qemu_log("OP after optimization and liveness analysis:\n");
- tcg_dump_ops(s, true);
- qemu_log("\n");
- qemu_log_unlock(logfile);
+ FILE *logfile = qemu_log_trylock();
+ if (logfile) {
+ fprintf(logfile, "OP after optimization and liveness analysis:\n");
+ tcg_dump_ops(s, logfile, true);
+ fprintf(logfile, "\n");
+ qemu_log_unlock(logfile);
+ }
}
#endif