[sanitizer_common] Add arm64e module type (#166018)

This will fix some symbolication failures on arm64e machines when the
symbolicator passes the (wrong) architecture string to atos.
This commit is contained in:
Andrew Haberlandt
2025-11-04 14:32:06 -08:00
committed by GitHub
parent d4222bf9e2
commit a51d219ee7
4 changed files with 34 additions and 19 deletions

View File

@@ -59,6 +59,7 @@ def is_valid_arch(s):
"armv7s",
"armv7k",
"arm64",
"arm64e",
"powerpc64",
"powerpc64le",
"s390x",

View File

@@ -737,6 +737,7 @@ enum ModuleArch {
kModuleArchARMV7S,
kModuleArchARMV7K,
kModuleArchARM64,
kModuleArchARM64E,
kModuleArchLoongArch64,
kModuleArchRISCV64,
kModuleArchHexagon
@@ -810,6 +811,8 @@ inline const char *ModuleArchToString(ModuleArch arch) {
return "armv7k";
case kModuleArchARM64:
return "arm64";
case kModuleArchARM64E:
return "arm64e";
case kModuleArchLoongArch64:
return "loongarch64";
case kModuleArchRISCV64:

View File

@@ -20,18 +20,21 @@
#include <mach/mach.h>
// These are not available in older macOS SDKs.
#ifndef CPU_SUBTYPE_X86_64_H
#define CPU_SUBTYPE_X86_64_H ((cpu_subtype_t)8) /* Haswell */
#endif
#ifndef CPU_SUBTYPE_ARM_V7S
#define CPU_SUBTYPE_ARM_V7S ((cpu_subtype_t)11) /* Swift */
#endif
#ifndef CPU_SUBTYPE_ARM_V7K
#define CPU_SUBTYPE_ARM_V7K ((cpu_subtype_t)12)
#endif
#ifndef CPU_TYPE_ARM64
#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64)
#endif
# ifndef CPU_SUBTYPE_X86_64_H
# define CPU_SUBTYPE_X86_64_H ((cpu_subtype_t)8) /* Haswell */
# endif
# ifndef CPU_SUBTYPE_ARM_V7S
# define CPU_SUBTYPE_ARM_V7S ((cpu_subtype_t)11) /* Swift */
# endif
# ifndef CPU_SUBTYPE_ARM_V7K
# define CPU_SUBTYPE_ARM_V7K ((cpu_subtype_t)12)
# endif
# ifndef CPU_TYPE_ARM64
# define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64)
# endif
# ifndef CPU_SUBTYPE_ARM64E
# define CPU_SUBTYPE_ARM64E ((cpu_subtype_t)2)
# endif
namespace __sanitizer {
@@ -311,18 +314,26 @@ ModuleArch ModuleArchFromCpuType(cpu_type_t cputype, cpu_subtype_t cpusubtype) {
case CPU_TYPE_I386:
return kModuleArchI386;
case CPU_TYPE_X86_64:
if (cpusubtype == CPU_SUBTYPE_X86_64_ALL) return kModuleArchX86_64;
if (cpusubtype == CPU_SUBTYPE_X86_64_H) return kModuleArchX86_64H;
if (cpusubtype == CPU_SUBTYPE_X86_64_ALL)
return kModuleArchX86_64;
if (cpusubtype == CPU_SUBTYPE_X86_64_H)
return kModuleArchX86_64H;
CHECK(0 && "Invalid subtype of x86_64");
return kModuleArchUnknown;
case CPU_TYPE_ARM:
if (cpusubtype == CPU_SUBTYPE_ARM_V6) return kModuleArchARMV6;
if (cpusubtype == CPU_SUBTYPE_ARM_V7) return kModuleArchARMV7;
if (cpusubtype == CPU_SUBTYPE_ARM_V7S) return kModuleArchARMV7S;
if (cpusubtype == CPU_SUBTYPE_ARM_V7K) return kModuleArchARMV7K;
if (cpusubtype == CPU_SUBTYPE_ARM_V6)
return kModuleArchARMV6;
if (cpusubtype == CPU_SUBTYPE_ARM_V7)
return kModuleArchARMV7;
if (cpusubtype == CPU_SUBTYPE_ARM_V7S)
return kModuleArchARMV7S;
if (cpusubtype == CPU_SUBTYPE_ARM_V7K)
return kModuleArchARMV7K;
CHECK(0 && "Invalid subtype of ARM");
return kModuleArchUnknown;
case CPU_TYPE_ARM64:
if (cpusubtype == CPU_SUBTYPE_ARM64E)
return kModuleArchARM64E;
return kModuleArchARM64;
default:
CHECK(0 && "Invalid CPU type");

View File

@@ -70,7 +70,7 @@ TEST(MemoryMapping, LoadedModuleArchAndUUID) {
EXPECT_EQ(arch, kModuleArchI386);
} else if (SANITIZER_WORDSIZE == 64) {
EXPECT_TRUE(arch == kModuleArchX86_64 || arch == kModuleArchX86_64H ||
arch == kModuleArchARM64);
arch == kModuleArchARM64 || arch == kModuleArchARM64E);
}
const u8 *uuid = modules[i].uuid();
u8 null_uuid[kModuleUUIDSize] = {0};