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