Add a lint check for an indirectbr destination which has not
authorDan Gohman <gohman@apple.com>
Fri, 13 Aug 2010 23:56:28 +0000 (23:56 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 13 Aug 2010 23:56:28 +0000 (23:56 +0000)
had its address taken.

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

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

index a9d972435f5fb8bbcea035b8d3d586f3283127fa..5f1cb61dacb80e647d9e864e74083ea8637e7cb6 100644 (file)
@@ -521,6 +521,12 @@ void Lint::visitIndirectBrInst(IndirectBrInst &I) {
 
   Assert1(I.getNumDestinations() != 0,
           "Undefined behavior: indirectbr with no destinations", &I);
+
+  for (unsigned i = 0, e = I.getNumDestinations(); i != e; ++i)
+    Assert1(I.getDestination(i)->hasAddressTaken(),
+            "Unusual: indirectbr destination has not "
+            "had its address taken",
+            &I);
 }
 
 void Lint::visitExtractElementInst(ExtractElementInst &I) {
index fcef7ee2d57133779ee1f2134fc8265ed5bf6f2e..2163a42eb02496376642480f2668b2fd11702eeb 100644 (file)
@@ -102,6 +102,7 @@ define void @not_vararg(i8* %p) nounwind {
 }
 
 ; CHECK: Undefined behavior: Branch to non-blockaddress
+; CHECK: Unusual: indirectbr destination has not had its address taken
 define void @use_indbr() {
   indirectbr i8* bitcast (i32()* @foo to i8*), [label %block]
 block: