@@ -65,8 +65,11 @@ using namespace llvm;
65
65
66
66
static const uint64_t kDefaultShadowScale = 3 ;
67
67
static const uint64_t kDefaultShadowOffset32 = 1ULL << 29 ;
68
- static const uint64_t kIOSShadowOffset32 = 1ULL << 30 ;
69
68
static const uint64_t kDefaultShadowOffset64 = 1ULL << 44 ;
69
+ static const uint64_t kIOSShadowOffset32 = 1ULL << 30 ;
70
+ static const uint64_t kIOSShadowOffset64 = 0x120200000 ;
71
+ static const uint64_t kIOSSimShadowOffset32 = 1ULL << 30 ;
72
+ static const uint64_t kIOSSimShadowOffset64 = kDefaultShadowOffset64 ;
70
73
static const uint64_t kSmallX86_64ShadowOffset = 0x7FFF8000 ; // < 2G.
71
74
static const uint64_t kLinuxKasan_ShadowOffset64 = 0xdffffc0000000000 ;
72
75
static const uint64_t kPPC64_ShadowOffset64 = 1ULL << 41 ;
@@ -334,11 +337,12 @@ struct ShadowMapping {
334
337
static ShadowMapping getShadowMapping (Triple &TargetTriple, int LongSize,
335
338
bool IsKasan) {
336
339
bool IsAndroid = TargetTriple.isAndroid ();
337
- bool IsIOS = TargetTriple.isiOS ();
340
+ bool IsIOS = TargetTriple.isiOS () || TargetTriple. isWatchOS () ;
338
341
bool IsFreeBSD = TargetTriple.isOSFreeBSD ();
339
342
bool IsLinux = TargetTriple.isOSLinux ();
340
343
bool IsPPC64 = TargetTriple.getArch () == llvm::Triple::ppc64 ||
341
344
TargetTriple.getArch () == llvm::Triple::ppc64le;
345
+ bool IsX86 = TargetTriple.getArch () == llvm::Triple::x86;
342
346
bool IsX86_64 = TargetTriple.getArch () == llvm::Triple::x86_64;
343
347
bool IsMIPS32 = TargetTriple.getArch () == llvm::Triple::mips ||
344
348
TargetTriple.getArch () == llvm::Triple::mipsel;
@@ -359,7 +363,8 @@ static ShadowMapping getShadowMapping(Triple &TargetTriple, int LongSize,
359
363
else if (IsFreeBSD)
360
364
Mapping.Offset = kFreeBSD_ShadowOffset32 ;
361
365
else if (IsIOS)
362
- Mapping.Offset = kIOSShadowOffset32 ;
366
+ // If we're targeting iOS and x86, the binary is built for iOS simulator.
367
+ Mapping.Offset = IsX86 ? kIOSSimShadowOffset32 : kIOSShadowOffset32 ;
363
368
else if (IsWindows)
364
369
Mapping.Offset = kWindowsShadowOffset32 ;
365
370
else
@@ -376,6 +381,9 @@ static ShadowMapping getShadowMapping(Triple &TargetTriple, int LongSize,
376
381
Mapping.Offset = kSmallX86_64ShadowOffset ;
377
382
} else if (IsMIPS64)
378
383
Mapping.Offset = kMIPS64_ShadowOffset64 ;
384
+ else if (IsIOS)
385
+ // If we're targeting iOS and x86, the binary is built for iOS simulator.
386
+ Mapping.Offset = IsX86_64 ? kIOSSimShadowOffset64 : kIOSShadowOffset64 ;
379
387
else if (IsAArch64)
380
388
Mapping.Offset = kAArch64_ShadowOffset64 ;
381
389
else
0 commit comments