Commit-ID:  a940cad331e79cc03d9ae74f56a2c7cb810bdce9
Gitweb:     http://git.kernel.org/tip/a940cad331e79cc03d9ae74f56a2c7cb810bdce9
Author:     Wang Nan <wangn...@huawei.com>
AuthorDate: Tue, 6 Dec 2016 07:22:30 +0000
Committer:  Arnaldo Carvalho de Melo <a...@redhat.com>
CommitDate: Tue, 6 Dec 2016 13:21:55 -0300

perf build: Check LLVM version in feature check

Cancel builtin llvm and clang support when LLVM version is less than
3.9.0: following commits uses newer API.

Since Clang/LLVM's API is not guaranteed to be stable, add a
test-llvm-version.cpp feature checker, issue warning if LLVM found in
compiling environment is not tested yet.

Committer Notes:

Testing it:

Environment:

  $ cat /etc/fedora-release
  Fedora release 25 (Twenty Five)
  $ rpm -q llvm-devel clang-devel
  llvm-devel-3.8.0-1.fc25.x86_64
  clang-devel-3.8.0-2.fc25.x86_64
  $

Before:

  $  make -k LIBCLANGLLVM=1 O=/tmp/build/perf -C tools/perf install-bin
  make: Entering directory '/home/acme/git/linux/tools/perf'
    BUILD:   Doing 'make -j4' parallel build
  Warning: tools/include/uapi/linux/bpf.h differs from kernel
  Warning: tools/arch/arm/include/uapi/asm/kvm.h differs from kernel
    INSTALL  GTK UI
    LINK     /tmp/build/perf/perf
  /tmp/build/perf/libperf.a(libperf-in.o): In function 
`perf::createCompilerInvocation(llvm::SmallVector<char const*, 16u>, 
llvm::StringRef&, clang::DiagnosticsEngine&)':
  /home/acme/git/linux/tools/perf/util/c++/clang.cpp:56: undefined reference to 
`clang::tooling::newInvocation(clang::DiagnosticsEngine*, 
llvm::SmallVector<char const*, 16u> const&)'
  /tmp/build/perf/libperf.a(libperf-in.o): In function 
`perf::getModuleFromSource(llvm::SmallVector<char const*, 16u>, 
llvm::StringRef, llvm::IntrusiveRefCntPtr<clang::vfs::FileSystem>)':
  /home/acme/git/linux/tools/perf/util/c++/clang.cpp:68: undefined reference to 
`clang::CompilerInstance::CompilerInstance(std::shared_ptr<clang::PCHContainerOperations>,
 bool)'
  /home/acme/git/linux/tools/perf/util/c++/clang.cpp:69: undefined reference to 
