perf llvm-utils: Add bpf include path to clang command line

We'll start putting headers for helpers to be used in eBPF proggies in
there:

  # perf trace -v --no-syscalls -e empty.c |& grep "llvm compiling command : "
  llvm compiling command : /usr/lib64/ccache/clang -D__KERNEL__ -D__NR_CPUS__=4 -DLINUX_VERSION_CODE=0x41100   -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h  -I/home/acme/lib/include/perf/bpf -Wno-unused-value -Wno-pointer-sign -working-directory /lib/modules/4.17.0-rc3-00034-gf4ef6a43/build -c /home/acme/bpf/empty.c -target bpf -O2 -o -
  #

Notice the "-I/home/acme/lib/include/perf/bpf"

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-6xq94xro8xlb5s9urznh3f9k@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent d8ed87bc
...@@ -885,6 +885,7 @@ endif ...@@ -885,6 +885,7 @@ endif
# Among the variables below, these: # Among the variables below, these:
# perfexecdir # perfexecdir
# perf_include_dir
# template_dir # template_dir
# mandir # mandir
# infodir # infodir
...@@ -904,6 +905,7 @@ bindir = $(abspath $(prefix)/$(bindir_relative)) ...@@ -904,6 +905,7 @@ bindir = $(abspath $(prefix)/$(bindir_relative))
mandir = share/man mandir = share/man
infodir = share/info infodir = share/info
perfexecdir = libexec/perf-core perfexecdir = libexec/perf-core
perf_include_dir = lib/include/perf
sharedir = $(prefix)/share sharedir = $(prefix)/share
template_dir = share/perf-core/templates template_dir = share/perf-core/templates
STRACE_GROUPS_DIR = share/perf-core/strace/groups STRACE_GROUPS_DIR = share/perf-core/strace/groups
...@@ -934,6 +936,7 @@ bindir_SQ = $(subst ','\'',$(bindir)) ...@@ -934,6 +936,7 @@ bindir_SQ = $(subst ','\'',$(bindir))
mandir_SQ = $(subst ','\'',$(mandir)) mandir_SQ = $(subst ','\'',$(mandir))
infodir_SQ = $(subst ','\'',$(infodir)) infodir_SQ = $(subst ','\'',$(infodir))
perfexecdir_SQ = $(subst ','\'',$(perfexecdir)) perfexecdir_SQ = $(subst ','\'',$(perfexecdir))
perf_include_dir_SQ = $(subst ','\'',$(perf_include_dir))
template_dir_SQ = $(subst ','\'',$(template_dir)) template_dir_SQ = $(subst ','\'',$(template_dir))
htmldir_SQ = $(subst ','\'',$(htmldir)) htmldir_SQ = $(subst ','\'',$(htmldir))
tipdir_SQ = $(subst ','\'',$(tipdir)) tipdir_SQ = $(subst ','\'',$(tipdir))
...@@ -944,14 +947,17 @@ srcdir_SQ = $(subst ','\'',$(srcdir)) ...@@ -944,14 +947,17 @@ srcdir_SQ = $(subst ','\'',$(srcdir))
ifneq ($(filter /%,$(firstword $(perfexecdir))),) ifneq ($(filter /%,$(firstword $(perfexecdir))),)
perfexec_instdir = $(perfexecdir) perfexec_instdir = $(perfexecdir)
perf_include_instdir = $(perf_include_dir)
STRACE_GROUPS_INSTDIR = $(STRACE_GROUPS_DIR) STRACE_GROUPS_INSTDIR = $(STRACE_GROUPS_DIR)
tip_instdir = $(tipdir) tip_instdir = $(tipdir)
else else
perfexec_instdir = $(prefix)/$(perfexecdir) perfexec_instdir = $(prefix)/$(perfexecdir)
perf_include_instdir = $(prefix)/$(perf_include_dir)
STRACE_GROUPS_INSTDIR = $(prefix)/$(STRACE_GROUPS_DIR) STRACE_GROUPS_INSTDIR = $(prefix)/$(STRACE_GROUPS_DIR)
tip_instdir = $(prefix)/$(tipdir) tip_instdir = $(prefix)/$(tipdir)
endif endif
perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir)) perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
perf_include_instdir_SQ = $(subst ','\'',$(perf_include_instdir))
STRACE_GROUPS_INSTDIR_SQ = $(subst ','\'',$(STRACE_GROUPS_INSTDIR)) STRACE_GROUPS_INSTDIR_SQ = $(subst ','\'',$(STRACE_GROUPS_INSTDIR))
tip_instdir_SQ = $(subst ','\'',$(tip_instdir)) tip_instdir_SQ = $(subst ','\'',$(tip_instdir))
...@@ -999,6 +1005,7 @@ $(call detected_var,ETC_PERFCONFIG_SQ) ...@@ -999,6 +1005,7 @@ $(call detected_var,ETC_PERFCONFIG_SQ)
$(call detected_var,STRACE_GROUPS_DIR_SQ) $(call detected_var,STRACE_GROUPS_DIR_SQ)
$(call detected_var,prefix_SQ) $(call detected_var,prefix_SQ)
$(call detected_var,perfexecdir_SQ) $(call detected_var,perfexecdir_SQ)
$(call detected_var,perf_include_dir_SQ)
$(call detected_var,tipdir_SQ) $(call detected_var,tipdir_SQ)
$(call detected_var,srcdir_SQ) $(call detected_var,srcdir_SQ)
$(call detected_var,LIBDIR) $(call detected_var,LIBDIR)
......
...@@ -767,6 +767,10 @@ ifndef NO_JVMTI ...@@ -767,6 +767,10 @@ ifndef NO_JVMTI
endif endif
$(call QUIET_INSTALL, libexec) \ $(call QUIET_INSTALL, libexec) \
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)' $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
ifndef NO_LIBBPF
$(call QUIET_INSTALL, lib) \
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perf_include_instdir_SQ)/bpf'
endif
$(call QUIET_INSTALL, perf-archive) \ $(call QUIET_INSTALL, perf-archive) \
$(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)' $(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
$(call QUIET_INSTALL, perf-with-kcore) \ $(call QUIET_INSTALL, perf-with-kcore) \
......
...@@ -152,6 +152,8 @@ libperf-y += perf-hooks.o ...@@ -152,6 +152,8 @@ libperf-y += perf-hooks.o
libperf-$(CONFIG_CXX) += c++/ libperf-$(CONFIG_CXX) += c++/
CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))" CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
CFLAGS_llvm-utils.o += -DPERF_INCLUDE_DIR="BUILD_STR($(perf_include_dir_SQ))"
# avoid compiler warnings in 32-bit mode # avoid compiler warnings in 32-bit mode
CFLAGS_genelf_debug.o += -Wno-packed CFLAGS_genelf_debug.o += -Wno-packed
......
...@@ -14,11 +14,12 @@ ...@@ -14,11 +14,12 @@
#include "config.h" #include "config.h"
#include "util.h" #include "util.h"
#include <sys/wait.h> #include <sys/wait.h>
#include <subcmd/exec-cmd.h>
#define CLANG_BPF_CMD_DEFAULT_TEMPLATE \ #define CLANG_BPF_CMD_DEFAULT_TEMPLATE \
"$CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS "\ "$CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS "\
"-DLINUX_VERSION_CODE=$LINUX_VERSION_CODE " \ "-DLINUX_VERSION_CODE=$LINUX_VERSION_CODE " \
"$CLANG_OPTIONS $KERNEL_INC_OPTIONS " \ "$CLANG_OPTIONS $KERNEL_INC_OPTIONS $PERF_BPF_INC_OPTIONS " \
"-Wno-unused-value -Wno-pointer-sign " \ "-Wno-unused-value -Wno-pointer-sign " \
"-working-directory $WORKING_DIR " \ "-working-directory $WORKING_DIR " \
"-c \"$CLANG_SOURCE\" -target bpf -O2 -o -" "-c \"$CLANG_SOURCE\" -target bpf -O2 -o -"
...@@ -212,7 +213,7 @@ version_notice(void) ...@@ -212,7 +213,7 @@ version_notice(void)
" \t\thttp://llvm.org/apt\n\n" " \t\thttp://llvm.org/apt\n\n"
" \tIf you are using old version of clang, change 'clang-bpf-cmd-template'\n" " \tIf you are using old version of clang, change 'clang-bpf-cmd-template'\n"
" \toption in [llvm] section of ~/.perfconfig to:\n\n" " \toption in [llvm] section of ~/.perfconfig to:\n\n"
" \t \"$CLANG_EXEC $CLANG_OPTIONS $KERNEL_INC_OPTIONS \\\n" " \t \"$CLANG_EXEC $CLANG_OPTIONS $KERNEL_INC_OPTIONS $PERF_BPF_INC_OPTIONS \\\n"
" \t -working-directory $WORKING_DIR -c $CLANG_SOURCE \\\n" " \t -working-directory $WORKING_DIR -c $CLANG_SOURCE \\\n"
" \t -emit-llvm -o - | /path/to/llc -march=bpf -filetype=obj -o -\"\n" " \t -emit-llvm -o - | /path/to/llc -march=bpf -filetype=obj -o -\"\n"
" \t(Replace /path/to/llc with path to your llc)\n\n" " \t(Replace /path/to/llc with path to your llc)\n\n"
...@@ -431,9 +432,11 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, ...@@ -431,9 +432,11 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
const char *clang_opt = llvm_param.clang_opt; const char *clang_opt = llvm_param.clang_opt;
char clang_path[PATH_MAX], abspath[PATH_MAX], nr_cpus_avail_str[64]; char clang_path[PATH_MAX], abspath[PATH_MAX], nr_cpus_avail_str[64];
char serr[STRERR_BUFSIZE]; char serr[STRERR_BUFSIZE];
char *kbuild_dir = NULL, *kbuild_include_opts = NULL; char *kbuild_dir = NULL, *kbuild_include_opts = NULL,
*perf_bpf_include_opts = NULL;
const char *template = llvm_param.clang_bpf_cmd_template; const char *template = llvm_param.clang_bpf_cmd_template;
char *command_echo, *command_out; char *command_echo = NULL, *command_out;
char *perf_include_dir = system_path(PERF_INCLUDE_DIR);
if (path[0] != '-' && realpath(path, abspath) == NULL) { if (path[0] != '-' && realpath(path, abspath) == NULL) {
err = errno; err = errno;
...@@ -471,12 +474,14 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, ...@@ -471,12 +474,14 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
snprintf(linux_version_code_str, sizeof(linux_version_code_str), snprintf(linux_version_code_str, sizeof(linux_version_code_str),
"0x%x", kernel_version); "0x%x", kernel_version);
if (asprintf(&perf_bpf_include_opts, "-I%s/bpf", perf_include_dir) < 0)
goto errout;
force_set_env("NR_CPUS", nr_cpus_avail_str); force_set_env("NR_CPUS", nr_cpus_avail_str);
force_set_env("LINUX_VERSION_CODE", linux_version_code_str); force_set_env("LINUX_VERSION_CODE", linux_version_code_str);
force_set_env("CLANG_EXEC", clang_path); force_set_env("CLANG_EXEC", clang_path);
force_set_env("CLANG_OPTIONS", clang_opt); force_set_env("CLANG_OPTIONS", clang_opt);
force_set_env("KERNEL_INC_OPTIONS", kbuild_include_opts); force_set_env("KERNEL_INC_OPTIONS", kbuild_include_opts);
force_set_env("PERF_BPF_INC_OPTIONS", perf_bpf_include_opts);
force_set_env("WORKING_DIR", kbuild_dir ? : "."); force_set_env("WORKING_DIR", kbuild_dir ? : ".");
/* /*
...@@ -512,6 +517,8 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, ...@@ -512,6 +517,8 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
free(command_out); free(command_out);
free(kbuild_dir); free(kbuild_dir);
free(kbuild_include_opts); free(kbuild_include_opts);
free(perf_bpf_include_opts);
free(perf_include_dir);
if (!p_obj_buf) if (!p_obj_buf)
free(obj_buf); free(obj_buf);
...@@ -526,6 +533,8 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, ...@@ -526,6 +533,8 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
free(kbuild_dir); free(kbuild_dir);
free(kbuild_include_opts); free(kbuild_include_opts);
free(obj_buf); free(obj_buf);
free(perf_bpf_include_opts);
free(perf_include_dir);
if (p_obj_buf) if (p_obj_buf)
*p_obj_buf = NULL; *p_obj_buf = NULL;
if (p_obj_buf_sz) if (p_obj_buf_sz)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment