diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index ae1e74020e679fd11452989db0f7717aee0cea4c..943b731d907e4f74f76146aa12fe2ff5029aee67 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 372cf1af1502b14dc9fd283a099eb59da09721d4..64feefa576f5998ab5d8dec2881646dfc4ed7a7f 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 1ead54a811a4cd47a5fecb649aaa1b7c9b93b334..1577db6bec08c9709723fc9ed04215b490d8e73d 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<QString, ProjectPart::Ptr> &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<ProjectPart::Ptr> projectParts, - const ExtraToolChainInfo &extraParams) +static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList<ProjectPart::Ptr> projectParts) { qCDebug(LOG) << "Taking arguments for analyzing from ProjectParts."; @@ -387,9 +383,7 @@ static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList<ProjectPart::Ptr> 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<QString, ProjectPart::Ptr> 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 18deebfcbd311f80508101b7de1257960538b8f9..ce974bac37f6d005f9307520727624c9abba3d26 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h @@ -47,11 +47,6 @@ struct AnalyzeUnit { }; typedef QList<AnalyzeUnit> 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 f3b89c27f6b314ac7654ecea61a970987629d303..68a2586c0d4e0e39d1eef4ceb1065505701a8ea9 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 a4aec5afdd922ee50fa8e4eb8923994d21e7bcda..e1ec557d835dee51379fcf85bcc97d6b7967fa37 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 85ea324c9f87c41fdfe80f055aa54eef43affb68..921d981a61154aa0025971428031a4ee6a5b9a22 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 b18a57e1497e538bcbae2dce3538455eca1b4195..ea45720589ca63bcedc6de853225be488ffb1aa2 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<ProjectPart>; @@ -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 b01795f9cf276ae35c271e5720d667f961f52343..98169f7d230c1653905c68034c18ae82da36afbe 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(); }