[msan] Fix shadow & origin store & load alignment.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Thu, 29 Nov 2012 14:05:53 +0000 (14:05 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Thu, 29 Nov 2012 14:05:53 +0000 (14:05 +0000)
This change ensures that shadow memory accesses have the same alignment
as corresponding app memory accesses.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168880 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/MemorySanitizer.cpp
test/Instrumentation/MemorySanitizer/msan_basic.ll

index 8cc0084db59281e4e6f9355a73edcd0dcad1e882..30652378bf7aa8446418605c4c8126804dd0b9e7 100644 (file)
@@ -710,13 +710,13 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
     Type *ShadowTy = getShadowTy(&I);
     Value *Addr = I.getPointerOperand();
     Value *ShadowPtr = getShadowPtr(Addr, ShadowTy, IRB);
-    setShadow(&I, IRB.CreateLoad(ShadowPtr, "_msld"));
+    setShadow(&I, IRB.CreateAlignedLoad(ShadowPtr, I.getAlignment(), "_msld"));
 
     if (ClCheckAccessAddress)
       insertCheck(I.getPointerOperand(), &I);
 
     if (ClTrackOrigins)
-      setOrigin(&I, IRB.CreateLoad(getOriginPtr(Addr, IRB)));
+      setOrigin(&I, IRB.CreateAlignedLoad(getOriginPtr(Addr, IRB), I.getAlignment()));
   }
 
   /// \brief Instrument StoreInst
@@ -731,7 +731,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
     Value *Shadow = getShadow(Val);
     Value *ShadowPtr = getShadowPtr(Addr, Shadow->getType(), IRB);
 
-    StoreInst *NewSI = IRB.CreateStore(Shadow, ShadowPtr);
+    StoreInst *NewSI = IRB.CreateAlignedStore(Shadow, ShadowPtr, I.getAlignment());
     DEBUG(dbgs() << "  STORE: " << *NewSI << "\n");
     // If the store is volatile, add a check.
     if (I.isVolatile())
@@ -740,7 +740,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
       insertCheck(Addr, &I);
 
     if (ClTrackOrigins)
-      IRB.CreateStore(getOrigin(Val), getOriginPtr(Addr, IRB));
+      IRB.CreateAlignedStore(getOrigin(Val), getOriginPtr(Addr, IRB), I.getAlignment());
   }
 
   // Casts.
index 37d4abc0860ddabda79d4eac3dd26304e7c5e5b8..2346d75f8e93d7027675fd1c560f809122249a50 100644 (file)
@@ -233,3 +233,28 @@ entry:
 ; CHECK: udiv
 ; CHECK-NOT: icmp
 ; CHECK: }
+
+
+; Check that loads from shadow have the same aligment as the original loads.
+
+define i32 @ShadowLoadAlignmentLarge() nounwind uwtable {
+  %y = alloca i32, align 64
+  %1 = load volatile i32* %y, align 64
+  ret i32 %1
+}
+
+; CHECK: define i32 @ShadowLoadAlignmentLarge
+; CHECK: load i32* {{.*}} align 64
+; CHECK: load volatile i32* {{.*}} align 64
+; CHECK: }
+
+define i32 @ShadowLoadAlignmentSmall() nounwind uwtable {
+  %y = alloca i32, align 2
+  %1 = load volatile i32* %y, align 2
+  ret i32 %1
+}
+
+; CHECK: define i32 @ShadowLoadAlignmentSmall
+; CHECK: load i32* {{.*}} align 2
+; CHECK: load volatile i32* {{.*}} align 2
+; CHECK: }