[llvm] r311087 - [dfsan] Add explicit zero extensions for shadow parameters in function wrappers.

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 18 13:36:49 PDT 2017


Merged to 5.0 in r311195.

On Thu, Aug 17, 2017 at 7:14 AM, Simon Dardis via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: sdardis
> Date: Thu Aug 17 07:14:25 2017
> New Revision: 311087
>
> URL: http://llvm.org/viewvc/llvm-project?rev=311087&view=rev
> Log:
> [dfsan] Add explicit zero extensions for shadow parameters in function wrappers.
>
> In the case where dfsan provides a custom wrapper for a function,
> shadow parameters are added for each parameter of the function.
> These parameters are i16s. For targets which do not consider this
> a legal type, the lack of sign extension information would cause
> LLVM to generate anyexts around their usage with phi variables
> and calling convention logic.
>
> Address this by introducing zero exts for each shadow parameter.
>
> Reviewers: pcc, slthakur
>
> Differential Revision: https://reviews.llvm.org/D33349
>
> Added:
>     llvm/trunk/test/Instrumentation/DataFlowSanitizer/Inputs/shadow-args-abilist.txt
>     llvm/trunk/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
> Modified:
>     llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
>     llvm/trunk/test/Instrumentation/DataFlowSanitizer/abilist.ll
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp?rev=311087&r1=311086&r2=311087&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp Thu Aug 17 07:14:25 2017
> @@ -1470,6 +1470,7 @@ void DFSanVisitor::visitCallSite(CallSit
>          }
>
>          i = CS.arg_begin();
> +        const unsigned ShadowArgStart = Args.size();
>          for (unsigned n = FT->getNumParams(); n != 0; ++i, --n)
>            Args.push_back(DFSF.getShadow(*i));
>
> @@ -1505,6 +1506,15 @@ void DFSanVisitor::visitCallSite(CallSit
>          CustomCI->setCallingConv(CI->getCallingConv());
>          CustomCI->setAttributes(CI->getAttributes());
>
> +        // Update the parameter attributes of the custom call instruction to
> +        // zero extend the shadow parameters. This is required for targets
> +        // which consider ShadowTy an illegal type.
> +        for (unsigned n = 0; n < FT->getNumParams(); n++) {
> +          const unsigned ArgNo = ShadowArgStart + n;
> +          if (CustomCI->getArgOperand(ArgNo)->getType() == DFSF.DFS.ShadowTy)
> +            CustomCI->addParamAttr(ArgNo, Attribute::ZExt);
> +        }
> +
>          if (!FT->getReturnType()->isVoidTy()) {
>            LoadInst *LabelLoad = IRB.CreateLoad(DFSF.LabelReturnAlloca);
>            DFSF.setShadow(CustomCI, LabelLoad);
>
> Added: llvm/trunk/test/Instrumentation/DataFlowSanitizer/Inputs/shadow-args-abilist.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/DataFlowSanitizer/Inputs/shadow-args-abilist.txt?rev=311087&view=auto
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/DataFlowSanitizer/Inputs/shadow-args-abilist.txt (added)
> +++ llvm/trunk/test/Instrumentation/DataFlowSanitizer/Inputs/shadow-args-abilist.txt Thu Aug 17 07:14:25 2017
> @@ -0,0 +1,8 @@
> +fun:dfsan_get_label=uninstrumented
> +fun:dfsan_get_label=custom
> +
> +fun:k2=uninstrumented
> +fun:k2=custom
> +
> +fun:k4=uninstrumented
> +fun:k4=custom
>
> Modified: llvm/trunk/test/Instrumentation/DataFlowSanitizer/abilist.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/DataFlowSanitizer/abilist.ll?rev=311087&r1=311086&r2=311087&view=diff
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/DataFlowSanitizer/abilist.ll (original)
> +++ llvm/trunk/test/Instrumentation/DataFlowSanitizer/abilist.ll Thu Aug 17 07:14:25 2017
> @@ -47,13 +47,13 @@ define void @f(i32 %x) {
>    ; CHECK: %[[LABELVA1:.*]] = alloca [2 x i16]
>    ; CHECK: %[[LABELRETURN:.*]] = alloca i16
>
> -  ; CHECK: call void @__dfsw_custom1(i32 1, i32 2, i16 0, i16 0)
> +  ; CHECK: call void @__dfsw_custom1(i32 1, i32 2, i16 zeroext 0, i16 zeroext 0)
>    call void @custom1(i32 1, i32 2)
>
> -  ; CHECK: call i32 @__dfsw_custom2(i32 1, i32 2, i16 0, i16 0, i16* %[[LABELRETURN]])
> +  ; CHECK: call i32 @__dfsw_custom2(i32 1, i32 2, i16 zeroext 0, i16 zeroext 0, i16* %[[LABELRETURN]])
>    call i32 @custom2(i32 1, i32 2)
>
> -  ; CHECK: call void @__dfsw_customcb({{.*}} @"dfst0$customcb", i8* bitcast ({{.*}} @"dfs$cb" to i8*), i16 0)
> +  ; CHECK: call void @__dfsw_customcb({{.*}} @"dfst0$customcb", i8* bitcast ({{.*}} @"dfs$cb" to i8*), i16 zeroext 0)
>    call void @customcb(i32 (i32)* @cb)
>
>    ; CHECK: %[[LABELVA1_0:.*]] = getelementptr inbounds [2 x i16], [2 x i16]* %[[LABELVA1]], i32 0, i32 0
> @@ -61,12 +61,12 @@ define void @f(i32 %x) {
>    ; CHECK: %[[LABELVA1_1:.*]] = getelementptr inbounds [2 x i16], [2 x i16]* %[[LABELVA1]], i32 0, i32 1
>    ; CHECK: store i16 %{{.*}}, i16* %[[LABELVA1_1]]
>    ; CHECK: %[[LABELVA1_0A:.*]] = getelementptr inbounds [2 x i16], [2 x i16]* %[[LABELVA1]], i32 0, i32 0
> -  ; CHECK: call void (i32, i16, i16*, ...) @__dfsw_custom3(i32 1, i16 0, i16* %[[LABELVA1_0A]], i32 2, i32 %{{.*}})
> +  ; CHECK: call void (i32, i16, i16*, ...) @__dfsw_custom3(i32 1, i16 zeroext 0, i16* %[[LABELVA1_0A]], i32 2, i32 %{{.*}})
>    call void (i32, ...) @custom3(i32 1, i32 2, i32 %x)
>
>    ; CHECK: %[[LABELVA2_0:.*]] = getelementptr inbounds [2 x i16], [2 x i16]* %[[LABELVA2]], i32 0, i32 0
>    ; CHECK: %[[LABELVA2_0A:.*]] = getelementptr inbounds [2 x i16], [2 x i16]* %[[LABELVA2]], i32 0, i32 0
> -  ; CHECK: call i32 (i32, i16, i16*, i16*, ...) @__dfsw_custom4(i32 1, i16 0, i16* %[[LABELVA2_0A]], i16* %[[LABELRETURN]], i32 2, i32 3)
> +  ; CHECK: call i32 (i32, i16, i16*, i16*, ...) @__dfsw_custom4(i32 1, i16 zeroext 0, i16* %[[LABELVA2_0A]], i16* %[[LABELRETURN]], i32 2, i32 3)
>    call i32 (i32, ...) @custom4(i32 1, i32 2, i32 3)
>
>    ret void
>
> Added: llvm/trunk/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll?rev=311087&view=auto
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll (added)
> +++ llvm/trunk/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll Thu Aug 17 07:14:25 2017
> @@ -0,0 +1,54 @@
> +; RUN: opt -mtriple=x86_64-unknown-linux-gnu < %s -dfsan -S --dfsan-abilist=%S/Inputs/shadow-args-abilist.txt  | FileCheck %s
> +
> +; REQUIRES: x86-registered-target
> +
> +; Test that the custom abi marks shadow parameters as zero extended.
> +
> +define i32 @m() {
> +entry:
> +  %call = call zeroext i16 @dfsan_get_label(i64 signext 56)
> +  %conv = zext i16 %call to i32
> +  ret i32 %conv
> +}
> +
> +; CHECK-LABEL: @"dfs$m"
> +; CHECK: %{{.*}} = call zeroext i16 @__dfsw_dfsan_get_label(i64 signext 56, i16 zeroext 0, i16* %{{.*}})
> +
> +define i32 @k() {
> +entry:
> +  %call = call zeroext i16 @k2(i64 signext 56, i64 signext 67)
> +  %conv = zext i16 %call to i32
> +  ret i32 %conv
> +}
> +
> +; CHECK-LABEL: @"dfs$k"
> +; CHECK: %{{.*}} = call zeroext i16 @__dfsw_k2(i64 signext 56, i64 signext 67, i16 zeroext {{.*}}, i16 zeroext {{.*}}, i16* %{{.*}})
> +
> +define i32 @k3() {
> +entry:
> +  %call = call zeroext i16 @k4(i64 signext 56, i64 signext 67, i64 signext 78, i64 signext 89)
> +  %conv = zext i16 %call to i32
> +  ret i32 %conv
> +}
> +
> +; CHECK-LABEL: @"dfs$k3"
> +; CHECK: %{{.*}} = call zeroext i16 @__dfsw_k4(i64 signext 56, i64 signext 67, i64 signext 78, i64 signext 89, i16 zeroext {{.*}}, i16 zeroext {{.*}}, i16 zeroext {{.*}}, i16 zeroext {{.*}}, i16* %{{.*}})
> +
> +declare zeroext i16 @dfsan_get_label(i64 signext)
> +
> +; CHECK-LABEL: @"dfsw$dfsan_get_label"
> +; CHECK: %{{.*}} = call i16 @__dfsw_dfsan_get_label(i64 %0, i16 zeroext %1, i16* %{{.*}})
> +
> +declare zeroext i16 @k2(i64 signext, i64 signext)
> +; CHECK-LABEL: @"dfsw$k2"
> +; CHECK: %{{.*}} = call i16 @__dfsw_k2(i64 %{{.*}}, i64 %{{.*}}, i16 zeroext %{{.*}}, i16 zeroext %{{.*}}, i16* %{{.*}})
> +
> +declare zeroext i16 @k4(i64 signext, i64 signext, i64 signext, i64 signext)
> +
> +; CHECK-LABEL: @"dfsw$k4"
> +; CHECK: %{{.*}} = call i16 @__dfsw_k4(i64 %{{.*}}, i64 %{{.*}}, i64  %{{.*}}, i64 %{{.*}}, i16 zeroext %{{.*}}, i16 zeroext %{{.*}}, i16 zeroext %{{.*}}, i16 zeroext %{{.*}}, i16* %{{.*}})
> +
> +
> +; CHECK: declare zeroext i16 @__dfsw_dfsan_get_label(i64 signext, i16, i16*)
> +; CHECK: declare zeroext i16 @__dfsw_k2(i64 signext, i64 signext, i16, i16, i16*)
> +; CHECK: declare zeroext i16 @__dfsw_k4(i64 signext, i64 signext, i64 signext, i64 signext, i16, i16, i16, i16, i16*)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list