From 765c1ea6d7272fae04d435b9bac79087a2f6aabf Mon Sep 17 00:00:00 2001 From: Chih-Hung Hsieh Date: Tue, 2 Feb 2016 11:30:39 -0800 Subject: [PATCH] Use newest clang static analyzers. * When WITH_STATIC_ANALYZER is set and non-zero, and clang compiler is used, call new clang ccc-analyzer or c++-analyzer. * Otherwise, if WITH_SYNTAX_CHECK is set and non-zero, call compiler with -fsyntax-only. * Replace "--sysroot=path" with "--sysroot path", to work with ccc-analyzer. * ccc-analyzer executes the original compilation command to generate object files before calling clang with --analyze to do static analysis. * When clang is called with --analyze, macro __clang_analyzer__ is defined. BUG: 13287788 Change-Id: I5edb25b52998d871385dd000778db2ce83224078 --- core/binary.mk | 20 ++++++++++++++++---- core/clang/HOST_x86_common.mk | 10 +++++----- core/clang/config.mk | 3 --- core/clang/versions.mk | 5 +++++ core/combo/HOST_CROSS_windows-x86.mk | 2 +- core/combo/HOST_CROSS_windows-x86_64.mk | 2 +- core/config.mk | 12 +++++------- 7 files changed, 33 insertions(+), 21 deletions(-) create mode 100644 core/clang/versions.mk diff --git a/core/binary.mk b/core/binary.mk index 4f5ced541..1c7ffda48 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -402,6 +402,12 @@ ifeq ($(strip $(WITH_STATIC_ANALYZER)),) LOCAL_NO_STATIC_ANALYZER := true endif +# Clang does not recognize all gcc flags. +# Use static analyzer only if clang is used. +ifneq ($(my_clang),true) + LOCAL_NO_STATIC_ANALYZER := true +endif + ifneq ($(strip $(LOCAL_IS_HOST_MODULE)),) my_syntax_arch := host else @@ -416,13 +422,16 @@ ifeq ($(strip $(my_cc)),) endif my_cc := $(my_cc_wrapper) $(my_cc) endif + ifneq ($(LOCAL_NO_STATIC_ANALYZER),true) - my_cc := $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer $(my_syntax_arch) "$(my_cc)" + my_cc := CCC_CC=$(CLANG) CLANG=$(CLANG) \ + $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer else ifneq ($(LOCAL_NO_SYNTAX_CHECK),true) - my_cc := $(SYNTAX_TOOLS_PREFIX)/ccc-syntax $(my_syntax_arch) "$(my_cc)" + my_cc := $(my_cc) -fsyntax-only endif endif + $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(my_cc) ifeq ($(strip $(my_cxx)),) @@ -433,13 +442,16 @@ ifeq ($(strip $(my_cxx)),) endif my_cxx := $(my_cxx_wrapper) $(my_cxx) endif + ifneq ($(LOCAL_NO_STATIC_ANALYZER),true) - my_cxx := $(SYNTAX_TOOLS_PREFIX)/cxx-analyzer $(my_syntax_arch) "$(my_cxx)" + my_cxx := CCC_CXX=$(CLANG_CXX) CLANG_CXX=$(CLANG_CXX) \ + $(SYNTAX_TOOLS_PREFIX)/c++-analyzer else ifneq ($(LOCAL_NO_SYNTAX_CHECK),true) - my_cxx := $(SYNTAX_TOOLS_PREFIX)/cxx-syntax $(my_syntax_arch) "$(my_cxx)" + my_cxx := $(my_cxx) -fsyntax-only endif endif + $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LINKER := $(my_linker) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(my_cxx) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CLANG := $(my_clang) diff --git a/core/clang/HOST_x86_common.mk b/core/clang/HOST_x86_common.mk index 8b94209f0..9e71750c1 100644 --- a/core/clang/HOST_x86_common.mk +++ b/core/clang/HOST_x86_common.mk @@ -13,7 +13,7 @@ endif ifeq ($(HOST_OS),linux) CLANG_CONFIG_x86_LINUX_HOST_EXTRA_ASFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) @@ -23,14 +23,14 @@ CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CFLAGS += -fstack-protector-strong ifneq ($(strip $($(clang_2nd_arch_prefix)HOST_IS_64_BIT)),) CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CPPFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8 \ -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8/x86_64-linux \ -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8/backward CLANG_CONFIG_x86_LINUX_HOST_EXTRA_LDFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin \ -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.8 \ -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.8 \ @@ -38,14 +38,14 @@ CLANG_CONFIG_x86_LINUX_HOST_EXTRA_LDFLAGS := \ else CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CPPFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8 \ -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8/x86_64-linux/32 \ -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8/backward CLANG_CONFIG_x86_LINUX_HOST_EXTRA_LDFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin \ -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.8/32 \ -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.8/32 \ diff --git a/core/clang/config.mk b/core/clang/config.mk index fb3886eef..e1ad3ceb2 100644 --- a/core/clang/config.mk +++ b/core/clang/config.mk @@ -1,8 +1,5 @@ ## Clang configurations. -LLVM_RELEASE_VERSION := 3.8 -LLVM_PREBUILTS_VERSION ?= clang-2577113 -LLVM_PREBUILTS_BASE ?= prebuilts/clang/host LLVM_PREBUILTS_PATH := $(LLVM_PREBUILTS_BASE)/$(BUILD_OS)-x86/$(LLVM_PREBUILTS_VERSION)/bin LLVM_RTLIB_PATH := $(LLVM_PREBUILTS_PATH)/../lib64/clang/$(LLVM_RELEASE_VERSION)/lib/linux/ diff --git a/core/clang/versions.mk b/core/clang/versions.mk new file mode 100644 index 000000000..7106899f7 --- /dev/null +++ b/core/clang/versions.mk @@ -0,0 +1,5 @@ +## Clang/LLVM release versions. + +LLVM_RELEASE_VERSION := 3.8 +LLVM_PREBUILTS_VERSION ?= clang-2577113 +LLVM_PREBUILTS_BASE ?= prebuilts/clang/host diff --git a/core/combo/HOST_CROSS_windows-x86.mk b/core/combo/HOST_CROSS_windows-x86.mk index b6cbebc92..6180a265a 100644 --- a/core/combo/HOST_CROSS_windows-x86.mk +++ b/core/combo/HOST_CROSS_windows-x86.mk @@ -19,7 +19,7 @@ $(combo_var_prefix)GLOBAL_CFLAGS += -DUSE_MINGW -DWIN32_LEAN_AND_MEAN $(combo_var_prefix)GLOBAL_CFLAGS += -Wno-unused-parameter -$(combo_var_prefix)GLOBAL_CFLAGS += --sysroot=prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32 +$(combo_var_prefix)GLOBAL_CFLAGS += --sysroot prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32 $(combo_var_prefix)GLOBAL_CFLAGS += -m32 $(combo_var_prefix)GLOBAL_LDFLAGS += -m32 TOOLS_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/bin/x86_64-w64-mingw32- diff --git a/core/combo/HOST_CROSS_windows-x86_64.mk b/core/combo/HOST_CROSS_windows-x86_64.mk index 1ad6005e3..e9b19cf95 100644 --- a/core/combo/HOST_CROSS_windows-x86_64.mk +++ b/core/combo/HOST_CROSS_windows-x86_64.mk @@ -19,7 +19,7 @@ $(combo_var_prefix)GLOBAL_CFLAGS += -DUSE_MINGW -DWIN32_LEAN_AND_MEAN $(combo_var_prefix)GLOBAL_CFLAGS += -Wno-unused-parameter -$(combo_var_prefix)GLOBAL_CFLAGS += --sysroot=prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32 +$(combo_var_prefix)GLOBAL_CFLAGS += --sysroot prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32 $(combo_var_prefix)GLOBAL_CFLAGS += -m64 $(combo_var_prefix)GLOBAL_LDFLAGS += -m64 TOOLS_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/bin/x86_64-w64-mingw32- diff --git a/core/config.mk b/core/config.mk index 59c111def..85a4ca1f9 100644 --- a/core/config.mk +++ b/core/config.mk @@ -349,20 +349,18 @@ ifeq ($(strip $(WITH_SYNTAX_CHECK)),0) WITH_SYNTAX_CHECK := endif +# define clang/llvm versions and base directory. +include $(BUILD_SYSTEM)/clang/versions.mk + # Disable WITH_STATIC_ANALYZER and WITH_SYNTAX_CHECK if tool can't be found -SYNTAX_TOOLS_PREFIX := prebuilts/misc/$(HOST_PREBUILT_TAG)/analyzer/bin +SYNTAX_TOOLS_PREFIX := \ + $(LLVM_PREBUILTS_BASE)/$(BUILD_OS)-x86/$(LLVM_PREBUILTS_VERSION)/tools/scan-build/libexec ifneq ($(strip $(WITH_STATIC_ANALYZER)),) ifeq ($(wildcard $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer),) $(warning *** Disable WITH_STATIC_ANALYZER because $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer does not exist) WITH_STATIC_ANALYZER := endif endif -ifneq ($(strip $(WITH_SYNTAX_CHECK)),) - ifeq ($(wildcard $(SYNTAX_TOOLS_PREFIX)/ccc-syntax),) - $(warning *** Disable WITH_SYNTAX_CHECK because $(SYNTAX_TOOLS_PREFIX)/ccc-syntax does not exist) - WITH_SYNTAX_CHECK := - endif -endif # WITH_STATIC_ANALYZER trumps WITH_SYNTAX_CHECK ifneq ($(strip $(WITH_STATIC_ANALYZER)),) -- 2.11.0