aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/header.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/header.c')
-rw-r--r--tools/perf/util/header.c75
1 files changed, 39 insertions, 36 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 33c17a2b2a81..5b01449152ef 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -2041,6 +2041,8 @@ int perf_session__read_header(struct perf_session *session, int fd)
2041 lseek(fd, tmp, SEEK_SET); 2041 lseek(fd, tmp, SEEK_SET);
2042 } 2042 }
2043 2043
2044 symbol_conf.nr_events = nr_attrs;
2045
2044 if (f_header.event_types.size) { 2046 if (f_header.event_types.size) {
2045 lseek(fd, f_header.event_types.offset, SEEK_SET); 2047 lseek(fd, f_header.event_types.offset, SEEK_SET);
2046 events = malloc(f_header.event_types.size); 2048 events = malloc(f_header.event_types.size);
@@ -2068,9 +2070,9 @@ out_delete_evlist:
2068 return -ENOMEM; 2070 return -ENOMEM;
2069} 2071}
2070 2072
2071int perf_event__synthesize_attr(struct perf_event_attr *attr, u16 ids, u64 *id, 2073int perf_event__synthesize_attr(struct perf_tool *tool,
2072 perf_event__handler_t process, 2074 struct perf_event_attr *attr, u16 ids, u64 *id,
2073 struct perf_session *session) 2075 perf_event__handler_t process)
2074{ 2076{
2075 union perf_event *ev; 2077 union perf_event *ev;
2076 size_t size; 2078 size_t size;
@@ -2092,22 +2094,23 @@ int perf_event__synthesize_attr(struct perf_event_attr *attr, u16 ids, u64 *id,
2092 ev->attr.header.type = PERF_RECORD_HEADER_ATTR; 2094 ev->attr.header.type = PERF_RECORD_HEADER_ATTR;
2093 ev->attr.header.size = size; 2095 ev->attr.header.size = size;
2094 2096
2095 err = process(ev, NULL, session); 2097 err = process(tool, ev, NULL, NULL);
2096 2098
2097 free(ev); 2099 free(ev);
2098 2100
2099 return err; 2101 return err;
2100} 2102}
2101 2103
2102int perf_session__synthesize_attrs(struct perf_session *session, 2104int perf_event__synthesize_attrs(struct perf_tool *tool,
2105 struct perf_session *session,
2103 perf_event__handler_t process) 2106 perf_event__handler_t process)
2104{ 2107{
2105 struct perf_evsel *attr; 2108 struct perf_evsel *attr;
2106 int err = 0; 2109 int err = 0;
2107 2110
2108 list_for_each_entry(attr, &session->evlist->entries, node) { 2111 list_for_each_entry(attr, &session->evlist->entries, node) {
2109 err = perf_event__synthesize_attr(&attr->attr, attr->ids, 2112 err = perf_event__synthesize_attr(tool, &attr->attr, attr->ids,
2110 attr->id, process, session); 2113 attr->id, process);
2111 if (err) { 2114 if (err) {
2112 pr_debug("failed to create perf header attribute\n"); 2115 pr_debug("failed to create perf header attribute\n");
2113 return err; 2116 return err;
@@ -2118,23 +2121,23 @@ int perf_session__synthesize_attrs(struct perf_session *session,
2118} 2121}
2119 2122
2120int perf_event__process_attr(union perf_event *event, 2123int perf_event__process_attr(union perf_event *event,
2121 struct perf_session *session) 2124 struct perf_evlist **pevlist)
2122{ 2125{
2123 unsigned int i, ids, n_ids; 2126 unsigned int i, ids, n_ids;
2124 struct perf_evsel *evsel; 2127 struct perf_evsel *evsel;
2128 struct perf_evlist *evlist = *pevlist;
2125 2129
2126 if (session->evlist == NULL) { 2130 if (evlist == NULL) {
2127 session->evlist = perf_evlist__new(NULL, NULL); 2131 *pevlist = evlist = perf_evlist__new(NULL, NULL);
2128 if (session->evlist == NULL) 2132 if (evlist == NULL)
2129 return -ENOMEM; 2133 return -ENOMEM;
2130 } 2134 }
2131 2135
2132 evsel = perf_evsel__new(&event->attr.attr, 2136 evsel = perf_evsel__new(&event->attr.attr, evlist->nr_entries);
2133 session->evlist->nr_entries);
2134 if (evsel == NULL) 2137 if (evsel == NULL)
2135 return -ENOMEM; 2138 return -ENOMEM;
2136 2139
2137 perf_evlist__add(session->evlist, evsel); 2140 perf_evlist__add(evlist, evsel);
2138 2141
2139 ids = event->header.size; 2142 ids = event->header.size;
2140 ids -= (void *)&event->attr.id - (void *)event; 2143 ids -= (void *)&event->attr.id - (void *)event;
@@ -2148,18 +2151,16 @@ int perf_event__process_attr(union perf_event *event,
2148 return -ENOMEM; 2151 return -ENOMEM;
2149 2152
2150 for (i = 0; i < n_ids; i++) { 2153 for (i = 0; i < n_ids; i++) {
2151 perf_evlist__id_add(session->evlist, evsel, 0, i, 2154 perf_evlist__id_add(evlist, evsel, 0, i, event->attr.id[i]);
2152 event->attr.id[i]);
2153 } 2155 }
2154 2156
2155 perf_session__update_sample_type(session);
2156
2157 return 0; 2157 return 0;
2158} 2158}
2159 2159
2160int perf_event__synthesize_event_type(u64 event_id, char *name, 2160int perf_event__synthesize_event_type(struct perf_tool *tool,
2161 u64 event_id, char *name,
2161 perf_event__handler_t process, 2162 perf_event__handler_t process,
2162 struct perf_session *session) 2163 struct machine *machine)
2163{ 2164{
2164 union perf_event ev; 2165 union perf_event ev;
2165 size_t size = 0; 2166 size_t size = 0;
@@ -2177,13 +2178,14 @@ int perf_event__synthesize_event_type(u64 event_id, char *name,
2177 ev.event_type.header.size = sizeof(ev.event_type) - 2178 ev.event_type.header.size = sizeof(ev.event_type) -
2178 (sizeof(ev.event_type.event_type.name) - size); 2179 (sizeof(ev.event_type.event_type.name) - size);
2179 2180
2180 err = process(&ev, NULL, session); 2181 err = process(tool, &ev, NULL, machine);
2181 2182
2182 return err; 2183 return err;
2183} 2184}
2184 2185
2185int perf_event__synthesize_event_types(perf_event__handler_t process, 2186int perf_event__synthesize_event_types(struct perf_tool *tool,
2186 struct perf_session *session) 2187 perf_event__handler_t process,
2188 struct machine *machine)
2187{ 2189{
2188 struct perf_trace_event_type *type; 2190 struct perf_trace_event_type *type;
2189 int i, err = 0; 2191 int i, err = 0;
@@ -2191,9 +2193,9 @@ int perf_event__synthesize_event_types(perf_event__handler_t process,
2191 for (i = 0; i < event_count; i++) { 2193 for (i = 0; i < event_count; i++) {
2192 type = &events[i]; 2194 type = &events[i];
2193 2195
2194 err = perf_event__synthesize_event_type(type->event_id, 2196 err = perf_event__synthesize_event_type(tool, type->event_id,
2195 type->name, process, 2197 type->name, process,
2196 session); 2198 machine);
2197 if (err) { 2199 if (err) {
2198 pr_debug("failed to create perf header event type\n"); 2200 pr_debug("failed to create perf header event type\n");
2199 return err; 2201 return err;
@@ -2203,8 +2205,8 @@ int perf_event__synthesize_event_types(perf_event__handler_t process,
2203 return err; 2205 return err;
2204} 2206}
2205 2207
2206int perf_event__process_event_type(union perf_event *event, 2208int perf_event__process_event_type(struct perf_tool *tool __unused,
2207 struct perf_session *session __unused) 2209 union perf_event *event)
2208{ 2210{
2209 if (perf_header__push_event(event->event_type.event_type.event_id, 2211 if (perf_header__push_event(event->event_type.event_type.event_id,
2210 event->event_type.event_type.name) < 0) 2212 event->event_type.event_type.name) < 0)
@@ -2213,9 +2215,9 @@ int perf_event__process_event_type(union perf_event *event,
2213 return 0; 2215 return 0;
2214} 2216}
2215 2217
2216int perf_event__synthesize_tracing_data(int fd, struct perf_evlist *evlist, 2218int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd,
2217 perf_event__handler_t process, 2219 struct perf_evlist *evlist,
2218 struct perf_session *session __unused) 2220 perf_event__handler_t process)
2219{ 2221{
2220 union perf_event ev; 2222 union perf_event ev;
2221 struct tracing_data *tdata; 2223 struct tracing_data *tdata;
@@ -2246,7 +2248,7 @@ int perf_event__synthesize_tracing_data(int fd, struct perf_evlist *evlist,
2246 ev.tracing_data.header.size = sizeof(ev.tracing_data); 2248 ev.tracing_data.header.size = sizeof(ev.tracing_data);
2247 ev.tracing_data.size = aligned_size; 2249 ev.tracing_data.size = aligned_size;
2248 2250
2249 process(&ev, NULL, session); 2251 process(tool, &ev, NULL, NULL);
2250 2252
2251 /* 2253 /*
2252 * The put function will copy all the tracing data 2254 * The put function will copy all the tracing data
@@ -2288,10 +2290,10 @@ int perf_event__process_tracing_data(union perf_event *event,
2288 return size_read + padding; 2290 return size_read + padding;
2289} 2291}
2290 2292
2291int perf_event__synthesize_build_id(struct dso *pos, u16 misc, 2293int perf_event__synthesize_build_id(struct perf_tool *tool,
2294 struct dso *pos, u16 misc,
2292 perf_event__handler_t process, 2295 perf_event__handler_t process,
2293 struct machine *machine, 2296 struct machine *machine)
2294 struct perf_session *session)
2295{ 2297{
2296 union perf_event ev; 2298 union perf_event ev;
2297 size_t len; 2299 size_t len;
@@ -2311,12 +2313,13 @@ int perf_event__synthesize_build_id(struct dso *pos, u16 misc,
2311 ev.build_id.header.size = sizeof(ev.build_id) + len; 2313 ev.build_id.header.size = sizeof(ev.build_id) + len;
2312 memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); 2314 memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len);
2313 2315
2314 err = process(&ev, NULL, session); 2316 err = process(tool, &ev, NULL, machine);
2315 2317
2316 return err; 2318 return err;
2317} 2319}
2318 2320
2319int perf_event__process_build_id(union perf_event *event, 2321int perf_event__process_build_id(struct perf_tool *tool __used,
2322 union perf_event *event,
2320 struct perf_session *session) 2323 struct perf_session *session)
2321{ 2324{
2322 __event_process_build_id(&event->build_id, 2325 __event_process_build_id(&event->build_id,