@@ -2442,18 +2442,17 @@ int annotate_get_insn_location(struct arch *arch, struct disasm_line *dl,
continue;
}
+ op_loc->mem_ref = mem_ref;
+ op_loc->multi_regs = multi_regs;
+
/*
* For powerpc, call get_powerpc_regs function which extracts the
* required fields for op_loc, ie reg1, reg2, offset from the
* raw instruction.
*/
if (arch__is(arch, "powerpc")) {
- op_loc->mem_ref = mem_ref;
- op_loc->multi_regs = multi_regs;
get_powerpc_regs(dl->raw.raw_insn, !i, op_loc);
- } else if (strchr(insn_str, arch->objdump.memory_ref_char)) {
- op_loc->mem_ref = true;
- op_loc->multi_regs = multi_regs;
+ } else if (mem_ref) {
extract_reg_offset(arch, insn_str, op_loc);
} else {
char *s, *p = NULL;
@@ -607,6 +607,12 @@ static bool check_multi_regs(struct arch *arch, const char *op)
return count > 1;
}
+/* Check whether the operand accesses memory. */
+static bool check_memory_ref(struct arch *arch, const char *op)
+{
+ return strchr(op, arch->objdump.memory_ref_char) != NULL;
+}
+
static int mov__parse(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms __maybe_unused,
struct disasm_line *dl __maybe_unused)
{
@@ -635,6 +641,7 @@ static int mov__parse(struct arch *arch, struct ins_operands *ops, struct map_sy
if (ops->source.raw == NULL)
return -1;
+ ops->source.mem_ref = check_memory_ref(arch, ops->source.raw);
ops->source.multi_regs = check_multi_regs(arch, ops->source.raw);
target = skip_spaces(++s);
@@ -657,6 +664,7 @@ static int mov__parse(struct arch *arch, struct ins_operands *ops, struct map_sy
if (ops->target.raw == NULL)
goto out_free_source;
+ ops->target.mem_ref = check_memory_ref(arch, ops->target.raw);
ops->target.multi_regs = check_multi_regs(arch, ops->target.raw);
if (comment == NULL)
Advance the mem_ref check on x86 to mov__parse(), along with the multi_reg check, to make annotate_get_insn_location() more concise. Signed-off-by: Li Huafei <lihuafei1@huawei.com> --- tools/perf/util/annotate.c | 9 ++++----- tools/perf/util/disasm.c | 8 ++++++++ 2 files changed, 12 insertions(+), 5 deletions(-)