From 4da282918f3d3d650cbd0d8c813389db5c72cad8 Mon Sep 17 00:00:00 2001 From: Brenden Blanco Date: Tue, 8 Mar 2016 08:32:29 -0800 Subject: [PATCH] When in KERNEL_HAS_SOURCE_DIR mode, include everything Include all of the paths in the build/ directory when kernel headers are split. Signed-off-by: Brenden Blanco --- src/cc/frontends/clang/kbuild_helper.cc | 16 +++++++++++++++- src/cc/frontends/clang/kbuild_helper.h | 10 ++++++---- src/cc/frontends/clang/loader.cc | 14 +++----------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/cc/frontends/clang/kbuild_helper.cc b/src/cc/frontends/clang/kbuild_helper.cc index dc1675b..3cb55df 100644 --- a/src/cc/frontends/clang/kbuild_helper.cc +++ b/src/cc/frontends/clang/kbuild_helper.cc @@ -22,7 +22,7 @@ namespace ebpf { using std::string; using std::vector; -KBuildHelper::KBuildHelper() { +KBuildHelper::KBuildHelper(const std::string &kdir) : kdir_(kdir) { } // read the flags from cache or learn @@ -58,6 +58,19 @@ int KBuildHelper::get_flags(const char *uname_machine, vector *cflags) { cflags->push_back("-nostdinc"); cflags->push_back("-isystem"); cflags->push_back("/virtual/lib/clang/include"); + + // some module build directories split headers between source/ and build/ + if (KERNEL_HAS_SOURCE_DIR) { + cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include"); + cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated/uapi"); + cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated"); + cflags->push_back("-I" + kdir_ + "/build/include"); + cflags->push_back("-I" + kdir_ + "/build/./arch/"+arch+"/include/uapi"); + cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated/uapi"); + cflags->push_back("-I" + kdir_ + "/build/include/uapi"); + cflags->push_back("-I" + kdir_ + "/build/include/generated/uapi"); + } + cflags->push_back("-I./arch/"+arch+"/include"); cflags->push_back("-Iarch/"+arch+"/include/generated/uapi"); cflags->push_back("-Iarch/"+arch+"/include/generated"); @@ -71,6 +84,7 @@ int KBuildHelper::get_flags(const char *uname_machine, vector *cflags) { cflags->push_back("-D__KERNEL__"); cflags->push_back("-Wno-unused-value"); cflags->push_back("-Wno-pointer-sign"); + return 0; } diff --git a/src/cc/frontends/clang/kbuild_helper.h b/src/cc/frontends/clang/kbuild_helper.h index 6f93dec..3cbc0f6 100644 --- a/src/cc/frontends/clang/kbuild_helper.h +++ b/src/cc/frontends/clang/kbuild_helper.h @@ -33,13 +33,13 @@ typedef std::unique_ptr FILEPtr; // Helper with pushd/popd semantics class DirStack { public: - explicit DirStack(const char *dst) : ok_(false) { + explicit DirStack(const std::string &dst) : ok_(false) { if (getcwd(cwd_, sizeof(cwd_)) == NULL) { ::perror("getcwd"); return; } - if (::chdir(dst)) { - fprintf(stderr, "chdir(%s): %s\n", dst, strerror(errno)); + if (::chdir(dst.c_str())) { + fprintf(stderr, "chdir(%s): %s\n", dst.c_str(), strerror(errno)); return; } ok_ = true; @@ -94,8 +94,10 @@ class TmpDir { // case we eventually support non-root user programs, cache in $HOME. class KBuildHelper { public: - KBuildHelper(); + explicit KBuildHelper(const std::string &kdir); int get_flags(const char *uname_machine, std::vector *cflags); + private: + std::string kdir_; }; } // namespace ebpf diff --git a/src/cc/frontends/clang/loader.cc b/src/cc/frontends/clang/loader.cc index af21a4f..6a0d025 100644 --- a/src/cc/frontends/clang/loader.cc +++ b/src/cc/frontends/clang/loader.cc @@ -82,11 +82,10 @@ int ClangLoader::parse(unique_ptr *mod, unique_ptr main_buf; struct utsname un; uname(&un); - char kdir[256]; - snprintf(kdir, sizeof(kdir), "%s/%s/%s", KERNEL_MODULES_DIR, un.release, KERNEL_MODULES_SUFFIX); + string kdir = string(KERNEL_MODULES_DIR) + "/" + un.release; // clang needs to run inside the kernel dir - DirStack dstack(kdir); + DirStack dstack(kdir + "/" + KERNEL_MODULES_SUFFIX); if (!dstack.ok()) return -1; @@ -106,17 +105,10 @@ int ClangLoader::parse(unique_ptr *mod, unique_ptr kflags; if (kbuild_helper.get_flags(un.machine, &kflags)) return -1; - // some module build directories split headers between source/ and build/ - if (KERNEL_HAS_SOURCE_DIR) { - kflags.push_back("-isystem"); - kflags.push_back(string(KERNEL_MODULES_DIR "/") + un.release + "/build/include"); - kflags.push_back("-isystem"); - kflags.push_back(string(KERNEL_MODULES_DIR "/") + un.release + "/build/include/generated/uapi"); - } kflags.push_back("-include"); kflags.push_back("/virtual/include/bcc/helpers.h"); kflags.push_back("-isystem"); -- 2.7.4