1 // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief This file contains signature information for runtime libcalls.
12 ///
13 /// CodeGen uses external symbols, which it refers to by name. The WebAssembly
14 /// target needs type information for all functions. This file contains a big
15 /// table providing type signatures for all runtime library functions that LLVM
16 /// uses.
17 ///
18 /// This is currently a fairly heavy-handed solution.
19 ///
20 //===----------------------------------------------------------------------===//
21 
22 #include "WebAssemblyRuntimeLibcallSignatures.h"
23 #include "WebAssemblySubtarget.h"
24 #include "llvm/CodeGen/RuntimeLibcalls.h"
25 
26 using namespace llvm;
27 
28 namespace {
29 
30 enum RuntimeLibcallSignature {
31   func,
32   f32_func_f32,
33   f32_func_f64,
34   f32_func_i32,
35   f32_func_i64,
36   f32_func_i16,
37   f64_func_f32,
38   f64_func_f64,
39   f64_func_i32,
40   f64_func_i64,
41   i32_func_f32,
42   i32_func_f64,
43   i32_func_i32,
44   i64_func_f32,
45   i64_func_f64,
46   i64_func_i64,
47   f32_func_f32_f32,
48   f32_func_f32_i32,
49   f32_func_i64_i64,
50   f64_func_f64_f64,
51   f64_func_f64_i32,
52   f64_func_i64_i64,
53   i16_func_f32,
54   i8_func_i8_i8,
55   func_f32_iPTR_iPTR,
56   func_f64_iPTR_iPTR,
57   i16_func_i16_i16,
58   i32_func_f32_f32,
59   i32_func_f64_f64,
60   i32_func_i32_i32,
61   i64_func_i64_i64,
62   i64_i64_func_f32,
63   i64_i64_func_f64,
64   i16_i16_func_i16_i16,
65   i32_i32_func_i32_i32,
66   i64_i64_func_i64_i64,
67   i64_i64_func_i64_i64_i64_i64,
68   i64_i64_i64_i64_func_i64_i64_i64_i64,
69   i64_i64_func_i64_i64_i32,
70   iPTR_func_iPTR_i32_iPTR,
71   iPTR_func_iPTR_iPTR_iPTR,
72   f32_func_f32_f32_f32,
73   f64_func_f64_f64_f64,
74   func_i64_i64_iPTR_iPTR,
75   func_iPTR_f32,
76   func_iPTR_f64,
77   func_iPTR_i32,
78   func_iPTR_i64,
79   func_iPTR_i64_i64,
80   func_iPTR_i64_i64_i64_i64,
81   func_iPTR_i64_i64_i64_i64_i64_i64,
82   i32_func_i64_i64,
83   i32_func_i64_i64_i64_i64,
84   unsupported
85 };
86 
87 } // end anonymous namespace
88 
89 static const RuntimeLibcallSignature
90 RuntimeLibcallSignatures[RTLIB::UNKNOWN_LIBCALL] = {
91 // Integer
92 /* SHL_I16 */ i16_func_i16_i16,
93 /* SHL_I32 */ i32_func_i32_i32,
94 /* SHL_I64 */ i64_func_i64_i64,
95 /* SHL_I128 */ i64_i64_func_i64_i64_i32,
96 /* SRL_I16 */ i16_func_i16_i16,
97 /* SRL_I32 */ i32_func_i32_i32,
98 /* SRL_I64 */ i64_func_i64_i64,
99 /* SRL_I128 */ i64_i64_func_i64_i64_i32,
100 /* SRA_I16 */ i16_func_i16_i16,
101 /* SRA_I32 */ i32_func_i32_i32,
102 /* SRA_I64 */ i64_func_i64_i64,
103 /* SRA_I128 */ i64_i64_func_i64_i64_i32,
104 /* MUL_I8 */ i8_func_i8_i8,
105 /* MUL_I16 */ i16_func_i16_i16,
106 /* MUL_I32 */ i32_func_i32_i32,
107 /* MUL_I64 */ i64_func_i64_i64,
108 /* MUL_I128 */ i64_i64_func_i64_i64_i64_i64,
109 /* MULO_I32 */ i32_func_i32_i32,
110 /* MULO_I64 */ i64_func_i64_i64,
111 /* MULO_I128 */ i64_i64_func_i64_i64_i64_i64,
112 /* SDIV_I8 */ i8_func_i8_i8,
113 /* SDIV_I16 */ i16_func_i16_i16,
114 /* SDIV_I32 */ i32_func_i32_i32,
115 /* SDIV_I64 */ i64_func_i64_i64,
116 /* SDIV_I128 */ i64_i64_func_i64_i64_i64_i64,
117 /* UDIV_I8 */ i8_func_i8_i8,
118 /* UDIV_I16 */ i16_func_i16_i16,
119 /* UDIV_I32 */ i32_func_i32_i32,
120 /* UDIV_I64 */ i64_func_i64_i64,
121 /* UDIV_I128 */ i64_i64_func_i64_i64_i64_i64,
122 /* SREM_I8 */ i8_func_i8_i8,
123 /* SREM_I16 */ i16_func_i16_i16,
124 /* SREM_I32 */ i32_func_i32_i32,
125 /* SREM_I64 */ i64_func_i64_i64,
126 /* SREM_I128 */ i64_i64_func_i64_i64_i64_i64,
127 /* UREM_I8 */ i8_func_i8_i8,
128 /* UREM_I16 */ i16_func_i16_i16,
129 /* UREM_I32 */ i32_func_i32_i32,
130 /* UREM_I64 */ i64_func_i64_i64,
131 /* UREM_I128 */ i64_i64_func_i64_i64_i64_i64,
132 /* SDIVREM_I8 */ i8_func_i8_i8,
133 /* SDIVREM_I16 */ i16_i16_func_i16_i16,
134 /* SDIVREM_I32 */ i32_i32_func_i32_i32,
135 /* SDIVREM_I64 */ i64_func_i64_i64,
136 /* SDIVREM_I128 */ i64_i64_i64_i64_func_i64_i64_i64_i64,
137 /* UDIVREM_I8 */ i8_func_i8_i8,
138 /* UDIVREM_I16 */ i16_i16_func_i16_i16,
139 /* UDIVREM_I32 */ i32_i32_func_i32_i32,
140 /* UDIVREM_I64 */ i64_i64_func_i64_i64,
141 /* UDIVREM_I128 */ i64_i64_i64_i64_func_i64_i64_i64_i64,
142 /* NEG_I32 */ i32_func_i32,
143 /* NEG_I64 */ i64_func_i64,
144 
145 // FLOATING POINT
146 /* ADD_F32 */ f32_func_f32_f32,
147 /* ADD_F64 */ f64_func_f64_f64,
148 /* ADD_F80 */ unsupported,
149 /* ADD_F128 */ func_iPTR_i64_i64_i64_i64,
150 /* ADD_PPCF128 */ unsupported,
151 /* SUB_F32 */ f32_func_f32_f32,
152 /* SUB_F64 */ f64_func_f64_f64,
153 /* SUB_F80 */ unsupported,
154 /* SUB_F128 */ func_iPTR_i64_i64_i64_i64,
155 /* SUB_PPCF128 */ unsupported,
156 /* MUL_F32 */ f32_func_f32_f32,
157 /* MUL_F64 */ f64_func_f64_f64,
158 /* MUL_F80 */ unsupported,
159 /* MUL_F128 */ func_iPTR_i64_i64_i64_i64,
160 /* MUL_PPCF128 */ unsupported,
161 /* DIV_F32 */ f32_func_f32_f32,
162 /* DIV_F64 */ f64_func_f64_f64,
163 /* DIV_F80 */ unsupported,
164 /* DIV_F128 */ func_iPTR_i64_i64_i64_i64,
165 /* DIV_PPCF128 */ unsupported,
166 /* REM_F32 */ f32_func_f32_f32,
167 /* REM_F64 */ f64_func_f64_f64,
168 /* REM_F80 */ unsupported,
169 /* REM_F128 */ func_iPTR_i64_i64_i64_i64,
170 /* REM_PPCF128 */ unsupported,
171 /* FMA_F32 */ f32_func_f32_f32_f32,
172 /* FMA_F64 */ f64_func_f64_f64_f64,
173 /* FMA_F80 */ unsupported,
174 /* FMA_F128 */ func_iPTR_i64_i64_i64_i64_i64_i64,
175 /* FMA_PPCF128 */ unsupported,
176 /* POWI_F32 */ f32_func_f32_i32,
177 /* POWI_F64 */ f64_func_f64_i32,
178 /* POWI_F80 */ unsupported,
179 /* POWI_F128 */ func_iPTR_i64_i64_i64_i64,
180 /* POWI_PPCF128 */ unsupported,
181 /* SQRT_F32 */ f32_func_f32,
182 /* SQRT_F64 */ f64_func_f64,
183 /* SQRT_F80 */ unsupported,
184 /* SQRT_F128 */ func_iPTR_i64_i64,
185 /* SQRT_PPCF128 */ unsupported,
186 /* LOG_F32 */ f32_func_f32,
187 /* LOG_F64 */ f64_func_f64,
188 /* LOG_F80 */ unsupported,
189 /* LOG_F128 */ func_iPTR_i64_i64,
190 /* LOG_PPCF128 */ unsupported,
191 /* LOG2_F32 */ f32_func_f32,
192 /* LOG2_F64 */ f64_func_f64,
193 /* LOG2_F80 */ unsupported,
194 /* LOG2_F128 */ func_iPTR_i64_i64,
195 /* LOG2_PPCF128 */ unsupported,
196 /* LOG10_F32 */ f32_func_f32,
197 /* LOG10_F64 */ f64_func_f64,
198 /* LOG10_F80 */ unsupported,
199 /* LOG10_F128 */ func_iPTR_i64_i64,
200 /* LOG10_PPCF128 */ unsupported,
201 /* EXP_F32 */ f32_func_f32,
202 /* EXP_F64 */ f64_func_f64,
203 /* EXP_F80 */ unsupported,
204 /* EXP_F128 */ func_iPTR_i64_i64,
205 /* EXP_PPCF128 */ unsupported,
206 /* EXP2_F32 */ f32_func_f32,
207 /* EXP2_F64 */ f64_func_f64,
208 /* EXP2_F80 */ unsupported,
209 /* EXP2_F128 */ func_iPTR_i64_i64,
210 /* EXP2_PPCF128 */ unsupported,
211 /* SIN_F32 */ f32_func_f32,
212 /* SIN_F64 */ f64_func_f64,
213 /* SIN_F80 */ unsupported,
214 /* SIN_F128 */ func_iPTR_i64_i64,
215 /* SIN_PPCF128 */ unsupported,
216 /* COS_F32 */ f32_func_f32,
217 /* COS_F64 */ f64_func_f64,
218 /* COS_F80 */ unsupported,
219 /* COS_F128 */ func_iPTR_i64_i64,
220 /* COS_PPCF128 */ unsupported,
221 /* SINCOS_F32 */ func_f32_iPTR_iPTR,
222 /* SINCOS_F64 */ func_f64_iPTR_iPTR,
223 /* SINCOS_F80 */ unsupported,
224 /* SINCOS_F128 */ func_i64_i64_iPTR_iPTR,
225 /* SINCOS_PPCF128 */ unsupported,
226 /* POW_F32 */ f32_func_f32_f32,
227 /* POW_F64 */ f64_func_f64_f64,
228 /* POW_F80 */ unsupported,
229 /* POW_F128 */ func_iPTR_i64_i64_i64_i64,
230 /* POW_PPCF128 */ unsupported,
231 /* CEIL_F32 */ f32_func_f32,
232 /* CEIL_F64 */ f64_func_f64,
233 /* CEIL_F80 */ unsupported,
234 /* CEIL_F128 */ func_iPTR_i64_i64,
235 /* CEIL_PPCF128 */ unsupported,
236 /* TRUNC_F32 */ f32_func_f32,
237 /* TRUNC_F64 */ f64_func_f64,
238 /* TRUNC_F80 */ unsupported,
239 /* TRUNC_F128 */ func_iPTR_i64_i64,
240 /* TRUNC_PPCF128 */ unsupported,
241 /* RINT_F32 */ f32_func_f32,
242 /* RINT_F64 */ f64_func_f64,
243 /* RINT_F80 */ unsupported,
244 /* RINT_F128 */ func_iPTR_i64_i64,
245 /* RINT_PPCF128 */ unsupported,
246 /* NEARBYINT_F32 */ f32_func_f32,
247 /* NEARBYINT_F64 */ f64_func_f64,
248 /* NEARBYINT_F80 */ unsupported,
249 /* NEARBYINT_F128 */ func_iPTR_i64_i64,
250 /* NEARBYINT_PPCF128 */ unsupported,
251 /* ROUND_F32 */ f32_func_f32,
252 /* ROUND_F64 */ f64_func_f64,
253 /* ROUND_F80 */ unsupported,
254 /* ROUND_F128 */ func_iPTR_i64_i64,
255 /* ROUND_PPCF128 */ unsupported,
256 /* FLOOR_F32 */ f32_func_f32,
257 /* FLOOR_F64 */ f64_func_f64,
258 /* FLOOR_F80 */ unsupported,
259 /* FLOOR_F128 */ func_iPTR_i64_i64,
260 /* FLOOR_PPCF128 */ unsupported,
261 /* COPYSIGN_F32 */ f32_func_f32_f32,
262 /* COPYSIGN_F64 */ f64_func_f64_f64,
263 /* COPYSIGN_F80 */ unsupported,
264 /* COPYSIGN_F128 */ func_iPTR_i64_i64_i64_i64,
265 /* COPYSIGN_PPCF128 */ unsupported,
266 /* FMIN_F32 */ f32_func_f32_f32,
267 /* FMIN_F64 */ f64_func_f64_f64,
268 /* FMIN_F80 */ unsupported,
269 /* FMIN_F128 */ func_iPTR_i64_i64_i64_i64,
270 /* FMIN_PPCF128 */ unsupported,
271 /* FMAX_F32 */ f32_func_f32_f32,
272 /* FMAX_F64 */ f64_func_f64_f64,
273 /* FMAX_F80 */ unsupported,
274 /* FMAX_F128 */ func_iPTR_i64_i64_i64_i64,
275 /* FMAX_PPCF128 */ unsupported,
276 
277 // CONVERSION
278 /* FPEXT_F32_PPCF128 */ unsupported,
279 /* FPEXT_F64_PPCF128 */ unsupported,
280 /* FPEXT_F64_F128 */ func_iPTR_f64,
281 /* FPEXT_F32_F128 */ func_iPTR_f32,
282 /* FPEXT_F32_F64 */ f64_func_f32,
283 /* FPEXT_F16_F32 */ f32_func_i16,
284 /* FPROUND_F32_F16 */ i16_func_f32,
285 /* FPROUND_F64_F16 */ unsupported,
286 /* FPROUND_F80_F16 */ unsupported,
287 /* FPROUND_F128_F16 */ unsupported,
288 /* FPROUND_PPCF128_F16 */ unsupported,
289 /* FPROUND_F64_F32 */ f32_func_f64,
290 /* FPROUND_F80_F32 */ unsupported,
291 /* FPROUND_F128_F32 */ f32_func_i64_i64,
292 /* FPROUND_PPCF128_F32 */ unsupported,
293 /* FPROUND_F80_F64 */ unsupported,
294 /* FPROUND_F128_F64 */ f64_func_i64_i64,
295 /* FPROUND_PPCF128_F64 */ unsupported,
296 /* FPTOSINT_F32_I32 */ i32_func_f32,
297 /* FPTOSINT_F32_I64 */ i64_func_f32,
298 /* FPTOSINT_F32_I128 */ i64_i64_func_f32,
299 /* FPTOSINT_F64_I32 */ i32_func_f64,
300 /* FPTOSINT_F64_I64 */ i64_func_f64,
301 /* FPTOSINT_F64_I128 */ i64_i64_func_f64,
302 /* FPTOSINT_F80_I32 */ unsupported,
303 /* FPTOSINT_F80_I64 */ unsupported,
304 /* FPTOSINT_F80_I128 */ unsupported,
305 /* FPTOSINT_F128_I32 */ i32_func_i64_i64,
306 /* FPTOSINT_F128_I64 */ i64_func_i64_i64,
307 /* FPTOSINT_F128_I128 */ i64_i64_func_i64_i64,
308 /* FPTOSINT_PPCF128_I32 */ unsupported,
309 /* FPTOSINT_PPCF128_I64 */ unsupported,
310 /* FPTOSINT_PPCF128_I128 */ unsupported,
311 /* FPTOUINT_F32_I32 */ i32_func_f32,
312 /* FPTOUINT_F32_I64 */ i64_func_f32,
313 /* FPTOUINT_F32_I128 */ i64_i64_func_f32,
314 /* FPTOUINT_F64_I32 */ i32_func_f64,
315 /* FPTOUINT_F64_I64 */ i64_func_f64,
316 /* FPTOUINT_F64_I128 */ i64_i64_func_f64,
317 /* FPTOUINT_F80_I32 */ unsupported,
318 /* FPTOUINT_F80_I64 */ unsupported,
319 /* FPTOUINT_F80_I128 */ unsupported,
320 /* FPTOUINT_F128_I32 */ i32_func_i64_i64,
321 /* FPTOUINT_F128_I64 */ i64_func_i64_i64,
322 /* FPTOUINT_F128_I128 */ i64_i64_func_i64_i64,
323 /* FPTOUINT_PPCF128_I32 */ unsupported,
324 /* FPTOUINT_PPCF128_I64 */ unsupported,
325 /* FPTOUINT_PPCF128_I128 */ unsupported,
326 /* SINTTOFP_I32_F32 */ f32_func_i32,
327 /* SINTTOFP_I32_F64 */ f64_func_i32,
328 /* SINTTOFP_I32_F80 */ unsupported,
329 /* SINTTOFP_I32_F128 */ func_iPTR_i32,
330 /* SINTTOFP_I32_PPCF128 */ unsupported,
331 /* SINTTOFP_I64_F32 */ f32_func_i64,
332 /* SINTTOFP_I64_F64 */ f64_func_i64,
333 /* SINTTOFP_I64_F80 */ unsupported,
334 /* SINTTOFP_I64_F128 */ func_iPTR_i64,
335 /* SINTTOFP_I64_PPCF128 */ unsupported,
336 /* SINTTOFP_I128_F32 */ f32_func_i64_i64,
337 /* SINTTOFP_I128_F64 */ f64_func_i64_i64,
338 /* SINTTOFP_I128_F80 */ unsupported,
339 /* SINTTOFP_I128_F128 */ func_iPTR_i64_i64,
340 /* SINTTOFP_I128_PPCF128 */ unsupported,
341 /* UINTTOFP_I32_F32 */ f32_func_i32,
342 /* UINTTOFP_I32_F64 */ f64_func_i64,
343 /* UINTTOFP_I32_F80 */ unsupported,
344 /* UINTTOFP_I32_F128 */ func_iPTR_i32,
345 /* UINTTOFP_I32_PPCF128 */ unsupported,
346 /* UINTTOFP_I64_F32 */ f32_func_i64,
347 /* UINTTOFP_I64_F64 */ f64_func_i64,
348 /* UINTTOFP_I64_F80 */ unsupported,
349 /* UINTTOFP_I64_F128 */ func_iPTR_i64,
350 /* UINTTOFP_I64_PPCF128 */ unsupported,
351 /* UINTTOFP_I128_F32 */ f32_func_i64_i64,
352 /* UINTTOFP_I128_F64 */ f64_func_i64_i64,
353 /* UINTTOFP_I128_F80 */ unsupported,
354 /* UINTTOFP_I128_F128 */ func_iPTR_i64_i64,
355 /* UINTTOFP_I128_PPCF128 */ unsupported,
356 
357 // COMPARISON
358 /* OEQ_F32 */ i32_func_f32_f32,
359 /* OEQ_F64 */ i32_func_f64_f64,
360 /* OEQ_F128 */ i32_func_i64_i64_i64_i64,
361 /* OEQ_PPCF128 */ unsupported,
362 /* UNE_F32 */ i32_func_f32_f32,
363 /* UNE_F64 */ i32_func_f64_f64,
364 /* UNE_F128 */ i32_func_i64_i64_i64_i64,
365 /* UNE_PPCF128 */ unsupported,
366 /* OGE_F32 */ i32_func_f32_f32,
367 /* OGE_F64 */ i32_func_f64_f64,
368 /* OGE_F128 */ i32_func_i64_i64_i64_i64,
369 /* OGE_PPCF128 */ unsupported,
370 /* OLT_F32 */ i32_func_f32_f32,
371 /* OLT_F64 */ i32_func_f64_f64,
372 /* OLT_F128 */ i32_func_i64_i64_i64_i64,
373 /* OLT_PPCF128 */ unsupported,
374 /* OLE_F32 */ i32_func_f32_f32,
375 /* OLE_F64 */ i32_func_f64_f64,
376 /* OLE_F128 */ i32_func_i64_i64_i64_i64,
377 /* OLE_PPCF128 */ unsupported,
378 /* OGT_F32 */ i32_func_f32_f32,
379 /* OGT_F64 */ i32_func_f64_f64,
380 /* OGT_F128 */ i32_func_i64_i64_i64_i64,
381 /* OGT_PPCF128 */ unsupported,
382 /* UO_F32 */ i32_func_f32_f32,
383 /* UO_F64 */ i32_func_f64_f64,
384 /* UO_F128 */ i32_func_i64_i64_i64_i64,
385 /* UO_PPCF128 */ unsupported,
386 /* O_F32 */ i32_func_f32_f32,
387 /* O_F64 */ i32_func_f64_f64,
388 /* O_F128 */ i32_func_i64_i64_i64_i64,
389 /* O_PPCF128 */ unsupported,
390 
391 // MEMORY
392 /* MEMCPY */ iPTR_func_iPTR_iPTR_iPTR,
393 /* MEMSET */ iPTR_func_iPTR_i32_iPTR,
394 /* MEMMOVE */ iPTR_func_iPTR_iPTR_iPTR,
395 
396 // ELEMENT-WISE ATOMIC MEMORY
397 /* MEMCPY_ELEMENT_ATOMIC_1 */ iPTR_func_iPTR_iPTR_iPTR,
398 /* MEMCPY_ELEMENT_ATOMIC_2 */ iPTR_func_iPTR_iPTR_iPTR,
399 /* MEMCPY_ELEMENT_ATOMIC_4 */ iPTR_func_iPTR_iPTR_iPTR,
400 /* MEMCPY_ELEMENT_ATOMIC_8 */ iPTR_func_iPTR_iPTR_iPTR,
401 /* MEMCPY_ELEMENT_ATOMIC_16 */ iPTR_func_iPTR_iPTR_iPTR,
402 
403 // EXCEPTION HANDLING
404 /* UNWIND_RESUME */ unsupported,
405 
406 // Note: there's two sets of atomics libcalls; see
407 // <http://llvm.org/docs/Atomics.html> for more info on the
408 // difference between them.
409 
410 // Atomic '__sync_*' libcalls.
411 /* SYNC_VAL_COMPARE_AND_SWAP_1 */ unsupported,
412 /* SYNC_VAL_COMPARE_AND_SWAP_2 */ unsupported,
413 /* SYNC_VAL_COMPARE_AND_SWAP_4 */ unsupported,
414 /* SYNC_VAL_COMPARE_AND_SWAP_8 */ unsupported,
415 /* SYNC_VAL_COMPARE_AND_SWAP_16 */ unsupported,
416 /* SYNC_LOCK_TEST_AND_SET_1 */ unsupported,
417 /* SYNC_LOCK_TEST_AND_SET_2 */ unsupported,
418 /* SYNC_LOCK_TEST_AND_SET_4 */ unsupported,
419 /* SYNC_LOCK_TEST_AND_SET_8 */ unsupported,
420 /* SYNC_LOCK_TEST_AND_SET_16 */ unsupported,
421 /* SYNC_FETCH_AND_ADD_1 */ unsupported,
422 /* SYNC_FETCH_AND_ADD_2 */ unsupported,
423 /* SYNC_FETCH_AND_ADD_4 */ unsupported,
424 /* SYNC_FETCH_AND_ADD_8 */ unsupported,
425 /* SYNC_FETCH_AND_ADD_16 */ unsupported,
426 /* SYNC_FETCH_AND_SUB_1 */ unsupported,
427 /* SYNC_FETCH_AND_SUB_2 */ unsupported,
428 /* SYNC_FETCH_AND_SUB_4 */ unsupported,
429 /* SYNC_FETCH_AND_SUB_8 */ unsupported,
430 /* SYNC_FETCH_AND_SUB_16 */ unsupported,
431 /* SYNC_FETCH_AND_AND_1 */ unsupported,
432 /* SYNC_FETCH_AND_AND_2 */ unsupported,
433 /* SYNC_FETCH_AND_AND_4 */ unsupported,
434 /* SYNC_FETCH_AND_AND_8 */ unsupported,
435 /* SYNC_FETCH_AND_AND_16 */ unsupported,
436 /* SYNC_FETCH_AND_OR_1 */ unsupported,
437 /* SYNC_FETCH_AND_OR_2 */ unsupported,
438 /* SYNC_FETCH_AND_OR_4 */ unsupported,
439 /* SYNC_FETCH_AND_OR_8 */ unsupported,
440 /* SYNC_FETCH_AND_OR_16 */ unsupported,
441 /* SYNC_FETCH_AND_XOR_1 */ unsupported,
442 /* SYNC_FETCH_AND_XOR_2 */ unsupported,
443 /* SYNC_FETCH_AND_XOR_4 */ unsupported,
444 /* SYNC_FETCH_AND_XOR_8 */ unsupported,
445 /* SYNC_FETCH_AND_XOR_16 */ unsupported,
446 /* SYNC_FETCH_AND_NAND_1 */ unsupported,
447 /* SYNC_FETCH_AND_NAND_2 */ unsupported,
448 /* SYNC_FETCH_AND_NAND_4 */ unsupported,
449 /* SYNC_FETCH_AND_NAND_8 */ unsupported,
450 /* SYNC_FETCH_AND_NAND_16 */ unsupported,
451 /* SYNC_FETCH_AND_MAX_1 */ unsupported,
452 /* SYNC_FETCH_AND_MAX_2 */ unsupported,
453 /* SYNC_FETCH_AND_MAX_4 */ unsupported,
454 /* SYNC_FETCH_AND_MAX_8 */ unsupported,
455 /* SYNC_FETCH_AND_MAX_16 */ unsupported,
456 /* SYNC_FETCH_AND_UMAX_1 */ unsupported,
457 /* SYNC_FETCH_AND_UMAX_2 */ unsupported,
458 /* SYNC_FETCH_AND_UMAX_4 */ unsupported,
459 /* SYNC_FETCH_AND_UMAX_8 */ unsupported,
460 /* SYNC_FETCH_AND_UMAX_16 */ unsupported,
461 /* SYNC_FETCH_AND_MIN_1 */ unsupported,
462 /* SYNC_FETCH_AND_MIN_2 */ unsupported,
463 /* SYNC_FETCH_AND_MIN_4 */ unsupported,
464 /* SYNC_FETCH_AND_MIN_8 */ unsupported,
465 /* SYNC_FETCH_AND_MIN_16 */ unsupported,
466 /* SYNC_FETCH_AND_UMIN_1 */ unsupported,
467 /* SYNC_FETCH_AND_UMIN_2 */ unsupported,
468 /* SYNC_FETCH_AND_UMIN_4 */ unsupported,
469 /* SYNC_FETCH_AND_UMIN_8 */ unsupported,
470 /* SYNC_FETCH_AND_UMIN_16 */ unsupported,
471 
472 // Atomic '__atomic_*' libcalls.
473 /* ATOMIC_LOAD */ unsupported,
474 /* ATOMIC_LOAD_1 */ unsupported,
475 /* ATOMIC_LOAD_2 */ unsupported,
476 /* ATOMIC_LOAD_4 */ unsupported,
477 /* ATOMIC_LOAD_8 */ unsupported,
478 /* ATOMIC_LOAD_16 */ unsupported,
479 
480 /* ATOMIC_STORE */ unsupported,
481 /* ATOMIC_STORE_1 */ unsupported,
482 /* ATOMIC_STORE_2 */ unsupported,
483 /* ATOMIC_STORE_4 */ unsupported,
484 /* ATOMIC_STORE_8 */ unsupported,
485 /* ATOMIC_STORE_16 */ unsupported,
486 
487 /* ATOMIC_EXCHANGE */ unsupported,
488 /* ATOMIC_EXCHANGE_1 */ unsupported,
489 /* ATOMIC_EXCHANGE_2 */ unsupported,
490 /* ATOMIC_EXCHANGE_4 */ unsupported,
491 /* ATOMIC_EXCHANGE_8 */ unsupported,
492 /* ATOMIC_EXCHANGE_16 */ unsupported,
493 
494 /* ATOMIC_COMPARE_EXCHANGE */ unsupported,
495 /* ATOMIC_COMPARE_EXCHANGE_1 */ unsupported,
496 /* ATOMIC_COMPARE_EXCHANGE_2 */ unsupported,
497 /* ATOMIC_COMPARE_EXCHANGE_4 */ unsupported,
498 /* ATOMIC_COMPARE_EXCHANGE_8 */ unsupported,
499 /* ATOMIC_COMPARE_EXCHANGE_16 */ unsupported,
500 
501 /* ATOMIC_FETCH_ADD_1 */ unsupported,
502 /* ATOMIC_FETCH_ADD_2 */ unsupported,
503 /* ATOMIC_FETCH_ADD_4 */ unsupported,
504 /* ATOMIC_FETCH_ADD_8 */ unsupported,
505 /* ATOMIC_FETCH_ADD_16 */ unsupported,
506 
507 /* ATOMIC_FETCH_SUB_1 */ unsupported,
508 /* ATOMIC_FETCH_SUB_2 */ unsupported,
509 /* ATOMIC_FETCH_SUB_4 */ unsupported,
510 /* ATOMIC_FETCH_SUB_8 */ unsupported,
511 /* ATOMIC_FETCH_SUB_16 */ unsupported,
512 
513 /* ATOMIC_FETCH_AND_1 */ unsupported,
514 /* ATOMIC_FETCH_AND_2 */ unsupported,
515 /* ATOMIC_FETCH_AND_4 */ unsupported,
516 /* ATOMIC_FETCH_AND_8 */ unsupported,
517 /* ATOMIC_FETCH_AND_16 */ unsupported,
518 
519 /* ATOMIC_FETCH_OR_1 */ unsupported,
520 /* ATOMIC_FETCH_OR_2 */ unsupported,
521 /* ATOMIC_FETCH_OR_4 */ unsupported,
522 /* ATOMIC_FETCH_OR_8 */ unsupported,
523 /* ATOMIC_FETCH_OR_16 */ unsupported,
524 
525 /* ATOMIC_FETCH_XOR_1 */ unsupported,
526 /* ATOMIC_FETCH_XOR_2 */ unsupported,
527 /* ATOMIC_FETCH_XOR_4 */ unsupported,
528 /* ATOMIC_FETCH_XOR_8 */ unsupported,
529 /* ATOMIC_FETCH_XOR_16 */ unsupported,
530 
531 /* ATOMIC_FETCH_NAND_1 */ unsupported,
532 /* ATOMIC_FETCH_NAND_2 */ unsupported,
533 /* ATOMIC_FETCH_NAND_4 */ unsupported,
534 /* ATOMIC_FETCH_NAND_8 */ unsupported,
535 /* ATOMIC_FETCH_NAND_16 */ unsupported,
536 
537 // Stack Protector Fail.
538 /* STACKPROTECTOR_CHECK_FAIL */ func,
539 
540 // Deoptimization.
541 /* DEOPTIMIZE */ unsupported,
542 
543 };
544 
545 static const char *
546 RuntimeLibcallNames[RTLIB::UNKNOWN_LIBCALL] = {
547 /* SHL_I16 */ "__ashlhi3",
548 /* SHL_I32 */ "__ashlsi3",
549 /* SHL_I64 */ "__ashldi3",
550 /* SHL_I128 */ "__ashlti3",
551 /* SRL_I16 */ "__lshrhi3",
552 /* SRL_I32 */ "__lshrsi3",
553 /* SRL_I64 */ "__lshrdi3",
554 /* SRL_I128 */ "__lshrti3",
555 /* SRA_I16 */ "__ashrhi3",
556 /* SRA_I32 */ "__ashrsi3",
557 /* SRA_I64 */ "__ashrdi3",
558 /* SRA_I128 */ "__ashrti3",
559 /* MUL_I8 */ "__mulqi3",
560 /* MUL_I16 */ "__mulhi3",
561 /* MUL_I32 */ "__mulsi3",
562 /* MUL_I64 */ "__muldi3",
563 /* MUL_I128 */ "__multi3",
564 /* MULO_I32 */ "__mulosi4",
565 /* MULO_I64 */ "__mulodi4",
566 /* MULO_I128 */ "__muloti4",
567 /* SDIV_I8 */ "__divqi3",
568 /* SDIV_I16 */ "__divhi3",
569 /* SDIV_I32 */ "__divsi3",
570 /* SDIV_I64 */ "__divdi3",
571 /* SDIV_I128 */ "__divti3",
572 /* UDIV_I8 */ "__udivqi3",
573 /* UDIV_I16 */ "__udivhi3",
574 /* UDIV_I32 */ "__udivsi3",
575 /* UDIV_I64 */ "__udivdi3",
576 /* UDIV_I128 */ "__udivti3",
577 /* SREM_I8 */ "__modqi3",
578 /* SREM_I16 */ "__modhi3",
579 /* SREM_I32 */ "__modsi3",
580 /* SREM_I64 */ "__moddi3",
581 /* SREM_I128 */ "__modti3",
582 /* UREM_I8 */ "__umodqi3",
583 /* UREM_I16 */ "__umodhi3",
584 /* UREM_I32 */ "__umodsi3",
585 /* UREM_I64 */ "__umoddi3",
586 /* UREM_I128 */ "__umodti3",
587 /* SDIVREM_I8 */ nullptr,
588 /* SDIVREM_I16 */ nullptr,
589 /* SDIVREM_I32 */ nullptr,
590 /* SDIVREM_I64 */ nullptr,
591 /* SDIVREM_I128 */ nullptr,
592 /* UDIVREM_I8 */ nullptr,
593 /* UDIVREM_I16 */ nullptr,
594 /* UDIVREM_I32 */ nullptr,
595 /* UDIVREM_I64 */ nullptr,
596 /* UDIVREM_I128 */ nullptr,
597 /* NEG_I32 */ "__negsi2",
598 /* NEG_I64 */ "__negdi2",
599 /* ADD_F32 */ "__addsf3",
600 /* ADD_F64 */ "__adddf3",
601 /* ADD_F80 */ nullptr,
602 /* ADD_F128 */ "__addtf3",
603 /* ADD_PPCF128 */ nullptr,
604 /* SUB_F32 */ "__subsf3",
605 /* SUB_F64 */ "__subdf3",
606 /* SUB_F80 */ nullptr,
607 /* SUB_F128 */ "__subtf3",
608 /* SUB_PPCF128 */ nullptr,
609 /* MUL_F32 */ "__mulsf3",
610 /* MUL_F64 */ "__muldf3",
611 /* MUL_F80 */ nullptr,
612 /* MUL_F128 */ "__multf3",
613 /* MUL_PPCF128 */ nullptr,
614 /* DIV_F32 */ "__divsf3",
615 /* DIV_F64 */ "__divdf3",
616 /* DIV_F80 */ nullptr,
617 /* DIV_F128 */ "__divtf3",
618 /* DIV_PPCF128 */ nullptr,
619 /* REM_F32 */ "fmodf",
620 /* REM_F64 */ "fmod",
621 /* REM_F80 */ nullptr,
622 /* REM_F128 */ "fmodl",
623 /* REM_PPCF128 */ nullptr,
624 /* FMA_F32 */ "fmaf",
625 /* FMA_F64 */ "fma",
626 /* FMA_F80 */ nullptr,
627 /* FMA_F128 */ "fmal",
628 /* FMA_PPCF128 */ nullptr,
629 /* POWI_F32 */ "__powisf2",
630 /* POWI_F64 */ "__powidf2",
631 /* POWI_F80 */ nullptr,
632 /* POWI_F128 */ "__powitf2",
633 /* POWI_PPCF128 */ nullptr,
634 /* SQRT_F32 */ "sqrtf",
635 /* SQRT_F64 */ "sqrt",
636 /* SQRT_F80 */ nullptr,
637 /* SQRT_F128 */ "sqrtl",
638 /* SQRT_PPCF128 */ nullptr,
639 /* LOG_F32 */ "logf",
640 /* LOG_F64 */ "log",
641 /* LOG_F80 */ nullptr,
642 /* LOG_F128 */ "logl",
643 /* LOG_PPCF128 */ nullptr,
644 /* LOG2_F32 */ "log2f",
645 /* LOG2_F64 */ "log2",
646 /* LOG2_F80 */ nullptr,
647 /* LOG2_F128 */ "log2l",
648 /* LOG2_PPCF128 */ nullptr,
649 /* LOG10_F32 */ "log10f",
650 /* LOG10_F64 */ "log10",
651 /* LOG10_F80 */ nullptr,
652 /* LOG10_F128 */ "log10l",
653 /* LOG10_PPCF128 */ nullptr,
654 /* EXP_F32 */ "expf",
655 /* EXP_F64 */ "exp",
656 /* EXP_F80 */ nullptr,
657 /* EXP_F128 */ "expl",
658 /* EXP_PPCF128 */ nullptr,
659 /* EXP2_F32 */ "exp2f",
660 /* EXP2_F64 */ "exp2",
661 /* EXP2_F80 */ nullptr,
662 /* EXP2_F128 */ "exp2l",
663 /* EXP2_PPCF128 */ nullptr,
664 /* SIN_F32 */ "sinf",
665 /* SIN_F64 */ "sin",
666 /* SIN_F80 */ nullptr,
667 /* SIN_F128 */ "sinl",
668 /* SIN_PPCF128 */ nullptr,
669 /* COS_F32 */ "cosf",
670 /* COS_F64 */ "cos",
671 /* COS_F80 */ nullptr,
672 /* COS_F128 */ "cosl",
673 /* COS_PPCF128 */ nullptr,
674 /* SINCOS_F32 */ "sincosf",
675 /* SINCOS_F64 */ "sincos",
676 /* SINCOS_F80 */ nullptr,
677 /* SINCOS_F128 */ "sincosl",
678 /* SINCOS_PPCF128 */ nullptr,
679 /* POW_F32 */ "powf",
680 /* POW_F64 */ "pow",
681 /* POW_F80 */ nullptr,
682 /* POW_F128 */ "powl",
683 /* POW_PPCF128 */ nullptr,
684 /* CEIL_F32 */ "ceilf",
685 /* CEIL_F64 */ "ceil",
686 /* CEIL_F80 */ nullptr,
687 /* CEIL_F128 */ "ceill",
688 /* CEIL_PPCF128 */ nullptr,
689 /* TRUNC_F32 */ "truncf",
690 /* TRUNC_F64 */ "trunc",
691 /* TRUNC_F80 */ nullptr,
692 /* TRUNC_F128 */ "truncl",
693 /* TRUNC_PPCF128 */ nullptr,
694 /* RINT_F32 */ "rintf",
695 /* RINT_F64 */ "rint",
696 /* RINT_F80 */ nullptr,
697 /* RINT_F128 */ "rintl",
698 /* RINT_PPCF128 */ nullptr,
699 /* NEARBYINT_F32 */ "nearbyintf",
700 /* NEARBYINT_F64 */ "nearbyint",
701 /* NEARBYINT_F80 */ nullptr,
702 /* NEARBYINT_F128 */ "nearbyintl",
703 /* NEARBYINT_PPCF128 */ nullptr,
704 /* ROUND_F32 */ "roundf",
705 /* ROUND_F64 */ "round",
706 /* ROUND_F80 */ nullptr,
707 /* ROUND_F128 */ "roundl",
708 /* ROUND_PPCF128 */ nullptr,
709 /* FLOOR_F32 */ "floorf",
710 /* FLOOR_F64 */ "floor",
711 /* FLOOR_F80 */ nullptr,
712 /* FLOOR_F128 */ "floorl",
713 /* FLOOR_PPCF128 */ nullptr,
714 /* COPYSIGN_F32 */ "copysignf",
715 /* COPYSIGN_F64 */ "copysign",
716 /* COPYSIGN_F80 */ nullptr,
717 /* COPYSIGN_F128 */ "copysignl",
718 /* COPYSIGN_PPCF128 */ nullptr,
719 /* FMIN_F32 */ "fminf",
720 /* FMIN_F64 */ "fmin",
721 /* FMIN_F80 */ nullptr,
722 /* FMIN_F128 */ "fminl",
723 /* FMIN_PPCF128 */ nullptr,
724 /* FMAX_F32 */ "fmaxf",
725 /* FMAX_F64 */ "fmax",
726 /* FMAX_F80 */ nullptr,
727 /* FMAX_F128 */ "fmaxl",
728 /* FMAX_PPCF128 */ nullptr,
729 /* FPEXT_F32_PPCF128 */ nullptr,
730 /* FPEXT_F64_PPCF128 */ nullptr,
731 /* FPEXT_F64_F128 */ "__extenddftf2",
732 /* FPEXT_F32_F128 */ "__extendsftf2",
733 /* FPEXT_F32_F64 */ "__extendsfdf2",
734 /* FPEXT_F16_F32 */ "__gnu_h2f_ieee",
735 /* FPROUND_F32_F16 */ "__gnu_f2h_ieee",
736 /* FPROUND_F64_F16 */ nullptr,
737 /* FPROUND_F80_F16 */ nullptr,
738 /* FPROUND_F128_F16 */ nullptr,
739 /* FPROUND_PPCF128_F16 */ nullptr,
740 /* FPROUND_F64_F32 */ "__truncdfsf2",
741 /* FPROUND_F80_F32 */ "__truncxfsf2",
742 /* FPROUND_F128_F32 */ "__trunctfsf2",
743 /* FPROUND_PPCF128_F32 */ nullptr,
744 /* FPROUND_F80_F64 */ "__truncxfdf2",
745 /* FPROUND_F128_F64 */ "__trunctfdf2",
746 /* FPROUND_PPCF128_F64 */ nullptr,
747 /* FPTOSINT_F32_I32 */ "__fixsfsi",
748 /* FPTOSINT_F32_I64 */ "__fixsfdi",
749 /* FPTOSINT_F32_I128 */ "__fixsfti",
750 /* FPTOSINT_F64_I32 */ "__fixdfsi",
751 /* FPTOSINT_F64_I64 */ "__fixdfdi",
752 /* FPTOSINT_F64_I128 */ "__fixdfti",
753 /* FPTOSINT_F80_I32 */ "__fixxfsi",
754 /* FPTOSINT_F80_I64 */ "__fixxfdi",
755 /* FPTOSINT_F80_I128 */ "__fixxfti",
756 /* FPTOSINT_F128_I32 */ "__fixtfsi",
757 /* FPTOSINT_F128_I64 */ "__fixtfdi",
758 /* FPTOSINT_F128_I128 */ "__fixtfti",
759 /* FPTOSINT_PPCF128_I32 */ nullptr,
760 /* FPTOSINT_PPCF128_I64 */ nullptr,
761 /* FPTOSINT_PPCF128_I128 */ nullptr,
762 /* FPTOUINT_F32_I32 */ "__fixunssfsi",
763 /* FPTOUINT_F32_I64 */ "__fixunssfdi",
764 /* FPTOUINT_F32_I128 */ "__fixunssfti",
765 /* FPTOUINT_F64_I32 */ "__fixunsdfsi",
766 /* FPTOUINT_F64_I64 */ "__fixunsdfdi",
767 /* FPTOUINT_F64_I128 */ "__fixunsdfti",
768 /* FPTOUINT_F80_I32 */ "__fixunsxfsi",
769 /* FPTOUINT_F80_I64 */ "__fixunsxfdi",
770 /* FPTOUINT_F80_I128 */ "__fixunsxfti",
771 /* FPTOUINT_F128_I32 */ "__fixunstfsi",
772 /* FPTOUINT_F128_I64 */ "__fixunstfdi",
773 /* FPTOUINT_F128_I128 */ "__fixunstfti",
774 /* FPTOUINT_PPCF128_I32 */ nullptr,
775 /* FPTOUINT_PPCF128_I64 */ nullptr,
776 /* FPTOUINT_PPCF128_I128 */ nullptr,
777 /* SINTTOFP_I32_F32 */ "__floatsisf",
778 /* SINTTOFP_I32_F64 */ "__floatsidf",
779 /* SINTTOFP_I32_F80 */ nullptr,
780 /* SINTTOFP_I32_F128 */ "__floatsitf",
781 /* SINTTOFP_I32_PPCF128 */ nullptr,
782 /* SINTTOFP_I64_F32 */ "__floatdisf",
783 /* SINTTOFP_I64_F64 */ "__floatdidf",
784 /* SINTTOFP_I64_F80 */ nullptr,
785 /* SINTTOFP_I64_F128 */ "__floatditf",
786 /* SINTTOFP_I64_PPCF128 */ nullptr,
787 /* SINTTOFP_I128_F32 */ "__floattisf",
788 /* SINTTOFP_I128_F64 */ "__floattidf",
789 /* SINTTOFP_I128_F80 */ nullptr,
790 /* SINTTOFP_I128_F128 */ "__floattitf",
791 /* SINTTOFP_I128_PPCF128 */ nullptr,
792 /* UINTTOFP_I32_F32 */ "__floatunsisf",
793 /* UINTTOFP_I32_F64 */ "__floatunsidf",
794 /* UINTTOFP_I32_F80 */ nullptr,
795 /* UINTTOFP_I32_F128 */ "__floatunsitf",
796 /* UINTTOFP_I32_PPCF128 */ nullptr,
797 /* UINTTOFP_I64_F32 */ "__floatundisf",
798 /* UINTTOFP_I64_F64 */ "__floatundidf",
799 /* UINTTOFP_I64_F80 */ nullptr,
800 /* UINTTOFP_I64_F128 */ "__floatunditf",
801 /* UINTTOFP_I64_PPCF128 */ nullptr,
802 /* UINTTOFP_I128_F32 */ "__floatuntisf",
803 /* UINTTOFP_I128_F64 */ "__floatuntidf",
804 /* UINTTOFP_I128_F80 */ nullptr,
805 /* UINTTOFP_I128_F128 */ "__floatuntitf",
806 /* UINTTOFP_I128_PPCF128 */ nullptr,
807 /* OEQ_F32 */ "__eqsf2",
808 /* OEQ_F64 */ "__eqdf2",
809 /* OEQ_F128 */ "__eqtf2",
810 /* OEQ_PPCF128 */ nullptr,
811 /* UNE_F32 */ "__nesf2",
812 /* UNE_F64 */ "__nedf2",
813 /* UNE_F128 */ "__netf2",
814 /* UNE_PPCF128 */ nullptr,
815 /* OGE_F32 */ "__gesf2",
816 /* OGE_F64 */ "__gedf2",
817 /* OGE_F128 */ "__getf2",
818 /* OGE_PPCF128 */ nullptr,
819 /* OLT_F32 */ "__ltsf2",
820 /* OLT_F64 */ "__ltdf2",
821 /* OLT_F128 */ "__lttf2",
822 /* OLT_PPCF128 */ nullptr,
823 /* OLE_F32 */ "__lesf2",
824 /* OLE_F64 */ "__ledf2",
825 /* OLE_F128 */ "__letf2",
826 /* OLE_PPCF128 */ nullptr,
827 /* OGT_F32 */ "__gtsf2",
828 /* OGT_F64 */ "__gtdf2",
829 /* OGT_F128 */ "__gttf2",
830 /* OGT_PPCF128 */ nullptr,
831 /* UO_F32 */ "__unordsf2",
832 /* UO_F64 */ "__unorddf2",
833 /* UO_F128 */ "__unordtf2",
834 /* UO_PPCF128 */ nullptr,
835 /* O_F32 */ "__unordsf2",
836 /* O_F64 */ "__unorddf2",
837 /* O_F128 */ "__unordtf2",
838 /* O_PPCF128 */ nullptr,
839 /* MEMCPY */ "memcpy",
840 /* MEMMOVE */ "memset",
841 /* MEMSET */ "memmove",
842 /* MEMCPY_ELEMENT_ATOMIC_1 */ "MEMCPY_ELEMENT_ATOMIC_1",
843 /* MEMCPY_ELEMENT_ATOMIC_2 */ "MEMCPY_ELEMENT_ATOMIC_2",
844 /* MEMCPY_ELEMENT_ATOMIC_4 */ "MEMCPY_ELEMENT_ATOMIC_4",
845 /* MEMCPY_ELEMENT_ATOMIC_8 */ "MEMCPY_ELEMENT_ATOMIC_8",
846 /* MEMCPY_ELEMENT_ATOMIC_16 */ "MEMCPY_ELEMENT_ATOMIC_16",
847 /* UNWIND_RESUME */ "_Unwind_Resume",
848 /* SYNC_VAL_COMPARE_AND_SWAP_1 */ "__sync_val_compare_and_swap_1",
849 /* SYNC_VAL_COMPARE_AND_SWAP_2 */ "__sync_val_compare_and_swap_2",
850 /* SYNC_VAL_COMPARE_AND_SWAP_4 */ "__sync_val_compare_and_swap_4",
851 /* SYNC_VAL_COMPARE_AND_SWAP_8 */ "__sync_val_compare_and_swap_8",
852 /* SYNC_VAL_COMPARE_AND_SWAP_16 */ "__sync_val_compare_and_swap_16",
853 /* SYNC_LOCK_TEST_AND_SET_1 */ "__sync_lock_test_and_set_1",
854 /* SYNC_LOCK_TEST_AND_SET_2 */ "__sync_lock_test_and_set_2",
855 /* SYNC_LOCK_TEST_AND_SET_4 */ "__sync_lock_test_and_set_4",
856 /* SYNC_LOCK_TEST_AND_SET_8 */ "__sync_lock_test_and_set_8",
857 /* SYNC_LOCK_TEST_AND_SET_16 */ "__sync_lock_test_and_set_16",
858 /* SYNC_FETCH_AND_ADD_1 */ "__sync_fetch_and_add_1",
859 /* SYNC_FETCH_AND_ADD_2 */ "__sync_fetch_and_add_2",
860 /* SYNC_FETCH_AND_ADD_4 */ "__sync_fetch_and_add_4",
861 /* SYNC_FETCH_AND_ADD_8 */ "__sync_fetch_and_add_8",
862 /* SYNC_FETCH_AND_ADD_16 */ "__sync_fetch_and_add_16",
863 /* SYNC_FETCH_AND_SUB_1 */ "__sync_fetch_and_sub_1",
864 /* SYNC_FETCH_AND_SUB_2 */ "__sync_fetch_and_sub_2",
865 /* SYNC_FETCH_AND_SUB_4 */ "__sync_fetch_and_sub_4",
866 /* SYNC_FETCH_AND_SUB_8 */ "__sync_fetch_and_sub_8",
867 /* SYNC_FETCH_AND_SUB_16 */ "__sync_fetch_and_sub_16",
868 /* SYNC_FETCH_AND_AND_1 */ "__sync_fetch_and_and_1",
869 /* SYNC_FETCH_AND_AND_2 */ "__sync_fetch_and_and_2",
870 /* SYNC_FETCH_AND_AND_4 */ "__sync_fetch_and_and_4",
871 /* SYNC_FETCH_AND_AND_8 */ "__sync_fetch_and_and_8",
872 /* SYNC_FETCH_AND_AND_16 */ "__sync_fetch_and_and_16",
873 /* SYNC_FETCH_AND_OR_1 */ "__sync_fetch_and_or_1",
874 /* SYNC_FETCH_AND_OR_2 */ "__sync_fetch_and_or_2",
875 /* SYNC_FETCH_AND_OR_4 */ "__sync_fetch_and_or_4",
876 /* SYNC_FETCH_AND_OR_8 */ "__sync_fetch_and_or_8",
877 /* SYNC_FETCH_AND_OR_16 */ "__sync_fetch_and_or_16",
878 /* SYNC_FETCH_AND_XOR_1 */ "__sync_fetch_and_xor_1",
879 /* SYNC_FETCH_AND_XOR_2 */ "__sync_fetch_and_xor_2",
880 /* SYNC_FETCH_AND_XOR_4 */ "__sync_fetch_and_xor_4",
881 /* SYNC_FETCH_AND_XOR_8 */ "__sync_fetch_and_xor_8",
882 /* SYNC_FETCH_AND_XOR_16 */ "__sync_fetch_and_xor_16",
883 /* SYNC_FETCH_AND_NAND_1 */ "__sync_fetch_and_nand_1",
884 /* SYNC_FETCH_AND_NAND_2 */ "__sync_fetch_and_nand_2",
885 /* SYNC_FETCH_AND_NAND_4 */ "__sync_fetch_and_nand_4",
886 /* SYNC_FETCH_AND_NAND_8 */ "__sync_fetch_and_nand_8",
887 /* SYNC_FETCH_AND_NAND_16 */ "__sync_fetch_and_nand_16",
888 /* SYNC_FETCH_AND_MAX_1 */ "__sync_fetch_and_max_1",
889 /* SYNC_FETCH_AND_MAX_2 */ "__sync_fetch_and_max_2",
890 /* SYNC_FETCH_AND_MAX_4 */ "__sync_fetch_and_max_4",
891 /* SYNC_FETCH_AND_MAX_8 */ "__sync_fetch_and_max_8",
892 /* SYNC_FETCH_AND_MAX_16 */ "__sync_fetch_and_max_16",
893 /* SYNC_FETCH_AND_UMAX_1 */ "__sync_fetch_and_umax_1",
894 /* SYNC_FETCH_AND_UMAX_2 */ "__sync_fetch_and_umax_2",
895 /* SYNC_FETCH_AND_UMAX_4 */ "__sync_fetch_and_umax_4",
896 /* SYNC_FETCH_AND_UMAX_8 */ "__sync_fetch_and_umax_8",
897 /* SYNC_FETCH_AND_UMAX_16 */ "__sync_fetch_and_umax_16",
898 /* SYNC_FETCH_AND_MIN_1 */ "__sync_fetch_and_min_1",
899 /* SYNC_FETCH_AND_MIN_2 */ "__sync_fetch_and_min_2",
900 /* SYNC_FETCH_AND_MIN_4 */ "__sync_fetch_and_min_4",
901 /* SYNC_FETCH_AND_MIN_8 */ "__sync_fetch_and_min_8",
902 /* SYNC_FETCH_AND_MIN_16 */ "__sync_fetch_and_min_16",
903 /* SYNC_FETCH_AND_UMIN_1 */ "__sync_fetch_and_umin_1",
904 /* SYNC_FETCH_AND_UMIN_2 */ "__sync_fetch_and_umin_2",
905 /* SYNC_FETCH_AND_UMIN_4 */ "__sync_fetch_and_umin_4",
906 /* SYNC_FETCH_AND_UMIN_8 */ "__sync_fetch_and_umin_8",
907 /* SYNC_FETCH_AND_UMIN_16 */ "__sync_fetch_and_umin_16",
908 
909 /* ATOMIC_LOAD */ "__atomic_load",
910 /* ATOMIC_LOAD_1 */ "__atomic_load_1",
911 /* ATOMIC_LOAD_2 */ "__atomic_load_2",
912 /* ATOMIC_LOAD_4 */ "__atomic_load_4",
913 /* ATOMIC_LOAD_8 */ "__atomic_load_8",
914 /* ATOMIC_LOAD_16 */ "__atomic_load_16",
915 
916 /* ATOMIC_STORE */ "__atomic_store",
917 /* ATOMIC_STORE_1 */ "__atomic_store_1",
918 /* ATOMIC_STORE_2 */ "__atomic_store_2",
919 /* ATOMIC_STORE_4 */ "__atomic_store_4",
920 /* ATOMIC_STORE_8 */ "__atomic_store_8",
921 /* ATOMIC_STORE_16 */ "__atomic_store_16",
922 
923 /* ATOMIC_EXCHANGE */ "__atomic_exchange",
924 /* ATOMIC_EXCHANGE_1 */ "__atomic_exchange_1",
925 /* ATOMIC_EXCHANGE_2 */ "__atomic_exchange_2",
926 /* ATOMIC_EXCHANGE_4 */ "__atomic_exchange_4",
927 /* ATOMIC_EXCHANGE_8 */ "__atomic_exchange_8",
928 /* ATOMIC_EXCHANGE_16 */ "__atomic_exchange_16",
929 
930 /* ATOMIC_COMPARE_EXCHANGE */ "__atomic_compare_exchange",
931 /* ATOMIC_COMPARE_EXCHANGE_1 */ "__atomic_compare_exchange_1",
932 /* ATOMIC_COMPARE_EXCHANGE_2 */ "__atomic_compare_exchange_2",
933 /* ATOMIC_COMPARE_EXCHANGE_4 */ "__atomic_compare_exchange_4",
934 /* ATOMIC_COMPARE_EXCHANGE_8 */ "__atomic_compare_exchange_8",
935 /* ATOMIC_COMPARE_EXCHANGE_16 */ "__atomic_compare_exchange_16",
936 
937 /* ATOMIC_FETCH_ADD_1 */ "__atomic_fetch_add_1",
938 /* ATOMIC_FETCH_ADD_2 */ "__atomic_fetch_add_2",
939 /* ATOMIC_FETCH_ADD_4 */ "__atomic_fetch_add_4",
940 /* ATOMIC_FETCH_ADD_8 */ "__atomic_fetch_add_8",
941 /* ATOMIC_FETCH_ADD_16 */ "__atomic_fetch_add_16",
942 /* ATOMIC_FETCH_SUB_1 */ "__atomic_fetch_sub_1",
943 /* ATOMIC_FETCH_SUB_2 */ "__atomic_fetch_sub_2",
944 /* ATOMIC_FETCH_SUB_4 */ "__atomic_fetch_sub_4",
945 /* ATOMIC_FETCH_SUB_8 */ "__atomic_fetch_sub_8",
946 /* ATOMIC_FETCH_SUB_16 */ "__atomic_fetch_sub_16",
947 /* ATOMIC_FETCH_AND_1 */ "__atomic_fetch_and_1",
948 /* ATOMIC_FETCH_AND_2 */ "__atomic_fetch_and_2",
949 /* ATOMIC_FETCH_AND_4 */ "__atomic_fetch_and_4",
950 /* ATOMIC_FETCH_AND_8 */ "__atomic_fetch_and_8",
951 /* ATOMIC_FETCH_AND_16 */ "__atomic_fetch_and_16",
952 /* ATOMIC_FETCH_OR_1 */ "__atomic_fetch_or_1",
953 /* ATOMIC_FETCH_OR_2 */ "__atomic_fetch_or_2",
954 /* ATOMIC_FETCH_OR_4 */ "__atomic_fetch_or_4",
955 /* ATOMIC_FETCH_OR_8 */ "__atomic_fetch_or_8",
956 /* ATOMIC_FETCH_OR_16 */ "__atomic_fetch_or_16",
957 /* ATOMIC_FETCH_XOR_1 */ "__atomic_fetch_xor_1",
958 /* ATOMIC_FETCH_XOR_2 */ "__atomic_fetch_xor_2",
959 /* ATOMIC_FETCH_XOR_4 */ "__atomic_fetch_xor_4",
960 /* ATOMIC_FETCH_XOR_8 */ "__atomic_fetch_xor_8",
961 /* ATOMIC_FETCH_XOR_16 */ "__atomic_fetch_xor_16",
962 /* ATOMIC_FETCH_NAND_1 */ "__atomic_fetch_nand_1",
963 /* ATOMIC_FETCH_NAND_2 */ "__atomic_fetch_nand_2",
964 /* ATOMIC_FETCH_NAND_4 */ "__atomic_fetch_nand_4",
965 /* ATOMIC_FETCH_NAND_8 */ "__atomic_fetch_nand_8",
966 /* ATOMIC_FETCH_NAND_16 */ "__atomic_fetch_nand_16",
967 
968 /* STACKPROTECTOR_CHECK_FAIL */ "__stack_chk_fail",
969 
970 /* DEOPTIMIZE */ "__llvm_deoptimize",
971 };
972 
973 void llvm::GetSignature(const WebAssemblySubtarget &Subtarget,
974                         RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets,
975                         SmallVectorImpl<wasm::ValType> &Params) {
976   assert(Rets.empty());
977   assert(Params.empty());
978 
979   WebAssembly::ExprType iPTR = Subtarget.hasAddr64() ?
980                                WebAssembly::ExprType::I64 :
981                                WebAssembly::ExprType::I32;
982 
983   switch (RuntimeLibcallSignatures[LC]) {
984   case func:
985     break;
986   case f32_func_f32:
987     Rets.push_back(wasm::ValType::F32);
988     Params.push_back(wasm::ValType::F32);
989     break;
990   case f32_func_f64:
991     Rets.push_back(wasm::ValType::F32);
992     Params.push_back(wasm::ValType::F64);
993     break;
994   case f32_func_i32:
995     Rets.push_back(wasm::ValType::F32);
996     Params.push_back(wasm::ValType::I32);
997     break;
998   case f32_func_i64:
999     Rets.push_back(wasm::ValType::F32);
1000     Params.push_back(wasm::ValType::I64);
1001     break;
1002   case f32_func_i16:
1003     Rets.push_back(wasm::ValType::F32);
1004     Params.push_back(wasm::ValType::I32);
1005     break;
1006   case f64_func_f32:
1007     Rets.push_back(wasm::ValType::F64);
1008     Params.push_back(wasm::ValType::F32);
1009     break;
1010   case f64_func_f64:
1011     Rets.push_back(wasm::ValType::F64);
1012     Params.push_back(wasm::ValType::F64);
1013     break;
1014   case f64_func_i32:
1015     Rets.push_back(wasm::ValType::F64);
1016     Params.push_back(wasm::ValType::I32);
1017     break;
1018   case f64_func_i64:
1019     Rets.push_back(wasm::ValType::F64);
1020     Params.push_back(wasm::ValType::I64);
1021     break;
1022   case i32_func_f32:
1023     Rets.push_back(wasm::ValType::I32);
1024     Params.push_back(wasm::ValType::F32);
1025     break;
1026   case i32_func_f64:
1027     Rets.push_back(wasm::ValType::I32);
1028     Params.push_back(wasm::ValType::F64);
1029     break;
1030   case i32_func_i32:
1031     Rets.push_back(wasm::ValType::I32);
1032     Params.push_back(wasm::ValType::I32);
1033     break;
1034   case i64_func_f32:
1035     Rets.push_back(wasm::ValType::I64);
1036     Params.push_back(wasm::ValType::F32);
1037     break;
1038   case i64_func_f64:
1039     Rets.push_back(wasm::ValType::I64);
1040     Params.push_back(wasm::ValType::F64);
1041     break;
1042   case i64_func_i64:
1043     Rets.push_back(wasm::ValType::I64);
1044     Params.push_back(wasm::ValType::I64);
1045     break;
1046   case f32_func_f32_f32:
1047     Rets.push_back(wasm::ValType::F32);
1048     Params.push_back(wasm::ValType::F32);
1049     Params.push_back(wasm::ValType::F32);
1050     break;
1051   case f32_func_f32_i32:
1052     Rets.push_back(wasm::ValType::F32);
1053     Params.push_back(wasm::ValType::F32);
1054     Params.push_back(wasm::ValType::I32);
1055     break;
1056   case f32_func_i64_i64:
1057     Rets.push_back(wasm::ValType::F32);
1058     Params.push_back(wasm::ValType::I64);
1059     Params.push_back(wasm::ValType::I64);
1060     break;
1061   case f64_func_f64_f64:
1062     Rets.push_back(wasm::ValType::F64);
1063     Params.push_back(wasm::ValType::F64);
1064     Params.push_back(wasm::ValType::F64);
1065     break;
1066   case f64_func_f64_i32:
1067     Rets.push_back(wasm::ValType::F64);
1068     Params.push_back(wasm::ValType::F64);
1069     Params.push_back(wasm::ValType::I32);
1070     break;
1071   case f64_func_i64_i64:
1072     Rets.push_back(wasm::ValType::F64);
1073     Params.push_back(wasm::ValType::I64);
1074     Params.push_back(wasm::ValType::I64);
1075     break;
1076   case i16_func_f32:
1077     Rets.push_back(wasm::ValType::I32);
1078     Params.push_back(wasm::ValType::F32);
1079     break;
1080   case i8_func_i8_i8:
1081     Rets.push_back(wasm::ValType::I32);
1082     Params.push_back(wasm::ValType::I32);
1083     Params.push_back(wasm::ValType::I32);
1084     break;
1085   case func_f32_iPTR_iPTR:
1086     Params.push_back(wasm::ValType::F32);
1087     Params.push_back(wasm::ValType(iPTR));
1088     Params.push_back(wasm::ValType(iPTR));
1089     break;
1090   case func_f64_iPTR_iPTR:
1091     Params.push_back(wasm::ValType::F64);
1092     Params.push_back(wasm::ValType(iPTR));
1093     Params.push_back(wasm::ValType(iPTR));
1094     break;
1095   case i16_func_i16_i16:
1096     Rets.push_back(wasm::ValType::I32);
1097     Params.push_back(wasm::ValType::I32);
1098     Params.push_back(wasm::ValType::I32);
1099     break;
1100   case i32_func_f32_f32:
1101     Rets.push_back(wasm::ValType::I32);
1102     Params.push_back(wasm::ValType::F32);
1103     Params.push_back(wasm::ValType::F32);
1104     break;
1105   case i32_func_f64_f64:
1106     Rets.push_back(wasm::ValType::I32);
1107     Params.push_back(wasm::ValType::F64);
1108     Params.push_back(wasm::ValType::F64);
1109     break;
1110   case i32_func_i32_i32:
1111     Rets.push_back(wasm::ValType::I32);
1112     Params.push_back(wasm::ValType::I32);
1113     Params.push_back(wasm::ValType::I32);
1114     break;
1115   case i64_func_i64_i64:
1116     Rets.push_back(wasm::ValType::I64);
1117     Params.push_back(wasm::ValType::I64);
1118     Params.push_back(wasm::ValType::I64);
1119     break;
1120   case i64_i64_func_f32:
1121 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1122     Rets.push_back(wasm::ValType::I64);
1123     Rets.push_back(wasm::ValType::I64);
1124 #else
1125     Params.push_back(wasm::ValType(iPTR));
1126 #endif
1127     Params.push_back(wasm::ValType::F32);
1128     break;
1129   case i64_i64_func_f64:
1130 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1131     Rets.push_back(wasm::ValType::I64);
1132     Rets.push_back(wasm::ValType::I64);
1133 #else
1134     Params.push_back(wasm::ValType(iPTR));
1135 #endif
1136     Params.push_back(wasm::ValType::F64);
1137     break;
1138   case i16_i16_func_i16_i16:
1139 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1140     Rets.push_back(wasm::ValType::I32);
1141     Rets.push_back(wasm::ValType::I32);
1142 #else
1143     Params.push_back(wasm::ValType(iPTR));
1144 #endif
1145     Params.push_back(wasm::ValType::I32);
1146     Params.push_back(wasm::ValType::I32);
1147     break;
1148   case i32_i32_func_i32_i32:
1149 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1150     Rets.push_back(wasm::ValType::I32);
1151     Rets.push_back(wasm::ValType::I32);
1152 #else
1153     Params.push_back(wasm::ValType(iPTR));
1154 #endif
1155     Params.push_back(wasm::ValType::I32);
1156     Params.push_back(wasm::ValType::I32);
1157     break;
1158   case i64_i64_func_i64_i64:
1159 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1160     Rets.push_back(wasm::ValType::I64);
1161     Rets.push_back(wasm::ValType::I64);
1162 #else
1163     Params.push_back(wasm::ValType(iPTR));
1164 #endif
1165     Params.push_back(wasm::ValType::I64);
1166     Params.push_back(wasm::ValType::I64);
1167     break;
1168   case i64_i64_func_i64_i64_i64_i64:
1169 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1170     Rets.push_back(wasm::ValType::I64);
1171     Rets.push_back(wasm::ValType::I64);
1172 #else
1173     Params.push_back(wasm::ValType(iPTR));
1174 #endif
1175     Params.push_back(wasm::ValType::I64);
1176     Params.push_back(wasm::ValType::I64);
1177     Params.push_back(wasm::ValType::I64);
1178     Params.push_back(wasm::ValType::I64);
1179     break;
1180   case i64_i64_i64_i64_func_i64_i64_i64_i64:
1181 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1182     Rets.push_back(wasm::ValType::I64);
1183     Rets.push_back(wasm::ValType::I64);
1184     Rets.push_back(wasm::ValType::I64);
1185     Rets.push_back(wasm::ValType::I64);
1186 #else
1187     Params.push_back(wasm::ValType(iPTR));
1188 #endif
1189     Params.push_back(wasm::ValType::I64);
1190     Params.push_back(wasm::ValType::I64);
1191     Params.push_back(wasm::ValType::I64);
1192     Params.push_back(wasm::ValType::I64);
1193     break;
1194   case i64_i64_func_i64_i64_i32:
1195 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1196     Rets.push_back(wasm::ValType::I64);
1197     Rets.push_back(wasm::ValType::I64);
1198     Rets.push_back(wasm::ValType::I64);
1199     Rets.push_back(wasm::ValType::I64);
1200 #else
1201     Params.push_back(wasm::ValType(iPTR));
1202 #endif
1203     Params.push_back(wasm::ValType::I64);
1204     Params.push_back(wasm::ValType::I64);
1205     Params.push_back(wasm::ValType::I32);
1206     break;
1207   case iPTR_func_iPTR_i32_iPTR:
1208     Rets.push_back(wasm::ValType(iPTR));
1209     Params.push_back(wasm::ValType(iPTR));
1210     Params.push_back(wasm::ValType::I32);
1211     Params.push_back(wasm::ValType(iPTR));
1212     break;
1213   case iPTR_func_iPTR_iPTR_iPTR:
1214     Rets.push_back(wasm::ValType(iPTR));
1215     Params.push_back(wasm::ValType(iPTR));
1216     Params.push_back(wasm::ValType(iPTR));
1217     Params.push_back(wasm::ValType(iPTR));
1218     break;
1219   case f32_func_f32_f32_f32:
1220     Rets.push_back(wasm::ValType::F32);
1221     Params.push_back(wasm::ValType::F32);
1222     Params.push_back(wasm::ValType::F32);
1223     Params.push_back(wasm::ValType::F32);
1224     break;
1225   case f64_func_f64_f64_f64:
1226     Rets.push_back(wasm::ValType::F64);
1227     Params.push_back(wasm::ValType::F64);
1228     Params.push_back(wasm::ValType::F64);
1229     Params.push_back(wasm::ValType::F64);
1230     break;
1231   case func_i64_i64_iPTR_iPTR:
1232     Params.push_back(wasm::ValType::I64);
1233     Params.push_back(wasm::ValType::I64);
1234     Params.push_back(wasm::ValType(iPTR));
1235     Params.push_back(wasm::ValType(iPTR));
1236     break;
1237   case func_iPTR_f32:
1238     Params.push_back(wasm::ValType(iPTR));
1239     Params.push_back(wasm::ValType::F32);
1240     break;
1241   case func_iPTR_f64:
1242     Params.push_back(wasm::ValType(iPTR));
1243     Params.push_back(wasm::ValType::F64);
1244     break;
1245   case func_iPTR_i32:
1246     Params.push_back(wasm::ValType(iPTR));
1247     Params.push_back(wasm::ValType::I32);
1248     break;
1249   case func_iPTR_i64:
1250     Params.push_back(wasm::ValType(iPTR));
1251     Params.push_back(wasm::ValType::I64);
1252     break;
1253   case func_iPTR_i64_i64:
1254     Params.push_back(wasm::ValType(iPTR));
1255     Params.push_back(wasm::ValType::I64);
1256     Params.push_back(wasm::ValType::I64);
1257     break;
1258   case func_iPTR_i64_i64_i64_i64:
1259     Params.push_back(wasm::ValType(iPTR));
1260     Params.push_back(wasm::ValType::I64);
1261     Params.push_back(wasm::ValType::I64);
1262     Params.push_back(wasm::ValType::I64);
1263     Params.push_back(wasm::ValType::I64);
1264     break;
1265   case func_iPTR_i64_i64_i64_i64_i64_i64:
1266     Params.push_back(wasm::ValType(iPTR));
1267     Params.push_back(wasm::ValType::I64);
1268     Params.push_back(wasm::ValType::I64);
1269     Params.push_back(wasm::ValType::I64);
1270     Params.push_back(wasm::ValType::I64);
1271     Params.push_back(wasm::ValType::I64);
1272     Params.push_back(wasm::ValType::I64);
1273     break;
1274   case i32_func_i64_i64:
1275     Rets.push_back(wasm::ValType::I32);
1276     Params.push_back(wasm::ValType::I64);
1277     Params.push_back(wasm::ValType::I64);
1278     break;
1279   case i32_func_i64_i64_i64_i64:
1280     Rets.push_back(wasm::ValType::I32);
1281     Params.push_back(wasm::ValType::I64);
1282     Params.push_back(wasm::ValType::I64);
1283     Params.push_back(wasm::ValType::I64);
1284     Params.push_back(wasm::ValType::I64);
1285     break;
1286   case unsupported:
1287     llvm_unreachable("unsupported runtime library signature");
1288   }
1289 }
1290 
1291 void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name,
1292                         SmallVectorImpl<wasm::ValType> &Rets,
1293                         SmallVectorImpl<wasm::ValType> &Params) {
1294   assert(strcmp(RuntimeLibcallNames[RTLIB::DEOPTIMIZE], "__llvm_deoptimize") ==
1295          0);
1296 
1297   for (size_t i = 0, e = RTLIB::UNKNOWN_LIBCALL; i < e; ++i)
1298     if (RuntimeLibcallNames[i] && strcmp(RuntimeLibcallNames[i], Name) == 0)
1299       return GetSignature(Subtarget, RTLIB::Libcall(i), Rets, Params);
1300 
1301   llvm_unreachable("unexpected runtime library name");
1302 }
1303