Home | History | Annotate | Download | only in DataFlowSanitizer
      1 ; RUN: opt < %s -dfsan -dfsan-args-abi -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
      2 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
      3 
      4 ; CHECK: i32 @discard(i32 %a, i32 %b)
      5 define i32 @discard(i32 %a, i32 %b) {
      6   ret i32 0
      7 }
      8 
      9 ; CHECK: i32 @functional(i32 %a, i32 %b)
     10 define i32 @functional(i32 %a, i32 %b) {
     11   %c = add i32 %a, %b
     12   ret i32 %c
     13 }
     14 
     15 declare void @custom1(i32 %a, i32 %b)
     16 
     17 declare i32 @custom2(i32 %a, i32 %b)
     18 
     19 declare void @customcb(i32 (i32)* %cb)
     20 
     21 declare i32 @cb(i32)
     22 
     23 ; CHECK: @"dfs$f"
     24 define void @f() {
     25   ; CHECK: %[[LABELRETURN:.*]] = alloca i16
     26 
     27   ; CHECK: call void @__dfsw_custom1(i32 1, i32 2, i16 0, i16 0)
     28   call void @custom1(i32 1, i32 2)
     29 
     30   ; CHECK: call i32 @__dfsw_custom2(i32 1, i32 2, i16 0, i16 0, i16* %[[LABELRETURN]])
     31   call i32 @custom2(i32 1, i32 2)
     32 
     33   ; CHECK: call void @__dfsw_customcb({{.*}} @"dfst0$customcb", i8* bitcast ({{.*}} @"dfs$cb" to i8*), i16 0)
     34   call void @customcb(i32 (i32)* @cb)
     35 
     36   ret void
     37 }
     38 
     39 ; CHECK: define i32 (i32, i32)* @discardg(i32)
     40 ; CHECK: %[[CALL:.*]] = call { i32 (i32, i32)*, i16 } @"dfs$g"(i32 %0, i16 0)
     41 ; CHECK: %[[XVAL:.*]] = extractvalue { i32 (i32, i32)*, i16 } %[[CALL]], 0
     42 ; CHECK: ret {{.*}} %[[XVAL]]
     43 @discardg = alias i32 (i32, i32)* (i32)* @g
     44 
     45 ; CHECK: define linkonce_odr { i32, i16 } @"dfsw$custom2"(i32, i32, i16, i16)
     46 ; CHECK: %[[LABELRETURN2:.*]] = alloca i16
     47 ; CHECK: %[[RV:.*]] = call i32 @__dfsw_custom2
     48 ; CHECK: %[[RVSHADOW:.*]] = load i16* %[[LABELRETURN2]]
     49 ; CHECK: insertvalue {{.*}}[[RV]], 0
     50 ; CHECK: insertvalue {{.*}}[[RVSHADOW]], 1
     51 ; CHECK: ret { i32, i16 }
     52 
     53 ; CHECK: @"dfs$g"
     54 define i32 (i32, i32)* @g(i32) {
     55   ; CHECK: ret {{.*}} @"dfsw$custom2"
     56   ret i32 (i32, i32)* @custom2
     57 }
     58 
     59 ; CHECK: define { i32, i16 } @"dfs$adiscard"(i32, i32, i16, i16)
     60 ; CHECK: %[[CALL:.*]] = call i32 @discard(i32 %0, i32 %1)
     61 ; CHECK: %[[IVAL0:.*]] = insertvalue { i32, i16 } undef, i32 %[[CALL]], 0
     62 ; CHECK: %[[IVAL1:.*]] = insertvalue { i32, i16 } %[[IVAL0]], i16 0, 1
     63 ; CHECK: ret { i32, i16 } %[[IVAL1]]
     64 @adiscard = alias i32 (i32, i32)* @discard
     65 
     66 ; CHECK: declare void @__dfsw_custom1(i32, i32, i16, i16)
     67 ; CHECK: declare i32 @__dfsw_custom2(i32, i32, i16, i16, i16*)
     68 
     69 ; CHECK-LABEL: define linkonce_odr i32 @"dfst0$customcb"(i32 (i32)*, i32, i16, i16*)
     70 ; CHECK: %[[BC:.*]] = bitcast i32 (i32)* %0 to { i32, i16 } (i32, i16)*
     71 ; CHECK: %[[CALL:.*]] = call { i32, i16 } %[[BC]](i32 %1, i16 %2)
     72 ; CHECK: %[[XVAL0:.*]] = extractvalue { i32, i16 } %[[CALL]], 0
     73 ; CHECK: %[[XVAL1:.*]] = extractvalue { i32, i16 } %[[CALL]], 1
     74 ; CHECK: store i16 %[[XVAL1]], i16* %3
     75 ; CHECK: ret i32 %[[XVAL0]]
     76