Utils: Make Utils::is64BitWindowsBinary operate on FilePaths

Change-Id: I8ef840219bc93f77f5a55e38013facf892de759d
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
hjk
2021-11-09 18:45:07 +01:00
parent a3ae60d729
commit aac740f127
7 changed files with 37 additions and 37 deletions

View File

@@ -24,6 +24,8 @@
****************************************************************************/
#include "winutils.h"
#include "filepath.h"
#include "qtcassert.h"
#ifdef Q_OS_WIN
@@ -152,16 +154,16 @@ QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem()
#endif
}
QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const QString &binaryIn)
QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const FilePath &binaryIn)
{
QTC_ASSERT(!binaryIn.isEmpty(), return false);
QTC_ASSERT(!binaryIn.isEmpty() && !binaryIn.needsDevice(), return false);
#ifdef Q_OS_WIN32
# ifdef __GNUC__ // MinGW lacking some definitions/winbase.h
# define SCS_64BIT_BINARY 6
# endif
bool isAmd64 = false;
DWORD binaryType = 0;
const QString binary = QDir::toNativeSeparators(binaryIn);
const QString binary = binaryIn.deviceLocalPath();
bool success = GetBinaryTypeW(reinterpret_cast<const TCHAR*>(binary.utf16()), &binaryType) != 0;
if (success && binaryType == SCS_64BIT_BINARY)
isAmd64=true;

View File

@@ -29,6 +29,8 @@
namespace Utils {
class FilePath;
// Helper to format a Windows error message, taking the
// code as returned by the GetLastError()-API.
QTCREATOR_UTILS_EXPORT QString winErrorMessage(unsigned long error);
@@ -42,7 +44,7 @@ QTCREATOR_UTILS_EXPORT QString winGetDLLVersion(WinDLLVersionType t,
QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem();
// Check for a 64bit binary.
QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const QString &binary);
QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const FilePath &binary);
// Get the path to the executable for a given PID.
QTCREATOR_UTILS_EXPORT QString imageName(quint32 processId);

View File

@@ -352,7 +352,7 @@ void CdbEngine::setupEngine()
return;
}
bool cdbIs64Bit = Utils::is64BitWindowsBinary(sp.debugger.command.executable().toString());
bool cdbIs64Bit = Utils::is64BitWindowsBinary(sp.debugger.command.executable());
if (!cdbIs64Bit)
m_wow64State = noWow64Stack;
const QFileInfo extensionFi(CdbEngine::extensionLibraryName(cdbIs64Bit));

View File

