summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2017-12-01 16:51:51 +0100
committerUlf Hermann <ulf.hermann@qt.io>2017-12-01 16:28:47 +0000
commit9215696c988976dffb81904ce0e840a0043f91b9 (patch)
tree9afe021fa993d2e1f019528b19361d8f6f827b4b
parentc251823e42403932936860a5f29f95b44250c295 (diff)
Allow more variants of architecture namesv4.5.2v4.5.1v4.5.04.5
Apparently "i686" can show up in perf.data files. Let's just accept all kinds of things that look remotely like a valid architecture, just to be safe. Change-Id: Ieb2af7c2809ba7799002f94f3aff0949b141194c Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--app/main.cpp14
-rw-r--r--app/perfregisterinfo.cpp53
-rw-r--r--app/perfregisterinfo.h4
3 files changed, 45 insertions, 26 deletions
diff --git a/app/main.cpp b/app/main.cpp
index 491b097..0aa94dd 100644
--- a/app/main.cpp
+++ b/app/main.cpp
@@ -37,6 +37,7 @@
#include <QTcpSocket>
#include <QTimer>
#include <limits>
+#include <cstring>
#ifdef Q_OS_WIN
#include <io.h>
@@ -140,11 +141,7 @@ int main(int argc, char *argv[])
QLatin1String("path"));
parser.addOption(appPath);
- const auto defaultArch =
- PerfRegisterInfo::s_defaultArchitecture != PerfRegisterInfo::ARCH_INVALID
- ? QLatin1String(PerfRegisterInfo::s_archNames[PerfRegisterInfo::s_defaultArchitecture])
- : QString();
-
+ const auto defaultArch = QLatin1String(PerfRegisterInfo::defaultArchitecture());
QCommandLineOption arch(QLatin1String("arch"),
QCoreApplication::translate(
"main",
@@ -271,12 +268,7 @@ int main(int argc, char *argv[])
}
const QByteArray &featureArch = features.architecture();
- for (uint i = 0; i < PerfRegisterInfo::ARCH_INVALID; ++i) {
- if (featureArch.startsWith(PerfRegisterInfo::s_archNames[i])) {
- unwind.setArchitecture(static_cast<PerfRegisterInfo::Architecture>(i));
- break;
- }
- }
+ unwind.setArchitecture(PerfRegisterInfo::archByName(featureArch));
if (unwind.architecture() == PerfRegisterInfo::ARCH_INVALID) {
qWarning() << "No information about CPU architecture found. Cannot unwind.";
diff --git a/app/perfregisterinfo.cpp b/app/perfregisterinfo.cpp
index 1c3d3cf..183fad5 100644
--- a/app/perfregisterinfo.cpp
+++ b/app/perfregisterinfo.cpp
@@ -19,10 +19,8 @@
****************************************************************************/
#include "perfregisterinfo.h"
-
-const char *PerfRegisterInfo::s_archNames[] = {
- "arm", "aarch64", "powerpc", "s390", "sh", "sparc", "x86"
-};
+#include <QByteArray>
+#include <QRegularExpression>
const uint PerfRegisterInfo::s_numRegisters[PerfRegisterInfo::ARCH_INVALID][PerfRegisterInfo::s_numAbis] = {
{16, 16},
@@ -103,22 +101,51 @@ const uint PerfRegisterInfo::s_dummyRegisters[ARCH_INVALID][2] = {
{0, 0}
};
-const PerfRegisterInfo::Architecture PerfRegisterInfo::s_defaultArchitecture = {
+QByteArray PerfRegisterInfo::defaultArchitecture()
+{
#if defined(__aarch64__)
- PerfRegisterInfo::ARCH_AARCH64
+ return "aarch64";
#elif defined(__arm__)
- PerfRegisterInfo::ARCH_ARM
+ return "arm";
#elif defined(__powerpc__)
- PerfRegisterInfo::ARCH_POWERPC
+ return "powerpc";
#elif defined(__s390__)
- PerfRegisterInfo::ARCH_S390
+ return "s390";
#elif defined(__sh__)
- PerfRegisterInfo::ARCH_SH
+ return "sh";
#elif defined(__sparc__)
- PerfRegisterInfo::ARCH_SPARC
+ return "sparc";
#elif defined(__i386__) || defined(__x86_64__)
- PerfRegisterInfo::ARCH_X86
+ return "x86";
#else
- PerfRegisterInfo::ARCH_INVALID
+ return "";
#endif
};
+
+PerfRegisterInfo::Architecture PerfRegisterInfo::archByName(const QByteArray &name)
+{
+ if (name == "aarch64" || name == "arm64")
+ return ARCH_AARCH64;
+
+ if (name.startsWith("arm"))
+ return ARCH_ARM;
+
+ if (name.startsWith("powerpc"))
+ return ARCH_POWERPC;
+
+ if (name.startsWith("s390"))
+ return ARCH_S390;
+
+ if (name.startsWith("sh"))
+ return ARCH_SH;
+
+ if (name.startsWith("sparc"))
+ return ARCH_SPARC;
+
+ if (name.startsWith("x86")
+ || QRegularExpression("^i[3-7]86$").match(name).hasMatch()
+ || name == "amd64")
+ return ARCH_X86;
+
+ return ARCH_INVALID;
+}
diff --git a/app/perfregisterinfo.h b/app/perfregisterinfo.h
index 3754073..1efdff6 100644
--- a/app/perfregisterinfo.h
+++ b/app/perfregisterinfo.h
@@ -39,7 +39,7 @@ public:
static const uint s_numAbis = 2; // maybe more for some archs?
- static const char *s_archNames[ARCH_INVALID];
+ static Architecture archByName(const QByteArray &name);
static const uint s_numRegisters[ARCH_INVALID][s_numAbis];
static const uint s_wordWidth[ARCH_INVALID][s_numAbis];
@@ -62,7 +62,7 @@ public:
static const uint s_dummyRegisters[ARCH_INVALID][2];
// default architecture for the system which was used for compilation
- static const Architecture s_defaultArchitecture;
+ static QByteArray defaultArchitecture();
};
#endif // PERFREGISTERINFO_H