Perf: FilePathify PerfDataReader

Change-Id: I253cfd3724a15d40ef39dafd4f4497ca331ad596
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
hjk
2022-12-13 08:11:32 +01:00
parent 371e674967
commit ea36472dce
6 changed files with 67 additions and 53 deletions

View File

@@ -35,6 +35,7 @@
#include <QtEndian>
using namespace ProjectExplorer;
using namespace Utils;
namespace PerfProfiler {
namespace Internal {
@@ -125,20 +126,25 @@ PerfDataReader::~PerfDataReader()
qDeleteAll(m_buffer);
}
void PerfDataReader::loadFromFile(const QString &filePath, const QString &executableDirPath,
ProjectExplorer::Kit *kit)
void PerfDataReader::loadFromFile(const FilePath &filePath, const QString &executableDirPath,
Kit *kit)
{
createParser(collectArguments(executableDirPath, kit) << QLatin1String("--input") << filePath);
CommandLine cmd{findPerfParser()};
collectArguments(&cmd, executableDirPath, kit);
cmd.addArg("--input");
cmd.addArg(filePath.nativePath());
createParser(cmd);
m_remoteProcessStart = 0; // Don't try to guess the timestamps
m_input.start(QIODevice::ReadOnly);
}
void PerfDataReader::createParser(const QStringList &arguments)
void PerfDataReader::createParser(const CommandLine &cmd)
{
clear();
QString program = findPerfParser();
const QString program = cmd.executable().path();
m_input.setProgram(program);
m_input.setArguments(arguments);
m_input.setArguments(cmd.splitArguments());
m_input.setWorkingDirectory(QFileInfo(program).dir().absolutePath());
}
@@ -269,35 +275,39 @@ bool PerfDataReader::acceptsSamples() const
return m_recording;
}
QStringList PerfDataReader::collectArguments(const QString &executableDirPath, const Kit *kit) const
void PerfDataReader::collectArguments(CommandLine *cmd, const QString &exe, const Kit *kit) const
{
QStringList arguments;
if (!executableDirPath.isEmpty())
arguments << "--app" << executableDirPath;
if (!exe.isEmpty()) {
cmd->addArg("--app");
cmd->addArg(exe);
}
if (QtSupport::QtVersion *qt = QtSupport::QtKitAspect::qtVersion(kit)) {
arguments << "--extra" << QString("%1%5%2%5%3%5%4")
.arg(QDir::toNativeSeparators(qt->libraryPath().toString()))
.arg(QDir::toNativeSeparators(qt->pluginPath().toString()))
.arg(QDir::toNativeSeparators(qt->hostBinPath().toString()))
.arg(QDir::toNativeSeparators(qt->qmlPath().toString()))
.arg(QDir::listSeparator());
cmd->addArg("--extra");
cmd->addArg(QString("%1%5%2%5%3%5%4")
.arg(qt->libraryPath().nativePath())
.arg(qt->pluginPath().nativePath())
.arg(qt->hostBinPath().nativePath())
.arg(qt->qmlPath().nativePath())
.arg(cmd->executable().osType() == OsTypeWindows ? u';' : u':'));
}
if (auto toolChain = ToolChainKitAspect::cxxToolChain(kit)) {
Abi::Architecture architecture = toolChain->targetAbi().architecture();
if (architecture == Abi::ArmArchitecture && toolChain->targetAbi().wordWidth() == 64) {
arguments << "--arch" << "aarch64";
cmd->addArg("--arch");
cmd->addArg("aarch64");
} else if (architecture != Abi::UnknownArchitecture) {
arguments << "--arch" << Abi::toString(architecture);
cmd->addArg("--arch");
cmd->addArg(Abi::toString(architecture));
}
}
QString sysroot = SysRootKitAspect::sysRoot(kit).toString();
if (!sysroot.isEmpty())
arguments << "--sysroot" << sysroot;
return arguments;
const FilePath sysroot = SysRootKitAspect::sysRoot(kit);
if (!sysroot.isEmpty()) {
cmd->addArg("--sysroot");
cmd->addArg(sysroot.nativePath());
}
}
static bool checkedWrite(QIODevice *device, const QByteArray &input)
@@ -372,21 +382,21 @@ bool PerfDataReader::feedParser(const QByteArray &input)
return true;
}
QStringList PerfDataReader::findTargetArguments(const ProjectExplorer::RunControl *runControl) const
void PerfDataReader::addTargetArguments(CommandLine *cmd, const RunControl *runControl) const
{
ProjectExplorer::Kit *kit = runControl->kit();
QTC_ASSERT(kit, return QStringList());
QTC_ASSERT(kit, return);
ProjectExplorer::BuildConfiguration *buildConfig = runControl->target()->activeBuildConfiguration();
QString buildDir = buildConfig ? buildConfig->buildDirectory().toString() : QString();
return collectArguments(buildDir, kit);
collectArguments(cmd, buildDir, kit);
}
QString PerfDataReader::findPerfParser()
FilePath findPerfParser()
{
QString filePath = Utils::qtcEnvironmentVariable("PERFPROFILER_PARSER_FILEPATH");
FilePath filePath = FilePath::fromUserInput(qtcEnvironmentVariable("PERFPROFILER_PARSER_FILEPATH"));
if (filePath.isEmpty())
filePath = Core::ICore::libexecPath("perfparser" QTC_HOST_EXE_SUFFIX).toString();
return QDir::toNativeSeparators(QDir::cleanPath(filePath));
filePath = Core::ICore::libexecPath("perfparser" QTC_HOST_EXE_SUFFIX);
return filePath;
}
} // namespace Internal

