Commit 2316f861 authored by Ravi Bangoria's avatar Ravi Bangoria Committed by Arnaldo Carvalho de Melo
Browse files

perf annotate: Simplify disasm_line allocation and freeing code



We are allocating disasm_line object in annotation_line__new() instead
of disasm_line__new(). Similarly annotation_line__delete() is actually
freeing disasm_line object as well. This complexity is because of
privsize.  But we don't need privsize anymore so get rid of privsize and
simplify disasm_line allocation and freeing code.

Signed-off-by: default avatarRavi Bangoria <ravi.bangoria@linux.ibm.com>
Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Song Liu <songliubraving@fb.com>
Link: http://lore.kernel.org/lkml/20200204045233.474937-3-ravi.bangoria@linux.ibm.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent e0ad4d68
Loading
Loading
Loading
Loading
+31 −55
Original line number Diff line number Diff line
@@ -1143,7 +1143,6 @@ out:
}

struct annotate_args {
	size_t			 privsize;
	struct arch		*arch;
	struct map_symbol	 ms;
	struct evsel	*evsel;
@@ -1153,74 +1152,53 @@ struct annotate_args {
	int			 line_nr;
};

static void annotation_line__delete(struct annotation_line *al)
static void annotation_line__init(struct annotation_line *al,
				  struct annotate_args *args,
				  int nr)
{
	void *ptr = (void *) al - al->privsize;
	al->offset = args->offset;
	al->line = strdup(args->line);
	al->line_nr = args->line_nr;
	al->data_nr = nr;
}

static void annotation_line__exit(struct annotation_line *al)
{
	free_srcline(al->path);
	zfree(&al->line);
	free(ptr);
}

/*
 * Allocating the annotation line data with following
 * structure:
 *
 *    --------------------------------------
 *    private space | struct annotation_line
 *    --------------------------------------
 *
 * Size of the private space is stored in 'struct annotation_line'.
 *
 */
static struct annotation_line *
annotation_line__new(struct annotate_args *args, size_t privsize)
static size_t disasm_line_size(int nr)
{
	struct annotation_line *al;
	struct evsel *evsel = args->evsel;
	size_t size = privsize + sizeof(*al);
	int nr = 1;

	if (perf_evsel__is_group_event(evsel))
		nr = evsel->core.nr_members;

	size += sizeof(al->data[0]) * nr;

	al = zalloc(size);
	if (al) {
		al = (void *) al + privsize;
		al->privsize   = privsize;
		al->offset     = args->offset;
		al->line       = strdup(args->line);
		al->line_nr    = args->line_nr;
		al->data_nr    = nr;
	}

	return al;
	return (sizeof(struct disasm_line) + (sizeof(al->data[0]) * nr));
}

/*
 * Allocating the disasm annotation line data with
 * following structure:
 *
 *    ------------------------------------------------------------
 *    privsize space | struct disasm_line | struct annotation_line
 *    ------------------------------------------------------------
 *    -------------------------------------------
 *    struct disasm_line | struct annotation_line
 *    -------------------------------------------
 *
 * We have 'struct annotation_line' member as last member
 * of 'struct disasm_line' to have an easy access.
 *
 */
static struct disasm_line *disasm_line__new(struct annotate_args *args)
{
	struct disasm_line *dl = NULL;
	struct annotation_line *al;
	size_t privsize = args->privsize + offsetof(struct disasm_line, al);
	int nr = 1;

	al = annotation_line__new(args, privsize);
	if (al != NULL) {
		dl = disasm_line(al);
	if (perf_evsel__is_group_event(args->evsel))
		nr = args->evsel->core.nr_members;

	dl = zalloc(disasm_line_size(nr));
	if (!dl)
		return NULL;

	annotation_line__init(&dl->al, args, nr);
	if (dl->al.line == NULL)
		goto out_delete;

@@ -1230,7 +1208,6 @@ static struct disasm_line *disasm_line__new(struct annotate_args *args)

		disasm_line__init_ins(dl, args->arch, &args->ms);
	}
	}

	return dl;

@@ -1248,7 +1225,8 @@ void disasm_line__free(struct disasm_line *dl)
	else
		ins__delete(&dl->ops);
	zfree(&dl->ins.name);
	annotation_line__delete(&dl->al);
	annotation_line__exit(&dl->al);
	free(dl);
}

int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw, int max_ins_name)
@@ -2152,11 +2130,9 @@ void symbol__calc_percent(struct symbol *sym, struct evsel *evsel)
int symbol__annotate(struct map_symbol *ms, struct evsel *evsel,
		     struct annotation_options *options, struct arch **parch)
{
	size_t privsize = 0;
	struct symbol *sym = ms->sym;
	struct annotation *notes = symbol__annotation(sym);
	struct annotate_args args = {
		.privsize	= privsize,
		.evsel		= evsel,
		.options	= options,
	};
+0 −1
Original line number Diff line number Diff line
@@ -139,7 +139,6 @@ struct annotation_line {
	u64			 cycles;
	u64			 cycles_max;
	u64			 cycles_min;
	size_t			 privsize;
	char			*path;
	u32			 idx;
	int			 idx_asm;