aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2022-10-07 18:00:36 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2022-10-14 12:30:14 +0000
commit679a726330fdf1d1f122320872f9f033d894799e (patch)
tree17b6fd7c99632d6c0827408ca4fb556800883cea /src/plugins
parent183dfb48a71c6bf606cd401aa06c4ccd66e9ef36 (diff)
C++ support: Consider project-specific target triple
... before creating project parts. Otherwise we can get wrong includes and defines from the compiler. Amends 9c86e6746fb82d6244cc2fc565d5f730c67f8106. Also do not add -m32 or -m64 for non-x86 targets. Task-number: QTCREATORBUG-25615 Change-Id: I02da9251c77d45fc8827990a2d59c3ae2c262591 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Christian Stenger <christian.stenger@qt.io> Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/clangcodemodel/clangutils.cpp5
-rw-r--r--src/plugins/cppeditor/compileroptionsbuilder.cpp4
-rw-r--r--src/plugins/cppeditor/compileroptionsbuilder_test.cpp6
-rw-r--r--src/plugins/cppeditor/cppcodemodelinspectordialog.cpp2
-rw-r--r--src/plugins/cppeditor/cppcodemodelinspectordumper.cpp12
-rw-r--r--src/plugins/cppeditor/cppcodemodelinspectordumper.h2
-rw-r--r--src/plugins/cppeditor/cppprojectinfogenerator.cpp21
-rw-r--r--src/plugins/cppeditor/projectpart.cpp3
-rw-r--r--src/plugins/cppeditor/projectpart.h7
-rw-r--r--src/plugins/projectexplorer/rawprojectpart.cpp2
-rw-r--r--src/plugins/projectexplorer/rawprojectpart.h2
11 files changed, 43 insertions, 23 deletions
diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp
index a50d7ec9b31..fc7c174cbda 100644
--- a/src/plugins/clangcodemodel/clangutils.cpp
+++ b/src/plugins/clangcodemodel/clangutils.cpp
@@ -78,9 +78,8 @@ static QStringList projectPartArguments(const ProjectPart &projectPart)
args << "-c";
if (projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) {
args << "--target=" + projectPart.toolChainTargetTriple;
- args << (projectPart.toolChainWordWidth == ProjectPart::WordWidth64Bit
- ? QLatin1String("-m64")
- : QLatin1String("-m32"));
+ if (projectPart.toolChainAbi.architecture() == Abi::X86Architecture)
+ args << QLatin1String(projectPart.toolChainAbi.wordWidth() == 64 ? "-m64" : "-m32");
}
args << projectPart.compilerFlags;
for (const ProjectExplorer::HeaderPath &headerPath : projectPart.headerPaths) {
diff --git a/src/plugins/cppeditor/compileroptionsbuilder.cpp b/src/plugins/cppeditor/compileroptionsbuilder.cpp
index a1b151de2a2..def318acb4e 100644
--- a/src/plugins/cppeditor/compileroptionsbuilder.cpp
+++ b/src/plugins/cppeditor/compileroptionsbuilder.cpp
@@ -227,7 +227,9 @@ QStringList createLanguageOptionGcc(ProjectFile::Kind fileKind, bool objcExt)
void CompilerOptionsBuilder::addWordWidth()
{
- const QString argument = m_projectPart.toolChainWordWidth == ProjectPart::WordWidth64Bit
+ if (m_projectPart.toolChainAbi.architecture() != Abi::X86Architecture)
+ return;
+ const QString argument = m_projectPart.toolChainAbi.wordWidth() == 64
? QLatin1String("-m64")
: QLatin1String("-m32");
add(argument);
diff --git a/src/plugins/cppeditor/compileroptionsbuilder_test.cpp b/src/plugins/cppeditor/compileroptionsbuilder_test.cpp
index 2bc07375842..f4d84e4e03b 100644
--- a/src/plugins/cppeditor/compileroptionsbuilder_test.cpp
+++ b/src/plugins/cppeditor/compileroptionsbuilder_test.cpp
@@ -37,8 +37,12 @@ public:
rpp.setConfigFileName(projectConfigFile);
ToolChainInfo tcInfo;
tcInfo.type = toolchainType;
- tcInfo.wordWidth = 64;
tcInfo.targetTriple = targetTriple;
+ tcInfo.abi = Abi::fromString(targetTriple);
+ if (!tcInfo.abi.isValid()) {
+ tcInfo.abi = Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::FreeBsdFlavor,
+ Abi::MachOFormat, 64);
+ }
tcInfo.isMsvc2015ToolChain = isMsvc2015;
tcInfo.extraCodeModelFlags = extraFlags;
tcInfo.macroInspectionRunner = [this](const QStringList &) {
diff --git a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
index f17f5c1f62f..0b5006e6bff 100644
--- a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
+++ b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
@@ -1789,7 +1789,7 @@ void CppCodeModelInspectorDialog::updateProjectPartData(const ProjectPart::Const
{QString::fromLatin1("Build Target Type"), CMI::Utils::toString(part->buildTargetType)},
{QString::fromLatin1("ToolChain Type"), part->toolchainType.toString()},
{QString::fromLatin1("ToolChain Target Triple"), part->toolChainTargetTriple},
- {QString::fromLatin1("ToolChain Word Width"), CMI::Utils::toString(part->toolChainWordWidth)},
+ {QString::fromLatin1("ToolChain Word Width"), CMI::Utils::toString(part->toolChainAbi.wordWidth())},
{QString::fromLatin1("ToolChain Install Dir"), part->toolChainInstallDir.toString()},
{QString::fromLatin1("Language Version"), CMI::Utils::toString(part->languageVersion)},
{QString::fromLatin1("Language Extensions"), CMI::Utils::toString(part->languageExtensions)},
diff --git a/src/plugins/cppeditor/cppcodemodelinspectordumper.cpp b/src/plugins/cppeditor/cppcodemodelinspectordumper.cpp
index 6b4429574e8..b82c2a03e11 100644
--- a/src/plugins/cppeditor/cppcodemodelinspectordumper.cpp
+++ b/src/plugins/cppeditor/cppcodemodelinspectordumper.cpp
@@ -373,15 +373,15 @@ QString Utils::toString(CPlusPlus::Kind kind)
return QString();
}
-QString Utils::toString(ProjectPart::ToolChainWordWidth width)
+QString Utils::toString(const ProjectExplorer::Abi &abi)
{
- switch (width) {
- case ProjectPart::ToolChainWordWidth::WordWidth32Bit:
+ switch (abi.wordWidth()) {
+ case 32:
return QString("32");
- case ProjectPart::ToolChainWordWidth::WordWidth64Bit:
+ case 64:
return QString("64");
}
- return QString();
+ return QString("??");
}
QString Utils::partsForFile(const QString &fileName)
@@ -508,7 +508,7 @@ void Dumper::dumpProjectInfos(const QList<ProjectInfo::ConstPtr> &projectInfos)
m_out << i3 << "Project File : " << projectFilePath << "\n";
m_out << i3 << "ToolChain Type : " << part->toolchainType.toString() << "\n";
m_out << i3 << "ToolChain Target Triple: " << part->toolChainTargetTriple << "\n";
- m_out << i3 << "ToolChain Word Width : " << part->toolChainWordWidth << "\n";
+ m_out << i3 << "ToolChain Word Width : " << part->toolChainAbi.wordWidth() << "\n";
m_out << i3 << "ToolChain Install Dir : " << part->toolChainInstallDir << "\n";
m_out << i3 << "Compiler Flags : " << part->compilerFlags.join(", ") << "\n";
m_out << i3 << "Selected For Building : " << part->selectedForBuilding << "\n";
diff --git a/src/plugins/cppeditor/cppcodemodelinspectordumper.h b/src/plugins/cppeditor/cppcodemodelinspectordumper.h
index 9474988af0c..872c868fee0 100644
--- a/src/plugins/cppeditor/cppcodemodelinspectordumper.h
+++ b/src/plugins/cppeditor/cppcodemodelinspectordumper.h
@@ -32,7 +32,7 @@ struct Utils
static QString toString(const QVector<ProjectFile> &projectFiles);
static QString toString(ProjectFile::Kind kind);
static QString toString(CPlusPlus::Kind kind);
- static QString toString(ProjectPart::ToolChainWordWidth width);
+ static QString toString(const ProjectExplorer::Abi &abi);
static QString partsForFile(const QString &fileName);
static QString unresolvedFileNameWithDelimiters(const CPlusPlus::Document::Include &include);
static QString pathListToString(const QStringList &pathList);
diff --git a/src/plugins/cppeditor/cppprojectinfogenerator.cpp b/src/plugins/cppeditor/cppprojectinfogenerator.cpp
index 629f44c43a1..2e5c068bd77 100644
--- a/src/plugins/cppeditor/cppprojectinfogenerator.cpp
+++ b/src/plugins/cppeditor/cppprojectinfogenerator.cpp
@@ -137,6 +137,27 @@ ProjectPart::ConstPtr ProjectInfoGenerator::createProjectPart(
tcInfo = m_projectUpdateInfo.cxxToolChainInfo;
}
+ QString explicitTarget;
+ if (!tcInfo.targetTripleIsAuthoritative) {
+ for (int i = 0; i < flags.commandLineFlags.size(); ++i) {
+ const QString &flag = flags.commandLineFlags.at(i);
+ if (flag == "-target") {
+ if (i + 1 < flags.commandLineFlags.size())
+ explicitTarget = flags.commandLineFlags.at(i + 1);
+ break;
+ } else if (flag.startsWith("--target=")) {
+ explicitTarget = flag.mid(9);
+ break;
+ }
+ }
+ }
+ if (!explicitTarget.isEmpty()) {
+ tcInfo.targetTriple = explicitTarget;
+ tcInfo.targetTripleIsAuthoritative = true;
+ if (const Abi abi = Abi::fromString(tcInfo.targetTriple); abi.isValid())
+ tcInfo.abi = abi;
+ }
+
return ProjectPart::create(projectFilePath, rawProjectPart, partName, projectFiles,
language, languageExtensions, flags, tcInfo);
}
diff --git a/src/plugins/cppeditor/projectpart.cpp b/src/plugins/cppeditor/projectpart.cpp
index 464c138cc8b..a315b621b8b 100644
--- a/src/plugins/cppeditor/projectpart.cpp
+++ b/src/plugins/cppeditor/projectpart.cpp
@@ -145,8 +145,7 @@ ProjectPart::ProjectPart(const Utils::FilePath &topLevelProject,
isMsvc2015Toolchain(tcInfo.isMsvc2015ToolChain),
toolChainTargetTriple(tcInfo.targetTriple),
targetTripleIsAuthoritative(tcInfo.targetTripleIsAuthoritative),
- toolChainWordWidth(tcInfo.wordWidth == 64 ? ProjectPart::WordWidth64Bit
- : ProjectPart::WordWidth32Bit),
+ toolChainAbi(tcInfo.abi),
toolChainInstallDir(tcInfo.installDir),
compilerFilePath(tcInfo.compilerFilePath),
warningFlags(flags.warningFlags),
diff --git a/src/plugins/cppeditor/projectpart.h b/src/plugins/cppeditor/projectpart.h
index 6f99dcf6d7e..4845d796a25 100644
--- a/src/plugins/cppeditor/projectpart.h
+++ b/src/plugins/cppeditor/projectpart.h
@@ -28,11 +28,6 @@ namespace CppEditor {
class CPPEDITOR_EXPORT ProjectPart
{
public:
- enum ToolChainWordWidth {
- WordWidth32Bit,
- WordWidth64Bit,
- };
-
using ConstPtr = QSharedPointer<const ProjectPart>;
public:
@@ -94,7 +89,7 @@ public:
const bool isMsvc2015Toolchain = false;
const QString toolChainTargetTriple;
const bool targetTripleIsAuthoritative;
- const ToolChainWordWidth toolChainWordWidth = WordWidth32Bit;
+ const ProjectExplorer::Abi toolChainAbi = ProjectExplorer::Abi::hostAbi();
const Utils::FilePath toolChainInstallDir;
const Utils::FilePath compilerFilePath;
const Utils::WarningFlags warningFlags = Utils::WarningFlags::Default;
diff --git a/src/plugins/projectexplorer/rawprojectpart.cpp b/src/plugins/projectexplorer/rawprojectpart.cpp
index 1f7cea32c96..673a19e859c 100644
--- a/src/plugins/projectexplorer/rawprojectpart.cpp
+++ b/src/plugins/projectexplorer/rawprojectpart.cpp
@@ -160,7 +160,7 @@ ToolChainInfo::ToolChainInfo(const ToolChain *toolChain,
// Keep the following cheap/non-blocking for the ui thread...
type = toolChain->typeId();
isMsvc2015ToolChain = toolChain->targetAbi().osFlavor() == Abi::WindowsMsvc2015Flavor;
- wordWidth = toolChain->targetAbi().wordWidth();
+ abi = toolChain->targetAbi();
targetTriple = toolChain->effectiveCodeModelTargetTriple();
targetTripleIsAuthoritative = !toolChain->explicitCodeModelTargetTriple().isEmpty();
extraCodeModelFlags = toolChain->extraCodeModelFlags();
diff --git a/src/plugins/projectexplorer/rawprojectpart.h b/src/plugins/projectexplorer/rawprojectpart.h
index e1895869294..6b06cdc6d82 100644
--- a/src/plugins/projectexplorer/rawprojectpart.h
+++ b/src/plugins/projectexplorer/rawprojectpart.h
@@ -141,7 +141,7 @@ public:
Utils::Id type;
bool isMsvc2015ToolChain = false;
bool targetTripleIsAuthoritative = false;
- unsigned wordWidth = 0;
+ Abi abi;
QString targetTriple;
Utils::FilePath compilerFilePath;
Utils::FilePath installDir;