From: Wang Nan <wangnan0@huawei.com>
To: <acme@kernel.org>, <ast@plumgrid.com>,
<brendan.d.gregg@gmail.com>, <daniel@iogearbox.net>,
<namhyung@kernel.org>, <masami.hiramatsu.pt@hitachi.com>,
<paulus@samba.org>, <a.p.zijlstra@chello.nl>, <mingo@redhat.com>,
<jolsa@kernel.org>, <dsahern@gmail.com>
Cc: <linux-kernel@vger.kernel.org>, <lizefan@huawei.com>,
<hekuang@huawei.com>, <xiakaixu@huawei.com>, <pi3orama@163.com>
Subject: [RFC PATCH v8 25/49] perf tests: Add LLVM test for eBPF on-the-fly compiling
Date: Wed, 24 Jun 2015 12:31:29 +0000 [thread overview]
Message-ID: <1435149113-51142-26-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1435149113-51142-1-git-send-email-wangnan0@huawei.com>
Previous patch introduces llvm__compile_bpf() to compile source file to
eBPF object. This patch adds testcase to test it. It also test libbpf
by opening generated object.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
tools/perf/tests/Build | 1 +
tools/perf/tests/builtin-test.c | 4 ++
tools/perf/tests/llvm.c | 85 +++++++++++++++++++++++++++++++++++++++++
tools/perf/tests/tests.h | 1 +
4 files changed, 91 insertions(+)
create mode 100644 tools/perf/tests/llvm.c
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index ee41e70..5d74604 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -31,6 +31,7 @@ perf-y += code-reading.o
perf-y += sample-parsing.o
perf-y += parse-no-sample-id-all.o
perf-y += kmod-path.o
+perf-y += llvm.o
perf-$(CONFIG_X86) += perf-time-to-tsc.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 87b9961..4d28fd9 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -171,6 +171,10 @@ static struct test {
.func = test__kmod_path__parse,
},
{
+ .desc = "Test LLVM searching and compiling",
+ .func = test__llvm,
+ },
+ {
.func = NULL,
},
};
diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c
new file mode 100644
index 0000000..272be1b
--- /dev/null
+++ b/tools/perf/tests/llvm.c
@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include <bpf/libbpf.h>
+#include <util/llvm-utils.h>
+#include <util/cache.h>
+#include "tests.h"
+#include "debug.h"
+
+static int perf_config_cb(const char *var, const char *val,
+ void *arg __maybe_unused)
+{
+ return perf_default_config(var, val, arg);
+}
+
+/*
+ * Randomly give it a "version" section since we don't really load it
+ * into kernel
+ */
+static const char test_bpf_prog[] =
+ "__attribute__((section(\"do_fork\"), used)) "
+ "int fork(void *ctx) {return 0;} "
+ "char _license[] __attribute__((section(\"license\"), used)) = \"GPL\";"
+ "int _version __attribute__((section(\"version\"), used)) = 0x40100;";
+
+#ifdef HAVE_LIBBPF_SUPPORT
+static int test__bpf_parsing(void *obj_buf, size_t obj_buf_sz)
+{
+ struct bpf_object *obj;
+
+ obj = bpf_object__open_buffer(obj_buf, obj_buf_sz);
+ if (!obj)
+ return -1;
+ bpf_object__close(obj);
+ return 0;
+}
+#else
+static int test__bpf_parsing(void *obj_buf __maybe_unused,
+ size_t obj_buf_sz __maybe_unused)
+{
+ fprintf(stderr, " (skip bpf parsing)");
+ return 0;
+}
+#endif
+
+#define new_string(n, fmt, ...) \
+do { \
+ n##_sz = snprintf(NULL, 0, fmt, __VA_ARGS__);\
+ if (n##_sz == 0) \
+ return -1; \
+ n##_new = malloc(n##_sz + 1); \
+ if (!n##_new) \
+ return -1; \
+ snprintf(n##_new, n##_sz + 1, fmt, __VA_ARGS__);\
+ n##_new[n##_sz] = '\0'; \
+} while(0)
+
+int test__llvm(void)
+{
+ char *tmpl_new, *clang_opt_new;
+ size_t tmpl_sz, clang_opt_sz;
+ void *obj_buf;
+ size_t obj_buf_sz;
+ int err;
+
+ perf_config(perf_config_cb, NULL);
+
+ if (!llvm_param.clang_bpf_cmd_template)
+ return -1;
+
+ if (!llvm_param.clang_opt)
+ llvm_param.clang_opt = strdup("");
+
+ new_string(tmpl, "echo '%s' | %s", test_bpf_prog,
+ llvm_param.clang_bpf_cmd_template);
+ new_string(clang_opt, "-xc %s", llvm_param.clang_opt);
+
+ llvm_param.clang_bpf_cmd_template = tmpl_new;
+ llvm_param.clang_opt = clang_opt_new;
+ err = llvm__compile_bpf("-", &obj_buf, &obj_buf_sz);
+ if (err)
+ return -1;
+
+ err = test__bpf_parsing(obj_buf, obj_buf_sz);
+ free(obj_buf);
+ return err;
+}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index 8e5038b..5b29796 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -61,6 +61,7 @@ int test__switch_tracking(void);
int test__fdarray__filter(void);
int test__fdarray__add(void);
int test__kmod_path__parse(void);
+int test__llvm(void);
#if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)
#ifdef HAVE_DWARF_UNWIND_SUPPORT
--
1.8.3.4
next prev parent reply other threads:[~2015-06-24 12:36 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-24 12:31 [RFC PATCH v8 00/49] perf tools: filtering events using eBPF programs Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 01/49] tools build: Add feature check for eBPF API Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 02/49] bpf tools: Introduce 'bpf' library to tools Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 03/49] bpf tools: Allow caller to set printing function Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 04/49] bpf tools: Open eBPF object file and do basic validation Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 05/49] bpf tools: Read eBPF object from buffer Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 06/49] bpf tools: Check endianess and make libbpf fail early Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 07/49] bpf tools: Iterate over ELF sections to collect information Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 08/49] bpf tools: Collect version and license from ELF sections Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 09/49] bpf tools: Collect map definitions from 'maps' section Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 10/49] bpf tools: Collect symbol table from SHT_SYMTAB section Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 11/49] bpf tools: Collect eBPF programs from their own sections Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 12/49] bpf tools: Collect relocation sections from SHT_REL sections Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 13/49] bpf tools: Record map accessing instructions for each program Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 14/49] bpf tools: Add bpf.c/h for common bpf operations Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 15/49] bpf tools: Create eBPF maps defined in an object file Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 16/49] bpf tools: Relocate eBPF programs Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 17/49] bpf tools: Introduce bpf_load_program() to bpf.c Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 18/49] bpf tools: Load eBPF programs in object files into kernel Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 19/49] bpf tools: Introduce accessors for struct bpf_program Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 20/49] bpf tools: Introduce accessors for struct bpf_object Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 21/49] bpf tools: Link all bpf objects onto a list Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 22/49] perf tools: Make perf depend on libbpf Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 23/49] perf tools: Introduce llvm config options Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 24/49] perf tools: Call clang to compile C source to object code Wang Nan
2015-06-24 12:31 ` Wang Nan [this message]
2015-06-24 12:31 ` [RFC PATCH v8 26/49] perf tools: Auto detecting kernel build directory Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 27/49] perf tools: Auto detecting kernel include options Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 28/49] perf record: Enable passing bpf object file to --event Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 29/49] perf record: Compile scriptlets if pass '.c' " Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 30/49] perf tools: Parse probe points of eBPF programs during preparation Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 31/49] perf probe: Attach trace_probe_event with perf_probe_event Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 32/49] perf record: Probe at kprobe points Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 33/49] perf record: Load all eBPF object into kernel Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 34/49] perf tools: Add bpf_fd field to evsel and config it Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 35/49] perf tools: Attach eBPF program to perf event Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 36/49] perf tools: Suppress probing messages when probing by BPF loading Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 37/49] perf record: Add clang options for compiling BPF scripts Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 38/49] bpf tools: Load instructions buffer using load_program() Wang Nan
2015-06-26 8:28 ` Alexei Starovoitov
2015-06-26 11:00 ` Wangnan (F)
2015-06-24 12:31 ` [RFC PATCH v8 39/49] bpf tools: Load a program with different instance using preprocessor Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 40/49] perf tools: Fix probe-event.h include Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 41/49] perf probe: Reset tev->args and tev->nargs when failure Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 42/49] perf tools: Move linux/filter.h to tools/include Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 43/49] perf tools: Iterater over tev instead of pev in bpf__for_each_program Wang Nan
2015-06-26 8:29 ` Alexei Starovoitov
2015-06-24 12:31 ` [RFC PATCH v8 44/49] perf tools: Add BPF_PROLOGUE config options for further patches Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 45/49] perf tools: Introduce arch_get_reg_info() for x86 Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 46/49] perf tools: Add prologue for BPF programs for fetching arguments Wang Nan
2015-06-26 4:23 ` Wangnan (F)
2015-06-26 8:32 ` Alexei Starovoitov
2015-06-24 12:31 ` [RFC PATCH v8 47/49] perf tools: Generate prologue for BPF programs Wang Nan
2015-06-26 8:40 ` Alexei Starovoitov
2015-06-24 12:31 ` [RFC PATCH v8 48/49] perf tools: Use same BPF program if arguments are identical Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 49/49] perf record: Support custom vmlinux path Wang Nan
2015-06-26 8:37 ` [RFC PATCH v8 00/49] perf tools: filtering events using eBPF programs Alexei Starovoitov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1435149113-51142-26-git-send-email-wangnan0@huawei.com \
--to=wangnan0@huawei.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@kernel.org \
--cc=ast@plumgrid.com \
--cc=brendan.d.gregg@gmail.com \
--cc=daniel@iogearbox.net \
--cc=dsahern@gmail.com \
--cc=hekuang@huawei.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=paulus@samba.org \
--cc=pi3orama@163.com \
--cc=xiakaixu@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®