`clang::CompilerInstance::createDiagnostics(clang::DiagnosticConsumer*, bool)'
  <SNIP>

After:

  Makefile.config:807: No suitable libLLVM found, disabling builtin clang and 
llvm support. Please install llvm-dev(el) (>= 3.9.0)

Updating the environment to a locally built LLVM 4.0 + clang 3.9 (forgot
to git pull, duh) combo, all works as expected, it is properly detected
and built into the resulting perf binary.

Signed-off-by: Wang Nan <wangn...@huawei.com>
Reported-and-Tested-by: Arnaldo Carvalho de Melo <a...@redhat.com>
Cc: Alexei Starovoitov <a...@fb.com>
Cc: He Kuang <heku...@huawei.com>
Cc: Jiri Olsa <jo...@kernel.org>
Cc: Joe Stringer <j...@ovn.org>
Cc: Zefan Li <lize...@huawei.com>
Cc: pi3or...@163.com
Link: http://lkml.kernel.org/r/20161206072230.7651-1-wangn...@huawei.com
[ Change the warning message a bit (add 'suitable' and 'builtin'), clarifying 
it, see committer notes above ]
Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
---
 tools/build/feature/Makefile              |  8 ++++++--
 tools/build/feature/test-llvm-version.cpp | 11 +++++++++++
 tools/build/feature/test-llvm.cpp         |  5 +++++
 tools/perf/Makefile.config                |  8 ++++++--
 4 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index 303196c..b564a2e 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -231,14 +231,18 @@ $(OUTPUT)test-jvmti.bin:
        $(BUILD)
 
 $(OUTPUT)test-llvm.bin:
-       $(BUILDXX) -std=gnu++11                                         \
+       $(BUILDXX) -std=gnu++11                                 \
                -I$(shell $(LLVM_CONFIG) --includedir)          \
                -L$(shell $(LLVM_CONFIG) --libdir)              \
                $(shell $(LLVM_CONFIG) --libs Core BPF)         \
                $(shell $(LLVM_CONFIG) --system-libs)
 
+$(OUTPUT)test-llvm-version.bin:
+       $(BUILDXX) -std=gnu++11                                 \
+               -I$(shell $(LLVM_CONFIG) --includedir)
+
 $(OUTPUT)test-clang.bin:
-       $(BUILDXX) -std=gnu++11                                         \
+       $(BUILDXX) -std=gnu++11                                 \
                -I$(shell $(LLVM_CONFIG) --includedir)          \
                -L$(shell $(LLVM_CONFIG) --libdir)              \
                -Wl,--start-group -lclangBasic -lclangDriver    \
diff --git a/tools/build/feature/test-llvm-version.cpp 
b/tools/build/feature/test-llvm-version.cpp
new file mode 100644
index 0000000..896d317
--- /dev/null
+++ b/tools/build/feature/test-llvm-version.cpp
@@ -0,0 +1,11 @@
+#include <cstdio>
+#include "llvm/Config/llvm-config.h"
+
+#define NUM_VERSION (((LLVM_VERSION_MAJOR) << 16) + (LLVM_VERSION_MINOR << 8) 
+ LLVM_VERSION_PATCH)
+#define pass int main() {printf("%x\n", NUM_VERSION); return 0;}
+
+#if NUM_VERSION >= 0x030900
+pass
+#else
+# error This LLVM is not tested yet.
+#endif
diff --git a/tools/build/feature/test-llvm.cpp 
b/tools/build/feature/test-llvm.cpp
index d8d2cee..455a332 100644
--- a/tools/build/feature/test-llvm.cpp
+++ b/tools/build/feature/test-llvm.cpp
@@ -1,5 +1,10 @@
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/raw_ostream.h"
+#define NUM_VERSION (((LLVM_VERSION_MAJOR) << 16) + (LLVM_VERSION_MINOR << 8) 
+ LLVM_VERSION_PATCH)
+
+#if NUM_VERSION < 0x030900
+# error "LLVM version too low"
+#endif
 int main()
 {
        llvm::errs() << "Hello World!\n";
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 09c2a98..76c84f0 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -802,12 +802,13 @@ ifdef LIBCLANGLLVM
     msg := $(warning No g++ found, disable clang and llvm support. Please 
install g++)
   else
     $(call feature_check,llvm)
+    $(call feature_check,llvm-version)
     ifneq ($(feature-llvm), 1)
-      msg := $(warning No libLLVM found, disable clang and llvm support. 
Please install llvm-dev)
+      msg := $(warning No suitable libLLVM found, disabling builtin clang and 
LLVM support. Please install llvm-dev(el) (>= 3.9.0))
     else
       $(call feature_check,clang)
       ifneq ($(feature-clang), 1)
-        msg := $(warning No libclang found, disable clang and llvm support. 
Please install libclang-dev)
+        msg := $(warning No suitable libclang found, disabling builtin clang 
and LLVM support. Please install libclang-dev(el) (>= 3.9.0))
       else
         CFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT
         CXXFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT -I$(shell $(LLVM_CONFIG) 
--includedir)
@@ -816,6 +817,9 @@ ifdef LIBCLANGLLVM
        USE_CXX = 1
        USE_LLVM = 1
        USE_CLANG = 1
+        ifneq ($(feature-llvm-version),1)
+          msg := $(warning This version of LLVM is not tested. May cause build 
errors)
+        endif
       endif
     endif
   endif

Reply via email to