From: Wang Nan <wangnan0@huawei.com>
To: <acme@kernel.org>, <alexei.starovoitov@gmail.com>
Cc: <lizefan@huawei.com>, <linux-kernel@vger.kernel.org>,
<pi3orama@163.com>, 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>
Subject: [PATCH v2 14/18] perf clang: Pass CFLAGS to builtin clang
Date: Mon, 26 Sep 2016 07:27:08 +0000 [thread overview]
Message-ID: <1474874832-134786-15-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1474874832-134786-1-git-send-email-wangnan0@huawei.com>
Pass -DKERNEL_VERSION_CODE, -D__NR_CPUS__, llvm.clang-opt config options
and CFLAGS detected by kbuild detector to builtin clang so BPF scripts
can use kernel headers and user defined options like external clang
compiler.
Test:
# perf record --dry-run -e tools/perf/tests/bpf-script-test-kbuild.c ls 2>&1 | grep built
bpf: builtin compiling successful
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>
---
tools/perf/util/c++/clang.cpp | 105 +++++++++++++++++++++++++++++++++++++--
tools/perf/util/llvm-utils-cxx.h | 14 ++++++
tools/perf/util/llvm-utils.h | 2 +-
3 files changed, 116 insertions(+), 5 deletions(-)
create mode 100644 tools/perf/util/llvm-utils-cxx.h
diff --git a/tools/perf/util/c++/clang.cpp b/tools/perf/util/c++/clang.cpp
index 9597ff7..c1660ab 100644
--- a/tools/perf/util/c++/clang.cpp
+++ b/tools/perf/util/c++/clang.cpp
@@ -27,6 +27,8 @@
#include "clang.h"
#include "clang-c.h"
+#include "llvm-utils-cxx.h"
+#include "util-cxx.h"
namespace perf {
@@ -152,6 +154,101 @@ getBPFObjectFromModule(llvm::Module *Module)
return std::move(Buffer);
}
+class ClangOptions {
+ llvm::SmallString<PATH_MAX> FileName;
+ llvm::SmallString<64> KVerDef;
+ llvm::SmallString<64> NRCpusDef;
+ char *kbuild_dir;
+ char *kbuild_include_opts;
+ char *clang_opt;
+public:
+ ClangOptions(const char *filename) : FileName(filename),
+ KVerDef(""),
+ NRCpusDef(""),
+ kbuild_dir(NULL),
+ kbuild_include_opts(NULL),
+ clang_opt(NULL)
+ {
+ llvm::sys::fs::make_absolute(FileName);
+
+ unsigned int kver;
+ if (!fetch_kernel_version(&kver, NULL, 0))
+ KVerDef = "-DLINUX_VERSION_CODE=" + std::to_string(kver);
+
+ int nr_cpus = llvm__get_nr_cpus();
+ if (nr_cpus > 0)
+ NRCpusDef = "-D__NR_CPUS__=" + std::to_string(nr_cpus);
+
+ if (llvm_param.clang_opt)
+ clang_opt = strdup(llvm_param.clang_opt);
+
+ llvm__get_kbuild_opts(&kbuild_dir, &kbuild_include_opts);
+ if (!kbuild_dir || !kbuild_include_opts) {
+ free(kbuild_dir);
+ free(kbuild_include_opts);
+ kbuild_dir = kbuild_include_opts = NULL;
+ }
+ }
+
+ ~ClangOptions()
+ {
+ free(kbuild_dir);
+ free(kbuild_include_opts);
+ free(clang_opt);
+ }
+
+ static void fillCFlagsFromString(opt::ArgStringList &CFlags, char *s, bool check = false)
+ {
+ if (!s)
+ return;
+
+ SmallVector<StringRef, 0> Terms;
+ StringRef Opts(s);
+ Opts.split(Terms, ' ');
+
+ for (auto i = Terms.begin(); i != Terms.end(); i++)
+ s[i->end() - Opts.begin()] = '\0';
+
+ for (auto i = Terms.begin(); i != Terms.end(); i++) {
+ if (!check) {
+ CFlags.push_back(i->begin());
+ continue;
+ }
+
+ if (i->startswith("-I"))
+ CFlags.push_back(i->begin());
+ else if (i->startswith("-D"))
+ CFlags.push_back(i->begin());
+ else if (*i == "-include") {
+ CFlags.push_back((i++)->begin());
+ /* Let clang report this error */
+ if (i == Terms.end())
+ break;
+ CFlags.push_back(i->begin());
+ }
+ }
+ }
+
+ void getCFlags(opt::ArgStringList &CFlags)
+ {
+ CFlags.push_back(KVerDef.c_str());
+ CFlags.push_back(NRCpusDef.c_str());
+
+ fillCFlagsFromString(CFlags, clang_opt);
+ fillCFlagsFromString(CFlags, kbuild_include_opts, true);
+
+ if (kbuild_dir) {
+ CFlags.push_back("-working-directory");
+ CFlags.push_back(kbuild_dir);
+ }
+ }
+
+ const char *getFileName(void)
+ {
+ return FileName.c_str();
+ }
+};
+
}
extern "C" {
@@ -175,11 +272,11 @@ int perf_clang__compile_bpf(const char *_filename,
if (!p_obj_buf || !p_obj_buf_sz)
return -EINVAL;
- llvm::SmallString<PATH_MAX> FileName(_filename);
- llvm::sys::fs::make_absolute(FileName);
-
+ ClangOptions Opts(_filename);
llvm::opt::ArgStringList CFlags;
- auto M = getModuleFromSource(std::move(CFlags), FileName.data());
+
+ Opts.getCFlags(CFlags);
+ auto M = getModuleFromSource(std::move(CFlags), Opts.getFileName());
if (!M)
return -EINVAL;
auto O = getBPFObjectFromModule(&*M);
diff --git a/tools/perf/util/llvm-utils-cxx.h b/tools/perf/util/llvm-utils-cxx.h
new file mode 100644
index 0000000..1202230
--- /dev/null
+++ b/tools/perf/util/llvm-utils-cxx.h
@@ -0,0 +1,14 @@
+#ifndef PERF_UTIL_LLVM_UTILS_CXX_H
+#define PERF_UTIL_LLVM_UTILS_CXX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "llvm-utils.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/perf/util/llvm-utils.h b/tools/perf/util/llvm-utils.h
index 8a7d588..fbc7a8b 100644
--- a/tools/perf/util/llvm-utils.h
+++ b/tools/perf/util/llvm-utils.h
@@ -5,7 +5,7 @@
#ifndef __LLVM_UTILS_H
#define __LLVM_UTILS_H
-#include "debug.h"
+#include <errno.h>
struct llvm_param {
/* Path of clang executable */
--
1.8.3.4
next prev parent reply other threads:[~2016-09-26 7:28 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-26 7:26 [PATCH v2 00/18] perf clang: Support compiling BPF script on the fly Wang Nan
2016-09-26 7:26 ` [PATCH v2 01/18] tools build: Support compiling C++ source file Wang Nan
2016-10-06 22:44 ` [tip:perf/urgent] " tip-bot for Wang Nan
2016-09-26 7:26 ` [PATCH v2 02/18] perf tools: Add feature detection for g++ Wang Nan
2016-10-06 22:45 ` [tip:perf/urgent] tools build: " tip-bot for Wang Nan
2016-09-26 7:26 ` [PATCH v2 03/18] perf tools: Add feature detection for LLVM Wang Nan
2016-09-26 7:26 ` [PATCH v2 04/18] perf tools: Add feature detection for clang Wang Nan
2016-09-26 7:26 ` [PATCH v2 05/18] perf build: Add clang and llvm compile and linking support Wang Nan
2016-09-26 7:27 ` [PATCH v2 06/18] perf clang: Add builtin clang support ant test case Wang Nan
2016-09-26 7:27 ` [PATCH v2 07/18] perf clang: Use real file system for #include Wang Nan
2016-09-26 7:27 ` [PATCH v2 08/18] perf clang: Allow passing CFLAGS to builtin clang Wang Nan
2016-09-26 7:27 ` [PATCH v2 09/18] perf clang: Update test case to use real BPF script Wang Nan
2016-09-26 7:27 ` [PATCH v2 10/18] perf clang: Support compile IR to BPF object and add testcase Wang Nan
2016-09-26 7:27 ` [PATCH v2 11/18] perf tools: Extract helpers in llvm-utils.c Wang Nan
2016-09-26 7:27 ` [PATCH v2 12/18] perf bpf: Compile BPF script use builtin clang support Wang Nan
2016-09-26 7:27 ` [PATCH v2 13/18] perf clang: Pass full path to builtin clang Wang Nan
2016-09-26 7:27 ` Wang Nan [this message]
2016-09-26 7:27 ` [PATCH v2 15/18] perf clang: Link BPF functions declaration into perf Wang Nan
2016-09-26 7:27 ` [PATCH v2 16/18] perf clang: Declare BPF functions for BPF scripts automatically Wang Nan
2016-09-26 7:27 ` [PATCH v2 17/18] perf clang: Include helpers to BPF scripts Wang Nan
2016-09-26 7:27 ` [PATCH v2 18/18] perf clang: Define PERF_BUILTIN_CLANG for builtin clang compiling Wang Nan
2016-10-05 23:20 ` [PATCH v2 00/18] perf clang: Support compiling BPF script on the fly Arnaldo Carvalho de Melo
2016-10-08 2:03 ` Wangnan (F)
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=1474874832-134786-15-git-send-email-wangnan0@huawei.com \
--to=wangnan0@huawei.com \
--cc=acme@kernel.org \
--cc=acme@redhat.com \
--cc=alexei.starovoitov@gmail.com \
--cc=ast@fb.com \
--cc=hekuang@huawei.com \
--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
all inboxes | Powered by JetHome®