aboutsummaryrefslogtreecommitdiffstats
path: root/dist
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2017-10-20 14:04:13 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2017-11-02 10:25:28 +0000
commit58e8904856cf42cc26f91073be2f3886a28132a4 (patch)
treecb8dfc959aa3674b44e0a7096bc92c979c41ad3a /dist
parent7af341fe562f0cd668e3d413b72e1beb6e3cf414 (diff)
Clang: enable clang tidy and clazy in code model
Set QTC_CLANG_PLUGINS_LOAD env variable to get diagnostics that come from libclang plugins. This functionality works after the patch is applied to clang repository and clang is properly built with it. Task-number: QTCREATORBUG-15157 Change-Id: Iefeee4dd115f3f43ddc6ed79452a1135e653def6 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'dist')
-rw-r--r--dist/clang/patches/QTCREATORBUG-15157_Link-with-clazy.patch134
-rw-r--r--dist/clang/patches/README7
2 files changed, 141 insertions, 0 deletions
diff --git a/dist/clang/patches/QTCREATORBUG-15157_Link-with-clazy.patch b/dist/clang/patches/QTCREATORBUG-15157_Link-with-clazy.patch
new file mode 100644
index 0000000000..6c1490f7f4
--- /dev/null
+++ b/dist/clang/patches/QTCREATORBUG-15157_Link-with-clazy.patch
@@ -0,0 +1,134 @@
+diff --git a/lib/Transforms/CMakeLists.txt b/lib/Transforms/CMakeLists.txt
+index 67bdeb27212..7fcddb15904 100644
+--- a/lib/Transforms/CMakeLists.txt
++++ b/lib/Transforms/CMakeLists.txt
+@@ -4,6 +4,5 @@ add_subdirectory(InstCombine)
+ add_subdirectory(Scalar)
+ add_subdirectory(IPO)
+ add_subdirectory(Vectorize)
+-add_subdirectory(Hello)
+ add_subdirectory(ObjCARC)
+ add_subdirectory(Coroutines)
+
+diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
+index 124f0c72fd7..fdff2ffe6d4 100644
+--- a/test/CMakeLists.txt
++++ b/test/CMakeLists.txt
+@@ -29,7 +29,6 @@ endif()
+ set(LLVM_TEST_DEPENDS
+ BugpointPasses
+ FileCheck
+- LLVMHello
+ UnitTests
+ bugpoint
+ count
+diff --git a/tools/clang/tools/libclang/CMakeLists.txt b/tools/clang/tools/libclang/CMakeLists.txt
+index 2dd6703076..2ef48266ac 100644
+--- a/tools/clang/tools/libclang/CMakeLists.txt
++++ b/tools/clang/tools/libclang/CMakeLists.txt
+@@ -19,6 +19,7 @@ set(SOURCES
+ CXString.cpp
+ CXType.cpp
+ Indexing.cpp
++ LinkClazy.cpp
+
+ ADDITIONAL_HEADERS
+ CIndexDiagnostic.h
+@@ -53,6 +54,14 @@ if (TARGET clangTidyPlugin)
+ list(APPEND LIBS clangIncludeFixerPlugin)
+ endif ()
+
++option(CLANG_ENABLE_CLAZY "Build libclang with clazy" OFF)
++
++if (CLANG_ENABLE_CLAZY)
++ add_definitions(-DENABLE_CLAZY)
++ link_directories(${CMAKE_INSTALL_PREFIX}/lib)
++ list(APPEND LIBS ClangLazy clangRewriteFrontend)
++endif()
++
+ find_library(DL_LIBRARY_PATH dl)
+ if (DL_LIBRARY_PATH)
+ list(APPEND LIBS dl)
+diff --git a/tools/clang/tools/libclang/LinkClazy.cpp b/tools/clang/tools/libclang/LinkClazy.cpp
+new file mode 100644
+--- /dev/null
++++ b/tools/clang/tools/libclang/LinkClazy.cpp
+@@ -0,0 +1,78 @@
++#ifdef ENABLE_CLAZY
++extern volatile int ClazyPluginAnchorSource;
++static int ClazyPluginAnchorDestination = ClazyPluginAnchorSource;
++
++#define REGISTER_CHECK_WITH_FLAGS(CHECK_NAME, CLASS_NAME, LEVEL, OPTIONS) \
++ extern volatile int ClazyAnchor_##CLASS_NAME; \
++ volatile int ClazyAnchorDestination_##CLASS_NAME = ClazyAnchor_##CLASS_NAME;
++#define REGISTER_CHECK(CHECK_NAME, CLASS_NAME, LEVEL) \
++ extern volatile int ClazyAnchor_##CLASS_NAME; \
++ static int ClazyAnchorDestination_##CLASS_NAME = ClazyAnchor_##CLASS_NAME;
++
++REGISTER_CHECK("inefficient-qlist", InefficientQList, HiddenCheckLevel)
++REGISTER_CHECK("isempty-vs-count", IsEmptyVSCount, HiddenCheckLevel)
++REGISTER_CHECK(s_checkName, Qt4_QStringFromArray, HiddenCheckLevel)
++REGISTER_CHECK("tr-non-literal", TrNonLiteral, HiddenCheckLevel)
++REGISTER_CHECK("connect-non-signal", ConnectNonSignal, CheckLevel0)
++REGISTER_CHECK("connect-not-normalized", ConnectNotNormalized, CheckLevel0)
++REGISTER_CHECK("container-anti-pattern", ContainerAntiPattern, CheckLevel0)
++REGISTER_CHECK("lambda-in-connect", LambdaInConnect, CheckLevel0)
++REGISTER_CHECK("mutable-container-key", MutableContainerKey, CheckLevel0)
++REGISTER_CHECK("qcolor-from-literal", QColorFromLiteral, CheckLevel0)
++REGISTER_CHECK(s_checkName, QDateTimeUtc, CheckLevel0)
++REGISTER_CHECK_WITH_FLAGS("qenums", Qenums, CheckLevel0, RegisteredCheck::Option_Qt4Incompatible)
++REGISTER_CHECK("qfileinfo-exists", QFileInfoExists, CheckLevel0)
++REGISTER_CHECK_WITH_FLAGS(s_checkName, QGetEnv, CheckLevel0, RegisteredCheck::Option_Qt4Incompatible)
++REGISTER_CHECK("qmap-with-pointer-key", QMapWithPointerKey, CheckLevel0)
++REGISTER_CHECK("qstring-insensitive-allocation", QStringInsensitiveAllocation, CheckLevel0)
++REGISTER_CHECK("qstring-arg", StringArg, CheckLevel0)
++REGISTER_CHECK(s_checkName, StringRefCandidates, CheckLevel0)
++REGISTER_CHECK("qt-macros", QtMacros, CheckLevel0)
++REGISTER_CHECK("qvariant-template-instantiation", QVariantTemplateInstantiation, CheckLevel0)
++REGISTER_CHECK("strict-iterators", StrictIterators, CheckLevel0)
++REGISTER_CHECK("temporary-iterator", TemporaryIterator, CheckLevel0)
++REGISTER_CHECK("unused-non-trivial-variable", UnusedNonTrivialVariable, CheckLevel0)
++REGISTER_CHECK("writing-to-temporary", WritingToTemporary, CheckLevel0)
++REGISTER_CHECK("wrong-qglobalstatic", WrongQGlobalStatic, CheckLevel0)
++REGISTER_CHECK(s_checkName, AutoUnexpectedQStringBuilder, CheckLevel1)
++REGISTER_CHECK("child-event-qobject-cast", ChildEvent_qobject_cast, CheckLevel1)
++REGISTER_CHECK("connect-3arg-lambda", Connect3argLambda, CheckLevel1)
++REGISTER_CHECK("const-signal-or-slot", ConstSignalOrSlot, CheckLevel1)
++REGISTER_CHECK("ctor-missing-parent-argument", CtorMissingParentArgument, CheckLevel2)
++REGISTER_CHECK("detaching-temporary", DetachingTemporary, CheckLevel1)
++REGISTER_CHECK("foreach", Foreach, CheckLevel1)
++REGISTER_CHECK("incorrect-emit", IncorrectEmit, CheckLevel1)
++REGISTER_CHECK("inefficient-qlist-soft", InefficientQListSoft, CheckLevel1)
++REGISTER_CHECK("install-event-filter", InstallEventFilter, CheckLevel1)
++REGISTER_CHECK("non-pod-global-static", NonPodStatic, CheckLevel1)
++REGISTER_CHECK("overridden-signal", OverriddenSignal, CheckLevel1)
++REGISTER_CHECK("post-event", PostEvent, CheckLevel1)
++REGISTER_CHECK("qdeleteall", QDeleteAll, CheckLevel1)
++REGISTER_CHECK("qhash-namespace", qhash_namespace, CheckLevel1)
++REGISTER_CHECK("qlatin1string-non-ascii", QLatin1StringNonAscii, CheckLevel1)
++REGISTER_CHECK("qproperty-without-notify", QPropertyWithoutNotify, CheckLevel1)
++REGISTER_CHECK("qstring-left", QStringLeft, CheckLevel1)
++REGISTER_CHECK("range-loop", RangeLoop, CheckLevel1)
++REGISTER_CHECK("returning-data-from-temporary", ReturningDataFromTemporary, CheckLevel1)
++REGISTER_CHECK("rule-of-two-soft", RuleOfTwoSoft, CheckLevel1)
++REGISTER_CHECK("virtual-signal", VirtualSignal, CheckLevel1)
++REGISTER_CHECK("base-class-event", BaseClassEvent, CheckLevel2)
++REGISTER_CHECK("container-inside-loop", ContainerInsideLoop, CheckLevel2)
++REGISTER_CHECK("copyable-polymorphic", CopyablePolymorphic, CheckLevel2)
++REGISTER_CHECK(s_checkName, FunctionArgsByRef, CheckLevel2)
++REGISTER_CHECK("function-args-by-value", FunctionArgsByValue, CheckLevel2)
++REGISTER_CHECK("global-const-char-pointer", GlobalConstCharPointer, CheckLevel2)
++REGISTER_CHECK("implicit-casts", ImplicitCasts, CheckLevel2)
++REGISTER_CHECK("missing-qobject-macro", MissingQ_OBJECT, CheckLevel2)
++REGISTER_CHECK("missing-typeinfo", MissingTypeinfo, CheckLevel2)
++REGISTER_CHECK_WITH_FLAGS(s_checkName, OldStyleConnect, CheckLevel2, RegisteredCheck::Option_Qt4Incompatible)
++REGISTER_CHECK_WITH_FLAGS(s_checkName, QStringAllocations, CheckLevel2, RegisteredCheck::Option_Qt4Incompatible)
++REGISTER_CHECK("reserve-candidates", ReserveCandidates, CheckLevel2)
++REGISTER_CHECK("returning-void-expression", ReturningVoidExpression, CheckLevel2)
++REGISTER_CHECK("rule-of-three", RuleOfThree, CheckLevel2)
++REGISTER_CHECK("virtual-call-ctor", VirtualCallsFromCTOR, CheckLevel2)
++REGISTER_CHECK("assert-with-side-effects", AssertWithSideEffects, CheckLevel3)
++REGISTER_CHECK("detaching-member", DetachingMember, CheckLevel3)
++REGISTER_CHECK("bogus-dynamic-cast", BogusDynamicCast, CheckLevel3)
++REGISTER_CHECK("thread-with-slots", ThreadWithSlots, CheckLevel3)
++#endif
diff --git a/dist/clang/patches/README b/dist/clang/patches/README
index ef3828753b..b349aafe02 100644
--- a/dist/clang/patches/README
+++ b/dist/clang/patches/README
@@ -37,3 +37,10 @@ QTCREATORBUG-15449_Fix-files-lock-on-Windows.patch
Significantly reduces problems when saving a header file on Windows.
+QTCREATORBUG-15157_Link-with-clazy.patch
+
+ https://bugreports.qt.io/browse/QTCREATORBUG-15157
+
+ Introduces the flag CLANG_ENABLE_CLAZY to link libclang with Clazy and
+ forces link for Clazy checks and plugin registry entry.
+