blob: d4ba9bb52ec09e203c49cc66e6391224b7287772 [file] [log] [blame]
Mehdi Aminia71a5a62016-04-21 05:47:17 +00001; 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=import -thinlto-index %t.index.bc %t1.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=IMPORT
6
7;
8; Alias can't point to "available_externally", so we can only import an alias
9; when we can import the aliasee with a linkage that won't be
10; available_externally, i.e linkOnceODR. (FIXME this limitation could be lifted)
11; PROMOTE-DAG: @globalfuncAlias = alias void (...), bitcast (void ()* @globalfunc to void (...)*)
12; PROMOTE-DAG: @globalfuncWeakAlias = weak alias void (...), bitcast (void ()* @globalfunc to void (...)*)
13; PROMOTE-DAG: @globalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @globalfunc to void (...)*)
14; PROMOTE-DAG: @globalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)
15; PROMOTE-DAG: @globalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)
16; PROMOTE-DAG: @internalfuncAlias = alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
17; PROMOTE-DAG: @internalfuncWeakAlias = weak alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
18; PROMOTE-DAG: @internalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
19; PROMOTE-DAG: @internalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
20; PROMOTE-DAG: @internalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
21; PROMOTE-DAG: @linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
22; PROMOTE-DAG: @linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
23; PROMOTE-DAG: @linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
24; PROMOTE-DAG: @linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
25; PROMOTE-DAG: @linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)
26; PROMOTE-DAG: @weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc to void (...)*)
27; PROMOTE-DAG: @weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc to void (...)*)
28; PROMOTE-DAG: @weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakfunc to void (...)*)
29; PROMOTE-DAG: @weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)
30; PROMOTE-DAG: @weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)
31; PROMOTE-DAG: @weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
32; PROMOTE-DAG: @weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
33; PROMOTE-DAG: @weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
34; PROMOTE-DAG: @weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
35; PROMOTE-DAG: @weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)
36
37; Only alias to LinkonceODR aliasee can be imported
38; PROMOTE-DAG: @linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
39; PROMOTE-DAG: @linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
40; PROMOTE-DAG: @linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
41; Amongst these that are imported, check that we promote only linkonce->weak
42; PROMOTE-DAG: @linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
43; PROMOTE-DAG: @linkonceODRfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
44
45; These will be imported, check the linkage/renaming after promotion
46; PROMOTE-DAG: define void @globalfunc()
47; PROMOTE-DAG: define hidden void @internalfunc.llvm.0()
48; PROMOTE-DAG: define linkonce_odr void @linkonceODRfunc()
49; PROMOTE-DAG: define weak_odr void @weakODRfunc()
50; PROMOTE-DAG: define linkonce void @linkoncefunc()
51; PROMOTE-DAG: define weak void @weakfunc()
52
Mehdi Amini5b85d8d2016-05-03 00:27:28 +000053; On the import side now, verify that aliases to a linkonce_odr are imported, but the weak/linkonce (we can't inline them)
Mehdi Aminia71a5a62016-04-21 05:47:17 +000054; IMPORT-DAG: declare void @linkonceODRfuncWeakAlias
Mehdi Amini5b85d8d2016-05-03 00:27:28 +000055; IMPORT-DAG: declare void @linkonceODRfuncLinkonceAlias
Mehdi Aminia71a5a62016-04-21 05:47:17 +000056; IMPORT-DAG: @linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
Mehdi Aminia71a5a62016-04-21 05:47:17 +000057; IMPORT-DAG: @linkonceODRfuncWeakODRAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
58; IMPORT-DAG: @linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
59; IMPORT-DAG: define linkonce_odr void @linkonceODRfunc()
60
61
62; On the import side, these aliases are not imported (they don't point to a linkonce_odr)
63; IMPORT-DAG: declare void @globalfuncAlias()
64; IMPORT-DAG: declare void @globalfuncWeakAlias()
65; IMPORT-DAG: declare void @globalfuncLinkonceAlias()
66; IMPORT-DAG: declare void @globalfuncWeakODRAlias()
67; IMPORT-DAG: declare void @globalfuncLinkonceODRAlias()
68; IMPORT-DAG: declare void @internalfuncAlias()
69; IMPORT-DAG: declare void @internalfuncWeakAlias()
70; IMPORT-DAG: declare void @internalfuncLinkonceAlias()
71; IMPORT-DAG: declare void @internalfuncWeakODRAlias()
72; IMPORT-DAG: declare void @internalfuncLinkonceODRAlias()
73; IMPORT-DAG: declare void @weakODRfuncAlias()
74; IMPORT-DAG: declare void @weakODRfuncWeakAlias()
75; IMPORT-DAG: declare void @weakODRfuncLinkonceAlias()
76; IMPORT-DAG: declare void @weakODRfuncWeakODRAlias()
77; IMPORT-DAG: declare void @weakODRfuncLinkonceODRAlias()
78; IMPORT-DAG: declare void @linkoncefuncAlias()
79; IMPORT-DAG: declare void @linkoncefuncWeakAlias()
80; IMPORT-DAG: declare void @linkoncefuncLinkonceAlias()
81; IMPORT-DAG: declare void @linkoncefuncWeakODRAlias()
82; IMPORT-DAG: declare void @linkoncefuncLinkonceODRAlias()
83; IMPORT-DAG: declare void @weakfuncAlias()
84; IMPORT-DAG: declare void @weakfuncWeakAlias()
85; IMPORT-DAG: declare void @weakfuncLinkonceAlias()
86; IMPORT-DAG: declare void @weakfuncWeakODRAlias()
87; IMPORT-DAG: declare void @weakfuncLinkonceODRAlias()
88
89
90
91define i32 @main() #0 {
92entry:
93 call void @globalfuncAlias()
94 call void @globalfuncWeakAlias()
95 call void @globalfuncLinkonceAlias()
96 call void @globalfuncWeakODRAlias()
97 call void @globalfuncLinkonceODRAlias()
98
99 call void @internalfuncAlias()
100 call void @internalfuncWeakAlias()
101 call void @internalfuncLinkonceAlias()
102 call void @internalfuncWeakODRAlias()
103 call void @internalfuncLinkonceODRAlias()
104 call void @linkonceODRfuncAlias()
105 call void @linkonceODRfuncWeakAlias()
106 call void @linkonceODRfuncLinkonceAlias()
107 call void @linkonceODRfuncWeakODRAlias()
108 call void @linkonceODRfuncLinkonceODRAlias()
109
110 call void @weakODRfuncAlias()
111 call void @weakODRfuncWeakAlias()
112 call void @weakODRfuncLinkonceAlias()
113 call void @weakODRfuncWeakODRAlias()
114 call void @weakODRfuncLinkonceODRAlias()
115
116 call void @linkoncefuncAlias()
117 call void @linkoncefuncWeakAlias()
118 call void @linkoncefuncLinkonceAlias()
119 call void @linkoncefuncWeakODRAlias()
120 call void @linkoncefuncLinkonceODRAlias()
121
122 call void @weakfuncAlias()
123 call void @weakfuncWeakAlias()
124 call void @weakfuncLinkonceAlias()
125 call void @weakfuncWeakODRAlias()
126 call void @weakfuncLinkonceODRAlias()
127
128 ret i32 0
129}
130
131
132declare void @globalfuncAlias()
133declare void @globalfuncWeakAlias()
134declare void @globalfuncLinkonceAlias()
135declare void @globalfuncWeakODRAlias()
136declare void @globalfuncLinkonceODRAlias()
137
138declare void @internalfuncAlias()
139declare void @internalfuncWeakAlias()
140declare void @internalfuncLinkonceAlias()
141declare void @internalfuncWeakODRAlias()
142declare void @internalfuncLinkonceODRAlias()
143
144declare void @linkonceODRfuncAlias()
145declare void @linkonceODRfuncWeakAlias()
146declare void @linkonceODRfuncLinkonceAlias()
147declare void @linkonceODRfuncWeakODRAlias()
148declare void @linkonceODRfuncLinkonceODRAlias()
149
150declare void @weakODRfuncAlias()
151declare void @weakODRfuncWeakAlias()
152declare void @weakODRfuncLinkonceAlias()
153declare void @weakODRfuncWeakODRAlias()
154declare void @weakODRfuncLinkonceODRAlias()
155
156declare void @linkoncefuncAlias()
157declare void @linkoncefuncWeakAlias()
158declare void @linkoncefuncLinkonceAlias()
159declare void @linkoncefuncWeakODRAlias()
160declare void @linkoncefuncLinkonceODRAlias()
161
162declare void @weakfuncAlias()
163declare void @weakfuncWeakAlias()
164declare void @weakfuncLinkonceAlias()
165declare void @weakfuncWeakODRAlias()
166declare void @weakfuncLinkonceODRAlias()
167
168