summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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