@@ -495,8 +495,8 @@ void DebuggerRunTool::start()
return;
if (m_runParameters.cppEngineType == CdbEngineType
&& Utils::is64BitWindowsBinary(m_runParameters.inferior.command.executable().toString())
&& !Utils::is64BitWindowsBinary(m_runParameters.debugger.command.executable().toString())) {
&& Utils::is64BitWindowsBinary(m_runParameters.inferior.command.executable())
&& !Utils::is64BitWindowsBinary(m_runParameters.debugger.command.executable())) {
reportFailure(
DebuggerPlugin::tr(
"%1 is a 64 bit executable which can not be debugged by a 32 bit Debugger.\n"

View File

@@ -126,7 +126,7 @@ void DesktopProcessSignalOperation::interruptProcessSilently(qint64 pid)
bool is64BitSystem = Utils::is64BitWindowsSystem();
SpecialInterrupt si = NoSpecialInterrupt;
if (is64BitSystem)
si = Utils::is64BitWindowsBinary(m_debuggerCommand.path()) ? Win64Interrupt : Win32Interrupt;
si = Utils::is64BitWindowsBinary(m_debuggerCommand) ? Win64Interrupt : Win32Interrupt;
/*
Windows 64 bit has a 32 bit subsystem (WOW64) which makes it possible to run a
32 bit application inside a 64 bit environment.
@@ -167,7 +167,8 @@ GDB 32bit | Api | Api | N/A | Win32
+ Utils::winErrorMessage(GetLastError()));
break;
}
bool creatorIs64Bit = Utils::is64BitWindowsBinary(QCoreApplication::applicationFilePath());
bool creatorIs64Bit = Utils::is64BitWindowsBinary(
Utils::FilePath::fromUserInput(QCoreApplication::applicationFilePath()));
if (!is64BitSystem
|| si == NoSpecialInterrupt
|| (si == Win64Interrupt && creatorIs64Bit)

View File

@@ -1521,9 +1521,9 @@ void ClangClToolChainConfigWidget::setFromClangClToolChain()
const auto *clangClToolChain = static_cast<const ClangClToolChain *>(toolChain());
if (clangClToolChain->isAutoDetected())
m_llvmDirLabel->setText(QDir::toNativeSeparators(clangClToolChain->clangPath()));
m_llvmDirLabel->setText(clangClToolChain->clangPath().toUserOutput());
else
m_compilerCommand->setFilePath(Utils::FilePath::fromString(clangClToolChain->clangPath()));
m_compilerCommand->setFilePath(clangClToolChain->clangPath());
}
static const MsvcToolChain *findMsvcToolChain(unsigned char wordWidth, Abi::OSFlavor flavor)
@@ -1543,10 +1543,10 @@ static const MsvcToolChain *findMsvcToolChain(const QString &displayedVarsBat)
});
}
static QVersionNumber clangClVersion(const QString &clangClPath)
static QVersionNumber clangClVersion(const FilePath &clangClPath)
{
QtcProcess clangClProcess;
clangClProcess.setCommand({FilePath::fromString(clangClPath), {"--version"}});
clangClProcess.setCommand({clangClPath, {"--version"}});
clangClProcess.runBlocking();
if (clangClProcess.result() != QtcProcess::FinishedWithSuccess)
return {};
@@ -1559,7 +1559,7 @@ static QVersionNumber clangClVersion(const QString &clangClPath)
}
static const MsvcToolChain *selectMsvcToolChain(const QString &displayedVarsBat,
const QString &clangClPath,
const FilePath &clangClPath,
unsigned char wordWidth)
{
const MsvcToolChain *toolChain = nullptr;
@@ -1584,7 +1584,7 @@ static const MsvcToolChain *selectMsvcToolChain(const QString &displayedVarsBat,
return toolChain;
}
static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPath,
static QList<ToolChain *> detectClangClToolChainInPath(const FilePath &clangClPath,
const QList<ToolChain *> &alreadyKnown,
const QString &displayedVarsBat,
bool isDefault = false)
@@ -1595,7 +1595,7 @@ static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPat
if (!toolChain) {
qWarning("Unable to find a suitable MSVC version for \"%s\".",
qPrintable(QDir::toNativeSeparators(clangClPath)));
qPrintable(clangClPath.toUserOutput()));
return res;
}
@@ -1615,7 +1615,7 @@ static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPat
if (tc->language() != language)
return false;
return systemEnvironment.isSameExecutable(tc->compilerCommand().toString(),
clangClPath);
clangClPath.toString());
}));
if (tc) {
res << tc;
@@ -1632,16 +1632,11 @@ static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPat
return res;
}
static QString compilerFromPath(const QString &path)
{
return path + "/bin/clang-cl.exe";
}
void ClangClToolChainConfigWidget::applyImpl()
{
Utils::FilePath clangClPath = m_compilerCommand->filePath();
auto clangClToolChain = static_cast<ClangClToolChain *>(toolChain());
clangClToolChain->setClangPath(clangClPath.toString());
clangClToolChain->setClangPath(clangClPath);
if (clangClPath.fileName() != "clang-cl.exe") {
clangClToolChain->resetVarsBat();
@@ -1650,7 +1645,7 @@ void ClangClToolChainConfigWidget::applyImpl()
}
const QString displayedVarsBat = m_varsBatDisplayCombo->currentText();
QList<ToolChain *> results = detectClangClToolChainInPath(clangClPath.toString(),
QList<ToolChain *> results = detectClangClToolChainInPath(clangClPath,
{},
displayedVarsBat);
@@ -1694,19 +1689,19 @@ ClangClToolChain::ClangClToolChain()
bool ClangClToolChain::isValid() const
{
const QFileInfo fi(clangPath());
return MsvcToolChain::isValid() && fi.exists() && fi.fileName() == "clang-cl.exe";
const FilePath clang = clangPath();
return MsvcToolChain::isValid() && clang.exists() && clang.fileName() == "clang-cl.exe";
}
void ClangClToolChain::addToEnvironment(Utils::Environment &env) const
{
MsvcToolChain::addToEnvironment(env);
env.prependOrSetPath(FilePath::fromString(m_clangPath).parentDir()); // bin folder
env.prependOrSetPath(m_clangPath.parentDir()); // bin folder
}
Utils::FilePath ClangClToolChain::compilerCommand() const
{
return Utils::FilePath::fromString(m_clangPath);
return m_clangPath;
}
QStringList ClangClToolChain::suggestedMkspecList() const
@@ -1728,7 +1723,7 @@ static inline QString llvmDirKey()
QVariantMap ClangClToolChain::toMap() const
{
QVariantMap result = MsvcToolChain::toMap();
result.insert(llvmDirKey(), m_clangPath);
result.insert(llvmDirKey(), m_clangPath.toString());
return result;
}
@@ -1739,7 +1734,7 @@ bool ClangClToolChain::fromMap(const QVariantMap &data)
const QString clangPath = data.value(llvmDirKey()).toString();
if (clangPath.isEmpty())
return false;
m_clangPath = clangPath;
m_clangPath = FilePath::fromString(clangPath);
return true;
}
@@ -2034,15 +2029,15 @@ QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
FilePath qtCreatorsClang = Core::ICore::clangExecutable(CLANG_BINDIR);
if (!qtCreatorsClang.isEmpty()) {
qtCreatorsClang = qtCreatorsClang.parentDir().pathAppended("clang-cl.exe");
results.append(detectClangClToolChainInPath(qtCreatorsClang.toString(),
results.append(detectClangClToolChainInPath(qtCreatorsClang,
alreadyKnown, "", true));
known.append(results);
}
const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat);
if (registry.status() == QSettings::NoError) {
const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString());
const QString clangClPath = compilerFromPath(path);
const FilePath path = FilePath::fromUserInput(registry.value(QStringLiteral(".")).toString());
const FilePath clangClPath = path / "bin/clang-cl.exe";
if (!path.isEmpty()) {
results.append(detectClangClToolChainInPath(clangClPath, known, ""));
known.append(results);
@@ -2052,7 +2047,7 @@ QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment();
const Utils::FilePath clangClPath = systemEnvironment.searchInPath("clang-cl");
if (!clangClPath.isEmpty())
results.append(detectClangClToolChainInPath(clangClPath.toString(), known, ""));
results.append(detectClangClToolChainInPath(clangClPath, known, ""));
return results;
}

View File

@@ -178,8 +178,8 @@ public:
const Utils::Environment &env) const override;
const QList<MsvcToolChain *> &msvcToolchains() const;
QString clangPath() const { return m_clangPath; }
void setClangPath(const QString &path) { m_clangPath = path; }
Utils::FilePath clangPath() const { return m_clangPath; }
void setClangPath(const Utils::FilePath &path) { m_clangPath = path; }
Macros msvcPredefinedMacros(const QStringList &cxxflags,
const Utils::Environment &env) const override;
@@ -192,7 +192,7 @@ public:
int priority() const override;
private:
QString m_clangPath;
Utils::FilePath m_clangPath;
};
// --------------------------------------------------------------------------