Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753024AbcLFHQH (ORCPT ); Tue, 6 Dec 2016 02:16:07 -0500 Received: from szxga02-in.huawei.com ([119.145.14.65]:46183 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752315AbcLFHOp (ORCPT ); Tue, 6 Dec 2016 02:14:45 -0500 From: Wang Nan To: CC: , , Wang Nan , Arnaldo Carvalho de Melo , "Alexei Starovoitov" , He Kuang , Jiri Olsa , Zefan Li , Subject: [PATCH v4 09/18] perf clang jit: Export functions for jitted code Date: Tue, 6 Dec 2016 07:13:47 +0000 Message-ID: <20161206071356.5312-10-wangnan0@huawei.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161206071356.5312-1-wangnan0@huawei.com> References: <20161206071356.5312-1-wangnan0@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.193.248] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4146 Lines: 133 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 Cc: Arnaldo Carvalho de Melo Cc: Alexei Starovoitov Cc: He Kuang Cc: Jiri Olsa Cc: Zefan Li 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 ' > $@ $(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 #include +#include +#include #include "clang.h" #include "clang-c.h" @@ -197,6 +199,15 @@ PerfModule::toBPFObject(void) return std::move(Buffer); } +static std::map 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