mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-23 12:08:25 +00:00
[msan] Raise alignment of origin stores/loads when possible.
Origin alignment is as high as the alignment of the corresponding application location, but never less than 4. llvm-svn: 171110
This commit is contained in:
parent
e64939756e
commit
3c52fb6e43
@ -100,7 +100,8 @@ static const uint64_t kShadowMask32 = 1ULL << 31;
|
|||||||
static const uint64_t kShadowMask64 = 1ULL << 46;
|
static const uint64_t kShadowMask64 = 1ULL << 46;
|
||||||
static const uint64_t kOriginOffset32 = 1ULL << 30;
|
static const uint64_t kOriginOffset32 = 1ULL << 30;
|
||||||
static const uint64_t kOriginOffset64 = 1ULL << 45;
|
static const uint64_t kOriginOffset64 = 1ULL << 45;
|
||||||
static const uint64_t kShadowTLSAlignment = 8;
|
static const unsigned kMinOriginAlignment = 4;
|
||||||
|
static const unsigned kShadowTLSAlignment = 8;
|
||||||
|
|
||||||
/// \brief Track origins of uninitialized values.
|
/// \brief Track origins of uninitialized values.
|
||||||
///
|
///
|
||||||
@ -451,8 +452,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
|||||||
insertCheck(Addr, &I);
|
insertCheck(Addr, &I);
|
||||||
|
|
||||||
if (MS.TrackOrigins) {
|
if (MS.TrackOrigins) {
|
||||||
|
unsigned Alignment = std::max(kMinOriginAlignment, I.getAlignment());
|
||||||
if (ClStoreCleanOrigin || isa<StructType>(Shadow->getType())) {
|
if (ClStoreCleanOrigin || isa<StructType>(Shadow->getType())) {
|
||||||
IRB.CreateStore(getOrigin(Val), getOriginPtr(Addr, IRB));
|
IRB.CreateAlignedStore(getOrigin(Val), getOriginPtr(Addr, IRB),
|
||||||
|
Alignment);
|
||||||
} else {
|
} else {
|
||||||
Value *ConvertedShadow = convertToShadowTyNoVec(Shadow, IRB);
|
Value *ConvertedShadow = convertToShadowTyNoVec(Shadow, IRB);
|
||||||
|
|
||||||
@ -469,7 +472,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
|||||||
SplitBlockAndInsertIfThen(cast<Instruction>(Cmp), false,
|
SplitBlockAndInsertIfThen(cast<Instruction>(Cmp), false,
|
||||||
MS.OriginStoreWeights);
|
MS.OriginStoreWeights);
|
||||||
IRBuilder<> IRBNew(CheckTerm);
|
IRBuilder<> IRBNew(CheckTerm);
|
||||||
IRBNew.CreateStore(getOrigin(Val), getOriginPtr(Addr, IRBNew));
|
IRBNew.CreateAlignedStore(getOrigin(Val), getOriginPtr(Addr, IRBNew),
|
||||||
|
Alignment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -827,8 +831,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
|||||||
if (ClCheckAccessAddress)
|
if (ClCheckAccessAddress)
|
||||||
insertCheck(I.getPointerOperand(), &I);
|
insertCheck(I.getPointerOperand(), &I);
|
||||||
|
|
||||||
if (MS.TrackOrigins)
|
if (MS.TrackOrigins) {
|
||||||
setOrigin(&I, IRB.CreateLoad(getOriginPtr(Addr, IRB)));
|
unsigned Alignment = std::max(kMinOriginAlignment, I.getAlignment());
|
||||||
|
setOrigin(&I, IRB.CreateAlignedLoad(getOriginPtr(Addr, IRB), Alignment));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Instrument StoreInst
|
/// \brief Instrument StoreInst
|
||||||
|
@ -56,7 +56,7 @@ entry:
|
|||||||
; CHECK-ORIGINS: icmp
|
; CHECK-ORIGINS: icmp
|
||||||
; CHECK-ORIGINS: br i1
|
; CHECK-ORIGINS: br i1
|
||||||
; CHECK-ORIGINS: <label>
|
; CHECK-ORIGINS: <label>
|
||||||
; CHECK-ORIGINS-NOT: store {{.*}} align
|
; CHECK-ORIGINS: store {{.*}} align 32
|
||||||
; CHECK-ORIGINS: br label
|
; CHECK-ORIGINS: br label
|
||||||
; CHECK-ORIGINS: <label>
|
; CHECK-ORIGINS: <label>
|
||||||
; CHECK-ORIGINS: store {{.*}} align 32
|
; CHECK-ORIGINS: store {{.*}} align 32
|
||||||
@ -362,7 +362,8 @@ define zeroext i1 @ICmpSLE(i32 %x) nounwind uwtable readnone {
|
|||||||
; CHECK: ret i1
|
; CHECK: ret i1
|
||||||
|
|
||||||
|
|
||||||
; Check that loads from shadow have the same aligment as the original loads.
|
; Check that loads of shadow have the same aligment as the original loads.
|
||||||
|
; Check that loads of origin have the aligment of max(4, original alignment).
|
||||||
|
|
||||||
define i32 @ShadowLoadAlignmentLarge() nounwind uwtable {
|
define i32 @ShadowLoadAlignmentLarge() nounwind uwtable {
|
||||||
%y = alloca i32, align 64
|
%y = alloca i32, align 64
|
||||||
@ -386,6 +387,12 @@ define i32 @ShadowLoadAlignmentSmall() nounwind uwtable {
|
|||||||
; CHECK: load volatile i32* {{.*}} align 2
|
; CHECK: load volatile i32* {{.*}} align 2
|
||||||
; CHECK: ret i32
|
; CHECK: ret i32
|
||||||
|
|
||||||
|
; CHECK-ORIGINS: @ShadowLoadAlignmentSmall
|
||||||
|
; CHECK-ORIGINS: load i32* {{.*}} align 2
|
||||||
|
; CHECK-ORIGINS: load i32* {{.*}} align 4
|
||||||
|
; CHECK-ORIGINS: load volatile i32* {{.*}} align 2
|
||||||
|
; CHECK-ORIGINS: ret i32
|
||||||
|
|
||||||
|
|
||||||
; Test vector manipulation instructions.
|
; Test vector manipulation instructions.
|
||||||
; Check that the same bit manipulation is applied to the shadow values.
|
; Check that the same bit manipulation is applied to the shadow values.
|
||||||
|
Loading…
Reference in New Issue
Block a user