forked from OSchip/llvm-project
[asan] Fix small X86_64 ShadowOffset for non-default shadow scale
The requirement is that shadow memory must be aligned to page boundaries (4k in this case). Use a closed form equation that always satisfies this requirement. Differential Revision: https://reviews.llvm.org/D39471 llvm-svn: 318421
This commit is contained in:
parent
dcb9e1b387
commit
8f1545c629
|
@ -139,7 +139,8 @@ static const u64 kDefaultShadowScale = 3;
|
|||
static const u64 kDefaultShadowSentinel = ~(uptr)0;
|
||||
static const u64 kDefaultShadowOffset32 = 1ULL << 29; // 0x20000000
|
||||
static const u64 kDefaultShadowOffset64 = 1ULL << 44;
|
||||
static const u64 kDefaultShort64bitShadowOffset = 0x7FFF8000; // < 2G.
|
||||
static const u64 kDefaultShort64bitShadowOffset =
|
||||
0x7FFFFFFF & (~0xFFFULL << kDefaultShadowScale); // < 2G.
|
||||
static const u64 kIosShadowOffset32 = 1ULL << 30; // 0x40000000
|
||||
static const u64 kIosShadowOffset64 = 0x120200000;
|
||||
static const u64 kIosSimShadowOffset32 = 1ULL << 30;
|
||||
|
|
|
@ -97,7 +97,8 @@ static const uint64_t kDynamicShadowSentinel =
|
|||
static const uint64_t kIOSShadowOffset32 = 1ULL << 30;
|
||||
static const uint64_t kIOSSimShadowOffset32 = 1ULL << 30;
|
||||
static const uint64_t kIOSSimShadowOffset64 = kDefaultShadowOffset64;
|
||||
static const uint64_t kSmallX86_64ShadowOffset = 0x7FFF8000; // < 2G.
|
||||
static const uint64_t kSmallX86_64ShadowOffsetBase = 0x7FFFFFFF; // < 2G.
|
||||
static const uint64_t kSmallX86_64ShadowOffsetAlignMask = ~0xFFFULL;
|
||||
static const uint64_t kLinuxKasan_ShadowOffset64 = 0xdffffc0000000000;
|
||||
static const uint64_t kPPC64_ShadowOffset64 = 1ULL << 41;
|
||||
static const uint64_t kSystemZ_ShadowOffset64 = 1ULL << 52;
|
||||
|
@ -495,6 +496,11 @@ static ShadowMapping getShadowMapping(Triple &TargetTriple, int LongSize,
|
|||
|
||||
ShadowMapping Mapping;
|
||||
|
||||
Mapping.Scale = kDefaultShadowScale;
|
||||
if (ClMappingScale.getNumOccurrences() > 0) {
|
||||
Mapping.Scale = ClMappingScale;
|
||||
}
|
||||
|
||||
if (LongSize == 32) {
|
||||
if (IsAndroid)
|
||||
Mapping.Offset = kDynamicShadowSentinel;
|
||||
|
@ -528,7 +534,8 @@ static ShadowMapping getShadowMapping(Triple &TargetTriple, int LongSize,
|
|||
if (IsKasan)
|
||||
Mapping.Offset = kLinuxKasan_ShadowOffset64;
|
||||
else
|
||||
Mapping.Offset = kSmallX86_64ShadowOffset;
|
||||
Mapping.Offset = (kSmallX86_64ShadowOffsetBase &
|
||||
(kSmallX86_64ShadowOffsetAlignMask << Mapping.Scale));
|
||||
} else if (IsWindows && IsX86_64) {
|
||||
Mapping.Offset = kWindowsShadowOffset64;
|
||||
} else if (IsMIPS64)
|
||||
|
@ -548,11 +555,6 @@ static ShadowMapping getShadowMapping(Triple &TargetTriple, int LongSize,
|
|||
Mapping.Offset = kDynamicShadowSentinel;
|
||||
}
|
||||
|
||||
Mapping.Scale = kDefaultShadowScale;
|
||||
if (ClMappingScale.getNumOccurrences() > 0) {
|
||||
Mapping.Scale = ClMappingScale;
|
||||
}
|
||||
|
||||
if (ClMappingOffset.getNumOccurrences() > 0) {
|
||||
Mapping.Offset = ClMappingOffset;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue