From b0a49ca1c1ad6a37bb0f6b4500d6a0625238abb6 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 17 Oct 2016 17:15:15 +0200 Subject: [PATCH] Clang: Fix parsing MSVC's crtdefs.h for 64 Bit ...by specifying the word width, as for the Clang Static Analyzer. This has gone unnoticed so far because it looks like that the error diagnostic from the bug report can be extracted with libclang (as shown in the info bar), but is not printed from libclang or clang.exe itself. Task-number: QTCREATORBUG-17130 Change-Id: Ia7a5ee3825c7211cdf80c2166a9eb454ce48cac1 Reviewed-by: David Schulz Reviewed-by: Christian Kandeler --- src/plugins/clangcodemodel/clangutils.cpp | 1 + .../refactoringcompileroptionsbuilder.cpp | 1 + .../clangstaticanalyzerruncontrol.cpp | 38 ++++++++----------- .../clangstaticanalyzerruncontrol.h | 7 +--- .../cpptools/compileroptionsbuilder.cpp | 8 ++++ src/plugins/cpptools/compileroptionsbuilder.h | 1 + src/plugins/cpptools/projectpart.cpp | 1 + src/plugins/cpptools/projectpart.h | 6 +++ src/plugins/cpptools/projectpartbuilder.cpp | 3 ++ 9 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index ae1e74020e6..943b731d907 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -89,6 +89,7 @@ public: LibClangOptionsBuilder optionsBuilder(*projectPart.data()); + optionsBuilder.addWordWidth(); optionsBuilder.addTargetTriple(); optionsBuilder.addLanguageOption(fileKind); optionsBuilder.addOptionsForLanguage(/*checkForBorlandExtensions*/ true); diff --git a/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp b/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp index 372cf1af150..64feefa576f 100644 --- a/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp +++ b/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp @@ -124,6 +124,7 @@ Utils::SmallStringVector RefactoringCompilerOptionsBuilder::build(CppTools::Proj RefactoringCompilerOptionsBuilder optionsBuilder(projectPart); + optionsBuilder.addWordWidth(); optionsBuilder.addTargetTriple(); optionsBuilder.addLanguageOption(fileKind); optionsBuilder.addOptionsForLanguage(/*checkForBorlandExtensions*/ true); diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index 1ead54a811a..1577db6bec0 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -86,18 +86,18 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl( ToolChain *toolChain = ToolChainKitInformation::toolChain(target->kit(), ToolChain::Language::Cxx); QTC_ASSERT(toolChain, return); - m_extraToolChainInfo.wordWidth = toolChain->targetAbi().wordWidth(); - m_extraToolChainInfo.targetTriple = toolChain->originalTargetTriple(); + m_targetTriple = toolChain->originalTargetTriple(); } -static void prependWordWidthArgumentIfNotIncluded(QStringList *arguments, unsigned char wordWidth) +static void prependWordWidthArgumentIfNotIncluded(QStringList *arguments, + ProjectPart::ToolChainWordWidth wordWidth) { QTC_ASSERT(arguments, return); const QString m64Argument = QLatin1String("-m64"); const QString m32Argument = QLatin1String("-m32"); - const QString argument = wordWidth == 64 ? m64Argument : m32Argument; + const QString argument = wordWidth == ProjectPart::WordWidth64Bit ? m64Argument : m32Argument; if (!arguments->contains(argument)) arguments->prepend(argument); @@ -165,11 +165,11 @@ class ClangStaticAnalyzerOptionsBuilder : public CompilerOptionsBuilder { public: static QStringList build(const CppTools::ProjectPart &projectPart, - CppTools::ProjectFile::Kind fileKind, - const ExtraToolChainInfo &extraParams) + CppTools::ProjectFile::Kind fileKind) { ClangStaticAnalyzerOptionsBuilder optionsBuilder(projectPart); + optionsBuilder.addWordWidth(); optionsBuilder.addTargetTriple(); optionsBuilder.addLanguageOption(fileKind); optionsBuilder.addOptionsForLanguage(false); @@ -195,10 +195,7 @@ public: if (type != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) optionsBuilder.add(QLatin1String("-fPIC")); // TODO: Remove? - QStringList options = optionsBuilder.options(); - prependWordWidthArgumentIfNotIncluded(&options, extraParams.wordWidth); - - return options; + return optionsBuilder.options(); } ClangStaticAnalyzerOptionsBuilder(const CppTools::ProjectPart &projectPart) @@ -325,11 +322,11 @@ static QStringList createHeaderPathsOptionsForClangOnMac(const ProjectPart &proj static QStringList tweakedArguments(const ProjectPart &projectPart, const QString &filePath, const QStringList &arguments, - const ExtraToolChainInfo &extraParams) + const QString &targetTriple) { QStringList newArguments = inputAndOutputArgumentsRemoved(filePath, arguments); - prependWordWidthArgumentIfNotIncluded(&newArguments, extraParams.wordWidth); - prependTargetTripleIfNotIncludedAndNotEmpty(&newArguments, extraParams.targetTriple); + prependWordWidthArgumentIfNotIncluded(&newArguments, projectPart.toolChainWordWidth); + prependTargetTripleIfNotIncludedAndNotEmpty(&newArguments, targetTriple); newArguments.append(createHeaderPathsOptionsForClangOnMac(projectPart)); newArguments.append(createMsCompatibilityVersionOption(projectPart)); newArguments.append(createOptionsToUndefineClangVersionMacrosForMsvc(projectPart)); @@ -341,7 +338,7 @@ static QStringList tweakedArguments(const ProjectPart &projectPart, static AnalyzeUnits unitsToAnalyzeFromCompilerCallData( const QHash &projectFileToProjectPart, const ProjectInfo::CompilerCallData &compilerCallData, - const ExtraToolChainInfo &extraParams) + const QString &targetTriple) { qCDebug(LOG) << "Taking arguments for analyzing from CompilerCallData."; @@ -361,7 +358,7 @@ static AnalyzeUnits unitsToAnalyzeFromCompilerCallData( const QStringList arguments = tweakedArguments(*projectPart, file, options, - extraParams); + targetTriple); unitsToAnalyze << AnalyzeUnit(file, arguments); } } @@ -370,8 +367,7 @@ static AnalyzeUnits unitsToAnalyzeFromCompilerCallData( return unitsToAnalyze; } -static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList projectParts, - const ExtraToolChainInfo &extraParams) +static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList projectParts) { qCDebug(LOG) << "Taking arguments for analyzing from ProjectParts."; @@ -387,9 +383,7 @@ static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList QTC_CHECK(file.kind != ProjectFile::Unclassified); if (ProjectFile::isSource(file.kind)) { const QStringList arguments - = ClangStaticAnalyzerOptionsBuilder::build(*projectPart.data(), - file.kind, - extraParams); + = ClangStaticAnalyzerOptionsBuilder::build(*projectPart.data(), file.kind); unitsToAnalyze << AnalyzeUnit(file.path, arguments); } } @@ -418,13 +412,13 @@ AnalyzeUnits ClangStaticAnalyzerRunControl::sortedUnitsToAnalyze() AnalyzeUnits units; const ProjectInfo::CompilerCallData compilerCallData = m_projectInfo.compilerCallData(); if (compilerCallData.isEmpty()) { - units = unitsToAnalyzeFromProjectParts(m_projectInfo.projectParts(), m_extraToolChainInfo); + units = unitsToAnalyzeFromProjectParts(m_projectInfo.projectParts()); } else { const QHash projectFileToProjectPart = generateProjectFileToProjectPartMapping(m_projectInfo.projectParts()); units = unitsToAnalyzeFromCompilerCallData(projectFileToProjectPart, compilerCallData, - m_extraToolChainInfo); + m_targetTriple); } Utils::sort(units, &AnalyzeUnit::file); diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h index 18deebfcbd3..ce974bac37f 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h @@ -47,11 +47,6 @@ struct AnalyzeUnit { }; typedef QList AnalyzeUnits; -struct ExtraToolChainInfo { - unsigned char wordWidth = 0; - QString targetTriple; -}; - class ClangStaticAnalyzerRunControl : public ProjectExplorer::RunControl { Q_OBJECT @@ -88,7 +83,7 @@ private: private: const CppTools::ProjectInfo m_projectInfo; - ExtraToolChainInfo m_extraToolChainInfo; + QString m_targetTriple; Utils::Environment m_environment; QString m_clangExecutable; diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index f3b89c27f6b..68a2586c0d4 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -87,6 +87,14 @@ void CompilerOptionsBuilder::addDefine(const QByteArray &defineDirective) m_options.append(defineDirectiveToDefineOption(defineDirective)); } +void CompilerOptionsBuilder::addWordWidth() +{ + const QString argument = m_projectPart.toolChainWordWidth == ProjectPart::WordWidth64Bit + ? QLatin1String("-m64") + : QLatin1String("-m32"); + add(argument); +} + void CompilerOptionsBuilder::addTargetTriple() { if (!m_projectPart.targetTriple.isEmpty()) { diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h index a4aec5afdd9..e1ec557d835 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.h +++ b/src/plugins/cpptools/compileroptionsbuilder.h @@ -44,6 +44,7 @@ public: void addDefine(const QByteArray &defineDirective); // Add options based on project part + void addWordWidth(); virtual void addTargetTriple(); virtual void enableExceptions(); void addHeaderPathOptions(); diff --git a/src/plugins/cpptools/projectpart.cpp b/src/plugins/cpptools/projectpart.cpp index 85ea324c9f8..921d981a611 100644 --- a/src/plugins/cpptools/projectpart.cpp +++ b/src/plugins/cpptools/projectpart.cpp @@ -32,6 +32,7 @@ namespace CppTools { ProjectPart::ProjectPart() : project(0) + , toolChainWordWidth(WordWidth32Bit) , isMsvc2015Toolchain(false) , languageVersion(CXX14) , languageExtensions(NoExtensions) diff --git a/src/plugins/cpptools/projectpart.h b/src/plugins/cpptools/projectpart.h index b18a57e1497..ea45720589c 100644 --- a/src/plugins/cpptools/projectpart.h +++ b/src/plugins/cpptools/projectpart.h @@ -81,6 +81,11 @@ public: // Types Qt5 = 2 }; + enum ToolChainWordWidth { + WordWidth32Bit, + WordWidth64Bit, + }; + using Ptr = QSharedPointer; @@ -103,6 +108,7 @@ public: // fields QByteArray projectDefines; QByteArray toolchainDefines; Core::Id toolchainType; + ToolChainWordWidth toolChainWordWidth; bool isMsvc2015Toolchain; QString targetTriple; ProjectPartHeaderPaths headerPaths; diff --git a/src/plugins/cpptools/projectpartbuilder.cpp b/src/plugins/cpptools/projectpartbuilder.cpp index b01795f9cf2..98169f7d230 100644 --- a/src/plugins/cpptools/projectpartbuilder.cpp +++ b/src/plugins/cpptools/projectpartbuilder.cpp @@ -343,6 +343,9 @@ void ProjectPartBuilder::evaluateProjectPartToolchain( projectPart->toolchainType = toolChain->typeId(); projectPart->isMsvc2015Toolchain = toolChain->targetAbi().osFlavor() == ProjectExplorer::Abi::WindowsMsvc2015Flavor; + projectPart->toolChainWordWidth = toolChain->targetAbi().wordWidth() == 64 + ? ProjectPart::WordWidth64Bit + : ProjectPart::WordWidth32Bit; projectPart->targetTriple = targetTriple(projectPart->project, toolChain->typeId()); projectPart->updateLanguageFeatures(); }