Home | History | Annotate | Download | only in X86
      1 ; RUN: opt -module-summary %s -o %t1.bc
      2 ; RUN: opt -module-summary %p/Inputs/alias_import.ll -o %t2.bc
      3 ; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc
      4 ; RUN: llvm-lto -thinlto-action=promote -thinlto-index %t.index.bc %t2.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=PROMOTE
      5 ; RUN: llvm-lto -thinlto-action=promote -thinlto-index %t.index.bc %t2.bc -o - | llvm-lto -thinlto-action=internalize -thinlto-index %t.index.bc -thinlto-module-id=%t2.bc - -o - | llvm-dis -o - | FileCheck %s --check-prefix=PROMOTE-INTERNALIZE
      6 ; RUN: llvm-lto -thinlto-action=import -thinlto-index %t.index.bc %t1.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=IMPORT
      7 
      8 ;
      9 ; Alias can't point to "available_externally", so we can only import an alias
     10 ; when we can import the aliasee with a linkage that won't be
     11 ; available_externally, i.e linkOnceODR. (FIXME this limitation could be lifted)
     12 ; PROMOTE-DAG: @globalfuncAlias = alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     13 ; PROMOTE-DAG: @globalfuncWeakAlias = weak alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     14 ; PROMOTE-DAG: @globalfuncLinkonceAlias = weak alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     15 ; PROMOTE-DAG: @globalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     16 ; PROMOTE-DAG: @globalfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     17 ; PROMOTE-DAG: @internalfuncAlias = alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
     18 ; PROMOTE-DAG: @internalfuncWeakAlias = weak alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
     19 ; PROMOTE-DAG: @internalfuncLinkonceAlias = weak alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
     20 ; PROMOTE-DAG: @internalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
     21 ; PROMOTE-DAG: @internalfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
     22 ; PROMOTE-DAG: @linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
     23 ; PROMOTE-DAG: @linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
     24 ; PROMOTE-DAG: @linkoncefuncLinkonceAlias = weak alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
     25 ; PROMOTE-DAG: @linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
     26 ; PROMOTE-DAG: @linkoncefuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
     27 ; PROMOTE-DAG: @weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc to void (...)*)
     28 ; PROMOTE-DAG: @weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc to void (...)*)
     29 ; PROMOTE-DAG: @weakfuncLinkonceAlias = weak alias void (...), bitcast (void ()* @weakfunc to void (...)*)
     30 ; PROMOTE-DAG: @weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)
     31 ; PROMOTE-DAG: @weakfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)
     32 ; PROMOTE-DAG: @weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
     33 ; PROMOTE-DAG: @weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
     34 ; PROMOTE-DAG: @weakODRfuncLinkonceAlias = weak alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
     35 ; PROMOTE-DAG: @weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
     36 ; PROMOTE-DAG: @weakODRfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
     37 
     38 ; Only alias to LinkonceODR aliasee can be imported
     39 ; PROMOTE-DAG: @linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
     40 ; PROMOTE-DAG: @linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
     41 ; PROMOTE-DAG: @linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
     42 ; Amongst these that are imported, check that we promote only linkonce->weak
     43 ; PROMOTE-DAG: @linkonceODRfuncLinkonceAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
     44 ; PROMOTE-DAG: @linkonceODRfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
     45 
     46 ; These will be imported, check the linkage/renaming after promotion
     47 ; PROMOTE-DAG: define void @globalfunc()
     48 ; PROMOTE-DAG: define hidden void @internalfunc.llvm.0()
     49 ; PROMOTE-DAG: define linkonce_odr void @linkonceODRfunc()
     50 ; PROMOTE-DAG: define weak_odr void @weakODRfunc()
     51 ; PROMOTE-DAG: define linkonce void @linkoncefunc()
     52 ; PROMOTE-DAG: define weak void @weakfunc()
     53 
     54 ; On the import side now, verify that aliases to a linkonce_odr are imported, but the weak/linkonce (we can't inline them)
     55 ; IMPORT-DAG:  declare void @linkonceODRfuncWeakAlias
     56 ; IMPORT-DAG: declare void @linkonceODRfuncLinkonceAlias
     57 ; IMPORT-DAG:  @linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
     58 ; IMPORT-DAG:  @linkonceODRfuncWeakODRAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
     59 ; IMPORT-DAG:  @linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
     60 ; IMPORT-DAG:  define linkonce_odr void @linkonceODRfunc()
     61 
     62 
     63 ; On the import side, these aliases are not imported (they don't point to a linkonce_odr)
     64 ; IMPORT-DAG: declare void @globalfuncAlias()
     65 ; IMPORT-DAG: declare void @globalfuncWeakAlias()
     66 ; IMPORT-DAG: declare void @globalfuncLinkonceAlias()
     67 ; IMPORT-DAG: declare void @globalfuncWeakODRAlias()
     68 ; IMPORT-DAG: declare void @globalfuncLinkonceODRAlias()
     69 ; IMPORT-DAG: declare void @internalfuncAlias()
     70 ; IMPORT-DAG: declare void @internalfuncWeakAlias()
     71 ; IMPORT-DAG: declare void @internalfuncLinkonceAlias()
     72 ; IMPORT-DAG: declare void @internalfuncWeakODRAlias()
     73 ; IMPORT-DAG: declare void @internalfuncLinkonceODRAlias()
     74 ; IMPORT-DAG: declare void @weakODRfuncAlias()
     75 ; IMPORT-DAG: declare void @weakODRfuncWeakAlias()
     76 ; IMPORT-DAG: declare void @weakODRfuncLinkonceAlias()
     77 ; IMPORT-DAG: declare void @weakODRfuncWeakODRAlias()
     78 ; IMPORT-DAG: declare void @weakODRfuncLinkonceODRAlias()
     79 ; IMPORT-DAG: declare void @linkoncefuncAlias()
     80 ; IMPORT-DAG: declare void @linkoncefuncWeakAlias()
     81 ; IMPORT-DAG: declare void @linkoncefuncLinkonceAlias()
     82 ; IMPORT-DAG: declare void @linkoncefuncWeakODRAlias()
     83 ; IMPORT-DAG: declare void @linkoncefuncLinkonceODRAlias()
     84 ; IMPORT-DAG: declare void @weakfuncAlias()
     85 ; IMPORT-DAG: declare void @weakfuncWeakAlias()
     86 ; IMPORT-DAG: declare void @weakfuncLinkonceAlias()
     87 ; IMPORT-DAG: declare void @weakfuncWeakODRAlias()
     88 ; IMPORT-DAG: declare void @weakfuncLinkonceODRAlias()
     89 
     90 ; Promotion + internalization should internalize all of these, except for aliases of
     91 ; linkonce_odr functions, because alias to linkonce_odr are the only aliases we will
     92 ; import (see selectCallee() in FunctionImport.cpp).
     93 ; PROMOTE-INTERNALIZE-DAG: @globalfuncAlias = internal alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     94 ; PROMOTE-INTERNALIZE-DAG: @globalfuncWeakAlias = internal alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     95 ; PROMOTE-INTERNALIZE-DAG: @globalfuncLinkonceAlias = internal alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     96 ; PROMOTE-INTERNALIZE-DAG: @globalfuncWeakODRAlias = internal alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     97 ; PROMOTE-INTERNALIZE-DAG: @globalfuncLinkonceODRAlias = internal alias void (...), bitcast (void ()* @globalfunc to void (...)*)
     98 ; PROMOTE-INTERNALIZE-DAG: @internalfuncAlias = internal alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
     99 ; PROMOTE-INTERNALIZE-DAG: @internalfuncWeakAlias = internal alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
    100 ; PROMOTE-INTERNALIZE-DAG: @internalfuncLinkonceAlias = internal alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
    101 ; PROMOTE-INTERNALIZE-DAG: @internalfuncWeakODRAlias = internal alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
    102 ; PROMOTE-INTERNALIZE-DAG: @internalfuncLinkonceODRAlias = internal alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
    103 ; PROMOTE-INTERNALIZE-DAG: @linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
    104 ; PROMOTE-INTERNALIZE-DAG: @linkonceODRfuncWeakAlias = internal alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
    105 ; PROMOTE-INTERNALIZE-DAG: @linkonceODRfuncLinkonceAlias = internal alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
    106 ; PROMOTE-INTERNALIZE-DAG: @linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
    107 ; PROMOTE-INTERNALIZE-DAG: @linkonceODRfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
    108 ; PROMOTE-INTERNALIZE-DAG: @weakODRfuncAlias = internal alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
    109 ; PROMOTE-INTERNALIZE-DAG: @weakODRfuncWeakAlias = internal alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
    110 ; PROMOTE-INTERNALIZE-DAG: @weakODRfuncLinkonceAlias = internal alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
    111 ; PROMOTE-INTERNALIZE-DAG: @weakODRfuncWeakODRAlias = internal alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
    112 ; PROMOTE-INTERNALIZE-DAG: @weakODRfuncLinkonceODRAlias = internal alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
    113 ; PROMOTE-INTERNALIZE-DAG: @linkoncefuncAlias = internal alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
    114 ; PROMOTE-INTERNALIZE-DAG: @linkoncefuncWeakAlias = internal alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
    115 ; PROMOTE-INTERNALIZE-DAG: @linkoncefuncLinkonceAlias = internal alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
    116 ; PROMOTE-INTERNALIZE-DAG: @linkoncefuncWeakODRAlias = internal alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
    117 ; PROMOTE-INTERNALIZE-DAG: @linkoncefuncLinkonceODRAlias = internal alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
    118 ; PROMOTE-INTERNALIZE-DAG: @weakfuncAlias = internal alias void (...), bitcast (void ()* @weakfunc to void (...)*)
    119 ; PROMOTE-INTERNALIZE-DAG: @weakfuncWeakAlias = internal alias void (...), bitcast (void ()* @weakfunc to void (...)*)
    120 ; PROMOTE-INTERNALIZE-DAG: @weakfuncLinkonceAlias = internal alias void (...), bitcast (void ()* @weakfunc to void (...)*)
    121 ; PROMOTE-INTERNALIZE-DAG: @weakfuncWeakODRAlias = internal alias void (...), bitcast (void ()* @weakfunc to void (...)*)
    122 ; PROMOTE-INTERNALIZE-DAG: @weakfuncLinkonceODRAlias = internal alias void (...), bitcast (void ()* @weakfunc to void (...)*)
    123 ; PROMOTE-INTERNALIZE-DAG: define internal void @globalfunc()
    124 ; PROMOTE-INTERNALIZE-DAG: define internal void @internalfunc.llvm.0()
    125 ; PROMOTE-INTERNALIZE-DAG: define internal void @linkonceODRfunc()
    126 ; PROMOTE-INTERNALIZE-DAG: define internal void @weakODRfunc()
    127 ; PROMOTE-INTERNALIZE-DAG: define internal void @linkoncefunc()
    128 ; PROMOTE-INTERNALIZE-DAG: define internal void @weakfunc()
    129 
    130 define i32 @main() #0 {
    131 entry:
    132   call void @globalfuncAlias()
    133   call void @globalfuncWeakAlias()
    134   call void @globalfuncLinkonceAlias()
    135   call void @globalfuncWeakODRAlias()
    136   call void @globalfuncLinkonceODRAlias()
    137 
    138   call void @internalfuncAlias()
    139   call void @internalfuncWeakAlias()
    140   call void @internalfuncLinkonceAlias()
    141   call void @internalfuncWeakODRAlias()
    142   call void @internalfuncLinkonceODRAlias()
    143   call void @linkonceODRfuncAlias()
    144   call void @linkonceODRfuncWeakAlias()
    145   call void @linkonceODRfuncLinkonceAlias()
    146   call void @linkonceODRfuncWeakODRAlias()
    147   call void @linkonceODRfuncLinkonceODRAlias()
    148 
    149   call void @weakODRfuncAlias()
    150   call void @weakODRfuncWeakAlias()
    151   call void @weakODRfuncLinkonceAlias()
    152   call void @weakODRfuncWeakODRAlias()
    153   call void @weakODRfuncLinkonceODRAlias()
    154 
    155   call void @linkoncefuncAlias()
    156   call void @linkoncefuncWeakAlias()
    157   call void @linkoncefuncLinkonceAlias()
    158   call void @linkoncefuncWeakODRAlias()
    159   call void @linkoncefuncLinkonceODRAlias()
    160 
    161   call void @weakfuncAlias()
    162   call void @weakfuncWeakAlias()
    163   call void @weakfuncLinkonceAlias()
    164   call void @weakfuncWeakODRAlias()
    165   call void @weakfuncLinkonceODRAlias()
    166 
    167   ret i32 0
    168 }
    169 
    170 
    171 declare void @globalfuncAlias()
    172 declare void @globalfuncWeakAlias()
    173 declare void @globalfuncLinkonceAlias()
    174 declare void @globalfuncWeakODRAlias()
    175 declare void @globalfuncLinkonceODRAlias()
    176 
    177 declare void @internalfuncAlias()
    178 declare void @internalfuncWeakAlias()
    179 declare void @internalfuncLinkonceAlias()
    180 declare void @internalfuncWeakODRAlias()
    181 declare void @internalfuncLinkonceODRAlias()
    182 
    183 declare void @linkonceODRfuncAlias()
    184 declare void @linkonceODRfuncWeakAlias()
    185 declare void @linkonceODRfuncLinkonceAlias()
    186 declare void @linkonceODRfuncWeakODRAlias()
    187 declare void @linkonceODRfuncLinkonceODRAlias()
    188 
    189 declare void @weakODRfuncAlias()
    190 declare void @weakODRfuncWeakAlias()
    191 declare void @weakODRfuncLinkonceAlias()
    192 declare void @weakODRfuncWeakODRAlias()
    193 declare void @weakODRfuncLinkonceODRAlias()
    194 
    195 declare void @linkoncefuncAlias()
    196 declare void @linkoncefuncWeakAlias()
    197 declare void @linkoncefuncLinkonceAlias()
    198 declare void @linkoncefuncWeakODRAlias()
    199 declare void @linkoncefuncLinkonceODRAlias()
    200 
    201 declare void @weakfuncAlias()
    202 declare void @weakfuncWeakAlias()
    203 declare void @weakfuncLinkonceAlias()
    204 declare void @weakfuncWeakODRAlias()
    205 declare void @weakfuncLinkonceODRAlias()
    206 
    207 
    208