diff options
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/util/annotate.c | 28 | ||||
| -rw-r--r-- | tools/perf/util/annotate.h | 1 | 
2 files changed, 21 insertions, 8 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 1dce09874d9..8069dfb5ba7 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -21,6 +21,14 @@ const char 	*disassembler_style;  static struct ins *ins__find(const char *name);  static int disasm_line__parse(char *line, char **namep, char **rawp); +static void ins__delete(struct ins_operands *ops) +{ +	free(ops->source.raw); +	free(ops->source.name); +	free(ops->target.raw); +	free(ops->target.name); +} +  static int ins__raw_scnprintf(struct ins *ins, char *bf, size_t size,  			      struct ins_operands *ops)  { @@ -192,7 +200,15 @@ static int lock__scnprintf(struct ins *ins, char *bf, size_t size,  					size - printed, ops->locked.ops);  } +static void lock__delete(struct ins_operands *ops) +{ +	free(ops->locked.ops); +	free(ops->target.raw); +	free(ops->target.name); +} +  static struct ins_ops lock_ops = { +	.free	   = lock__delete,  	.parse	   = lock__parse,  	.scnprintf = lock__scnprintf,  }; @@ -542,14 +558,10 @@ void disasm_line__free(struct disasm_line *dl)  {  	free(dl->line);  	free(dl->name); -	if (dl->ins && dl->ins->ops == &lock_ops) { -		free(dl->ops.locked.ops); -	} else { -		free(dl->ops.source.raw); -		free(dl->ops.source.name); -	} -	free(dl->ops.target.raw); -	free(dl->ops.target.name); +	if (dl->ins && dl->ins->ops->free) +		dl->ins->ops->free(&dl->ops); +	else +		ins__delete(&dl->ops);  	free(dl);  } diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index b79d3260647..78a5692dd71 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h @@ -32,6 +32,7 @@ struct ins_operands {  };  struct ins_ops { +	void (*free)(struct ins_operands *ops);  	int (*parse)(struct ins_operands *ops);  	int (*scnprintf)(struct ins *ins, char *bf, size_t size,  			 struct ins_operands *ops);  |