[dfsan] Treat vararg custom functions like unimplemented functions.
authorPeter Collingbourne <peter@pcc.me.uk>
Wed, 20 Aug 2014 01:40:23 +0000 (01:40 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Wed, 20 Aug 2014 01:40:23 +0000 (01:40 +0000)
Because declarations of these functions can appear in places like autoconf
checks, they have to be handled somehow, even though we do not support
vararg custom functions. We do so by printing a warning and calling the
uninstrumented function, as we do for unimplemented functions.

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

lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
test/Instrumentation/DataFlowSanitizer/abilist.ll

index 3e11efc0e306d42f499cddeea097f5865df6b49a..9f5e0bb844d5b592a9d5f1819eb58b70cc652714 100644 (file)
@@ -476,7 +476,7 @@ DataFlowSanitizer::WrapperKind DataFlowSanitizer::getWrapperKind(Function *F) {
     return WK_Functional;
   if (ABIList.isIn(*F, "discard"))
     return WK_Discard;
-  if (ABIList.isIn(*F, "custom"))
+  if (ABIList.isIn(*F, "custom") && !F->isVarArg())
     return WK_Custom;
 
   return WK_Warning;
index 66ddc140a0829573b00573d1f1b5cd95d92e0227..53b7d86dbdab72d02913e2ba6a6e2e72a15159a9 100644 (file)
@@ -16,6 +16,8 @@ declare void @custom1(i32 %a, i32 %b)
 
 declare i32 @custom2(i32 %a, i32 %b)
 
+declare void @custom3(...)
+
 declare void @customcb(i32 (i32)* %cb)
 
 declare i32 @cb(i32)
@@ -33,6 +35,10 @@ define void @f() {
   ; CHECK: call void @__dfsw_customcb({{.*}} @"dfst0$customcb", i8* bitcast ({{.*}} @"dfs$cb" to i8*), i16 0)
   call void @customcb(i32 (i32)* @cb)
 
+  ; CHECK: call void @__dfsan_unimplemented
+  ; CHECK: call void (...)* @custom3()
+  call void (...)* @custom3()
+
   ret void
 }