View File

@@ -19,6 +19,8 @@ class RunControl;
namespace PerfProfiler {
namespace Internal {
Utils::FilePath findPerfParser();
class PerfDataReader : public PerfProfilerTraceFile
{
Q_OBJECT
@@ -26,14 +28,14 @@ public:
explicit PerfDataReader(QObject *parent = nullptr);
~PerfDataReader() override;
void loadFromFile(const QString &filePath, const QString &executableDirPath,
void loadFromFile(const Utils::FilePath &filePath, const QString &executableDirPath,
ProjectExplorer::Kit *kit);
void createParser(const QStringList &arguments);
void createParser(const Utils::CommandLine &arguments);
void startParser();
void stopParser();
QStringList findTargetArguments(const ProjectExplorer::RunControl *runControl) const;
void addTargetArguments(Utils::CommandLine *cmd, const ProjectExplorer::RunControl *runControl) const;
void clear();
bool feedParser(const QByteArray &input);
@@ -63,7 +65,8 @@ protected:
private:
static const int s_maxBufferSize = 1 << 29;
QStringList collectArguments(const QString &executableDirPath,
void collectArguments(Utils::CommandLine *cmd,
const QString &executableDirPath,
const ProjectExplorer::Kit *kit) const;
void writeChunk();
@@ -77,7 +80,6 @@ private:
qint64 m_remoteProcessStart;
qint64 m_lastRemoteTimestamp;
static QString findPerfParser();
qint64 delay(qint64 currentTime);
};

View File

@@ -60,13 +60,14 @@ public:
void start() override
{
QStringList args = m_reader.findTargetArguments(runControl());
CommandLine cmd{findPerfParser()};
m_reader.addTargetArguments(&cmd, runControl());
QUrl url = runControl()->property("PerfConnection").toUrl();
if (url.isValid()) {
args.append(QStringList{"--host", url.host(), "--port", QString::number(url.port())});
cmd.addArgs({"--host", url.host(), "--port", QString::number(url.port())});
}
appendMessage("PerfParser args: " + args.join(' '), Utils::NormalMessageFormat);
m_reader.createParser(args);
appendMessage("PerfParser args: " + cmd.arguments(), NormalMessageFormat);
m_reader.createParser(cmd);
m_reader.startParser();
}

View File

@@ -593,7 +593,7 @@ void PerfProfilerTool::showLoadPerfDialog()
m_fileFinder.setAdditionalSearchDirectories(collectQtIncludePaths(kit));
m_fileFinder.setSysroot(sysroot(kit));
m_fileFinder.setProjectFiles(sourceFiles());
m_traceManager->loadFromPerfData(dlg.traceFilePath(), dlg.executableDirPath(), kit);
m_traceManager->loadFromPerfData(FilePath::fromUserInput(dlg.traceFilePath()), dlg.executableDirPath(), kit);
}
void PerfProfilerTool::showLoadTraceDialog()
@@ -612,7 +612,7 @@ void PerfProfilerTool::showLoadTraceDialog()
const Kit *kit = target ? target->kit() : nullptr;
populateFileFinder(currentProject, kit);
m_traceManager->loadFromTraceFile(filePath.toString());
m_traceManager->loadFromTraceFile(filePath);
}
void PerfProfilerTool::showSaveTraceDialog()
@@ -627,7 +627,7 @@ void PerfProfilerTool::showSaveTraceDialog()
filePath = filePath.stringAppended(".ptq");
setToolActionsEnabled(false);
m_traceManager->saveToTraceFile(filePath.toString());
m_traceManager->saveToTraceFile(filePath);
}
void PerfProfilerTool::setAggregated(bool aggregated)

View File

@@ -12,9 +12,10 @@
#include <utils/qtcassert.h>
#include <QFileInfo>
#include <QFutureInterface>
using namespace Utils;
namespace PerfProfiler {
namespace Internal {
@@ -575,19 +576,19 @@ qint32 PerfProfilerTraceManager::symbolLocation(qint32 locationId) const
return symbol(locationId).name != -1 ? locationId : location(locationId).parentLocationId;
}
void PerfProfilerTraceManager::loadFromTraceFile(const QString &filePath)
void PerfProfilerTraceManager::loadFromTraceFile(const FilePath &filePath)
{
Core::ProgressManager::addTask(load(filePath), Tr::tr("Loading Trace Data"),
Core::ProgressManager::addTask(load(filePath.toFSPathString()), Tr::tr("Loading Trace Data"),
Constants::PerfProfilerTaskLoadTrace);
}
void PerfProfilerTraceManager::saveToTraceFile(const QString &filePath)
void PerfProfilerTraceManager::saveToTraceFile(const FilePath &filePath)
{
Core::ProgressManager::addTask(save(filePath), Tr::tr("Saving Trace Data"),
Core::ProgressManager::addTask(save(filePath.toFSPathString()), Tr::tr("Saving Trace Data"),
Constants::PerfProfilerTaskSaveTrace);
}
void PerfProfilerTraceManager::loadFromPerfData(const QString &filePath,
void PerfProfilerTraceManager::loadFromPerfData(const FilePath &filePath,
const QString &executableDirPath,
ProjectExplorer::Kit *kit)
{
@@ -604,7 +605,7 @@ void PerfProfilerTraceManager::loadFromPerfData(const QString &filePath,
connect(reader, &QObject::destroyed, this, &TimelineTraceManager::loadFinished);
const int fileMegabytes = static_cast<int>(
qMin(QFileInfo(filePath).size() >> 20,
qMin(filePath.fileSize() >> 20,
static_cast<qint64>(std::numeric_limits<int>::max())));
Core::FutureProgress *fp = Core::ProgressManager::addTimedTask(
reader->future(), Tr::tr("Loading Trace Data"), Constants::PerfProfilerTaskLoadPerf,

View File

@@ -139,9 +139,9 @@ public:
const QHash<qint32, TracePoint> &tracePoints() const { return m_tracePoints; }
const QHash<quint32, Thread> &threads() const { return m_threads; }
void loadFromTraceFile(const QString &filePath);
void saveToTraceFile(const QString &filePath);
void loadFromPerfData(const QString &filePath, const QString &executableDirPath,
void loadFromTraceFile(const Utils::FilePath &filePath);
void saveToTraceFile(const Utils::FilePath &filePath);
void loadFromPerfData(const Utils::FilePath &filePath, const QString &executableDirPath,
ProjectExplorer::Kit *kit);
void finalize() override;