diff options
Diffstat (limited to 'tools/perf/util/llvm-utils.c')
-rw-r--r-- | tools/perf/util/llvm-utils.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c index 5e94857dfca2..19262f98cd4e 100644 --- a/tools/perf/util/llvm-utils.c +++ b/tools/perf/util/llvm-utils.c | |||
@@ -22,12 +22,14 @@ | |||
22 | "$CLANG_OPTIONS $KERNEL_INC_OPTIONS $PERF_BPF_INC_OPTIONS " \ | 22 | "$CLANG_OPTIONS $KERNEL_INC_OPTIONS $PERF_BPF_INC_OPTIONS " \ |
23 | "-Wno-unused-value -Wno-pointer-sign " \ | 23 | "-Wno-unused-value -Wno-pointer-sign " \ |
24 | "-working-directory $WORKING_DIR " \ | 24 | "-working-directory $WORKING_DIR " \ |
25 | "-c \"$CLANG_SOURCE\" -target bpf -O2 -o -" | 25 | "-c \"$CLANG_SOURCE\" -target bpf $CLANG_EMIT_LLVM -O2 -o - $LLVM_OPTIONS_PIPE" |
26 | 26 | ||
27 | struct llvm_param llvm_param = { | 27 | struct llvm_param llvm_param = { |
28 | .clang_path = "clang", | 28 | .clang_path = "clang", |
29 | .llc_path = "llc", | ||
29 | .clang_bpf_cmd_template = CLANG_BPF_CMD_DEFAULT_TEMPLATE, | 30 | .clang_bpf_cmd_template = CLANG_BPF_CMD_DEFAULT_TEMPLATE, |
30 | .clang_opt = NULL, | 31 | .clang_opt = NULL, |
32 | .opts = NULL, | ||
31 | .kbuild_dir = NULL, | 33 | .kbuild_dir = NULL, |
32 | .kbuild_opts = NULL, | 34 | .kbuild_opts = NULL, |
33 | .user_set_param = false, | 35 | .user_set_param = false, |
@@ -51,6 +53,8 @@ int perf_llvm_config(const char *var, const char *value) | |||
51 | llvm_param.kbuild_opts = strdup(value); | 53 | llvm_param.kbuild_opts = strdup(value); |
52 | else if (!strcmp(var, "dump-obj")) | 54 | else if (!strcmp(var, "dump-obj")) |
53 | llvm_param.dump_obj = !!perf_config_bool(var, value); | 55 | llvm_param.dump_obj = !!perf_config_bool(var, value); |
56 | else if (!strcmp(var, "opts")) | ||
57 | llvm_param.opts = strdup(value); | ||
54 | else { | 58 | else { |
55 | pr_debug("Invalid LLVM config option: %s\n", value); | 59 | pr_debug("Invalid LLVM config option: %s\n", value); |
56 | return -1; | 60 | return -1; |
@@ -430,11 +434,13 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, | |||
430 | unsigned int kernel_version; | 434 | unsigned int kernel_version; |
431 | char linux_version_code_str[64]; | 435 | char linux_version_code_str[64]; |
432 | const char *clang_opt = llvm_param.clang_opt; | 436 | const char *clang_opt = llvm_param.clang_opt; |
433 | char clang_path[PATH_MAX], abspath[PATH_MAX], nr_cpus_avail_str[64]; | 437 | char clang_path[PATH_MAX], llc_path[PATH_MAX], abspath[PATH_MAX], nr_cpus_avail_str[64]; |
434 | char serr[STRERR_BUFSIZE]; | 438 | char serr[STRERR_BUFSIZE]; |
435 | char *kbuild_dir = NULL, *kbuild_include_opts = NULL, | 439 | char *kbuild_dir = NULL, *kbuild_include_opts = NULL, |
436 | *perf_bpf_include_opts = NULL; | 440 | *perf_bpf_include_opts = NULL; |
437 | const char *template = llvm_param.clang_bpf_cmd_template; | 441 | const char *template = llvm_param.clang_bpf_cmd_template; |
442 | char *pipe_template = NULL; | ||
443 | const char *opts = llvm_param.opts; | ||
438 | char *command_echo = NULL, *command_out; | 444 | char *command_echo = NULL, *command_out; |
439 | char *perf_include_dir = system_path(PERF_INCLUDE_DIR); | 445 | char *perf_include_dir = system_path(PERF_INCLUDE_DIR); |
440 | 446 | ||
@@ -484,6 +490,26 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, | |||
484 | force_set_env("PERF_BPF_INC_OPTIONS", perf_bpf_include_opts); | 490 | force_set_env("PERF_BPF_INC_OPTIONS", perf_bpf_include_opts); |
485 | force_set_env("WORKING_DIR", kbuild_dir ? : "."); | 491 | force_set_env("WORKING_DIR", kbuild_dir ? : "."); |
486 | 492 | ||
493 | if (opts) { | ||
494 | err = search_program(llvm_param.llc_path, "llc", llc_path); | ||
495 | if (err) { | ||
496 | pr_err("ERROR:\tunable to find llc.\n" | ||
497 | "Hint:\tTry to install latest clang/llvm to support BPF. Check your $PATH\n" | ||
498 | " \tand 'llc-path' option in [llvm] section of ~/.perfconfig.\n"); | ||
499 | version_notice(); | ||
500 | goto errout; | ||
501 | } | ||
502 | |||
503 | if (asprintf(&pipe_template, "%s -emit-llvm | %s -march=bpf %s -filetype=obj -o -", | ||
504 | template, llc_path, opts) < 0) { | ||
505 | pr_err("ERROR:\tnot enough memory to setup command line\n"); | ||
506 | goto errout; | ||
507 | } | ||
508 | |||
509 | template = pipe_template; | ||
510 | |||
511 | } | ||
512 | |||
487 | /* | 513 | /* |
488 | * Since we may reset clang's working dir, path of source file | 514 | * Since we may reset clang's working dir, path of source file |
489 | * should be transferred into absolute path, except we want | 515 | * should be transferred into absolute path, except we want |
@@ -535,6 +561,7 @@ errout: | |||
535 | free(obj_buf); | 561 | free(obj_buf); |
536 | free(perf_bpf_include_opts); | 562 | free(perf_bpf_include_opts); |
537 | free(perf_include_dir); | 563 | free(perf_include_dir); |
564 | free(pipe_template); | ||
538 | if (p_obj_buf) | 565 | if (p_obj_buf) |
539 | *p_obj_buf = NULL; | 566 | *p_obj_buf = NULL; |
540 | if (p_obj_buf_sz) | 567 | if (p_obj_buf_sz) |