summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-06-26 13:53:50 +0200
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-06-29 12:15:02 +0300
commitfafb0cb8d46b9a1515d3913129785428e599fd80 (patch)
tree61d0b7283a0a62f736ed62b047dab9a3c0c94099
parentc26e6e398bc3e924b7dddb4e48b7c379f8a9b539 (diff)
downloadqt-creator-fafb0cb8d46b9a1515d3913129785428e599fd80.tar.gz
Adapt to upstream API change in CompilerOptionsBuilder II
Change-Id: I196b69846e22136773cf3cbf463a413d840dc4d2 Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp142
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h1
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;