|
@@ -230,10 +230,12 @@ static int jump__parse(struct arch *arch __maybe_unused, struct ins_operands *op
|
|
|
else
|
|
|
ops->target.addr = strtoull(ops->raw, NULL, 16);
|
|
|
|
|
|
- if (s++ != NULL)
|
|
|
+ if (s++ != NULL) {
|
|
|
ops->target.offset = strtoull(s, NULL, 16);
|
|
|
- else
|
|
|
- ops->target.offset = UINT64_MAX;
|
|
|
+ ops->target.offset_avail = true;
|
|
|
+ } else {
|
|
|
+ ops->target.offset_avail = false;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -241,7 +243,7 @@ static int jump__parse(struct arch *arch __maybe_unused, struct ins_operands *op
|
|
|
static int jump__scnprintf(struct ins *ins, char *bf, size_t size,
|
|
|
struct ins_operands *ops)
|
|
|
{
|
|
|
- if (!ops->target.addr)
|
|
|
+ if (!ops->target.addr || ops->target.offset < 0)
|
|
|
return ins__raw_scnprintf(ins, bf, size, ops);
|
|
|
|
|
|
return scnprintf(bf, size, "%-6.6s %" PRIx64, ins->name, ops->target.offset);
|
|
@@ -1209,9 +1211,11 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map,
|
|
|
if (dl == NULL)
|
|
|
return -1;
|
|
|
|
|
|
- if (dl->ops.target.offset == UINT64_MAX)
|
|
|
+ if (!disasm_line__has_offset(dl)) {
|
|
|
dl->ops.target.offset = dl->ops.target.addr -
|
|
|
map__rip_2objdump(map, sym->start);
|
|
|
+ dl->ops.target.offset_avail = true;
|
|
|
+ }
|
|
|
|
|
|
/* kcore has no symbols, so add the call target name */
|
|
|
if (dl->ins.ops && ins__is_call(&dl->ins) && !dl->ops.target.name) {
|