diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-06-26 13:53:50 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-06-29 12:15:02 +0300 |
commit | fafb0cb8d46b9a1515d3913129785428e599fd80 (patch) | |
tree | 61d0b7283a0a62f736ed62b047dab9a3c0c94099 /plugins | |
parent | c26e6e398bc3e924b7dddb4e48b7c379f8a9b539 (diff) | |
download | qt-creator-fafb0cb8d46b9a1515d3913129785428e599fd80.tar.gz |
Adapt to upstream API change in CompilerOptionsBuilder II
Change-Id: I196b69846e22136773cf3cbf463a413d840dc4d2
Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp | 142 | ||||
-rw-r--r-- | plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h | 1 |
2 files changed, 114 insertions, 29 deletions
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index 35590e8284..0a1e65676a 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -61,8 +61,6 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl( const ProjectInfo &projectInfo) : AnalyzerRunControl(startParams, runConfiguration) , m_projectInfo(projectInfo) - , m_toolchainType(ProjectExplorer::ToolChainKitInformation - ::toolChain(runConfiguration->target()->kit())->type()) , m_wordWidth(runConfiguration->abi().wordWidth()) , m_initialFilesToProcessSize(0) , m_filesAnalyzed(0) @@ -113,27 +111,113 @@ static QStringList tweakedArguments(const QString &filePath, return newArguments; } -static QStringList argumentsFromProjectPart(const CppTools::ProjectPart::Ptr &projectPart, - CppTools::ProjectFile::Kind fileKind, - const QString &toolchainType, - unsigned char wordWidth) +static QString createLanguageOptionMsvc(ProjectFile::Kind fileKind) { - CompilerOptionsBuilder optionsBuilder(projectPart); - optionsBuilder.addLanguageOption(fileKind, toolchainType); - optionsBuilder.addOptionsForLanguage(false, toolchainType); - optionsBuilder.addToolchainAndProjectDefines(toolchainType); - optionsBuilder.addHeaderPathOptions(CompilerOptionsBuilder::IsBlackListed(), toolchainType); - - if (toolchainType == QLatin1String("msvc")) - optionsBuilder.add(QLatin1String("/EHsc")); // clang-cl does not understand exceptions - else - optionsBuilder.add(QLatin1String("-fPIC")); // TODO: Remove? - - QStringList options = optionsBuilder.options(); - prependWordWidthArgumentIfNotIncluded(&options, wordWidth); - return options; + switch (fileKind) { + case ProjectFile::CHeader: + case ProjectFile::CSource: + return QLatin1String("/TC"); + break; + case ProjectFile::CXXHeader: + case ProjectFile::CXXSource: + return QLatin1String("/TP"); + break; + default: + break; + } + return QString(); } +class ClangStaticAnalyzerOptionsBuilder : public CompilerOptionsBuilder +{ +public: + static QStringList build(const CppTools::ProjectPart::Ptr &projectPart, + CppTools::ProjectFile::Kind fileKind, + unsigned char wordWidth) + { + ClangStaticAnalyzerOptionsBuilder optionsBuilder(projectPart); + optionsBuilder.addLanguageOption(fileKind); + optionsBuilder.addOptionsForLanguage(false); + + // In gcc headers, lots of built-ins are referenced that clang does not understand. + // Therefore, prevent the inclusion of the header that references them. Of course, this + // will break if code actually requires stuff from there, but that should be the less common + // case. + const QString type = projectPart->toolchainType; + if (type == QLatin1String("mingw") || type == QLatin1String("gcc")) + optionsBuilder.addDefine("#define _X86INTRIN_H_INCLUDED\n"); + + optionsBuilder.addToolchainAndProjectDefines(); + optionsBuilder.addHeaderPathOptions(); + + if (projectPart->toolchainType == QLatin1String("msvc")) + optionsBuilder.add(QLatin1String("/EHsc")); // clang-cl does not understand exceptions + else + optionsBuilder.add(QLatin1String("-fPIC")); // TODO: Remove? + + QStringList options = optionsBuilder.options(); + prependWordWidthArgumentIfNotIncluded(&options, wordWidth); + return options; + } + +private: + ClangStaticAnalyzerOptionsBuilder(const CppTools::ProjectPart::Ptr &projectPart) + : CompilerOptionsBuilder(projectPart) + , m_isMsvcToolchain(m_projectPart->toolchainType == QLatin1String("msvc")) + { + } + + void addLanguageOption(ProjectFile::Kind fileKind) override + { + if (m_isMsvcToolchain) + add(createLanguageOptionMsvc(fileKind)); + else + CompilerOptionsBuilder::addLanguageOption(fileKind); + } + + void addOptionsForLanguage(bool checkForBorlandExtensions) override + { + if (m_isMsvcToolchain) + return; + CompilerOptionsBuilder::addOptionsForLanguage(checkForBorlandExtensions); + } + + QString includeOption() const override + { + if (m_isMsvcToolchain) + return QLatin1String("/I"); + return CompilerOptionsBuilder::includeOption(); + } + + QString defineOption() const override + { + if (m_isMsvcToolchain) + return QLatin1String("/D"); + return CompilerOptionsBuilder::defineOption(); + } + + bool excludeDefineLine(const QByteArray &defineLine) const override + { + if (CompilerOptionsBuilder::excludeDefineLine(defineLine)) + return true; + + // gcc 4.9 has: + // #define __has_include(STR) __has_include__(STR) + // #define __has_include_next(STR) __has_include_next__(STR) + // The right-hand sides are gcc built-ins that clang does not understand, and they'd + // override clang's own (non-macro, it seems) definitions of the symbols on the left-hand + // side. + const bool isGccToolchain = m_projectPart->toolchainType == QLatin1String("gcc"); + if (isGccToolchain && defineLine.contains("has_include")) + return true; + + return false; + } + +private: + bool m_isMsvcToolchain; +}; + static AnalyzeUnits unitsToAnalyzeFromCompilerCallData( const ProjectInfo::CompilerCallData &compilerCallData, unsigned char wordWidth) @@ -157,7 +241,6 @@ static AnalyzeUnits unitsToAnalyzeFromCompilerCallData( } static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList<ProjectPart::Ptr> projectParts, - const QString &toolchainType, unsigned char wordWidth) { qCDebug(LOG) << "Taking arguments for analyzing from ProjectParts."; @@ -173,10 +256,8 @@ static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList<ProjectPart::Ptr> continue; QTC_CHECK(file.kind != ProjectFile::Unclassified); if (ProjectFile::isSource(file.kind)) { - const QStringList arguments = argumentsFromProjectPart(projectPart, - file.kind, - toolchainType, - wordWidth); + const QStringList arguments + = ClangStaticAnalyzerOptionsBuilder::build(projectPart, file.kind, wordWidth); unitsToAnalyze << AnalyzeUnit(file.path, arguments); } } @@ -193,7 +274,6 @@ AnalyzeUnits ClangStaticAnalyzerRunControl::sortedUnitsToAnalyze() const ProjectInfo::CompilerCallData compilerCallData = m_projectInfo.compilerCallData(); if (compilerCallData.isEmpty()) { units = unitsToAnalyzeFromProjectParts(m_projectInfo.projectParts(), - m_toolchainType, m_wordWidth); } else { units = unitsToAnalyzeFromCompilerCallData(compilerCallData, m_wordWidth); @@ -219,6 +299,12 @@ static QDebug operator<<(QDebug debug, const AnalyzeUnits &analyzeUnits) return debug; } +static QString toolchainType(ProjectExplorer::RunConfiguration *runConfiguration) +{ + QTC_ASSERT(runConfiguration, return QString()); + return ToolChainKitInformation::toolChain(runConfiguration->target()->kit())->type(); +} + bool ClangStaticAnalyzerRunControl::startEngine() { m_success = false; @@ -231,8 +317,8 @@ bool ClangStaticAnalyzerRunControl::startEngine() // Check clang executable bool isValidClangExecutable; - const QString executable - = clangExecutableFromSettings(m_toolchainType, &isValidClangExecutable); + const QString executable = clangExecutableFromSettings(toolchainType(runConfiguration()), + &isValidClangExecutable); if (!isValidClangExecutable) { const QString errorMessage = tr("Clang Static Analyzer: Invalid executable \"%1\", stop.") .arg(executable); diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h index f9456df30a..f9419e21c3 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h @@ -71,7 +71,6 @@ private: private: const CppTools::ProjectInfo m_projectInfo; - const QString m_toolchainType; const unsigned char m_wordWidth; QString m_clangExecutable; |