diff options
author | Ingo Molnar <mingo@kernel.org> | 2016-06-22 09:34:19 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-06-22 09:34:19 +0200 |
commit | 4330b439bbe16b48dd2fe9a379bd58a07b97aab8 (patch) | |
tree | 375958f5410db5095d172b21f02e5bb737fb97c6 /tools/perf/util/llvm-utils.c | |
parent | 02469a95096a549508c5adf61d84a1d72851c85b (diff) | |
parent | 6745d8ea825966b0956c691cf7fccc13debedc39 (diff) |
Merge tag 'perf-core-for-mingo-20160621' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
New features:
- Add --dry-run option to 'perf record' to check if command line options can be
parsed, but not doing any recording (Wang Nan)
- Allow dumping the object files generated by llvm when processing eBPF
scriptlet events (Wang Nan)
- Add stackcollapse.py script to help generating flame graphs (Paolo Bonzini)
Documentation changes:
- Fix 'perf script' documentation of '-f' when it should be '-F' (Adrian Hunter)
Infrastructure changes:
- Fix write_backwards fallback when using a new tool on older kernels
without support for this feature (Arnaldo Carvalho de Melo)
- Remove some leftovers from the initial codebase copying from git
(Arnaldo Carvalho de Melo)
- List libelf-devel as an alternative, as this is how the libelf
development package is called on OpenSuSE (Jean Delvare)
- Rename __hists__add_entry to hists__add_entry (Jiri Olsa)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/util/llvm-utils.c')
-rw-r--r-- | tools/perf/util/llvm-utils.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c index 33071d6159bc..878a566763c3 100644 --- a/tools/perf/util/llvm-utils.c +++ b/tools/perf/util/llvm-utils.c @@ -42,6 +42,8 @@ int perf_llvm_config(const char *var, const char *value) llvm_param.kbuild_dir = strdup(value); else if (!strcmp(var, "kbuild-opts")) llvm_param.kbuild_opts = strdup(value); + else if (!strcmp(var, "dump-obj")) + llvm_param.dump_obj = !!perf_config_bool(var, value); else return -1; llvm_param.user_set_param = true; @@ -326,6 +328,42 @@ get_kbuild_opts(char **kbuild_dir, char **kbuild_include_opts) pr_debug("include option is set to %s\n", *kbuild_include_opts); } +static void +dump_obj(const char *path, void *obj_buf, size_t size) +{ + char *obj_path = strdup(path); + FILE *fp; + char *p; + + if (!obj_path) { + pr_warning("WARNING: No enough memory, skip object dumping\n"); + return; + } + + p = strrchr(obj_path, '.'); + if (!p || (strcmp(p, ".c") != 0)) { + pr_warning("WARNING: invalid llvm source path: '%s', skip object dumping\n", + obj_path); + goto out; + } + + p[1] = 'o'; + fp = fopen(obj_path, "wb"); + if (!fp) { + pr_warning("WARNING: failed to open '%s': %s, skip object dumping\n", + obj_path, strerror(errno)); + goto out; + } + + pr_info("LLVM: dumping %s\n", obj_path); + if (fwrite(obj_buf, size, 1, fp) != 1) + pr_warning("WARNING: failed to write to file '%s': %s, skip object dumping\n", + obj_path, strerror(errno)); + fclose(fp); +out: + free(obj_path); +} + int llvm__compile_bpf(const char *path, void **p_obj_buf, size_t *p_obj_buf_sz) { @@ -411,6 +449,10 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, free(kbuild_dir); free(kbuild_include_opts); + + if (llvm_param.dump_obj) + dump_obj(path, obj_buf, obj_buf_sz); + if (!p_obj_buf) free(obj_buf); else |