builtin-script.c (820e9906cf64142169134f35b996108303cf22ca) | builtin-script.c (7cc72553ac03ec20afe2dec91dce4624ccd379b8) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2#include "builtin.h" 3 4#include "util/counts.h" 5#include "util/debug.h" 6#include "util/dso.h" 7#include <subcmd/exec-cmd.h> 8#include "util/header.h" --- 108 unchanged lines hidden (view full) --- 117 PERF_OUTPUT_UREGS = 1ULL << 27, 118 PERF_OUTPUT_METRIC = 1ULL << 28, 119 PERF_OUTPUT_MISC = 1ULL << 29, 120 PERF_OUTPUT_SRCCODE = 1ULL << 30, 121 PERF_OUTPUT_IPC = 1ULL << 31, 122 PERF_OUTPUT_TOD = 1ULL << 32, 123 PERF_OUTPUT_DATA_PAGE_SIZE = 1ULL << 33, 124 PERF_OUTPUT_CODE_PAGE_SIZE = 1ULL << 34, | 1// SPDX-License-Identifier: GPL-2.0 2#include "builtin.h" 3 4#include "util/counts.h" 5#include "util/debug.h" 6#include "util/dso.h" 7#include <subcmd/exec-cmd.h> 8#include "util/header.h" --- 108 unchanged lines hidden (view full) --- 117 PERF_OUTPUT_UREGS = 1ULL << 27, 118 PERF_OUTPUT_METRIC = 1ULL << 28, 119 PERF_OUTPUT_MISC = 1ULL << 29, 120 PERF_OUTPUT_SRCCODE = 1ULL << 30, 121 PERF_OUTPUT_IPC = 1ULL << 31, 122 PERF_OUTPUT_TOD = 1ULL << 32, 123 PERF_OUTPUT_DATA_PAGE_SIZE = 1ULL << 33, 124 PERF_OUTPUT_CODE_PAGE_SIZE = 1ULL << 34, |
125 PERF_OUTPUT_INS_LAT = 1ULL << 35, |
|
125}; 126 127struct perf_script { 128 struct perf_tool tool; 129 struct perf_session *session; 130 bool show_task_events; 131 bool show_mmap_events; 132 bool show_switch_events; --- 50 unchanged lines hidden (view full) --- 183 {.str = "phys_addr", .field = PERF_OUTPUT_PHYS_ADDR}, 184 {.str = "metric", .field = PERF_OUTPUT_METRIC}, 185 {.str = "misc", .field = PERF_OUTPUT_MISC}, 186 {.str = "srccode", .field = PERF_OUTPUT_SRCCODE}, 187 {.str = "ipc", .field = PERF_OUTPUT_IPC}, 188 {.str = "tod", .field = PERF_OUTPUT_TOD}, 189 {.str = "data_page_size", .field = PERF_OUTPUT_DATA_PAGE_SIZE}, 190 {.str = "code_page_size", .field = PERF_OUTPUT_CODE_PAGE_SIZE}, | 126}; 127 128struct perf_script { 129 struct perf_tool tool; 130 struct perf_session *session; 131 bool show_task_events; 132 bool show_mmap_events; 133 bool show_switch_events; --- 50 unchanged lines hidden (view full) --- 184 {.str = "phys_addr", .field = PERF_OUTPUT_PHYS_ADDR}, 185 {.str = "metric", .field = PERF_OUTPUT_METRIC}, 186 {.str = "misc", .field = PERF_OUTPUT_MISC}, 187 {.str = "srccode", .field = PERF_OUTPUT_SRCCODE}, 188 {.str = "ipc", .field = PERF_OUTPUT_IPC}, 189 {.str = "tod", .field = PERF_OUTPUT_TOD}, 190 {.str = "data_page_size", .field = PERF_OUTPUT_DATA_PAGE_SIZE}, 191 {.str = "code_page_size", .field = PERF_OUTPUT_CODE_PAGE_SIZE}, |
192 {.str = "ins_lat", .field = PERF_OUTPUT_INS_LAT}, |
|
191}; 192 193enum { 194 OUTPUT_TYPE_SYNTH = PERF_TYPE_MAX, 195 OUTPUT_TYPE_OTHER, 196 OUTPUT_TYPE_MAX 197}; 198 --- 58 unchanged lines hidden (view full) --- 257 258 .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID | 259 PERF_OUTPUT_CPU | PERF_OUTPUT_TIME | 260 PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP | 261 PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET | 262 PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD | 263 PERF_OUTPUT_ADDR | PERF_OUTPUT_DATA_SRC | 264 PERF_OUTPUT_WEIGHT | PERF_OUTPUT_PHYS_ADDR | | 193}; 194 195enum { 196 OUTPUT_TYPE_SYNTH = PERF_TYPE_MAX, 197 OUTPUT_TYPE_OTHER, 198 OUTPUT_TYPE_MAX 199}; 200 --- 58 unchanged lines hidden (view full) --- 259 260 .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID | 261 PERF_OUTPUT_CPU | PERF_OUTPUT_TIME | 262 PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP | 263 PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET | 264 PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD | 265 PERF_OUTPUT_ADDR | PERF_OUTPUT_DATA_SRC | 266 PERF_OUTPUT_WEIGHT | PERF_OUTPUT_PHYS_ADDR | |
265 PERF_OUTPUT_DATA_PAGE_SIZE | PERF_OUTPUT_CODE_PAGE_SIZE, | 267 PERF_OUTPUT_DATA_PAGE_SIZE | PERF_OUTPUT_CODE_PAGE_SIZE | 268 PERF_OUTPUT_INS_LAT, |
266 267 .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT, 268 }, 269 270 [PERF_TYPE_BREAKPOINT] = { 271 .user_set = false, 272 273 .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID | --- 180 unchanged lines hidden (view full) --- 454 evsel__do_check_stype(evsel, PERF_SAMPLE_ADDR, "ADDR", PERF_OUTPUT_ADDR, allow_user_set)) 455 return -EINVAL; 456 457 if (PRINT_FIELD(DATA_SRC) && 458 evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC", PERF_OUTPUT_DATA_SRC)) 459 return -EINVAL; 460 461 if (PRINT_FIELD(WEIGHT) && | 269 270 .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT, 271 }, 272 273 [PERF_TYPE_BREAKPOINT] = { 274 .user_set = false, 275 276 .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID | --- 180 unchanged lines hidden (view full) --- 457 evsel__do_check_stype(evsel, PERF_SAMPLE_ADDR, "ADDR", PERF_OUTPUT_ADDR, allow_user_set)) 458 return -EINVAL; 459 460 if (PRINT_FIELD(DATA_SRC) && 461 evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC", PERF_OUTPUT_DATA_SRC)) 462 return -EINVAL; 463 464 if (PRINT_FIELD(WEIGHT) && |
462 evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT, "WEIGHT", PERF_OUTPUT_WEIGHT)) | 465 evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT_TYPE, "WEIGHT", PERF_OUTPUT_WEIGHT)) |
463 return -EINVAL; 464 465 if (PRINT_FIELD(SYM) && 466 !(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) { 467 pr_err("Display of symbols requested but neither sample IP nor " 468 "sample address\navailable. Hence, no addresses to convert " 469 "to symbols.\n"); 470 return -EINVAL; --- 46 unchanged lines hidden (view full) --- 517 if (PRINT_FIELD(DATA_PAGE_SIZE) && 518 evsel__check_stype(evsel, PERF_SAMPLE_DATA_PAGE_SIZE, "DATA_PAGE_SIZE", PERF_OUTPUT_DATA_PAGE_SIZE)) 519 return -EINVAL; 520 521 if (PRINT_FIELD(CODE_PAGE_SIZE) && 522 evsel__check_stype(evsel, PERF_SAMPLE_CODE_PAGE_SIZE, "CODE_PAGE_SIZE", PERF_OUTPUT_CODE_PAGE_SIZE)) 523 return -EINVAL; 524 | 466 return -EINVAL; 467 468 if (PRINT_FIELD(SYM) && 469 !(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) { 470 pr_err("Display of symbols requested but neither sample IP nor " 471 "sample address\navailable. Hence, no addresses to convert " 472 "to symbols.\n"); 473 return -EINVAL; --- 46 unchanged lines hidden (view full) --- 520 if (PRINT_FIELD(DATA_PAGE_SIZE) && 521 evsel__check_stype(evsel, PERF_SAMPLE_DATA_PAGE_SIZE, "DATA_PAGE_SIZE", PERF_OUTPUT_DATA_PAGE_SIZE)) 522 return -EINVAL; 523 524 if (PRINT_FIELD(CODE_PAGE_SIZE) && 525 evsel__check_stype(evsel, PERF_SAMPLE_CODE_PAGE_SIZE, "CODE_PAGE_SIZE", PERF_OUTPUT_CODE_PAGE_SIZE)) 526 return -EINVAL; 527 |
528 if (PRINT_FIELD(INS_LAT) && 529 evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT_STRUCT, "WEIGHT_STRUCT", PERF_OUTPUT_INS_LAT)) 530 return -EINVAL; 531 |
|
525 return 0; 526} 527 528static void set_print_ip_opts(struct perf_event_attr *attr) 529{ 530 unsigned int type = output_type(attr->type); 531 532 output[type].print_ip_opts = 0; --- 1501 unchanged lines hidden (view full) --- 2034 perf_sample__fprintf_addr(sample, thread, attr, fp); 2035 2036 if (PRINT_FIELD(DATA_SRC)) 2037 data_src__fprintf(sample->data_src, fp); 2038 2039 if (PRINT_FIELD(WEIGHT)) 2040 fprintf(fp, "%16" PRIu64, sample->weight); 2041 | 532 return 0; 533} 534 535static void set_print_ip_opts(struct perf_event_attr *attr) 536{ 537 unsigned int type = output_type(attr->type); 538 539 output[type].print_ip_opts = 0; --- 1501 unchanged lines hidden (view full) --- 2041 perf_sample__fprintf_addr(sample, thread, attr, fp); 2042 2043 if (PRINT_FIELD(DATA_SRC)) 2044 data_src__fprintf(sample->data_src, fp); 2045 2046 if (PRINT_FIELD(WEIGHT)) 2047 fprintf(fp, "%16" PRIu64, sample->weight); 2048 |
2049 if (PRINT_FIELD(INS_LAT)) 2050 fprintf(fp, "%16" PRIu16, sample->ins_lat); 2051 |
|
2042 if (PRINT_FIELD(IP)) { 2043 struct callchain_cursor *cursor = NULL; 2044 2045 if (script->stitch_lbr) 2046 al->thread->lbr_stitch_enable = true; 2047 2048 if (symbol_conf.use_callchain && sample->callchain && 2049 thread__resolve_callchain(al->thread, &callchain_cursor, evsel, --- 1660 unchanged lines hidden (view full) --- 3710 OPT_CALLBACK('F', "fields", NULL, "str", 3711 "comma separated output fields prepend with 'type:'. " 3712 "+field to add and -field to remove." 3713 "Valid types: hw,sw,trace,raw,synth. " 3714 "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso," 3715 "addr,symoff,srcline,period,iregs,uregs,brstack," 3716 "brstacksym,flags,bpf-output,brstackinsn,brstackoff," 3717 "callindent,insn,insnlen,synth,phys_addr,metric,misc,ipc,tod," | 2052 if (PRINT_FIELD(IP)) { 2053 struct callchain_cursor *cursor = NULL; 2054 2055 if (script->stitch_lbr) 2056 al->thread->lbr_stitch_enable = true; 2057 2058 if (symbol_conf.use_callchain && sample->callchain && 2059 thread__resolve_callchain(al->thread, &callchain_cursor, evsel, --- 1660 unchanged lines hidden (view full) --- 3720 OPT_CALLBACK('F', "fields", NULL, "str", 3721 "comma separated output fields prepend with 'type:'. " 3722 "+field to add and -field to remove." 3723 "Valid types: hw,sw,trace,raw,synth. " 3724 "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso," 3725 "addr,symoff,srcline,period,iregs,uregs,brstack," 3726 "brstacksym,flags,bpf-output,brstackinsn,brstackoff," 3727 "callindent,insn,insnlen,synth,phys_addr,metric,misc,ipc,tod," |
3718 "data_page_size,code_page_size", | 3728 "data_page_size,code_page_size,ins_lat", |
3719 parse_output_fields), 3720 OPT_BOOLEAN('a', "all-cpus", &system_wide, 3721 "system-wide collection from all CPUs"), 3722 OPT_STRING(0, "dsos", &symbol_conf.dso_list_str, "dso[,dso...]", 3723 "only consider symbols in these DSOs"), 3724 OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]", 3725 "only consider these symbols"), 3726 OPT_INTEGER(0, "addr-range", &symbol_conf.addr_range, --- 104 unchanged lines hidden (view full) --- 3831 * Enable guest sample processing. 3832 */ 3833 perf_guest = true; 3834 } 3835 3836 data.path = input_name; 3837 data.force = symbol_conf.force; 3838 | 3729 parse_output_fields), 3730 OPT_BOOLEAN('a', "all-cpus", &system_wide, 3731 "system-wide collection from all CPUs"), 3732 OPT_STRING(0, "dsos", &symbol_conf.dso_list_str, "dso[,dso...]", 3733 "only consider symbols in these DSOs"), 3734 OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]", 3735 "only consider these symbols"), 3736 OPT_INTEGER(0, "addr-range", &symbol_conf.addr_range, --- 104 unchanged lines hidden (view full) --- 3841 * Enable guest sample processing. 3842 */ 3843 perf_guest = true; 3844 } 3845 3846 data.path = input_name; 3847 data.force = symbol_conf.force; 3848 |
3849 if (symbol__validate_sym_arguments()) 3850 return -1; 3851 |
|
3839 if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) { 3840 rec_script_path = get_script_path(argv[1], RECORD_SUFFIX); 3841 if (!rec_script_path) 3842 return cmd_record(argc, argv); 3843 } 3844 3845 if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep"))) { 3846 rep_script_path = get_script_path(argv[1], REPORT_SUFFIX); --- 187 unchanged lines hidden (view full) --- 4034 } 4035 if (show_full_info) 4036 script.tool.show_feat_hdr = SHOW_FEAT_HEADER_FULL_INFO; 4037 4038 if (symbol__init(&session->header.env) < 0) 4039 goto out_delete; 4040 4041 uname(&uts); | 3852 if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) { 3853 rec_script_path = get_script_path(argv[1], RECORD_SUFFIX); 3854 if (!rec_script_path) 3855 return cmd_record(argc, argv); 3856 } 3857 3858 if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep"))) { 3859 rep_script_path = get_script_path(argv[1], REPORT_SUFFIX); --- 187 unchanged lines hidden (view full) --- 4047 } 4048 if (show_full_info) 4049 script.tool.show_feat_hdr = SHOW_FEAT_HEADER_FULL_INFO; 4050 4051 if (symbol__init(&session->header.env) < 0) 4052 goto out_delete; 4053 4054 uname(&uts); |
4042 if (data.is_pipe || /* assume pipe_mode indicates native_arch */ 4043 !strcmp(uts.machine, session->header.env.arch) || 4044 (!strcmp(uts.machine, "x86_64") && 4045 !strcmp(session->header.env.arch, "i386"))) | 4055 if (data.is_pipe) { /* Assume pipe_mode indicates native_arch */ |
4046 native_arch = true; | 4056 native_arch = true; |
4057 } else if (session->header.env.arch) { 4058 if (!strcmp(uts.machine, session->header.env.arch)) 4059 native_arch = true; 4060 else if (!strcmp(uts.machine, "x86_64") && 4061 !strcmp(session->header.env.arch, "i386")) 4062 native_arch = true; 4063 } |
|
4047 4048 script.session = session; 4049 script__setup_sample_type(&script); 4050 4051 if ((output[PERF_TYPE_HARDWARE].fields & PERF_OUTPUT_CALLINDENT) || 4052 symbol_conf.graph_function) 4053 itrace_synth_opts.thread_stack = true; 4054 --- 124 unchanged lines hidden --- | 4064 4065 script.session = session; 4066 script__setup_sample_type(&script); 4067 4068 if ((output[PERF_TYPE_HARDWARE].fields & PERF_OUTPUT_CALLINDENT) || 4069 symbol_conf.graph_function) 4070 itrace_synth_opts.thread_stack = true; 4071 --- 124 unchanged lines hidden --- |