When in KERNEL_HAS_SOURCE_DIR mode, include everything
authorBrenden Blanco <bblanco@plumgrid.com>
Tue, 8 Mar 2016 16:32:29 +0000 (08:32 -0800)
committerBrenden Blanco <bblanco@plumgrid.com>
Tue, 8 Mar 2016 16:32:29 +0000 (08:32 -0800)
Include all of the paths in the build/ directory when kernel headers are
split.

Signed-off-by: Brenden Blanco <bblanco@plumgrid.com>
src/cc/frontends/clang/kbuild_helper.cc
src/cc/frontends/clang/kbuild_helper.h
src/cc/frontends/clang/loader.cc

index dc1675b..3cb55df 100644 (file)
@@ -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<string> *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<string> *cflags) {
   cflags->push_back("-D__KERNEL__");
   cflags->push_back("-Wno-unused-value");
   cflags->push_back("-Wno-pointer-sign");
+
   return 0;
 }
 
index 6f93dec..3cbc0f6 100644 (file)
@@ -33,13 +33,13 @@ typedef std::unique_ptr<FILE, FileDeleter> 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<std::string> *cflags);
+ private:
+  std::string kdir_;
 };
 
 }  // namespace ebpf
index af21a4f..6a0d025 100644 (file)
@@ -82,11 +82,10 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, unique_ptr<vector<TableDes
   unique_ptr<llvm::MemoryBuffer> 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<llvm::Module> *mod, unique_ptr<vector<TableDes
                                    "-Wno-gnu-variable-sized-type-not-at-end",
                                    "-x", "c", "-c", abs_file.c_str()});
 
-  KBuildHelper kbuild_helper;
+  KBuildHelper kbuild_helper(kdir);
   vector<string> 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");