| Index: src/common/mac/arch_utilities.cc
|
| diff --git a/src/common/mac/arch_utilities.cc b/src/common/mac/arch_utilities.cc
|
| index 94e3be3b0078d582a81a591391080f3ef3e2f492..bfafc0d90fde6a80d54dc7bf156f1ecbce11beb7 100644
|
| --- a/src/common/mac/arch_utilities.cc
|
| +++ b/src/common/mac/arch_utilities.cc
|
| @@ -30,27 +30,20 @@
|
| #include "common/mac/arch_utilities.h"
|
|
|
| #include <mach-o/arch.h>
|
| +#include <mach-o/fat.h>
|
| #include <stdio.h>
|
| #include <string.h>
|
|
|
| -#ifndef CPU_TYPE_ARM
|
| -#define CPU_TYPE_ARM (static_cast<cpu_type_t>(12))
|
| -#endif // CPU_TYPE_ARM
|
| -
|
| -#ifndef CPU_SUBTYPE_ARM_V7
|
| -#define CPU_SUBTYPE_ARM_V7 (static_cast<cpu_subtype_t>(9))
|
| -#endif // CPU_SUBTYPE_ARM_V7
|
| -
|
| #ifndef CPU_SUBTYPE_ARM_V7S
|
| #define CPU_SUBTYPE_ARM_V7S (static_cast<cpu_subtype_t>(11))
|
| #endif // CPU_SUBTYPE_ARM_V7S
|
|
|
| #ifndef CPU_TYPE_ARM64
|
| -#define CPU_TYPE_ARM64 (static_cast<cpu_type_t>(16777228))
|
| +#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64)
|
| #endif // CPU_TYPE_ARM64
|
|
|
| #ifndef CPU_SUBTYPE_ARM64_ALL
|
| -#define CPU_SUBTYPE_ARM64_ALL (static_cast<cpu_type_t>(0))
|
| +#define CPU_SUBTYPE_ARM64_ALL (static_cast<cpu_subtype_t>(0))
|
| #endif // CPU_SUBTYPE_ARM64_ALL
|
|
|
| namespace {
|
| @@ -111,3 +104,108 @@ const NXArchInfo* BreakpadGetArchInfoFromCpuType(cpu_type_t cpu_type,
|
| }
|
|
|
| } // namespace google_breakpad
|
| +
|
| +#ifndef __APPLE__
|
| +namespace {
|
| +
|
| +enum Architecture {
|
| + kArch_i386 = 0,
|
| + kArch_x86_64,
|
| + kArch_arm,
|
| + kArch_arm64,
|
| + kArch_ppc,
|
| + // This must be last.
|
| + kNumArchitectures
|
| +};
|
| +
|
| +// enum Architecture above and kKnownArchitectures below
|
| +// must be kept in sync.
|
| +const NXArchInfo kKnownArchitectures[] = {
|
| + {
|
| + "i386",
|
| + CPU_TYPE_I386,
|
| + CPU_SUBTYPE_I386_ALL,
|
| + NX_LittleEndian,
|
| + "Intel 80x86"
|
| + },
|
| + {
|
| + "x86_64",
|
| + CPU_TYPE_X86_64,
|
| + CPU_SUBTYPE_X86_64_ALL,
|
| + NX_LittleEndian,
|
| + "Intel x86-64"
|
| + },
|
| + {
|
| + "arm",
|
| + CPU_TYPE_ARM,
|
| + CPU_SUBTYPE_ARM_ALL,
|
| + NX_LittleEndian,
|
| + "ARM"
|
| + },
|
| + {
|
| + "arm64",
|
| + CPU_TYPE_ARM64,
|
| + CPU_SUBTYPE_ARM64_ALL,
|
| + NX_LittleEndian,
|
| + "ARM64"
|
| + },
|
| + {
|
| + "ppc",
|
| + CPU_TYPE_POWERPC,
|
| + CPU_SUBTYPE_POWERPC_ALL,
|
| + NX_BigEndian,
|
| + "PowerPC"
|
| + }
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +const NXArchInfo *NXGetLocalArchInfo(void) {
|
| + Architecture arch;
|
| +#if defined(__i386__)
|
| + arch = kArch_i386;
|
| +#elif defined(__x86_64__)
|
| + arch = kArch_x86_64;
|
| +#elif defined(__arm64)
|
| + arch = kArch_arm64;
|
| +#elif defined(__arm__)
|
| + arch = kArch_arm;
|
| +#elif defined(__powerpc__)
|
| + arch = kArch_ppc;
|
| +#else
|
| + #error "Unsupported CPU architecture"
|
| +#endif
|
| + return &kKnownArchitectures[arch];
|
| +}
|
| +
|
| +const NXArchInfo *NXGetArchInfoFromName(const char *name) {
|
| + for (int arch = 0; arch < kNumArchitectures; ++arch) {
|
| + if (strcmp(name, kKnownArchitectures[arch].name)) {
|
| + return &kKnownArchitectures[arch];
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +const NXArchInfo *NXGetArchInfoFromCpuType(cpu_type_t cputype,
|
| + cpu_subtype_t cpusubtype) {
|
| + for (int arch = 0; arch < kNumArchitectures; ++arch) {
|
| + if (kKnownArchitectures[arch].cputype == cputype) {
|
| + return &kKnownArchitectures[arch];
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +struct fat_arch *NXFindBestFatArch(cpu_type_t cputype,
|
| + cpu_subtype_t cpusubtype,
|
| + struct fat_arch *fat_archs,
|
| + uint32_t nfat_archs) {
|
| + for (uint32_t f = 0; f < nfat_archs; ++f) {
|
| + if (fat_archs[f].cputype == cputype) {
|
| + return &fat_archs[f];
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +#endif // !__APPLE__
|
|
|