Home | History | Annotate | Download | only in Inline
      1 ; RUN: opt -inline %s -S | FileCheck %s
      2 ; Ensure SSP attributes are propagated correctly when inlining.
      3 
      4 @.str = private unnamed_addr constant [11 x i8] c"fun_nossp\0A\00", align 1
      5 @.str1 = private unnamed_addr constant [9 x i8] c"fun_ssp\0A\00", align 1
      6 @.str2 = private unnamed_addr constant [15 x i8] c"fun_sspstrong\0A\00", align 1
      7 @.str3 = private unnamed_addr constant [12 x i8] c"fun_sspreq\0A\00", align 1
      8 
      9 ; These first four functions (@fun_sspreq, @fun_sspstrong, @fun_ssp, @fun_nossp)
     10 ; are used by the remaining functions to ensure that the SSP attributes are
     11 ; propagated correctly.  The caller should have its SSP attribute set as:
     12 ; strictest(caller-ssp-attr, callee-ssp-attr), where strictness is ordered as:
     13 ;  sspreq > sspstrong > ssp > [no ssp]
     14 define internal void @fun_sspreq() nounwind sspreq uwtable {
     15 entry:
     16   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([12 x i8]* @.str3, i32 0, i32 0))
     17   ret void
     18 }
     19 
     20 define internal void @fun_sspstrong() nounwind sspstrong uwtable {
     21 entry:
     22   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str2, i32 0, i32 0))
     23   ret void
     24 }
     25 
     26 define internal void @fun_ssp() nounwind ssp uwtable {
     27 entry:
     28   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str1, i32 0, i32 0))
     29   ret void
     30 }
     31 
     32 define internal void @fun_nossp() nounwind uwtable {
     33 entry:
     34   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11 x i8]* @.str, i32 0, i32 0))
     35   ret void
     36 }
     37 
     38 ; Tests start below 
     39 
     40 define void @inline_req_req() nounwind sspreq uwtable {
     41 entry:
     42 ; CHECK: @inline_req_req() #0
     43   call void @fun_sspreq()
     44   ret void
     45 }
     46 
     47 define void @inline_req_strong() nounwind sspstrong uwtable {
     48 entry:
     49 ; CHECK: @inline_req_strong() #0
     50   call void @fun_sspreq()
     51   ret void
     52 }
     53 
     54 define void @inline_req_ssp() nounwind ssp uwtable {
     55 entry:
     56 ; CHECK: @inline_req_ssp() #0
     57   call void @fun_sspreq()
     58   ret void
     59 }
     60 
     61 define void @inline_req_nossp() nounwind uwtable {
     62 entry:
     63 ; CHECK: @inline_req_nossp() #0
     64   call void @fun_sspreq()
     65   ret void
     66 }
     67 
     68 define void @inline_strong_req() nounwind sspreq uwtable {
     69 entry:
     70 ; CHECK: @inline_strong_req() #0
     71   call void @fun_sspstrong()
     72   ret void
     73 }
     74 
     75 
     76 define void @inline_strong_strong() nounwind sspstrong uwtable {
     77 entry:
     78 ; CHECK: @inline_strong_strong() #1
     79   call void @fun_sspstrong()
     80   ret void
     81 }
     82 
     83 define void @inline_strong_ssp() nounwind ssp uwtable {
     84 entry:
     85 ; CHECK: @inline_strong_ssp() #1
     86   call void @fun_sspstrong()
     87   ret void
     88 }
     89 
     90 define void @inline_strong_nossp() nounwind uwtable {
     91 entry:
     92 ; CHECK: @inline_strong_nossp() #1
     93   call void @fun_sspstrong()
     94   ret void
     95 }
     96 
     97 define void @inline_ssp_req() nounwind sspreq uwtable {
     98 entry:
     99 ; CHECK: @inline_ssp_req() #0
    100   call void @fun_ssp()
    101   ret void
    102 }
    103 
    104 
    105 define void @inline_ssp_strong() nounwind sspstrong uwtable {
    106 entry:
    107 ; CHECK: @inline_ssp_strong() #1
    108   call void @fun_ssp()
    109   ret void
    110 }
    111 
    112 define void @inline_ssp_ssp() nounwind ssp uwtable {
    113 entry:
    114 ; CHECK: @inline_ssp_ssp() #2
    115   call void @fun_ssp()
    116   ret void
    117 }
    118 
    119 define void @inline_ssp_nossp() nounwind uwtable {
    120 entry:
    121 ; CHECK: @inline_ssp_nossp() #2
    122   call void @fun_ssp()
    123   ret void
    124 }
    125 
    126 define void @inline_nossp_req() nounwind uwtable sspreq {
    127 entry:
    128 ; CHECK: @inline_nossp_req() #0
    129   call void @fun_nossp()
    130   ret void
    131 }
    132 
    133 
    134 define void @inline_nossp_strong() nounwind sspstrong uwtable {
    135 entry:
    136 ; CHECK: @inline_nossp_strong() #1
    137   call void @fun_nossp()
    138   ret void
    139 }
    140 
    141 define void @inline_nossp_ssp() nounwind ssp uwtable {
    142 entry:
    143 ; CHECK: @inline_nossp_ssp() #2
    144   call void @fun_nossp()
    145   ret void
    146 }
    147 
    148 define void @inline_nossp_nossp() nounwind uwtable {
    149 entry:
    150 ; CHECK: @inline_nossp_nossp() #3
    151   call void @fun_nossp()
    152   ret void
    153 }
    154 
    155 declare i32 @printf(i8*, ...)
    156 
    157 ; CHECK: attributes #0 = { nounwind sspreq uwtable }
    158 ; CHECK: attributes #1 = { nounwind sspstrong uwtable }
    159 ; CHECK: attributes #2 = { nounwind ssp uwtable }
    160 ; CHECK: attributes #3 = { nounwind uwtable }
    161