diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2017-12-01 16:51:51 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2017-12-01 16:28:47 +0000 |
commit | 9215696c988976dffb81904ce0e840a0043f91b9 (patch) | |
tree | 9afe021fa993d2e1f019528b19361d8f6f827b4b | |
parent | c251823e42403932936860a5f29f95b44250c295 (diff) |
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.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 |