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 15/18] perf clang: Declare BPF functions for BPF scripts automatically
Date: Tue, 6 Dec 2016 07:13:53 +0000 [thread overview]
Message-ID: <20161206071356.5312-16-wangnan0@huawei.com> (raw)
In-Reply-To: <20161206071356.5312-1-wangnan0@huawei.com>
Use Clang's OverlayFileSystem, add '-include' options to make builtin
clang define BPF functions. After this patch BPF script writer needn't
define BPF functions by their own.
Add -DBUILTIN_CLANG_DEFAULT_INCLUDE to builtin clang so when adopting
builtin clang BPF functions can be automatically defined, and keep
undefined when using external clang. Passing a
-UBUILTIN_CLANG_DEFAULT_INCLUDE to cancel this defaudefinition.
Test cases are updated to avoid redefinition of these functions.
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/bpf-script-example.c | 18 +++++++++------
tools/perf/tests/bpf-script-test-prologue.c | 2 ++
tools/perf/tests/bpf-script-test-relocation.c | 18 +++++++++------
tools/perf/util/c++/clang.cpp | 33 ++++++++++++++++++++++++++-
4 files changed, 56 insertions(+), 15 deletions(-)
diff --git a/tools/perf/tests/bpf-script-example.c b/tools/perf/tests/bpf-script-example.c
index ccbc19c..42dc341 100644
--- a/tools/perf/tests/bpf-script-example.c
+++ b/tools/perf/tests/bpf-script-example.c
@@ -8,13 +8,6 @@
#endif
#define BPF_ANY 0
#define BPF_MAP_TYPE_ARRAY 2
-#define BPF_FUNC_map_lookup_elem 1
-#define BPF_FUNC_map_update_elem 2
-
-static void *(*bpf_map_lookup_elem)(void *map, void *key) =
- (void *) BPF_FUNC_map_lookup_elem;
-static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
- (void *) BPF_FUNC_map_update_elem;
struct bpf_map_def {
unsigned int type;
@@ -24,6 +17,17 @@ struct bpf_map_def {
};
#define SEC(NAME) __attribute__((section(NAME), used))
+
+#ifndef BUILTIN_CLANG_DEFAULT_INCLUDE
+#define BPF_FUNC_map_lookup_elem 1
+#define BPF_FUNC_map_update_elem 2
+
+static void *(*bpf_map_lookup_elem)(void *map, void *key) =
+ (void *) BPF_FUNC_map_lookup_elem;
+static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
+ (void *) BPF_FUNC_map_update_elem;
+#endif
+
struct bpf_map_def SEC("maps") flip_table = {
.type = BPF_MAP_TYPE_ARRAY,
.key_size = sizeof(int),
diff --git a/tools/perf/tests/bpf-script-test-prologue.c b/tools/perf/tests/bpf-script-test-prologue.c
index 7230e62..ada812b 100644
--- a/tools/perf/tests/bpf-script-test-prologue.c
+++ b/tools/perf/tests/bpf-script-test-prologue.c
@@ -13,8 +13,10 @@
#define FMODE_READ 0x1
#define FMODE_WRITE 0x2
+#ifndef BUILTIN_CLANG_DEFAULT_INCLUDE
static void (*bpf_trace_printk)(const char *fmt, int fmt_size, ...) =
(void *) 6;
+#endif
SEC("func=null_lseek file->f_mode offset orig")
int bpf_func__null_lseek(void *ctx, int err, unsigned long f_mode,
diff --git a/tools/perf/tests/bpf-script-test-relocation.c b/tools/perf/tests/bpf-script-test-relocation.c
index 93af774..57c96a3 100644
--- a/tools/perf/tests/bpf-script-test-relocation.c
+++ b/tools/perf/tests/bpf-script-test-relocation.c
@@ -8,13 +8,6 @@
#endif
#define BPF_ANY 0
#define BPF_MAP_TYPE_ARRAY 2
-#define BPF_FUNC_map_lookup_elem 1
-#define BPF_FUNC_map_update_elem 2
-
-static void *(*bpf_map_lookup_elem)(void *map, void *key) =
- (void *) BPF_FUNC_map_lookup_elem;
-static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
- (void *) BPF_FUNC_map_update_elem;
struct bpf_map_def {
unsigned int type;
@@ -24,6 +17,17 @@ struct bpf_map_def {
};
#define SEC(NAME) __attribute__((section(NAME), used))
+
+#ifndef BUILTIN_CLANG_DEFAULT_INCLUDE
+#define BPF_FUNC_map_lookup_elem 1
+#define BPF_FUNC_map_update_elem 2
+
+static void *(*bpf_map_lookup_elem)(void *map, void *key) =
+ (void *) BPF_FUNC_map_lookup_elem;
+static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
+ (void *) BPF_FUNC_map_update_elem;
+#endif
+
struct bpf_map_def SEC("maps") my_table = {
.type = BPF_MAP_TYPE_ARRAY,
.key_size = sizeof(int),
diff --git a/tools/perf/util/c++/clang.cpp b/tools/perf/util/c++/clang.cpp
index 1bd92ea..feb69ea 100644
--- a/tools/perf/util/c++/clang.cpp
+++ b/tools/perf/util/c++/clang.cpp
@@ -39,9 +39,17 @@
#include "util-cxx.h"
#include "perf-hooks.h"
#include "jit-helpers.h"
+#include "clang-bpf-includes.h"
namespace perf {
+static struct BPFHeader {
+ llvm::StringRef Path;
+ llvm::StringRef Content;
+} BPFHeaders[] = {
+ {"/virtual/bpf-funcs.h", clang_builtin_bpf_funcs_str},
+};
+
static std::unique_ptr<llvm::LLVMContext> LLVMCtx;
using namespace clang;
@@ -63,6 +71,11 @@ createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path,
"-x", "c"};
CCArgs.append(CFlags.begin(), CFlags.end());
+ for (BPFHeader &h : BPFHeaders) {
+ CCArgs.append(1, "-include");
+ CCArgs.append(1, h.Path.begin());
+ }
+
CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs);
FrontendOptions& Opts = CI->getFrontendOpts();
@@ -71,6 +84,22 @@ createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path,
return CI;
}
+static IntrusiveRefCntPtr<vfs::FileSystem>
+addBPFHeaders(IntrusiveRefCntPtr<vfs::FileSystem> VFS)
+{
+ using namespace vfs;
+
+ llvm::IntrusiveRefCntPtr<OverlayFileSystem> OverlayFS(
+ new OverlayFileSystem(VFS));
+ llvm::IntrusiveRefCntPtr<InMemoryFileSystem> MemFS(
+ new InMemoryFileSystem(true));
+ OverlayFS->pushOverlay(MemFS);
+
+ for (BPFHeader &h : BPFHeaders)
+ MemFS->addFile(h.Path, 0, llvm::MemoryBuffer::getMemBuffer(h.Content));
+ return OverlayFS;
+}
+
static std::unique_ptr<PerfModule>
getModuleFromSource(llvm::opt::ArgStringList CFlags,
StringRef Path, IntrusiveRefCntPtr<vfs::FileSystem> VFS)
@@ -78,7 +107,8 @@ getModuleFromSource(llvm::opt::ArgStringList CFlags,
CompilerInstance Clang;
Clang.createDiagnostics();
- Clang.setVirtualFileSystem(&*VFS);
+ IntrusiveRefCntPtr<vfs::FileSystem> OverlayVFS = addBPFHeaders(VFS);
+ Clang.setVirtualFileSystem(&*OverlayVFS);
IntrusiveRefCntPtr<CompilerInvocation> CI =
createCompilerInvocation(std::move(CFlags), Path,
@@ -366,6 +396,7 @@ public:
{
CFlags.push_back(KVerDef.c_str());
CFlags.push_back(NRCpusDef.c_str());
+ CFlags.push_back("-DBUILTIN_CLANG_DEFAULT_INCLUDE");
fillCFlagsFromString(CFlags, clang_opt);
fillCFlagsFromString(CFlags, kbuild_include_opts, true);
--
2.10.1
next prev parent reply other threads:[~2016-12-06 7:14 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 ` [PATCH v4 09/18] perf clang jit: Export functions for jitted code Wang Nan
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 ` Wang Nan [this message]
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-16-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