diff options
-rw-r--r-- | app/main.cpp | 14 | ||||
-rw-r--r-- | app/perfregisterinfo.cpp | 53 | ||||
-rw-r--r-- | app/perfregisterinfo.h | 4 |
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 |