Reinstate checking of stackrestore, with checking for both Read
authorDan Gohman <gohman@apple.com>
Wed, 26 May 2010 22:21:25 +0000 (22:21 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 26 May 2010 22:21:25 +0000 (22:21 +0000)
and Write, and add a comment explaining this.

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

lib/Analysis/Lint.cpp
test/Other/lint.ll

index a19e13ef177a4a7848840b99f1abee314b3aee50..1fae14f801191027a93deb68268573892e57e93b 100644 (file)
@@ -285,6 +285,14 @@ void Lint::visitCallSite(CallSite CS) {
       visitMemoryReference(I, CS.getArgument(0), 0, 0,
                            MemRef::Read | MemRef::Write);
       break;
+
+    case Intrinsic::stackrestore:
+      // Stackrestore doesn't read or write memory, but it sets the
+      // stack pointer, which the compiler may read from or write to
+      // at any time, so check it for both readability and writeability.
+      visitMemoryReference(I, CS.getArgument(0), 0, 0,
+                           MemRef::Read | MemRef::Write);
+      break;
     }
 }
 
index eb0b7629e432ff69000f2b22d0e5bced841d7e7b..1f9efe3ad9ad569784bf65dd62f3a31afa09fdef 100644 (file)
@@ -2,6 +2,7 @@
 target datalayout = "e-p:64:64:64"
 
 declare fastcc void @bar()
+declare void @llvm.stackrestore(i8*)
 
 @CG = constant i32 7
 
@@ -50,6 +51,8 @@ define i32 @foo() noreturn {
   %lb = load i32* bitcast (i8* blockaddress(@foo, %next) to i32*)
 ; CHECK: Call to block address
   call void()* bitcast (i8* blockaddress(@foo, %next) to void()*)()
+; CHECK: Undefined behavior: Null pointer dereference
+  call void @llvm.stackrestore(i8* null)
 
   br label %next