From: Wang Nan <wangnan0@huawei.com>
To: <acme@kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <joe@ovn.org>,
Wang Nan <wangnan0@huawei.com>,
Arnaldo Carvalho de Melo <acme@redhat.com>,
"Alexei Starovoitov" <ast@fb.com>, He Kuang <hekuang@huawei.com>,
Jiri Olsa <jolsa@kernel.org>, Zefan Li <lizefan@huawei.com>,
<pi3orama@163.com>
Subject: [PATCH v4 09/18] perf clang jit: Export functions for jitted code
Date: Tue, 6 Dec 2016 07:13:47 +0000 [thread overview]
Message-ID: <20161206071356.5312-10-wangnan0@huawei.com> (raw)
In-Reply-To: <20161206071356.5312-1-wangnan0@huawei.com>
After this patch functions attached on perf hooks is allowed to invoke
external functions. Add a testcase for this feature.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@fb.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
---
tools/perf/tests/Build | 2 +-
tools/perf/tests/bpf-script-example.c | 4 ++++
tools/perf/util/c++/clang-c.h | 2 ++
tools/perf/util/c++/clang-test.cpp | 9 +++++++++
tools/perf/util/c++/clang.cpp | 17 ++++++++++++++++-
5 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 6676c2d..d6e6e00 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -49,7 +49,7 @@ $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build
$(call rule_mkdir)
$(Q)echo '#include <tests/llvm.h>' > $@
$(Q)echo 'const char test_llvm__bpf_base_prog[] =' >> $@
- $(Q)sed -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/g' $< >> $@
+ $(Q)sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/g' $< >> $@
$(Q)echo ';' >> $@
$(OUTPUT)tests/llvm-src-kbuild.c: tests/bpf-script-test-kbuild.c tests/Build
diff --git a/tools/perf/tests/bpf-script-example.c b/tools/perf/tests/bpf-script-example.c
index 265036e..ccbc19c 100644
--- a/tools/perf/tests/bpf-script-example.c
+++ b/tools/perf/tests/bpf-script-example.c
@@ -48,9 +48,13 @@ char _license[] SEC("license") = "GPL";
int _version SEC("version") = LINUX_VERSION_CODE;
#ifdef TEST_PERF_HOOK
+extern int printf(const char *fmt, ...);
+extern void test__clang_callback(int x);
SEC("perfhook:test")
void hook_test(void)
{
+ printf("Hello, hook_test\n");
+ test__clang_callback(1234);
return;
}
#endif
diff --git a/tools/perf/util/c++/clang-c.h b/tools/perf/util/c++/clang-c.h
index 5ebcb41..9f75e41 100644
--- a/tools/perf/util/c++/clang-c.h
+++ b/tools/perf/util/c++/clang-c.h
@@ -16,6 +16,8 @@ extern int test__clang_to_IR(void);
extern int test__clang_to_obj(void);
extern int test__clang_jit(void);
+extern void test__clang_callback(int x);
+
extern int perf_clang__compile_bpf(const char *filename,
void **p_obj_buf,
size_t *p_obj_buf_sz);
diff --git a/tools/perf/util/c++/clang-test.cpp b/tools/perf/util/c++/clang-test.cpp
index 2b4aa8d..0bdb807 100644
--- a/tools/perf/util/c++/clang-test.cpp
+++ b/tools/perf/util/c++/clang-test.cpp
@@ -68,6 +68,13 @@ int test__clang_to_obj(void)
return 0;
}
+static int callback_flag;
+
+void test__clang_callback(int x)
+{
+ callback_flag = x;
+}
+
int test__clang_jit(void)
{
perf_clang_scope _scope;
@@ -84,6 +91,8 @@ int test__clang_jit(void)
perf_hooks__set_hook(i.first.c_str(), i.second, NULL);
perf_hooks__invoke_test();
+ if (callback_flag != 1234)
+ return -1;
return 0;
}
diff --git a/tools/perf/util/c++/clang.cpp b/tools/perf/util/c++/clang.cpp
index b996ec6..3ce2e0e 100644
--- a/tools/perf/util/c++/clang.cpp
+++ b/tools/perf/util/c++/clang.cpp
@@ -30,6 +30,8 @@
#include "llvm/Target/TargetOptions.h"
#include <memory>
#include <vector>
+#include <set>
+#include <tuple>
#include "clang.h"
#include "clang-c.h"
@@ -197,6 +199,15 @@ PerfModule::toBPFObject(void)
return std::move(Buffer);
}
+static std::map<const std::string, const void *> exported_funcs =
+{
+#define EXPORT(f) {#f, (const void *)&f}
+ EXPORT(test__clang_callback),
+ EXPORT(printf),
+ EXPORT(puts),
+#undef EXPORT
+};
+
/*
* Use a global memory manager so allocated code and data won't be released
* when object destroy.
@@ -223,7 +234,11 @@ int PerfModule::doJIT(void)
auto Resolver = createLambdaResolver(
[](const std::string &Name) {
- return RuntimeDyld::SymbolInfo(nullptr);
+ auto i = exported_funcs.find(Name);
+ if (i == exported_funcs.end())
+ return RuntimeDyld::SymbolInfo(nullptr);
+ return RuntimeDyld::SymbolInfo((uint64_t)(i->second),
+ JITSymbolFlags::Exported);
},
[](const std::string &Name) {
return RuntimeDyld::SymbolInfo(nullptr);
--
2.10.1
next prev parent reply other threads:[~2016-12-06 7:16 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-06 7:13 [PATCH v4 00/18] perf clang: Builtin clang and perfhook support Wang Nan
2016-12-06 7:13 ` [PATCH v4 01/18] perf build: Check LLVM version in feature check Wang Nan
2016-12-06 7:20 ` Wangnan (F)
2016-12-06 7:22 ` [PATCH v4 01/18 -cleanup] " Wang Nan
2016-12-06 14:02 ` Arnaldo Carvalho de Melo
2016-12-07 18:22 ` [tip:perf/core] " tip-bot for Wang Nan
2016-12-06 7:13 ` [PATCH v4 02/18] perf build: Support dynamic linking clang libraries Wang Nan
2016-12-06 7:13 ` [PATCH v4 03/18] perf clang: Cleanup clang options Wang Nan
2016-12-06 7:13 ` [PATCH v4 04/18] perf clang: Pass full path to builtin clang Wang Nan
2016-12-06 7:13 ` [PATCH v4 05/18] perf clang: Pass CFLAGS " Wang Nan
2016-12-06 7:13 ` [PATCH v4 06/18] perf clang jit: Wrap llvm::Module using PerfModule Wang Nan
2016-12-06 7:13 ` [PATCH v4 07/18] perf clang jit: Insignt BPF and JIT functions in a Module Wang Nan
2016-12-06 7:13 ` [PATCH v4 08/18] perf clang jit: add PerfModule::doJIT to JIT perfhook functions Wang Nan
2016-12-06 7:13 ` Wang Nan [this message]
2016-12-06 7:13 ` [PATCH v4 10/18] perf clang jit: Actually JIT and hook in bpf loader Wang Nan
2016-12-06 7:13 ` [PATCH v4 11/18] perf clang jit: Collect the lowest address in maps section as map_base Wang Nan
2016-12-06 7:13 ` [PATCH v4 12/18] perf clang jit: Retrive fd of BPF map from its offset Wang Nan
2016-12-06 7:13 ` [PATCH v4 13/18] perf clang jit: Allow jitted perf hook access BPF maps Wang Nan
2016-12-06 7:13 ` [PATCH v4 14/18] perf clang: Link BPF functions declaration into perf Wang Nan
2016-12-06 7:13 ` [PATCH v4 15/18] perf clang: Declare BPF functions for BPF scripts automatically Wang Nan
2016-12-06 7:13 ` [PATCH v4 16/18] perf clang: Include helpers to BPF scripts Wang Nan
2016-12-06 7:13 ` [PATCH v4 17/18] perf clang builtin: Define hook helpers by default Wang Nan
2016-12-06 7:13 ` [PATCH v4 18/18] perf clang jit: Export getpid() to perf hook Wang Nan
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=20161206071356.5312-10-wangnan0@huawei.com \
--to=wangnan0@huawei.com \
--cc=acme@kernel.org \
--cc=acme@redhat.com \
--cc=ast@fb.com \
--cc=hekuang@huawei.com \
--cc=joe@ovn.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=pi3orama@163.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
Powered by JetHome