summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-08-13 23:56:28 +0000
committerDan Gohman <gohman@apple.com>2010-08-13 23:56:28 +0000
commit21e6dc6aa3d52ac7153b6531b919a818cdf9517e (patch)
tree2883c8a0438c475cc420651fd77dc922dddc5e9f
parent4577f37d49e43dec44aea0cbed60f16dd29237ca (diff)
downloadbcm5719-llvm-21e6dc6aa3d52ac7153b6531b919a818cdf9517e.tar.gz
bcm5719-llvm-21e6dc6aa3d52ac7153b6531b919a818cdf9517e.zip
Add a lint check for an indirectbr destination which has not
had its address taken. llvm-svn: 111058
-rw-r--r--llvm/lib/Analysis/Lint.cpp6
-rw-r--r--llvm/test/Other/lint.ll1
2 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/Lint.cpp b/llvm/lib/Analysis/Lint.cpp
index a9d972435f5..5f1cb61dacb 100644
--- a/llvm/lib/Analysis/Lint.cpp
+++ b/llvm/lib/Analysis/Lint.cpp
@@ -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) {
diff --git a/llvm/test/Other/lint.ll b/llvm/test/Other/lint.ll
index fcef7ee2d57..2163a42eb02 100644
--- a/llvm/test/Other/lint.ll
+++ b/llvm/test/Other/lint.ll
@@ -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:
OpenPOWER on IntegriCloud