perf/core improvements and fixes
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit e7af7b15121ca08c31a0ab9df71a41b4c53365b4:
Merge tag 'perf-core-for-mingo-20161201' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2016-12-02 10:08:03 +0100)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20161205
for you to fetch changes up to bec60e50af83741cde1786ab475d4bf472aed6f9:
perf annotate: Show raw form for jump instruction with indirect target (2016-12-05 17:21:57 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
Fixes:
- Do not show a bogus target address in 'perf annotate' for targetless powerpc jump instructions such as 'bctr' (Ravi Bangoria)
- tools/build fixes related to race conditions with the fixdep utility (Jiri Olsa)
- Fix building objtool with clang (Peter Foley)
Infrastructure:
- Support linking perf with clang and LLVM libraries, initially statically, but this limitation will be lifted and shared libraries, when available, will be preferred to the static build, that should, as with other features, be enabled explicitly (Wang Nan)
----------------------------------------------------------------
Jiri Olsa (7):
tools build: Make fixdep parsing wait for last target tools build: Make the .cmd file more readable tools build: Move tabs to spaces where suitable perf tools: Move install-gtk target into rules area perf tools: Move python/perf.so target into rules area perf tools: Cleanup build directory before each test perf tools: Add non config targets
Peter Foley (1):
tools build: Fix objtool build with clang
Ravi Bangoria (1):
perf annotate: Show raw form for jump instruction with indirect target
Wang Nan (11):
perf tools: Pass context to perf hook functions perf llvm: Extract helpers in llvm-utils.c
tools build: Add feature detection for LLVM
tools build: Add feature detection for clang
perf build: Add clang and llvm compile and linking support perf clang: Add builtin clang support ant test case perf clang: Use real file system for #include
perf clang: Allow passing CFLAGS to builtin clang perf clang: Update test case to use real BPF script perf clang: Support compile IR to BPF object and add testcase perf clang: Compile BPF script using builtin clang support
tools/build/Build.include | 20 ++-- tools/build/Makefile.feature | 138 +++++++++++++------------- tools/build/feature/Makefile | 120 +++++++++++++---------- tools/build/feature/test-clang.cpp | 21 ++++ tools/build/feature/test-llvm.cpp | 8 ++ tools/build/fixdep.c | 5 +- tools/perf/Makefile.config | 62 +++++++++--- tools/perf/Makefile.perf | 56 +++++++---- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 9 ++ tools/perf/tests/clang.c | 46 +++++++++ tools/perf/tests/llvm.h | 7 ++ tools/perf/tests/make | 4 +- tools/perf/tests/perf-hooks.c | 14 ++- tools/perf/tests/tests.h | 3 + tools/perf/util/Build | 2 + tools/perf/util/annotate.c | 3 + tools/perf/util/bpf-loader.c | 19 +++- tools/perf/util/c++/Build | 2 + tools/perf/util/c++/clang-c.h | 43 ++++++++ tools/perf/util/c++/clang-test.cpp | 62 ++++++++++++ tools/perf/util/c++/clang.cpp | 195 +++++++++++++++++++++++++++++++++++++ tools/perf/util/c++/clang.h | 26 +++++ tools/perf/util/llvm-utils.c | 76 +++++++++++---- tools/perf/util/llvm-utils.h | 6 ++ tools/perf/util/perf-hooks.c | 10 +- tools/perf/util/perf-hooks.h | 6 +- tools/perf/util/util-cxx.h | 26 +++++ 28 files changed, 795 insertions(+), 195 deletions(-) create mode 100644 tools/build/feature/test-clang.cpp create mode 100644 tools/build/feature/test-llvm.cpp create mode 100644 tools/perf/tests/clang.c create mode 100644 tools/perf/util/c++/Build create mode 100644 tools/perf/util/c++/clang-c.h create mode 100644 tools/perf/util/c++/clang-test.cpp create mode 100644 tools/perf/util/c++/clang.cpp create mode 100644 tools/perf/util/c++/clang.h create mode 100644 tools/perf/util/util-cxx.h
# uname -a
Linux jouet 4.8.8-300.fc25.x86_64 #1 SMP Tue Nov 15 18:10:06 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
# perf test
1: vmlinux symtab matches kallsyms : Ok
2: Detect openat syscall event : Ok
3: Detect openat syscall event on all cpus : Ok
4: Read samples using the mmap interface : Ok
5: Parse event definition strings : Ok
6: PERF_RECORD_* events & perf_sample fields : Ok
7: Parse perf pmu format : Ok
8: DSO data read : Ok
9: DSO data cache : Ok
10: DSO data reopen : Ok
11: Roundtrip evsel->name : Ok
12: Parse sched tracepoints fields : Ok
13: syscalls:sys_enter_openat event fields : Ok
14: Setup struct perf_event_attr : Ok
15: Match and link multiple hists : Ok
16: 'import perf' in python : Ok
17: Breakpoint overflow signal handler : Ok
18: Breakpoint overflow sampling : Ok
19: Number of exit events of a simple workload : Ok
20: Software clock events period values : Ok
21: Object code reading : Ok
22: Sample parsing : Ok
23: Use a dummy software event to keep tracking: Ok
24: Parse with no sample_id_all bit set : Ok
25: Filter hist entries : Ok
26: Lookup mmap thread : Ok
27: Share thread mg : Ok
28: Sort output of hist entries : Ok
29: Cumulate child hist entries : Ok
30: Track with sched_switch : Ok
31: Filter fds with revents mask in a fdarray : Ok
32: Add fd to a fdarray, making it autogrow : Ok
33: kmod_path__parse : Ok
34: Thread map : Ok
35: LLVM search and compile :
35.1: Basic BPF llvm compile : Ok
35.2: kbuild searching : Ok
35.3: Compile source for BPF prologue generation: Ok
35.4: Compile source for BPF relocation : Ok
36: Session topology : Ok
37: BPF filter :
37.1: Basic BPF filtering : Ok
37.2: BPF prologue generation : Ok
37.3: BPF relocation checker : Ok
38: Synthesize thread map : Ok
39: Synthesize cpu map : Ok
40: Synthesize stat config : Ok
41: Synthesize stat : Ok
42: Synthesize stat round : Ok
43: Synthesize attr update : Ok
44: Event times : Ok
45: Read backward ring buffer : Ok
46: Print cpu map : Ok
47: Probe SDT events : Ok
48: is_printable_array : Ok
49: Print bitmap : Ok
50: perf hooks : Ok
51: builtin clang support : Skip (not compiled in)
52: x86 rdpmc : Ok
53: Convert perf time to TSC : Ok
54: DWARF unwind : Ok
55: x86 instruction decoder - new instructions : Ok
56: Intel cqm nmi context read : Skip
#
# time dm
1 alpine:3.4: Ok
2 android-ndk:r12b-arm: Ok
3 archlinux:latest: Ok
4 centos:5: Ok
5 centos:6: Ok
6 centos:7: Ok
7 debian:7: Ok
8 debian:8: Ok
9 debian:experimental: Ok
10 fedora:20: Ok
11 fedora:21: Ok
12 fedora:22: Ok
13 fedora:23: Ok
14 fedora:24: Ok
15 fedora:24-x-ARC-uClibc: Ok
16 fedora:25: Ok
17 fedora:rawhide: Ok
18 mageia:5: Ok
19 opensuse:13.2: Ok
20 opensuse:42.1: Ok
21 opensuse:tumbleweed: Ok
22 ubuntu:12.04.5: Ok
23 ubuntu:14.04.4-x-linaro-arm64: Ok
24 ubuntu:16.04: Ok
25 ubuntu:16.04-x-arm: Ok
26 ubuntu:16.04-x-arm64: Ok
27 ubuntu:16.04-x-powerpc: Ok
28 ubuntu:16.04-x-powerpc64: Ok
29 ubuntu:16.04-x-powerpc64el: Ok
30 ubuntu:16.04-x-s390: Ok
31 ubuntu:16.10: Ok
#
$ make -C tools/perf build-test
make: Entering directory '/home/acme/git/linux/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_no_backtrace_O: make NO_BACKTRACE=1
make_no_gtk2_O: make NO_GTK2=1
make_static_O: make LDFLAGS=-static
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_perf_o_O: make perf.o
make_no_slang_O: make NO_SLANG=1
make_install_prefix_O: make install prefix=/tmp/krava
make_no_libpython_O: make NO_LIBPYTHON=1
make_no_newt_O: make NO_NEWT=1
make_debug_O: make DEBUG=1
make_tags_O: make tags
make_no_libbionic_O: make NO_LIBBIONIC=1
make_help_O: make help
make_install_O: make install
make_no_libunwind_O: make NO_LIBUNWIND=1
make_pure_O: make
make_minimal_O: make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1
make_no_libperl_O: make NO_LIBPERL=1
make_no_libbpf_O: make NO_LIBBPF=1
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_doc_O: make doc
make_no_libaudit_O: make NO_LIBAUDIT=1
make_clean_all_O: make clean all
make_with_babeltrace_O: make LIBBABELTRACE=1
make_no_libnuma_O: make NO_LIBNUMA=1
make_util_map_o_O: make util/map.o
make_install_bin_O: make install-bin
make_no_demangle_O: make NO_DEMANGLE=1
make_no_libelf_O: make NO_LIBELF=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_with_clangllvm_O: make LIBCLANGLLVM=1
OK
make: Leaving directory '/home/acme/git/linux/tools/perf'
$Arnaldo Carvalho de Melo
maintainerPATCH 1/20 tools build: Make fixdep parsing wait for last target
From: Jiri Olsa <[email protected]>
The fixdep tool, among other things, replaces the target of the object in the gcc generated dependency output file.
The parsing code assumes there's only single target in the rule but this is not always the case as described in here:
https://gcc.gnu.org/ml/gcc-help/2016-11/msg00099.html
Make the fixdep code smart enough to skip all the possible targets.
--- tools/build/fixdep.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/build/fixdep.c +3 -2
@@ -49,7 +49,7 @@ static void parse_dep_file(void *map, size_t len)char *end = m + len;char *p;char s[PATH_MAX ]; -int is_target; +int is_target, has_target =0 ;int saw_any_target =0 ;int is_first_dep =0 ;
@@ -67,7 +67,8 @@ static void parse_dep_file(void *map, size_t len)if (is_target) {/* The /next/ file is the first dependency */ is_first_dep =1 ; - }else { + has_target =1 ; + }else if (has_target) {/* Save this token/filename */ memcpy (s, m, p-m); s[p - m] =0 ;
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 2/20 tools build: Fix objtool build with clang
In reply to Arnaldo Carvalho de MeloFrom: Peter Foley <[email protected]>
Clang doesn't support multiple arguments being passed to -Wp, so split them.
Fixes this error:
HOSTCC tools/objtool/fixdep.o
cat: tools/objtool/.fixdep.o.d: No such file or directory
--- tools/build/Build.include | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/build/Build.include +3 -3
@@ -89,12 +89,12 @@ if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ # - per target C flags # - per object C flags # - BUILD_STR macro to allow '-D"$(variable)"' constructs -c_flags_1 = -Wp,-MD,$(depfile),-MT,$@ $(CFLAGS) -D"BUILD_STR(s)=\#s" $(CFLAGS_$(basetarget).o) $(CFLAGS_$(obj)) +c_flags_1 = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CFLAGS) -D"BUILD_STR(s)=\#s" $(CFLAGS_$(basetarget).o) $(CFLAGS_$(obj)) c_flags_2 = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(c_flags_1)) c_flags = $(filter-out $(CFLAGS_REMOVE_$(obj)), $(c_flags_2)) -cxx_flags = -Wp,-MD,$(depfile),-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj)) +cxx_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj)) ### ## HOSTCC C flags -host_c_flags = -Wp,-MD,$(depfile),-MT,$@ $(CHOSTFLAGS) -D"BUILD_STR(s)=\#s" $(CHOSTFLAGS_$(basetarget).o) $(CHOSTFLAGS_$(obj)) +host_c_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CHOSTFLAGS) -D"BUILD_STR(s)=\#s" $(CHOSTFLAGS_$(basetarget).o) $(CHOSTFLAGS_$(obj))
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 3/20 perf tools: Pass context to perf hook functions
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Pass a pointer to perf hook functions so they receive context information during setup.
--- tools/perf/tests/perf-hooks.c | 14 +++++++++----- tools/perf/util/perf-hooks.c | 10 +++++++--- tools/perf/util/perf-hooks.h | 6 ++++-- 3 files changed, 20 insertions(+), 10 deletions(-)
tools/perf/tests/perf-hooks.c +9 -5
@@ -15,13 +15,13 @@ static void sigsegv_handler(int sig __maybe_unused)exit (-1 ); } -static int hook_flags; -static void the_hook (void ) +static void the_hook (void *_hook_flags) { +int *hook_flags = _hook_flags;int *p =NULL ; - hook_flags =1234 ; + *hook_flags =1234 ;/* Generate a segfault, test perf_hooks__recover */ *p =0 ;
@@ -29,13 +29,17 @@ static void the_hook(void)int test__perf_hooks (int subtest__maybe_unused ) { +int hook_flags =0 ; +signal (SIGSEGV , sigsegv_handler); -perf_hooks__set_hook ("test" , the_hook); +perf_hooks__set_hook ("test" , the_hook, &hook_flags);perf_hooks__invoke_test ();/* hook is triggered? */ -if (hook_flags !=1234 ) +if (hook_flags !=1234 ) { +pr_debug ("Setting failed: %d (%p)\n" , hook_flags, &hook_flags);return TEST_FAIL ; + }/* the buggy hook is removed? */ if (perf_hooks__get_hook ("test" ))
tools/perf/util/perf-hooks.c +7 -3
@@ -27,7 +27,7 @@ void perf_hooks__invoke(const struct perf_hook_desc *desc) *(current_perf_hook->p_hook_func) =NULL ; }else { current_perf_hook = desc; - (**desc->p_hook_func)(); + (**desc->p_hook_func)(desc->hook_ctx); } current_perf_hook =NULL ; }
@@ -41,7 +41,9 @@ void perf_hooks__recover(void)#define PERF_HOOK (name) \ perf_hook_func_t __perf_hook_func_##name = NULL; \ struct perf_hook_desc __perf_hook_desc_##name = \ - {.hook_name = #name, .p_hook_func = &__perf_hook_func_##name}; + {.hook_name = #name, \ + .p_hook_func = &__perf_hook_func_##name, \ + .hook_ctx = NULL};#include "perf-hooks-list.h" #undef PERF_HOOK
@@ -54,7 +56,8 @@ static struct perf_hook_desc *perf_hooks[] = {#undef PERF_HOOKint perf_hooks__set_hook (const char *hook_name, -perf_hook_func_t hook_func) +perf_hook_func_t hook_func, +void *hook_ctx) {unsigned int i;
@@ -65,6 +68,7 @@ int perf_hooks__set_hook(const char *hook_name,if (*(perf_hooks[i]->p_hook_func))pr_warning ("Overwrite existing hook: %s\n" , hook_name); *(perf_hooks[i]->p_hook_func) = hook_func; + perf_hooks[i]->hook_ctx = hook_ctx;return 0 ; }return -ENOENT ;
tools/perf/util/perf-hooks.h +4 -2
@@ -5,10 +5,11 @@extern "C" {#endif -typedef void (*perf_hook_func_t )(void ); +typedef void (*perf_hook_func_t )(void *ctx);struct perf_hook_desc {const char *const hook_name;perf_hook_func_t *const p_hook_func; +void *hook_ctx; };extern void perf_hooks__invoke (const struct perf_hook_desc *);
@@ -26,7 +27,8 @@ static inline void perf_hooks__invoke_##name(void) \extern int perf_hooks__set_hook (const char *hook_name, -perf_hook_func_t hook_func); +perf_hook_func_t hook_func, +void *hook_ctx);extern perf_hook_func_t perf_hooks__get_hook (const char *hook_name);
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 4/20 perf llvm: Extract helpers in llvm-utils.c
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
The following commits will use builtin clang to compile BPF scripts.
llvm__get_kbuild_opts() and llvm__get_nr_cpus() are extracted to help building '-DKERNEL_VERSION_CODE' and '-D__NR_CPUS__' macros.
Doing object dumping in bpf loader, so further builtin clang compiling needn't consider it.
--- tools/perf/util/bpf-loader.c | 4 +++ tools/perf/util/llvm-utils.c | 76 +++++++++++++++++++++++++++++++++----------- tools/perf/util/llvm-utils.h | 6 ++++ 3 files changed, 68 insertions(+), 18 deletions(-)
tools/perf/util/bpf-loader.c +4 -0
@@ -90,6 +90,10 @@ struct bpf_object *bpf__prepare_load(const char *filename, bool source)if (err)return ERR_PTR (-BPF_LOADER_ERRNO__COMPILE ); obj =bpf_object__open_buffer (obj_buf, obj_buf_sz, filename); + +if (!IS_ERR (obj) && llvm_param.dump_obj) +llvm__dump_obj (filename, obj_buf, obj_buf_sz); +free (obj_buf); }else obj =bpf_object__open (filename);
tools/perf/util/llvm-utils.c +58 -18
128 lines not on this page · raw message
tools/perf/util/llvm-utils.h +6 -0
@@ -50,4 +50,10 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, size_t *p_obj_buf_sz);/* This function is for test__llvm() use only */ int llvm__search_clang (void ); + +/* Following functions are reused by builtin clang support */ +void llvm__get_kbuild_opts (char **kbuild_dir,char **kbuild_include_opts); +int llvm__get_nr_cpus (void ); + +void llvm__dump_obj (const char *path,void *obj_buf,size_t size);#endif
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 5/20 tools build: Add feature detection for LLVM
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Check if basic LLVM compiling environment is ready.
Use llvm-config to detect include and library directories. Avoid using 'llvm-config --cxxflags' because its result contain some unwanted flags like --sysroot (if LLVM is built by yocto).
Use '?=' to set LLVM_CONFIG, so explicitly passing LLVM_CONFIG to make would override it.
Use 'llvm-config --libs BPF' to check if BPF backend is compiled in. Since now BPF bytecode is the only required backend, no need to waste time linking llvm and clang if BPF backend is missing. This also introduce an implicit requirement that LLVM should be new enough. Old LLVM doesn't support BPF backend.
--- tools/build/feature/Makefile | 8 ++++++++ tools/build/feature/test-llvm.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 tools/build/feature/test-llvm.cpp
tools/build/feature/Makefile +8 -0
@@ -55,6 +55,7 @@ FILES := $(addprefix $(OUTPUT),$(FILES)) CC := $(CROSS_COMPILE)gcc -MD CXX := $(CROSS_COMPILE)g++ -MD PKG_CONFIG := $(CROSS_COMPILE)pkg-config +LLVM_CONFIG ?= llvm-config all: $(FILES)
@@ -229,6 +230,13 @@ $(OUTPUT)test-cxx.bin: $(OUTPUT)test-jvmti.bin: $(BUILD) +$(OUTPUT)test-llvm.bin: + $(BUILDXX) -std=gnu++11 \ + -I$(shell $(LLVM_CONFIG) --includedir) \ + -L$(shell $(LLVM_CONFIG) --libdir) \ + $(shell $(LLVM_CONFIG) --libs Core BPF) \ + $(shell $(LLVM_CONFIG) --system-libs) + -include $(OUTPUT)*.d ###############################
tools/build/feature/test-llvm.cpp new file +8 -0
@@ -0,0 +1,8 @@ +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/raw_ostream.h" +int main() +{ + llvm::errs() << "Hello World!\n"; + llvm::llvm_shutdown(); + return 0; +}
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 6/20 tools build: Add feature detection for clang
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Check if basic clang compiling environment is ready.
Doesn't like 'llvm-config --libs' which can returns llvm libraries in right order and duplicates some libraries if necessary, there's no correspondence for clang libraries (-lclangxxx). to avoid extra complexity and to avoid new clang breaking libraries ordering, use --start-group and --end-group.
In this test case, manually identify required clang libs and hope it to be stable. Putting all clang libraries here is possible (use make's wildcard), but then feature checking becomes very slow.
--- tools/build/feature/Makefile | 10 ++++++++++ tools/build/feature/test-clang.cpp | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 tools/build/feature/test-clang.cpp
tools/build/feature/Makefile +10 -0
@@ -237,6 +237,16 @@ $(OUTPUT)test-llvm.bin: $(shell $(LLVM_CONFIG) --libs Core BPF) \ $(shell $(LLVM_CONFIG) --system-libs) +$(OUTPUT)test-clang.bin: + $(BUILDXX) -std=gnu++11 \ + -I$(shell $(LLVM_CONFIG) --includedir) \ + -L$(shell $(LLVM_CONFIG) --libdir) \ + -Wl,--start-group -lclangBasic -lclangDriver \ + -lclangFrontend -lclangEdit -lclangLex \ + -lclangAST -Wl,--end-group \ + $(shell $(LLVM_CONFIG) --libs Core option) \ + $(shell $(LLVM_CONFIG) --system-libs) + -include $(OUTPUT)*.d ###############################
tools/build/feature/test-clang.cpp new file +21 -0
@@ -0,0 +1,21 @@ +#include "clang/Basic/VirtualFileSystem.h" +#include "clang/Driver/Driver.h" +#include "clang/Frontend/TextDiagnosticPrinter.h" +#include "llvm/ADT/IntrusiveRefCntPtr.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/raw_ostream.h" + +using namespace clang; +using namespace clang::driver; + +int main() +{ + IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); + IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); + + DiagnosticsEngine Diags(DiagID, &*DiagOpts); + Driver TheDriver("test", "bpf-pc-linux", Diags); + + llvm::llvm_shutdown(); + return 0; +}
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 7/20 perf build: Add clang and llvm compile and linking support
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Add necessary c++ flags and link libraries to support builtin clang and LLVM. Add all llvm and clang libraries, so don't need to worry about clang changes its libraries setting. However, linking perf would take much longer than usual.
--- tools/perf/Makefile.config | 35 +++++++++++++++++++++++++++++++++++ tools/perf/Makefile.perf | 23 ++++++++++++++++++++++- tools/perf/tests/make | 2 ++ 3 files changed, 59 insertions(+), 1 deletion(-)
tools/perf/Makefile.config +35 -0
@@ -136,6 +136,7 @@ endif # Treat warnings as errors unless directed not to ifneq ($(WERROR),0) CFLAGS += -Werror + CXXFLAGS += -Werror endif ifndef DEBUG
@@ -182,6 +183,13 @@ CFLAGS += -Wall CFLAGS += -Wextra CFLAGS += -std=gnu99 +CXXFLAGS += -std=gnu++11 -fno-exceptions -fno-rtti +CXXFLAGS += -Wall +CXXFLAGS += -fno-omit-frame-pointer +CXXFLAGS += -ggdb3 +CXXFLAGS += -funwind-tables +CXXFLAGS += -Wno-strict-aliasing + # Enforce a non-executable stack, as we may regress (again) in the future by # adding assembler files missing the .GNU-stack linker note. LDFLAGS += -Wl,-z,noexecstack
@@ -783,6 +791,33 @@ ifndef NO_JVMTI endif endif +USE_CXX = 0 +USE_CLANGLLVM = 0 +ifdef LIBCLANGLLVM + $(call feature_check,cxx) + ifneq ($(feature-cxx), 1) + msg := $(warning No g++ found, disable clang and llvm support. Please install g++) + else + $(call feature_check,llvm) + ifneq ($(feature-llvm), 1) + msg := $(warning No libLLVM found, disable clang and llvm support. Please install llvm-dev) + else + $(call feature_check,clang) + ifneq ($(feature-clang), 1) + msg := $(warning No libclang found, disable clang and llvm support. Please install libclang-dev) + else + CFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT + CXXFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT -I$(shell $(LLVM_CONFIG) --includedir) + $(call detected,CONFIG_CXX) + $(call detected,CONFIG_CLANGLLVM) + USE_CXX = 1 + USE_LLVM = 1 + USE_CLANG = 1 + endif + endif + endif +endif + # Among the variables below, these: # perfexecdir # template_dir
tools/perf/Makefile.perf +22 -1
@@ -88,6 +88,10 @@ include ../scripts/utilities.mak # and bypass the feature detection # # Define NO_JVMTI if you do not want jvmti agent built +# +# Define LIBCLANGLLVM if you DO want builtin clang and llvm support. +# When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if +# llvm-config is not in $PATH. # As per kernel Makefile, avoid funny character set dependencies unexport LC_ALL
@@ -143,6 +147,7 @@ endef $(call allow-override,CC,$(CROSS_COMPILE)gcc) $(call allow-override,AR,$(CROSS_COMPILE)ar) $(call allow-override,LD,$(CROSS_COMPILE)ld) +$(call allow-override,CXX,$(CROSS_COMPILE)g++) LD += $(EXTRA_LDFLAGS)
@@ -151,6 +156,7 @@ HOSTLD ?= ld HOSTAR ?= ar PKG_CONFIG = $(CROSS_COMPILE)pkg-config +LLVM_CONFIG ?= llvm-config RM = rm -f LN = ln -f
@@ -338,6 +344,21 @@ endif LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group +ifeq ($(USE_CLANG), 1) + CLANGLIBS_LIST = AST Basic CodeGen Driver Frontend Lex Tooling Edit Sema Analysis Parse Serialization + LIBCLANG = $(foreach l,$(CLANGLIBS_LIST),$(wildcard $(shell $(LLVM_CONFIG) --libdir)/libclang$(l).a)) + LIBS += -Wl,--start-group $(LIBCLANG) -Wl,--end-group +endif + +ifeq ($(USE_LLVM), 1) + LIBLLVM = $(shell $(LLVM_CONFIG) --libs all) $(shell $(LLVM_CONFIG) --system-libs) + LIBS += -L$(shell $(LLVM_CONFIG) --libdir) $(LIBLLVM) +endif + +ifeq ($(USE_CXX), 1) + LIBS += -lstdc++ +endif + export INSTALL SHELL_PATH ### Build rules
@@ -356,7 +377,7 @@ strip: $(PROGRAMS) $(OUTPUT)perf PERF_IN := $(OUTPUT)perf-in.o -export srctree OUTPUT RM CC LD AR CFLAGS V BISON FLEX AWK +export srctree OUTPUT RM CC CXX LD AR CFLAGS CXXFLAGS V BISON FLEX AWK export HOSTCC HOSTLD HOSTAR include $(srctree)/tools/build/Makefile.include
tools/perf/tests/make +2 -0
@@ -83,6 +83,7 @@ make_no_libbpf := NO_LIBBPF=1 make_no_libcrypto := NO_LIBCRYPTO=1 make_with_babeltrace:= LIBBABELTRACE=1 make_no_sdt := NO_SDT=1 +make_with_clangllvm := LIBCLANGLLVM=1 make_tags := tags make_cscope := cscope make_help := help
@@ -139,6 +140,7 @@ run += make_no_libbionic run += make_no_auxtrace run += make_no_libbpf run += make_with_babeltrace +run += make_with_clangllvm run += make_help run += make_doc run += make_perf_o
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 8/20 perf clang: Add builtin clang support ant test case
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Add basic clang support in clang.cpp and test__clang() testcase. The first testcase checks if builtin clang is able to generate LLVM IR.
tests/clang.c is a proxy. Real testcase resides in utils/c++/clang-test.cpp in c++ and exports C interface to perf test subsystem.
Test result:
$ perf test -v clang 51: builtin clang support : 51.1: Test builtin clang compile C source to IR : --- start --- test child forked, pid 13215 test child finished with 0 ---- end ---- Test builtin clang support subtest 0: Ok
Committer note:
Make sure you've enabled CLANG and LLVM builtin support by setting the LIBCLANGLLVM variable on the make command line, e.g.:
make LIBCLANGLLVM=1 O=/tmp/build/perf -C tools/perf install-bin
Otherwise you'll get this when trying to do the 'perf test' call above:
# perf test clang 51: builtin clang support : Skip (not compiled in) #
--- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 9 ++++ tools/perf/tests/clang.c | 42 +++++++++++++++++ tools/perf/tests/tests.h | 3 ++ tools/perf/util/Build | 2 + tools/perf/util/c++/Build | 2 + tools/perf/util/c++/clang-c.h | 16 +++++++ tools/perf/util/c++/clang-test.cpp | 31 ++++++++++++ tools/perf/util/c++/clang.cpp | 96 ++++++++++++++++++++++++++++++++++++++ tools/perf/util/c++/clang.h | 16 +++++++ 10 files changed, 218 insertions(+) create mode 100644 tools/perf/tests/clang.c create mode 100644 tools/perf/util/c++/Build create mode 100644 tools/perf/util/c++/clang-c.h create mode 100644 tools/perf/util/c++/clang-test.cpp create mode 100644 tools/perf/util/c++/clang.cpp create mode 100644 tools/perf/util/c++/clang.h
tools/perf/tests/Build +1 -0
@@ -43,6 +43,7 @@ perf-y += sdt.o perf-y += is_printable_array.o perf-y += bitmap.o perf-y += perf-hooks.o +perf-y += clang.o $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build $(call rule_mkdir)
tools/perf/tests/builtin-test.c +9 -0
@@ -234,6 +234,15 @@ static struct test generic_tests[] = { .func = test__perf_hooks, }, { + .desc = "builtin clang support", + .func = test__clang, + .subtest = { + .skip_if_fail = true, + .get_nr = test__clang_subtest_get_nr, + .get_desc = test__clang_subtest_get_desc, + } + }, + { .func = NULL, }, };
tools/perf/tests/clang.c new file +42 -0
42 lines not on this page · raw message
tools/perf/tests/tests.h +3 -0
@@ -92,6 +92,9 @@ int test__sdt_event(int subtest);int test__is_printable_array (int subtest);int test__bitmap_print (int subtest);int test__perf_hooks (int subtest); +int test__clang (int subtest); +const char *test__clang_subtest_get_desc (int subtest); +int test__clang_subtest_get_nr (void );#if defined(__arm__) || defined(__aarch64__)#ifdef HAVE_DWARF_UNWIND_SUPPORT
tools/perf/util/Build +2 -0
@@ -126,6 +126,8 @@ endif libperf-y += perf-hooks.o +libperf-$(CONFIG_CXX) += c++/ + CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))" # avoid compiler warnings in 32-bit mode CFLAGS_genelf_debug.o += -Wno-packed
tools/perf/util/c++/Build new file +2 -0
@@ -0,0 +1,2 @@ +libperf-$(CONFIG_CLANGLLVM) += clang.o +libperf-$(CONFIG_CLANGLLVM) += clang-test.o
tools/perf/util/c++/clang-c.h new file +16 -0
@@ -0,0 +1,16 @@ +#ifndef PERF_UTIL_CLANG_C_H +#define PERF_UTIL_CLANG_C_H + +#ifdef __cplusplus +extern "C" { +#endif + +extern void perf_clang__init (void ); +extern void perf_clang__cleanup (void ); + +extern int test__clang_to_IR (void ); + +#ifdef __cplusplus +} +#endif +#endif
tools/perf/util/c++/clang-test.cpp new file +31 -0
@@ -0,0 +1,31 @@ +#include "clang.h" +#include "clang-c.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/LLVMContext.h" + +class perf_clang_scope { +public: + explicit perf_clang_scope() {perf_clang__init();} + ~perf_clang_scope() {perf_clang__cleanup();} +}; + +extern "C" { + +int test__clang_to_IR(void) +{ + perf_clang_scope _scope; + + std::unique_ptr<llvm::Module> M = + perf::getModuleFromSource("perf-test.c", + "int myfunc(void) {return 1;}"); + + if (!M) + return -1; + + for (llvm::Function& F : *M) + if (F.getName() == "myfunc") + return 0; + return -1; +} + +}
tools/perf/util/c++/clang.cpp new file +96 -0
96 lines not on this page · raw message
tools/perf/util/c++/clang.h new file +16 -0
@@ -0,0 +1,16 @@ +#ifndef PERF_UTIL_CLANG_H +#define PERF_UTIL_CLANG_H + +#include "llvm/ADT/StringRef.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include <memory> +namespace perf { + +using namespace llvm; + +std::unique_ptr<Module> +getModuleFromSource(StringRef Name, StringRef Content); + +} +#endif
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 9/20 perf clang: Use real file system for #include
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Utilize clang's OverlayFileSystem facility, allow CompilerInstance to access real file system.
With this patch the '#include' directive can be used.
Add a new getModuleFromSource for real file.
--- tools/perf/util/c++/clang.cpp | 44 +++++++++++++++++++++++++++++++------------ tools/perf/util/c++/clang.h | 3 +++ 2 files changed, 35 insertions(+), 12 deletions(-)
tools/perf/util/c++/clang.cpp +32 -12
@@ -15,6 +15,7 @@ #include "clang/Tooling/Tooling.h" #include "llvm/IR/Module.h" #include "llvm/Option/Option.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/ManagedStatic.h" #include <memory>
@@ -27,14 +28,6 @@ static std::unique_ptr<llvm::LLVMContext> LLVMCtx; using namespace clang; -static vfs::InMemoryFileSystem * -buildVFS(StringRef& Name, StringRef& Content) -{ - vfs::InMemoryFileSystem *VFS = new vfs::InMemoryFileSystem(true); - VFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content)); - return VFS; -} - static CompilerInvocation * createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) {
@@ -60,17 +53,17 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) return CI; } -std::unique_ptr<llvm::Module> -getModuleFromSource(StringRef Name, StringRef Content) +static std::unique_ptr<llvm::Module> +getModuleFromSource(StringRef Path, + IntrusiveRefCntPtr<vfs::FileSystem> VFS) { CompilerInstance Clang; Clang.createDiagnostics(); - IntrusiveRefCntPtr<vfs::FileSystem> VFS = buildVFS(Name, Content); Clang.setVirtualFileSystem(&*VFS); IntrusiveRefCntPtr<CompilerInvocation> CI = - createCompilerInvocation(Name, Clang.getDiagnostics()); + createCompilerInvocation(Path, Clang.getDiagnostics()); Clang.setInvocation(&*CI); std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx));
@@ -80,6 +73,33 @@ getModuleFromSource(StringRef Name, StringRef Content) return Act->takeModule(); } +std::unique_ptr<llvm::Module> +getModuleFromSource(StringRef Name, StringRef Content) +{ + using namespace vfs; + + llvm::IntrusiveRefCntPtr<OverlayFileSystem> OverlayFS( + new OverlayFileSystem(getRealFileSystem())); + llvm::IntrusiveRefCntPtr<InMemoryFileSystem> MemFS( + new InMemoryFileSystem(true)); + + /* + * pushOverlay helps setting working dir for MemFS. Must call + * before addFile. + */ + OverlayFS->pushOverlay(MemFS); + MemFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content)); + + return getModuleFromSource(Name, OverlayFS); +} + +std::unique_ptr<llvm::Module> +getModuleFromSource(StringRef Path) +{ + IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem()); + return getModuleFromSource(Path, VFS); +} + } extern "C" {
tools/perf/util/c++/clang.h +3 -0
@@ -12,5 +12,8 @@ using namespace llvm; std::unique_ptr<Module> getModuleFromSource(StringRef Name, StringRef Content); +std::unique_ptr<Module> +getModuleFromSource(StringRef Path); + }#endif
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 10/20 perf clang: Allow passing CFLAGS to builtin clang
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Improve getModuleFromSource() API to accept a cflags list. This feature will be used to pass LINUX_VERSION_CODE and -I flags.
--- tools/perf/util/c++/clang-test.cpp | 5 +++-- tools/perf/util/c++/clang.cpp | 21 +++++++++++++-------- tools/perf/util/c++/clang.h | 8 ++++++-- 3 files changed, 22 insertions(+), 12 deletions(-)
tools/perf/util/c++/clang-test.cpp +3 -2
@@ -16,8 +16,9 @@ int test__clang_to_IR(void) perf_clang_scope _scope; std::unique_ptr<llvm::Module> M = - perf::getModuleFromSource("perf-test.c", - "int myfunc(void) {return 1;}"); + perf::getModuleFromSource({"-DRESULT=1"}, + "perf-test.c", + "int myfunc(void) {return RESULT;}"); if (!M) return -1;
tools/perf/util/c++/clang.cpp +13 -8
@@ -29,7 +29,8 @@ static std::unique_ptr<llvm::LLVMContext> LLVMCtx; using namespace clang; static CompilerInvocation * -createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) +createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path, + DiagnosticsEngine& Diags) { llvm::opt::ArgStringList CCArgs { "-cc1",
@@ -45,6 +46,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) "-Wno-unused-value", "-Wno-pointer-sign", "-x", "c"}; + + CCArgs.append(CFlags.begin(), CFlags.end()); CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs); FrontendOptions& Opts = CI->getFrontendOpts();
@@ -54,8 +57,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) } static std::unique_ptr<llvm::Module> -getModuleFromSource(StringRef Path, - IntrusiveRefCntPtr<vfs::FileSystem> VFS) +getModuleFromSource(llvm::opt::ArgStringList CFlags, + StringRef Path, IntrusiveRefCntPtr<vfs::FileSystem> VFS) { CompilerInstance Clang; Clang.createDiagnostics();
@@ -63,7 +66,8 @@ getModuleFromSource(StringRef Path, Clang.setVirtualFileSystem(&*VFS); IntrusiveRefCntPtr<CompilerInvocation> CI = - createCompilerInvocation(Path, Clang.getDiagnostics()); + createCompilerInvocation(std::move(CFlags), Path, + Clang.getDiagnostics()); Clang.setInvocation(&*CI); std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx));
@@ -74,7 +78,8 @@ getModuleFromSource(StringRef Path, } std::unique_ptr<llvm::Module> -getModuleFromSource(StringRef Name, StringRef Content) +getModuleFromSource(llvm::opt::ArgStringList CFlags, + StringRef Name, StringRef Content) { using namespace vfs;
@@ -90,14 +95,14 @@ getModuleFromSource(StringRef Name, StringRef Content) OverlayFS->pushOverlay(MemFS); MemFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content)); - return getModuleFromSource(Name, OverlayFS); + return getModuleFromSource(std::move(CFlags), Name, OverlayFS); } std::unique_ptr<llvm::Module> -getModuleFromSource(StringRef Path) +getModuleFromSource(llvm::opt::ArgStringList CFlags, StringRef Path) { IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem()); - return getModuleFromSource(Path, VFS); + return getModuleFromSource(std::move(CFlags), Path, VFS); } }
tools/perf/util/c++/clang.h +6 -2
@@ -4,16 +4,20 @@#include "llvm/ADT/StringRef.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" +#include "llvm/Option/Option.h" #include <memory> +namespace perf { using namespace llvm; std::unique_ptr<Module> -getModuleFromSource(StringRef Name, StringRef Content); +getModuleFromSource(opt::ArgStringList CFlags, + StringRef Name, StringRef Content); std::unique_ptr<Module> -getModuleFromSource(StringRef Path); +getModuleFromSource(opt::ArgStringList CFlags, + StringRef Path); }#endif
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 11/20 perf clang: Update test case to use real BPF script
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Allow C++ code to use util.h and tests/llvm.h. Let 'perf test' compile a real BPF script.
--- tools/perf/Makefile.config | 27 +++++++++++++++------------ tools/perf/tests/llvm.h | 7 +++++++ tools/perf/util/c++/clang-test.cpp | 17 ++++++++++++++--- tools/perf/util/util-cxx.h | 26 ++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 tools/perf/util/util-cxx.h
tools/perf/Makefile.config +15 -12
@@ -212,24 +212,27 @@ ifeq ($(DEBUG),0) endif endif -CFLAGS += -I$(src-perf)/util/include -CFLAGS += -I$(src-perf)/arch/$(ARCH)/include -CFLAGS += -I$(srctree)/tools/include/uapi -CFLAGS += -I$(srctree)/tools/include/ -CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/uapi -CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/ -CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/ +INC_FLAGS += -I$(src-perf)/util/include +INC_FLAGS += -I$(src-perf)/arch/$(ARCH)/include +INC_FLAGS += -I$(srctree)/tools/include/uapi +INC_FLAGS += -I$(srctree)/tools/include/ +INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/uapi +INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/ +INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/ # $(obj-perf) for generated common-cmds.h # $(obj-perf)/util for generated bison/flex headers ifneq ($(OUTPUT),) -CFLAGS += -I$(obj-perf)/util -CFLAGS += -I$(obj-perf) +INC_FLAGS += -I$(obj-perf)/util +INC_FLAGS += -I$(obj-perf) endif -CFLAGS += -I$(src-perf)/util -CFLAGS += -I$(src-perf) -CFLAGS += -I$(srctree)/tools/lib/ +INC_FLAGS += -I$(src-perf)/util +INC_FLAGS += -I$(src-perf) +INC_FLAGS += -I$(srctree)/tools/lib/ + +CFLAGS += $(INC_FLAGS) +CXXFLAGS += $(INC_FLAGS) CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
tools/perf/tests/llvm.h +7 -0
@@ -1,6 +1,10 @@ #ifndef PERF_TEST_LLVM_H #define PERF_TEST_LLVM_H +#ifdef __cplusplus +extern "C" { +#endif + #include <stddef.h> /* for size_t */ #include <stdbool.h> /* for bool */
@@ -20,4 +24,7 @@ enum test_llvm__testcase {int test_llvm__fetch_bpf_obj (void **p_obj_buf,size_t *p_obj_buf_sz,enum test_llvm__testcase index,bool force,bool *should_load_fail); +#ifdef __cplusplus +} +#endif #endif
tools/perf/util/c++/clang-test.cpp +14 -3
@@ -3,6 +3,10 @@ #include "llvm/IR/Function.h" #include "llvm/IR/LLVMContext.h" +#include <util-cxx.h> +#include <tests/llvm.h> +#include <string> + class perf_clang_scope { public: explicit perf_clang_scope() {perf_clang__init();}
@@ -14,17 +18,24 @@ extern "C" { int test__clang_to_IR(void) { perf_clang_scope _scope; + unsigned int kernel_version; + + if (fetch_kernel_version(&kernel_version, NULL, 0)) + return -1; + + std::string cflag_kver("-DLINUX_VERSION_CODE=" + + std::to_string(kernel_version)); std::unique_ptr<llvm::Module> M = - perf::getModuleFromSource({"-DRESULT=1"}, + perf::getModuleFromSource({cflag_kver.c_str()}, "perf-test.c", - "int myfunc(void) {return RESULT;}"); + test_llvm__bpf_base_prog); if (!M) return -1; for (llvm::Function& F : *M) - if (F.getName() == "myfunc") + if (F.getName() == "bpf_func__SyS_epoll_wait") return 0; return -1; }
tools/perf/util/util-cxx.h new file +26 -0
@@ -0,0 +1,26 @@ +/* +* Support C++ source use utilities defined in util.h +*/ + +#ifndef PERF_UTIL_UTIL_CXX_H +#define PERF_UTIL_UTIL_CXX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* +* Now 'new' is the only C++ keyword found in util.h: +* in tools/include/linux/rbtree.h +* +* Other keywords, like class and delete, should be +* redefined if necessary. +*/ +#define new _new +#include "util.h" +#undef new + +#ifdef __cplusplus +} +#endif +#endif
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 12/20 perf clang: Support compile IR to BPF object and add testcase
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
getBPFObjectFromModule() is introduced to compile LLVM IR(Module) to BPF object. Add new testcase for it.
Test result:
$ ./buildperf/perf test -v clang 51: builtin clang support : 51.1: builtin clang compile C source to IR : --- start --- test child forked, pid 21822 test child finished with 0 ---- end ---- builtin clang support subtest 0: Ok 51.2: builtin clang compile C source to ELF object : --- start --- test child forked, pid 21823 test child finished with 0 ---- end ---- builtin clang support subtest 1: Ok
--- tools/perf/tests/clang.c | 6 ++++- tools/perf/util/c++/clang-c.h | 1 + tools/perf/util/c++/clang-test.cpp | 31 +++++++++++++++++++++----- tools/perf/util/c++/clang.cpp | 45 ++++++++++++++++++++++++++++++++++++++ tools/perf/util/c++/clang.h | 3 +++ 5 files changed, 79 insertions(+), 7 deletions(-)
tools/perf/tests/clang.c +5 -1
@@ -12,6 +12,10 @@ static struct { .func = test__clang_to_IR, .desc = "builtin clang compile C source to IR", }, + { + .func = test__clang_to_obj, + .desc = "builtin clang compile C source to ELF object", + },#endif };
@@ -33,7 +37,7 @@ int test__clang(int i __maybe_unused) return TEST_SKIP; }#else -int test__clang (int i__maybe_unused ) +int test__clang (int i) {if (i <0 || i >= (int )ARRAY_SIZE (clang_testcase_table))return TEST_FAIL ;
tools/perf/util/c++/clang-c.h +1 -0
@@ -9,6 +9,7 @@ extern void perf_clang__init(void);extern void perf_clang__cleanup (void );extern int test__clang_to_IR (void ); +extern int test__clang_to_obj (void ); #ifdef __cplusplus }
tools/perf/util/c++/clang-test.cpp +25 -6
@@ -13,15 +13,13 @@ public: ~perf_clang_scope() {perf_clang__cleanup();} }; -extern "C" { - -int test__clang_to_IR(void) +static std::unique_ptr<llvm::Module> +__test__clang_to_IR(void) { - perf_clang_scope _scope; unsigned int kernel_version; if (fetch_kernel_version(&kernel_version, NULL, 0)) - return -1; + return std::unique_ptr<llvm::Module>(nullptr); std::string cflag_kver("-DLINUX_VERSION_CODE=" + std::to_string(kernel_version));
@@ -30,14 +28,35 @@ int test__clang_to_IR(void) perf::getModuleFromSource({cflag_kver.c_str()}, "perf-test.c", test_llvm__bpf_base_prog); + return M; +} + +extern "C" { +int test__clang_to_IR(void) +{ + perf_clang_scope _scope; + auto M = __test__clang_to_IR(); if (!M) return -1; - for (llvm::Function& F : *M) if (F.getName() == "bpf_func__SyS_epoll_wait") return 0; return -1; } +int test__clang_to_obj(void) +{ + perf_clang_scope _scope; + + auto M = __test__clang_to_IR(); + if (!M) + return -1; + + auto Buffer = perf::getBPFObjectFromModule(&*M); + if (!Buffer) + return -1; + return 0; +} + }
tools/perf/util/c++/clang.cpp +45 -0
67 lines not on this page · raw message
tools/perf/util/c++/clang.h +3 -0
@@ -19,5 +19,8 @@ std::unique_ptr<Module> getModuleFromSource(opt::ArgStringList CFlags, StringRef Path); +std::unique_ptr<llvm::SmallVectorImpl<char>> +getBPFObjectFromModule(llvm::Module *Module); + }#endif
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 13/20 perf clang: Compile BPF script using builtin clang support
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
After this patch, perf utilizes builtin clang support to build BPF script, no longer depend on external clang, but fallbacking to it if for some reason the builtin compiling framework fails.
Test:
$ type clang -bash: type: clang: not found $ cat ~/.perfconfig $ echo '#define LINUX_VERSION_CODE 0x040700' > ./test.c $ cat ./tools/perf/tests/bpf-script-example.c >> ./test.c $ ./perf record -v --dry-run -e ./test.c 2>&1 | grep builtin bpf: successfull builtin compilation $
Can't pass cflags so unable to include kernel headers now. Will be fixed by following commits.
Committer notes:
Make sure '-v' comes before the '-e ./test.c' in the command line otherwise the 'verbose' variable will not be set when the bpf event is parsed and thus the pr_debug indicating a 'successfull builtin compilation' will not be output, as the debug level (1) will be less than what 'verbose' has at that point (0).
--- tools/perf/util/bpf-loader.c | 15 +++++++++++---- tools/perf/util/c++/clang-c.h | 26 ++++++++++++++++++++++++++ tools/perf/util/c++/clang.cpp | 29 +++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-)
tools/perf/util/bpf-loader.c +11 -4
@@ -14,11 +14,11 @@#include "debug.h" #include "bpf-loader.h" #include "bpf-prologue.h" -#include "llvm-utils.h" #include "probe-event.h" #include "probe-finder.h" // for MAX_PROBES #include "parse-events.h" #include "llvm-utils.h" +#include "c++/clang-c.h" #define DEFINE_PRINT_FN (name, level) \ static int libbpf_##name(const char *fmt, ...) \
@@ -86,9 +86,16 @@ struct bpf_object *bpf__prepare_load(const char *filename, bool source)void *obj_buf;size_t obj_buf_sz; - err =llvm__compile_bpf (filename, &obj_buf, &obj_buf_sz); -if (err) -return ERR_PTR (-BPF_LOADER_ERRNO__COMPILE ); +perf_clang__init (); + err =perf_clang__compile_bpf (filename, &obj_buf, &obj_buf_sz); +perf_clang__cleanup (); +if (err) { +pr_warning ("bpf: builtin compilation failed: %d, try external compiler\n" , err); + err =llvm__compile_bpf (filename, &obj_buf, &obj_buf_sz); +if (err) +return ERR_PTR (-BPF_LOADER_ERRNO__COMPILE ); + }else +pr_debug ("bpf: successfull builtin compilation\n" ); obj =bpf_object__open_buffer (obj_buf, obj_buf_sz, filename);if (!IS_ERR (obj) && llvm_param.dump_obj)
tools/perf/util/c++/clang-c.h +26 -0
@@ -1,16 +1,42 @@#ifndef PERF_UTIL_CLANG_C_H #define PERF_UTIL_CLANG_C_H +#include <stddef.h> /* for size_t */ +#include <util-cxx.h> /* for __maybe_unused */ +#ifdef __cplusplusextern "C" {#endif +#ifdef HAVE_LIBCLANGLLVM_SUPPORT extern void perf_clang__init (void );extern void perf_clang__cleanup (void );extern int test__clang_to_IR (void );extern int test__clang_to_obj (void ); +extern int perf_clang__compile_bpf (const char *filename, +void **p_obj_buf, +size_t *p_obj_buf_sz); +#else + + +static inline void perf_clang__init (void ) { } +static inline void perf_clang__cleanup (void ) { } + +static inline int test__clang_to_IR (void ) {return -1 ; } +static inline int test__clang_to_obj (void ) {return -1 ;} + +static inline int +perf_clang__compile_bpf (const char *filename__maybe_unused , +void **p_obj_buf__maybe_unused , +size_t *p_obj_buf_sz__maybe_unused ) +{ +return -ENOTSUP ; +} + +#endif + #ifdef __cplusplus }#endif
tools/perf/util/c++/clang.cpp +29 -0
@@ -163,4 +163,33 @@ void perf_clang__cleanup(void) perf::LLVMCtx.reset(nullptr); llvm::llvm_shutdown(); } + +int perf_clang__compile_bpf(const char *filename, + void **p_obj_buf, + size_t *p_obj_buf_sz) +{ + using namespace perf; + + if (!p_obj_buf || !p_obj_buf_sz) + return -EINVAL; + + llvm::opt::ArgStringList CFlags; + auto M = getModuleFromSource(std::move(CFlags), filename); + if (!M) + return -EINVAL; + auto O = getBPFObjectFromModule(&*M); + if (!O) + return -EINVAL; + + size_t size = O->size_in_bytes(); + void *buffer; + + buffer = malloc(size); + if (!buffer) + return -ENOMEM; + memcpy(buffer, O->data(), size); + *p_obj_buf = buffer; + *p_obj_buf_sz = size; + return 0; +} }
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 14/20 tools build: Make the .cmd file more readable
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Putting extra line between dependencies and cmd_* definition to make it more readable.
Before:
$ cat .builtin-top.o.cmd ... /home/jolsa/kernel/linux-perf/tools/include/linux/stringify.h \ /home/jolsa/kernel/linux-perf/tools/include/linux/time64.h cmd_builtin-top.o := gcc -Wp,-MD,./.builtin-top.o.d -Wp,-MT,builtin-... ...
After:
$ cat .builtin-top.o.cmd ... /home/jolsa/kernel/linux-perf/tools/include/linux/stringify.h \ /home/jolsa/kernel/linux-perf/tools/include/linux/time64.h
cmd_builtin-top.o := gcc -Wp,-MD,./.builtin-top.o.d -Wp,-MT,builtin-...
...
--- tools/build/Build.include | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/build/Build.include +1 -1
@@ -65,7 +65,7 @@ dep-cmd = $(if $(wildcard $(fixdep)), printf '\# cannot find fixdep (%s)\n' $(fixdep) > $(dot-target).cmd; \ printf '\# using basic dep data\n\n' >> $(dot-target).cmd; \ cat $(depfile) >> $(dot-target).cmd; \ - printf '%s\n' 'cmd_$@ := $(make-cmd)' >> $(dot-target).cmd) + printf '\n%s\n' 'cmd_$@ := $(make-cmd)' >> $(dot-target).cmd) ### # if_changed_dep - execute command if any prerequisite is newer than
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 15/20 tools build: Move tabs to spaces where suitable
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
We've been hit several times by a Makefile bug where line indented by tab was falsely considered as target command.
We prevent this by always using space indentation for everything except for the target commands.
--- tools/build/Build.include | 12 ++-- tools/build/Makefile.feature | 138 +++++++++++++++++++++---------------------- tools/build/feature/Makefile | 102 ++++++++++++++++---------------- 3 files changed, 126 insertions(+), 126 deletions(-)
tools/build/Build.include +6 -6
@@ -72,15 +72,15 @@ dep-cmd = $(if $(wildcard $(fixdep)), # target, or command line has changed and update # dependencies in the cmd file if_changed_dep = $(if $(strip $(any-prereq) $(arg-check)), \ - @set -e; \ - $(echo-cmd) $(cmd_$(1)) && $(dep-cmd)) + @set -e; \ + $(echo-cmd) $(cmd_$(1)) && $(dep-cmd)) # if_changed - execute command if any prerequisite is newer than # target, or command line has changed -if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ - @set -e; \ - $(echo-cmd) $(cmd_$(1)); \ - printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd) +if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ + @set -e; \ + $(echo-cmd) $(cmd_$(1)); \ + printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd) ### # C flags to be used in rule definitions, includes:
tools/build/Makefile.feature +69 -69
153 lines not on this page · raw message
tools/build/feature/Makefile +51 -51
105 lines not on this page · raw message
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 16/20 perf tools: Move install-gtk target into rules area
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
The upcoming fixdep fix needs all targets at the same area, so they'll fit under a signal condition block.
Move install-gtk target into the rules section.
--- tools/perf/Makefile.perf | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
tools/perf/Makefile.perf +7 -5
@@ -331,11 +331,6 @@ endif ifndef NO_GTK2 ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so GTK_IN := $(OUTPUT)gtk-in.o - -install-gtk: $(OUTPUT)libperf-gtk.so - $(call QUIET_INSTALL, 'GTK UI') \ - $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \ - $(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)' endif ifdef ASCIIDOC8
@@ -712,7 +707,14 @@ check: $(OUTPUT)common-cmds.h ### Installation rules +ifndef NO_GTK2 +install-gtk: $(OUTPUT)libperf-gtk.so + $(call QUIET_INSTALL, 'GTK UI') \ + $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \ + $(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)' +else install-gtk: +endif install-tools: all install-gtk $(call QUIET_INSTALL, binaries) \
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 17/20 perf tools: Move python/perf.so target into rules area
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Following fixdep fix needs all targets at the same area, so they'll fit under signal condition block.
Moving python/perf.so target into rules section and intentionally removing the perl script related comment.
--- tools/perf/Makefile.perf | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
tools/perf/Makefile.perf +8 -11
@@ -268,17 +268,6 @@ python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources) PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI) -$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) - $(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \ - CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \ - $(PYTHON_WORD) util/setup.py \ - --quiet build_ext; \ - mkdir -p $(OUTPUT)python && \ - cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/ -# -# No Perl scripts right now: -# - SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) PROGRAMS += $(OUTPUT)perf
@@ -362,6 +351,14 @@ SHELL = $(SHELL_PATH) all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS) +$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) + $(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \ + CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \ + $(PYTHON_WORD) util/setup.py \ + --quiet build_ext; \ + mkdir -p $(OUTPUT)python && \ + cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/ + please_set_SHELL_PATH_to_a_more_modern_shell: $(Q)$$(:)
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 18/20 perf tools: Cleanup build directory before each test
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Cleanup the fixdep tool before every test.
--- tools/perf/tests/make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/tests/make +1 -1
@@ -280,7 +280,7 @@ endif MAKEFLAGS := --no-print-directory -clean := @(cd $(PERF); $(MAKE_F) -s $(O_OPT) clean >/dev/null) +clean := @(cd $(PERF); $(MAKE_F) -s $(O_OPT) clean >/dev/null && $(MAKE) -s $(O_OPT) -C ../build clean >/dev/null) $(run): $(call clean)
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 19/20 perf tools: Add non config targets
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Adding some missing non config targets that were for some reason omitted.
--- tools/perf/Makefile.perf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/Makefile.perf +1 -1
@@ -177,7 +177,7 @@ SUBCMD_DIR = $(srctree)/tools/lib/subcmd/ # non-config cases config := 1 -NON_CONFIG_TARGETS := clean TAGS tags cscope help install-doc +NON_CONFIG_TARGETS := clean TAGS tags cscope help install-doc install-man install-html install-info install-pdf doc man html info pdf ifdef MAKECMDGOALS ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),)
Signature · 1 line
2.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 20/20 perf annotate: Show raw form for jump instruction with indirect target
In reply to Arnaldo Carvalho de MeloFrom: Ravi Bangoria <[email protected]>
For jump instructions that does not include target address as direct operand, show the original disassembled line for them. This is needed for certain powerpc jump instructions that use target address in a register (such as bctr, btar, ...).
Before:
ld r12,32088(r12)
mtctr r12
v bctr ffffffffffffca2c
std r2,24(r1)
addis r12,r2,-1After:
ld r12,32088(r12)
mtctr r12
v bctr
std r2,24(r1)
addis r12,r2,-1Committer notes:
Testing it using a perf.data file and vmlinux for powerpc64, cross-annotating it on a x86_64 workstation:
Before:
.__bpf_prog_run vmlinux.powerpc
│ std r10,512(r9) ▒
│ lbz r9,0(r31) ▒
│ rldicr r9,r9,3,60 ▒
│ ldx r9,r30,r9 ▒
│ mtctr r9 ▒
100.00 │ ↓ bctr 3fffffffffe01510 ▒
│ lwa r10,4(r31) ▒
│ lwz r9,0(r31) ▒ <SNIP>
Invalid jump offset: 3fffffffffe01510
After:
.__bpf_prog_run vmlinux.powerpc
│ std r10,512(r9) ▒
│ lbz r9,0(r31) ▒
│ rldicr r9,r9,3,60 ▒
│ ldx r9,r30,r9 ▒
│ mtctr r9 ▒
100.00 │ ↓ bctr ▒
│ lwa r10,4(r31) ▒
│ lwz r9,0(r31) ▒ <SNIP>
Invalid jump offset: 3fffffffffe01510
This, in turn, uncovers another problem with jumps without operands, the ENTER/-> operation, to jump to the target, still continues using the bogus target :-)
BTW, this was the file used for the above tests:
[acme@jouet ravi_bangoria]$ perf report --header-only -i perf.data.f22vm.powerdev
# ========
# captured on: Thu Nov 24 12:40:38 2016
# hostname : pdev-f22-qemu
# os release : 4.4.10-200.fc22.ppc64
# perf version : 4.9.rc1.g6298ce
# arch : ppc64
# nrcpus online : 48
# nrcpus avail : 48
# cpudesc : POWER7 (architected), altivec supported
# cpuid : 74,513
# total memory : 4158976 kB
# cmdline : /home/ravi/Workspace/linux/tools/perf/perf record -a
# event : name = cycles:ppp, , size = 112, { sample_period, sample_freq } = 4000, sample_type = IP|TID|TIME|CPU|PERIOD, disabled = 1, inherit = 1, mmap = 1, c
# HEADER_CPU_TOPOLOGY info available, use -I to display
# HEADER_NUMA_TOPOLOGY info available, use -I to display
# pmu mappings: cpu = 4, software = 1, tracepoint = 2, breakpoint = 5
# missing features: HEADER_TRACING_DATA HEADER_BRANCH_STACK HEADER_GROUP_DESC HEADER_AUXTRACE HEADER_STAT HEADER_CACHE
# ========
#
[acme@jouet ravi_bangoria]$--- tools/perf/util/annotate.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/annotate.c +3 -0
@@ -237,6 +237,9 @@ static int jump__parse(struct arch *arch __maybe_unused, struct ins_operands *opstatic int jump__scnprintf (struct ins *ins,char *bf,size_t size,struct ins_operands *ops) { +if (!ops->target.addr) +return ins__raw_scnprintf (ins, bf, size, ops); +return scnprintf (bf, size,"%-6.6s %" PRIx64, ins->name, ops->target.offset); }
Signature · 1 line
2.9.3
Quoted 241 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
e7af7b15121ca08c31a0ab9df71a41b4c53365b4:Merge tag 'perf-core-for-mingo-20161201' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/core (2016-12-02 10:08:03 +0100)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-20161205for you to fetch changes up to
bec60e50af83741cde1786ab475d4bf472aed6f9:perf annotate: Show raw form for jump instruction with indirect target (2016-12-05 17:21:57 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:Fixes:
- Do not show a bogus target address in 'perf annotate' for targetless powerpc jump instructions such as 'bctr' (Ravi Bangoria)
-
tools/buildfixes related to race conditions with the fixdep utility (Jiri Olsa)- Fix building objtool with clang (Peter Foley)
Infrastructure:
- Support linking perf with clang and LLVM libraries, initially statically, but this limitation will be lifted and shared libraries, when available, will be preferred to the static build, that should, as with other features, be enabled explicitly (Wang Nan)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Jiri Olsa (7):
tools build: Make fixdep parsing wait for last target tools build: Make the .cmd file more readable tools build: Move tabs to spaces where suitable perf tools: Move install-gtk target into rules area perf tools: Move python/perf.so target into rules area perf tools: Cleanup build directory before each test perf tools: Add non config targetsPeter Foley (1):
tools build: Fix objtool build with clangRavi Bangoria (1):
perf annotate: Show raw form for jump instruction with indirect targetWang Nan (11):
perf tools: Pass context to perf hook functions perf llvm: Extract helpers inllvm-utils.c
tools build: Add feature detection for LLVM
tools build: Add feature detection for clang
perf build: Add clang and llvm compile and linking support perf clang: Add builtin clang support ant test case perf clang: Use real file system for #include
perf clang: Allow passing CFLAGS to builtin clang perf clang: Update test case to use real BPF script perf clang: Support compile IR to BPF object and add testcase perf clang: Compile BPF script using builtin clang supporttools/build/Build.include | 20 ++-- tools/build/Makefile.feature | 138 +++++++++++++------------- tools/build/feature/Makefile | 120 +++++++++++++---------- tools/build/feature/test-clang.cpp | 21 ++++ tools/build/feature/test-llvm.cpp | 8 ++ tools/build/fixdep.c | 5 +- tools/perf/Makefile.config | 62 +++++++++--- tools/perf/Makefile.perf | 56 +++++++---- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 9 ++ tools/perf/tests/clang.c | 46 +++++++++ tools/perf/tests/llvm.h | 7 ++ tools/perf/tests/make | 4 +- tools/perf/tests/perf-hooks.c | 14 ++- tools/perf/tests/tests.h | 3 + tools/perf/util/Build | 2 + tools/perf/util/annotate.c | 3 + tools/perf/util/bpf-loader.c | 19 +++- tools/perf/util/c++/Build | 2 + tools/perf/util/c++/clang-c.h | 43 ++++++++ tools/perf/util/c++/clang-test.cpp | 62 ++++++++++++ tools/perf/util/c++/clang.cpp | 195 +++++++++++++++++++++++++++++++++++++ tools/perf/util/c++/clang.h | 26 +++++ tools/perf/util/llvm-utils.c | 76 +++++++++++---- tools/perf/util/llvm-utils.h | 6 ++ tools/perf/util/perf-hooks.c | 10 +- tools/perf/util/perf-hooks.h | 6 +- tools/perf/util/util-cxx.h | 26 +++++ 28 files changed, 795 insertions(+), 195 deletions(-) create mode 100644 tools/build/feature/test-clang.cpp create mode 100644 tools/build/feature/test-llvm.cpp create mode 100644 tools/perf/tests/clang.c create mode 100644 tools/perf/util/c++/Build create mode 100644 tools/perf/util/c++/clang-c.h create mode 100644 tools/perf/util/c++/clang-test.cpp create mode 100644 tools/perf/util/c++/clang.cpp create mode 100644 tools/perf/util/c++/clang.h create mode 100644 tools/perf/util/util-cxx.h# uname -a Linux jouet 4.8.8-300.fc25.x86_64 #1 SMP Tue Nov 15 18:10:06 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux # perf test 1: vmlinux symtab matches kallsyms : Ok 2: Detect openat syscall event : Ok 3: Detect openat syscall event on all cpus : Ok 4: Read samples using the mmap interface : Ok 5: Parse event definition strings : Ok 6: PERF_RECORD_* events & perf_sample fields : Ok 7: Parse perf pmu format : Ok 8: DSO data read : Ok 9: DSO data cache : Ok 10: DSO data reopen : Ok 11: Roundtrip evsel->name : Ok 12: Parse sched tracepoints fields : Ok 13: syscalls:sys_enter_openat event fields : Ok 14: Setup struct perf_event_attr : Ok 15: Match and link multiple hists : Ok 16: 'import perf' in python : Ok 17: Breakpoint overflow signal handler : Ok 18: Breakpoint overflow sampling : Ok 19: Number of exit events of a simple workload : Ok 20: Software clock events period values : Ok 21: Object code reading : Ok 22: Sample parsing : Ok 23: Use a dummy software event to keep tracking: Ok 24: Parse with no sample_id_all bit set : Ok 25: Filter hist entries : Ok 26: Lookup mmap thread : Ok 27: Share thread mg : Ok 28: Sort output of hist entries : Ok 29: Cumulate child hist entries : Ok 30: Track with sched_switch : Ok 31: Filter fds with revents mask in a fdarray : Ok 32: Add fd to a fdarray, making it autogrow : Ok 33: kmod_path__parse : Ok 34: Thread map : Ok 35: LLVM search and compile : 35.1: Basic BPF llvm compile : Ok 35.2: kbuild searching : Ok 35.3: Compile source for BPF prologue generation: Ok 35.4: Compile source for BPF relocation : Ok 36: Session topology : Ok 37: BPF filter : 37.1: Basic BPF filtering : Ok 37.2: BPF prologue generation : Ok 37.3: BPF relocation checker : Ok 38: Synthesize thread map : Ok 39: Synthesize cpu map : Ok 40: Synthesize stat config : Ok 41: Synthesize stat : Ok 42: Synthesize stat round : Ok 43: Synthesize attr update : Ok 44: Event times : Ok 45: Read backward ring buffer : Ok 46: Print cpu map : Ok 47: Probe SDT events : Ok 48: is_printable_array : Ok 49: Print bitmap : Ok 50: perf hooks : Ok 51: builtin clang support : Skip (not compiled in) 52: x86 rdpmc : Ok 53: Convert perf time to TSC : Ok 54: DWARF unwind : Ok 55: x86 instruction decoder - new instructions : Ok 56: Intel cqm nmi context read : Skip # # time dm 1 alpine:3.4: Ok 2 android-ndk:r12b-arm: Ok 3 archlinux:latest: Ok 4 centos:5: Ok 5 centos:6: Ok 6 centos:7: Ok 7 debian:7: Ok 8 debian:8: Ok 9 debian:experimental: Ok 10 fedora:20: Ok 11 fedora:21: Ok 12 fedora:22: Ok 13 fedora:23: Ok 14 fedora:24: Ok 15 fedora:24-x-ARC-uClibc: Ok 16 fedora:25: Ok 17 fedora:rawhide: Ok 18 mageia:5: Ok 19 opensuse:13.2: Ok 20 opensuse:42.1: Ok 21 opensuse:tumbleweed: Ok 22 ubuntu:12.04.5: Ok 23 ubuntu:14.04.4-x-linaro-arm64: Ok 24 ubuntu:16.04: Ok 25 ubuntu:16.04-x-arm: Ok 26 ubuntu:16.04-x-arm64: Ok 27 ubuntu:16.04-x-powerpc: Ok 28 ubuntu:16.04-x-powerpc64: Ok 29 ubuntu:16.04-x-powerpc64el: Ok 30 ubuntu:16.04-x-s390: Ok 31 ubuntu:16.10: Ok # $ make -C tools/perf build-test make: Entering directory '/home/acme/git/linux/tools/perf' - tarpkg: ./tests/perf-targz-src-pkg . make_no_backtrace_O: make NO_BACKTRACE=1 make_no_gtk2_O: make NO_GTK2=1 make_static_O: make LDFLAGS=-static make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1 make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1 make_perf_o_O: make perf.o make_no_slang_O: make NO_SLANG=1 make_install_prefix_O: make install prefix=/tmp/krava make_no_libpython_O: make NO_LIBPYTHON=1 make_no_newt_O: make NO_NEWT=1 make_debug_O: make DEBUG=1 make_tags_O: make tags make_no_libbionic_O: make NO_LIBBIONIC=1 make_help_O: make help make_install_O: make install make_no_libunwind_O: make NO_LIBUNWIND=1 make_pure_O: make make_minimal_O: make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1 make_no_libperl_O: make NO_LIBPERL=1 make_no_libbpf_O: make NO_LIBBPF=1 make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1 make_doc_O: make doc make_no_libaudit_O: make NO_LIBAUDIT=1 make_clean_all_O: make clean all make_with_babeltrace_O: make LIBBABELTRACE=1 make_no_libnuma_O: make NO_LIBNUMA=1 make_util_map_o_O: make util/map.o make_install_bin_O: make install-bin make_no_demangle_O: make NO_DEMANGLE=1
Quoted 8 lines
make_no_libelf_O: make NO_LIBELF=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_with_clangllvm_O: make LIBCLANGLLVM=1
OK
make: Leaving directory '/home/acme/git/linux/tools/perf'
$Pulled, thanks a lot Arnaldo!
Ingo