|
@@ -229,6 +229,24 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void set_print_ip_opts(struct perf_event_attr *attr)
|
|
|
+{
|
|
|
+ unsigned int type = attr->type;
|
|
|
+
|
|
|
+ output[type].print_ip_opts = 0;
|
|
|
+ if (PRINT_FIELD(IP))
|
|
|
+ output[type].print_ip_opts |= PRINT_IP_OPT_IP;
|
|
|
+
|
|
|
+ if (PRINT_FIELD(SYM))
|
|
|
+ output[type].print_ip_opts |= PRINT_IP_OPT_SYM;
|
|
|
+
|
|
|
+ if (PRINT_FIELD(DSO))
|
|
|
+ output[type].print_ip_opts |= PRINT_IP_OPT_DSO;
|
|
|
+
|
|
|
+ if (PRINT_FIELD(SYMOFFSET))
|
|
|
+ output[type].print_ip_opts |= PRINT_IP_OPT_SYMOFFSET;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* verify all user requested events exist and the samples
|
|
|
* have the expected data
|
|
@@ -237,7 +255,6 @@ static int perf_session__check_output_opt(struct perf_session *session)
|
|
|
{
|
|
|
int j;
|
|
|
struct perf_evsel *evsel;
|
|
|
- struct perf_event_attr *attr;
|
|
|
|
|
|
for (j = 0; j < PERF_TYPE_MAX; ++j) {
|
|
|
evsel = perf_session__find_first_evtype(session, j);
|
|
@@ -260,20 +277,7 @@ static int perf_session__check_output_opt(struct perf_session *session)
|
|
|
if (evsel == NULL)
|
|
|
continue;
|
|
|
|
|
|
- attr = &evsel->attr;
|
|
|
-
|
|
|
- output[j].print_ip_opts = 0;
|
|
|
- if (PRINT_FIELD(IP))
|
|
|
- output[j].print_ip_opts |= PRINT_IP_OPT_IP;
|
|
|
-
|
|
|
- if (PRINT_FIELD(SYM))
|
|
|
- output[j].print_ip_opts |= PRINT_IP_OPT_SYM;
|
|
|
-
|
|
|
- if (PRINT_FIELD(DSO))
|
|
|
- output[j].print_ip_opts |= PRINT_IP_OPT_DSO;
|
|
|
-
|
|
|
- if (PRINT_FIELD(SYMOFFSET))
|
|
|
- output[j].print_ip_opts |= PRINT_IP_OPT_SYMOFFSET;
|
|
|
+ set_print_ip_opts(&evsel->attr);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -547,6 +551,34 @@ struct perf_script {
|
|
|
struct perf_session *session;
|
|
|
};
|
|
|
|
|
|
+static int process_attr(struct perf_tool *tool, union perf_event *event,
|
|
|
+ struct perf_evlist **pevlist)
|
|
|
+{
|
|
|
+ struct perf_script *scr = container_of(tool, struct perf_script, tool);
|
|
|
+ struct perf_evlist *evlist;
|
|
|
+ struct perf_evsel *evsel, *pos;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = perf_event__process_attr(tool, event, pevlist);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ evlist = *pevlist;
|
|
|
+ evsel = perf_evlist__last(*pevlist);
|
|
|
+
|
|
|
+ if (evsel->attr.type >= PERF_TYPE_MAX)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ list_for_each_entry(pos, &evlist->entries, node) {
|
|
|
+ if (pos->attr.type == evsel->attr.type && pos != evsel)
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ set_print_ip_opts(&evsel->attr);
|
|
|
+
|
|
|
+ return perf_evsel__check_attr(evsel, scr->session);
|
|
|
+}
|
|
|
+
|
|
|
static void sig_handler(int sig __maybe_unused)
|
|
|
{
|
|
|
session_done = 1;
|
|
@@ -1272,7 +1304,7 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
|
|
|
.comm = perf_event__process_comm,
|
|
|
.exit = perf_event__process_exit,
|
|
|
.fork = perf_event__process_fork,
|
|
|
- .attr = perf_event__process_attr,
|
|
|
+ .attr = process_attr,
|
|
|
.tracing_data = perf_event__process_tracing_data,
|
|
|
.build_id = perf_event__process_build_id,
|
|
|
.ordered_samples = true,
|