summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2015-09-09 00:01:31 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2015-09-09 00:01:31 +0000
commitee381ffba4a1797a38115217c1540b5c3b8ea4e7 (patch)
tree5e485b22f6e7add56797ca35dcdb13967d1fdb12
parent84df12375cdec370fd09a99e3de2e788351ff403 (diff)
downloadbcm5719-llvm-ee381ffba4a1797a38115217c1540b5c3b8ea4e7.tar.gz
bcm5719-llvm-ee381ffba4a1797a38115217c1540b5c3b8ea4e7.zip
CodeGen: Add CFI unrelated cast checks to the new pointer code path.
llvm-svn: 247105
-rw-r--r--clang/lib/CodeGen/CGExpr.cpp8
-rw-r--r--clang/test/CodeGenCXX/cfi-cast.cpp16
2 files changed, 24 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index b7d1ef19b15..8339444c20e 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -820,6 +820,14 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
getNaturalPointeeTypeAlignment(E->getType(), Source));
}
+ if (SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
+ if (auto PT = E->getType()->getAs<PointerType>())
+ EmitVTablePtrCheckForCast(PT->getPointeeType(), Addr.getPointer(),
+ /*MayBeNull=*/true,
+ CodeGenFunction::CFITCK_UnrelatedCast,
+ CE->getLocStart());
+ }
+
return Builder.CreateBitCast(Addr, ConvertType(E->getType()));
}
break;
diff --git a/clang/test/CodeGenCXX/cfi-cast.cpp b/clang/test/CodeGenCXX/cfi-cast.cpp
index 09089634442..7efcd9e0cae 100644
--- a/clang/test/CodeGenCXX/cfi-cast.cpp
+++ b/clang/test/CodeGenCXX/cfi-cast.cpp
@@ -107,3 +107,19 @@ void vcp(void *p) {
// CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1C")
static_cast<C*>(p);
}
+
+// CHECK-UCAST-LABEL: define void @_Z3bcpP1B
+// CHECK-UCAST-STRICT-LABEL: define void @_Z3bcpP1B
+void bcp(B *p) {
+ // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1A")
+ // CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1C")
+ (C *)p;
+}
+
+// CHECK-UCAST-LABEL: define void @_Z8bcp_callP1B
+// CHECK-UCAST-STRICT-LABEL: define void @_Z8bcp_callP1B
+void bcp_call(B *p) {
+ // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1A")
+ // CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1C")
+ ((C *)p)->f();
+}
OpenPOWER on IntegriCloud