Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp
Line
Count
Source (jump to first uncovered line)
1
// CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
///
9
/// \file
10
/// This file contains signature information for runtime libcalls.
11
///
12
/// CodeGen uses external symbols, which it refers to by name. The WebAssembly
13
/// target needs type information for all functions. This file contains a big
14
/// table providing type signatures for all runtime library functions that LLVM
15
/// uses.
16
///
17
/// This is currently a fairly heavy-handed solution.
18
///
19
//===----------------------------------------------------------------------===//
20
21
#include "WebAssemblyRuntimeLibcallSignatures.h"
22
#include "WebAssemblySubtarget.h"
23
#include "llvm/CodeGen/RuntimeLibcalls.h"
24
25
using namespace llvm;
26
27
namespace {
28
29
enum RuntimeLibcallSignature {
30
  func,
31
  f32_func_f32,
32
  f32_func_f64,
33
  f32_func_i32,
34
  f32_func_i64,
35
  f32_func_i16,
36
  f64_func_f32,
37
  f64_func_f64,
38
  f64_func_i32,
39
  f64_func_i64,
40
  i32_func_f32,
41
  i32_func_f64,
42
  i32_func_i32,
43
  i64_func_f32,
44
  i64_func_f64,
45
  i64_func_i64,
46
  f32_func_f32_f32,
47
  f32_func_f32_i32,
48
  f32_func_i64_i64,
49
  f64_func_f64_f64,
50
  f64_func_f64_i32,
51
  f64_func_i64_i64,
52
  i16_func_f32,
53
  i16_func_f64,
54
  i16_func_i64_i64,
55
  i8_func_i8_i8,
56
  func_f32_iPTR_iPTR,
57
  func_f64_iPTR_iPTR,
58
  i16_func_i16_i16,
59
  i32_func_f32_f32,
60
  i32_func_f64_f64,
61
  i32_func_i32_i32,
62
  i32_func_i32_i32_iPTR,
63
  i64_func_i64_i64,
64
  i64_func_i64_i64_iPTR,
65
  i64_i64_func_i32,
66
  i64_i64_func_i64,
67
  i64_i64_func_f32,
68
  i64_i64_func_f64,
69
  i16_i16_func_i16_i16,
70
  i32_i32_func_i32_i32,
71
  i64_i64_func_i64_i64,
72
  i64_i64_func_i64_i64_i64_i64,
73
  i64_i64_func_i64_i64_i64_i64_iPTR,
74
  i64_i64_i64_i64_func_i64_i64_i64_i64,
75
  i64_i64_func_i64_i64_i32,
76
  i64_i64_func_i64_i64_i64_i64_i64_i64,
77
  iPTR_func_i32,
78
  iPTR_func_iPTR_i32_iPTR,
79
  iPTR_func_iPTR_iPTR_iPTR,
80
  f32_func_f32_f32_f32,
81
  f64_func_f64_f64_f64,
82
  func_i64_i64_iPTR_iPTR,
83
  i32_func_i64_i64,
84
  i32_func_i64_i64_i64_i64,
85
  iPTR_func_f32,
86
  iPTR_func_f64,
87
  iPTR_func_i64_i64,
88
  unsupported
89
};
90
91
struct RuntimeLibcallSignatureTable {
92
  std::vector<RuntimeLibcallSignature> Table;
93
94
  // Any newly-added libcalls will be unsupported by default.
95
1
  RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) {
96
    // Integer
97
1
    Table[RTLIB::SHL_I16] = i16_func_i16_i16;
98
1
    Table[RTLIB::SHL_I32] = i32_func_i32_i32;
99
1
    Table[RTLIB::SHL_I64] = i64_func_i64_i64;
100
1
    Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32;
101
1
    Table[RTLIB::SRL_I16] = i16_func_i16_i16;
102
1
    Table[RTLIB::SRL_I32] = i32_func_i32_i32;
103
1
    Table[RTLIB::SRL_I64] = i64_func_i64_i64;
104
1
    Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32;
105
1
    Table[RTLIB::SRA_I16] = i16_func_i16_i16;
106
1
    Table[RTLIB::SRA_I32] = i32_func_i32_i32;
107
1
    Table[RTLIB::SRA_I64] = i64_func_i64_i64;
108
1
    Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32;
109
1
    Table[RTLIB::MUL_I8] = i8_func_i8_i8;
110
1
    Table[RTLIB::MUL_I16] = i16_func_i16_i16;
111
1
    Table[RTLIB::MUL_I32] = i32_func_i32_i32;
112
1
    Table[RTLIB::MUL_I64] = i64_func_i64_i64;
113
1
    Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64;
114
1
    Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR;
115
1
    Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR;
116
1
    Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR;
117
1
    Table[RTLIB::SDIV_I8] = i8_func_i8_i8;
118
1
    Table[RTLIB::SDIV_I16] = i16_func_i16_i16;
119
1
    Table[RTLIB::SDIV_I32] = i32_func_i32_i32;
120
1
    Table[RTLIB::SDIV_I64] = i64_func_i64_i64;
121
1
    Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64;
122
1
    Table[RTLIB::UDIV_I8] = i8_func_i8_i8;
123
1
    Table[RTLIB::UDIV_I16] = i16_func_i16_i16;
124
1
    Table[RTLIB::UDIV_I32] = i32_func_i32_i32;
125
1
    Table[RTLIB::UDIV_I64] = i64_func_i64_i64;
126
1
    Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64;
127
1
    Table[RTLIB::SREM_I8] = i8_func_i8_i8;
128
1
    Table[RTLIB::SREM_I16] = i16_func_i16_i16;
129
1
    Table[RTLIB::SREM_I32] = i32_func_i32_i32;
130
1
    Table[RTLIB::SREM_I64] = i64_func_i64_i64;
131
1
    Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64;
132
1
    Table[RTLIB::UREM_I8] = i8_func_i8_i8;
133
1
    Table[RTLIB::UREM_I16] = i16_func_i16_i16;
134
1
    Table[RTLIB::UREM_I32] = i32_func_i32_i32;
135
1
    Table[RTLIB::UREM_I64] = i64_func_i64_i64;
136
1
    Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64;
137
1
    Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8;
138
1
    Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16;
139
1
    Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32;
140
1
    Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64;
141
1
    Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
142
1
    Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8;
143
1
    Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16;
144
1
    Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32;
145
1
    Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64;
146
1
    Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
147
1
    Table[RTLIB::NEG_I32] = i32_func_i32;
148
1
    Table[RTLIB::NEG_I64] = i64_func_i64;
149
150
    // Floating-point.
151
    // All F80 and PPCF128 routines are unsupported.
152
1
    Table[RTLIB::ADD_F32] = f32_func_f32_f32;
153
1
    Table[RTLIB::ADD_F64] = f64_func_f64_f64;
154
1
    Table[RTLIB::ADD_F128] = i64_i64_func_i64_i64_i64_i64;
155
1
    Table[RTLIB::SUB_F32] = f32_func_f32_f32;
156
1
    Table[RTLIB::SUB_F64] = f64_func_f64_f64;
157
1
    Table[RTLIB::SUB_F128] = i64_i64_func_i64_i64_i64_i64;
158
1
    Table[RTLIB::MUL_F32] = f32_func_f32_f32;
159
1
    Table[RTLIB::MUL_F64] = f64_func_f64_f64;
160
1
    Table[RTLIB::MUL_F128] = i64_i64_func_i64_i64_i64_i64;
161
1
    Table[RTLIB::DIV_F32] = f32_func_f32_f32;
162
1
    Table[RTLIB::DIV_F64] = f64_func_f64_f64;
163
1
    Table[RTLIB::DIV_F128] = i64_i64_func_i64_i64_i64_i64;
164
1
    Table[RTLIB::REM_F32] = f32_func_f32_f32;
165
1
    Table[RTLIB::REM_F64] = f64_func_f64_f64;
166
1
    Table[RTLIB::REM_F128] = i64_i64_func_i64_i64_i64_i64;
167
1
    Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32;
168
1
    Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64;
169
1
    Table[RTLIB::FMA_F128] = i64_i64_func_i64_i64_i64_i64_i64_i64;
170
1
    Table[RTLIB::POWI_F32] = f32_func_f32_i32;
171
1
    Table[RTLIB::POWI_F64] = f64_func_f64_i32;
172
1
    Table[RTLIB::POWI_F128] = i64_i64_func_i64_i64_i32;
173
1
    Table[RTLIB::SQRT_F32] = f32_func_f32;
174
1
    Table[RTLIB::SQRT_F64] = f64_func_f64;
175
1
    Table[RTLIB::SQRT_F128] = i64_i64_func_i64_i64;
176
1
    Table[RTLIB::CBRT_F32] = f32_func_f32;
177
1
    Table[RTLIB::CBRT_F64] = f64_func_f64;
178
1
    Table[RTLIB::CBRT_F128] = i64_i64_func_i64_i64;
179
1
    Table[RTLIB::LOG_F32] = f32_func_f32;
180
1
    Table[RTLIB::LOG_F64] = f64_func_f64;
181
1
    Table[RTLIB::LOG_F128] = i64_i64_func_i64_i64;
182
1
    Table[RTLIB::LOG2_F32] = f32_func_f32;
183
1
    Table[RTLIB::LOG2_F64] = f64_func_f64;
184
1
    Table[RTLIB::LOG2_F128] = i64_i64_func_i64_i64;
185
1
    Table[RTLIB::LOG10_F32] = f32_func_f32;
186
1
    Table[RTLIB::LOG10_F64] = f64_func_f64;
187
1
    Table[RTLIB::LOG10_F128] = i64_i64_func_i64_i64;
188
1
    Table[RTLIB::EXP_F32] = f32_func_f32;
189
1
    Table[RTLIB::EXP_F64] = f64_func_f64;
190
1
    Table[RTLIB::EXP_F128] = i64_i64_func_i64_i64;
191
1
    Table[RTLIB::EXP2_F32] = f32_func_f32;
192
1
    Table[RTLIB::EXP2_F64] = f64_func_f64;
193
1
    Table[RTLIB::EXP2_F128] = i64_i64_func_i64_i64;
194
1
    Table[RTLIB::EXP10_F32] = f32_func_f32;
195
1
    Table[RTLIB::EXP10_F64] = f64_func_f64;
196
1
    Table[RTLIB::EXP10_F128] = i64_i64_func_i64_i64;
197
1
    Table[RTLIB::SIN_F32] = f32_func_f32;
198
1
    Table[RTLIB::SIN_F64] = f64_func_f64;
199
1
    Table[RTLIB::SIN_F128] = i64_i64_func_i64_i64;
200
1
    Table[RTLIB::COS_F32] = f32_func_f32;
201
1
    Table[RTLIB::COS_F64] = f64_func_f64;
202
1
    Table[RTLIB::COS_F128] = i64_i64_func_i64_i64;
203
1
    Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
204
1
    Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
205
1
    Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
206
1
    Table[RTLIB::POW_F32] = f32_func_f32_f32;
207
1
    Table[RTLIB::POW_F64] = f64_func_f64_f64;
208
1
    Table[RTLIB::POW_F128] = i64_i64_func_i64_i64_i64_i64;
209
1
    Table[RTLIB::CEIL_F32] = f32_func_f32;
210
1
    Table[RTLIB::CEIL_F64] = f64_func_f64;
211
1
    Table[RTLIB::CEIL_F128] = i64_i64_func_i64_i64;
212
1
    Table[RTLIB::TRUNC_F32] = f32_func_f32;
213
1
    Table[RTLIB::TRUNC_F64] = f64_func_f64;
214
1
    Table[RTLIB::TRUNC_F128] = i64_i64_func_i64_i64;
215
1
    Table[RTLIB::RINT_F32] = f32_func_f32;
216
1
    Table[RTLIB::RINT_F64] = f64_func_f64;
217
1
    Table[RTLIB::RINT_F128] = i64_i64_func_i64_i64;
218
1
    Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
219
1
    Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
220
1
    Table[RTLIB::NEARBYINT_F128] = i64_i64_func_i64_i64;
221
1
    Table[RTLIB::ROUND_F32] = f32_func_f32;
222
1
    Table[RTLIB::ROUND_F64] = f64_func_f64;
223
1
    Table[RTLIB::ROUND_F128] = i64_i64_func_i64_i64;
224
1
    Table[RTLIB::ROUNDEVEN_F32] = f32_func_f32;
225
1
    Table[RTLIB::ROUNDEVEN_F64] = f64_func_f64;
226
1
    Table[RTLIB::ROUNDEVEN_F128] = i64_i64_func_i64_i64;
227
1
    Table[RTLIB::LROUND_F32] = iPTR_func_f32;
228
1
    Table[RTLIB::LROUND_F64] = iPTR_func_f64;
229
1
    Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64;
230
1
    Table[RTLIB::LLROUND_F32] = i64_func_f32;
231
1
    Table[RTLIB::LLROUND_F64] = i64_func_f64;
232
1
    Table[RTLIB::LLROUND_F128] = i64_func_i64_i64;
233
1
    Table[RTLIB::LRINT_F32] = iPTR_func_f32;
234
1
    Table[RTLIB::LRINT_F64] = iPTR_func_f64;
235
1
    Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64;
236
1
    Table[RTLIB::LLRINT_F32] = i64_func_f32;
237
1
    Table[RTLIB::LLRINT_F64] = i64_func_f64;
238
1
    Table[RTLIB::LLRINT_F128] = i64_func_i64_i64;
239
1
    Table[RTLIB::FLOOR_F32] = f32_func_f32;
240
1
    Table[RTLIB::FLOOR_F64] = f64_func_f64;
241
1
    Table[RTLIB::FLOOR_F128] = i64_i64_func_i64_i64;
242
1
    Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
243
1
    Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
244
1
    Table[RTLIB::COPYSIGN_F128] = i64_i64_func_i64_i64_i64_i64;
245
1
    Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
246
1
    Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
247
1
    Table[RTLIB::FMIN_F128] = i64_i64_func_i64_i64_i64_i64;
248
1
    Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
249
1
    Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
250
1
    Table[RTLIB::FMAX_F128] = i64_i64_func_i64_i64_i64_i64;
251
1
    Table[RTLIB::LDEXP_F32] = f32_func_f32_i32;
252
1
    Table[RTLIB::LDEXP_F64] = f64_func_f64_i32;
253
1
    Table[RTLIB::LDEXP_F128] = i64_i64_func_i64_i64_i32;
254
1
    Table[RTLIB::FREXP_F32] = f32_func_f32_i32;
255
1
    Table[RTLIB::FREXP_F64] = f64_func_f64_i32;
256
1
    Table[RTLIB::FREXP_F128] = i64_i64_func_i64_i64_i32;
257
258
    // Conversion
259
    // All F80 and PPCF128 routines are unsupported.
260
1
    Table[RTLIB::FPEXT_F64_F128] = i64_i64_func_f64;
261
1
    Table[RTLIB::FPEXT_F32_F128] = i64_i64_func_f32;
262
1
    Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
263
1
    Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
264
1
    Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
265
1
    Table[RTLIB::FPROUND_F64_F16] = i16_func_f64;
266
1
    Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
267
1
    Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64;
268
1
    Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
269
1
    Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
270
1
    Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
271
1
    Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
272
1
    Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
273
1
    Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
274
1
    Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
275
1
    Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
276
1
    Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
277
1
    Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
278
1
    Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
279
1
    Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
280
1
    Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
281
1
    Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
282
1
    Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
283
1
    Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
284
1
    Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
285
1
    Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
286
1
    Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
287
1
    Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
288
1
    Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
289
1
    Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
290
1
    Table[RTLIB::SINTTOFP_I32_F128] = i64_i64_func_i32;
291
1
    Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
292
1
    Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
293
1
    Table[RTLIB::SINTTOFP_I64_F128] = i64_i64_func_i64;
294
1
    Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
295
1
    Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
296
1
    Table[RTLIB::SINTTOFP_I128_F128] = i64_i64_func_i64_i64;
297
1
    Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
298
1
    Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
299
1
    Table[RTLIB::UINTTOFP_I32_F128] = i64_i64_func_i32;
300
1
    Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
301
1
    Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
302
1
    Table[RTLIB::UINTTOFP_I64_F128] = i64_i64_func_i64;
303
1
    Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
304
1
    Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
305
1
    Table[RTLIB::UINTTOFP_I128_F128] = i64_i64_func_i64_i64;
306
307
    // Comparison
308
    // ALl F80 and PPCF128 routines are unsupported.
309
1
    Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
310
1
    Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
311
1
    Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
312
1
    Table[RTLIB::UNE_F32] = i32_func_f32_f32;
313
1
    Table[RTLIB::UNE_F64] = i32_func_f64_f64;
314
1
    Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
315
1
    Table[RTLIB::OGE_F32] = i32_func_f32_f32;
316
1
    Table[RTLIB::OGE_F64] = i32_func_f64_f64;
317
1
    Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
318
1
    Table[RTLIB::OLT_F32] = i32_func_f32_f32;
319
1
    Table[RTLIB::OLT_F64] = i32_func_f64_f64;
320
1
    Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
321
1
    Table[RTLIB::OLE_F32] = i32_func_f32_f32;
322
1
    Table[RTLIB::OLE_F64] = i32_func_f64_f64;
323
1
    Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
324
1
    Table[RTLIB::OGT_F32] = i32_func_f32_f32;
325
1
    Table[RTLIB::OGT_F64] = i32_func_f64_f64;
326
1
    Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
327
1
    Table[RTLIB::UO_F32] = i32_func_f32_f32;
328
1
    Table[RTLIB::UO_F64] = i32_func_f64_f64;
329
1
    Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
330
331
    // Memory
332
1
    Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
333
1
    Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
334
1
    Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
335
336
    // __stack_chk_fail
337
1
    Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func;
338
339
    // Return address handling
340
1
    Table[RTLIB::RETURN_ADDRESS] = iPTR_func_i32;
341
342
    // Element-wise Atomic memory
343
    // TODO: Fix these when we implement atomic support
344
1
    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
345
1
    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
346
1
    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
347
1
    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
348
1
    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
349
1
    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
350
1
    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
351
1
    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
352
1
    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
353
1
    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
354
355
1
    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
356
1
    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
357
1
    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
358
1
    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
359
1
    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
360
361
    // Atomic '__sync_*' libcalls.
362
    // TODO: Fix these when we implement atomic support
363
1
    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
364
1
    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
365
1
    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
366
1
    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
367
1
    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
368
1
    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
369
1
    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
370
1
    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
371
1
    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
372
1
    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
373
1
    Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
374
1
    Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
375
1
    Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
376
1
    Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
377
1
    Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
378
1
    Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
379
1
    Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
380
1
    Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
381
1
    Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
382
1
    Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
383
1
    Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
384
1
    Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
385
1
    Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
386
1
    Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
387
1
    Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
388
1
    Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
389
1
    Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
390
1
    Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
391
1
    Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
392
1
    Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
393
1
    Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
394
1
    Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
395
1
    Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
396
1
    Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
397
1
    Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
398
1
    Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
399
1
    Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
400
1
    Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
401
1
    Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
402
1
    Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
403
1
    Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
404
1
    Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
405
1
    Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
406
1
    Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
407
1
    Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
408
1
    Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
409
1
    Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
410
1
    Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
411
1
    Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
412
1
    Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
413
1
    Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
414
1
    Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
415
1
    Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
416
1
    Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
417
1
    Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
418
1
    Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
419
1
    Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
420
1
    Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
421
1
    Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
422
1
    Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
423
424
    // Atomic '__atomic_*' libcalls.
425
    // TODO: Fix these when we implement atomic support
426
1
    Table[RTLIB::ATOMIC_LOAD] = unsupported;
427
1
    Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
428
1
    Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
429
1
    Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
430
1
    Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
431
1
    Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
432
433
1
    Table[RTLIB::ATOMIC_STORE] = unsupported;
434
1
    Table[RTLIB::ATOMIC_STORE_1] = unsupported;
435
1
    Table[RTLIB::ATOMIC_STORE_2] = unsupported;
436
1
    Table[RTLIB::ATOMIC_STORE_4] = unsupported;
437
1
    Table[RTLIB::ATOMIC_STORE_8] = unsupported;
438
1
    Table[RTLIB::ATOMIC_STORE_16] = unsupported;
439
440
1
    Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
441
1
    Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
442
1
    Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
443
1
    Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
444
1
    Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
445
1
    Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
446
447
1
    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
448
1
    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
449
1
    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
450
1
    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
451
1
    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
452
1
    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
453
454
1
    Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
455
1
    Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
456
1
    Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
457
1
    Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
458
1
    Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
459
460
1
    Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
461
1
    Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
462
1
    Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
463
1
    Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
464
1
    Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
465
466
1
    Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
467
1
    Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
468
1
    Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
469
1
    Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
470
1
    Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
471
472
1
    Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
473
1
    Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
474
1
    Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
475
1
    Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
476
1
    Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
477
478
1
    Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
479
1
    Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
480
1
    Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
481
1
    Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
482
1
    Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
483
484
1
    Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
485
1
    Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
486
1
    Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
487
1
    Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
488
1
    Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
489
1
  }
490
};
491
492
687
RuntimeLibcallSignatureTable &getRuntimeLibcallSignatures() {
493
687
  static RuntimeLibcallSignatureTable RuntimeLibcallSignatures;
494
687
  return RuntimeLibcallSignatures;
495
687
}
496
497
// Maps libcall names to their RTLIB::Libcall number. Builds the map in a
498
// constructor for use with a static variable
499
struct StaticLibcallNameMap {
500
  StringMap<RTLIB::Libcall> Map;
501
1
  StaticLibcallNameMap() {
502
1
    static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
503
653
#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
504
1
#include "llvm/IR/RuntimeLibcalls.def"
505
1
#undef HANDLE_LIBCALL
506
1
    };
507
653
    for (const auto &NameLibcall : NameLibcalls) {
508
653
      if (NameLibcall.first != nullptr &&
509
653
          getRuntimeLibcallSignatures().Table[NameLibcall.second] !=
510
513
              unsupported) {
511
215
        assert(!Map.contains(NameLibcall.first) &&
512
215
               "duplicate libcall names in name map");
513
0
        Map[NameLibcall.first] = NameLibcall.second;
514
215
      }
515
653
    }
516
    // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is
517
    // consistent with the f64 and f128 names.
518
1
    Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32;
519
1
    Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16;
520
521
1
    Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS;
522
1
  }
523
};
524
525
} // end anonymous namespace
526
527
void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
528
                               RTLIB::Libcall LC,
529
                               SmallVectorImpl<wasm::ValType> &Rets,
530
174
                               SmallVectorImpl<wasm::ValType> &Params) {
531
174
  assert(Rets.empty());
532
0
  assert(Params.empty());
533
534
0
  wasm::ValType PtrTy =
535
174
      Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
536
537
174
  auto &Table = getRuntimeLibcallSignatures().Table;
538
174
  switch (Table[LC]) {
539
4
  case func:
540
4
    break;
541
56
  case f32_func_f32:
542
56
    Rets.push_back(wasm::ValType::F32);
543
56
    Params.push_back(wasm::ValType::F32);
544
56
    break;
545
0
  case f32_func_f64:
546
0
    Rets.push_back(wasm::ValType::F32);
547
0
    Params.push_back(wasm::ValType::F64);
548
0
    break;
549
0
  case f32_func_i32:
550
0
    Rets.push_back(wasm::ValType::F32);
551
0
    Params.push_back(wasm::ValType::I32);
552
0
    break;
553
0
  case f32_func_i64:
554
0
    Rets.push_back(wasm::ValType::F32);
555
0
    Params.push_back(wasm::ValType::I64);
556
0
    break;
557
2
  case f32_func_i16:
558
2
    Rets.push_back(wasm::ValType::F32);
559
2
    Params.push_back(wasm::ValType::I32);
560
2
    break;
561
0
  case f64_func_f32:
562
0
    Rets.push_back(wasm::ValType::F64);
563
0
    Params.push_back(wasm::ValType::F32);
564
0
    break;
565
45
  case f64_func_f64:
566
45
    Rets.push_back(wasm::ValType::F64);
567
45
    Params.push_back(wasm::ValType::F64);
568
45
    break;
569
0
  case f64_func_i32:
570
0
    Rets.push_back(wasm::ValType::F64);
571
0
    Params.push_back(wasm::ValType::I32);
572
0
    break;
573
0
  case f64_func_i64:
574
0
    Rets.push_back(wasm::ValType::F64);
575
0
    Params.push_back(wasm::ValType::I64);
576
0
    break;
577
0
  case i32_func_f32:
578
0
    Rets.push_back(wasm::ValType::I32);
579
0
    Params.push_back(wasm::ValType::F32);
580
0
    break;
581
0
  case i32_func_f64:
582
0
    Rets.push_back(wasm::ValType::I32);
583
0
    Params.push_back(wasm::ValType::F64);
584
0
    break;
585
0
  case i32_func_i32:
586
0
    Rets.push_back(wasm::ValType::I32);
587
0
    Params.push_back(wasm::ValType::I32);
588
0
    break;
589
0
  case i64_func_f32:
590
0
    Rets.push_back(wasm::ValType::I64);
591
0
    Params.push_back(wasm::ValType::F32);
592
0
    break;
593
0
  case i64_func_f64:
594
0
    Rets.push_back(wasm::ValType::I64);
595
0
    Params.push_back(wasm::ValType::F64);
596
0
    break;
597
0
  case i64_func_i64:
598
0
    Rets.push_back(wasm::ValType::I64);
599
0
    Params.push_back(wasm::ValType::I64);
600
0
    break;
601
21
  case f32_func_f32_f32:
602
21
    Rets.push_back(wasm::ValType::F32);
603
21
    Params.push_back(wasm::ValType::F32);
604
21
    Params.push_back(wasm::ValType::F32);
605
21
    break;
606
0
  case f32_func_f32_i32:
607
0
    Rets.push_back(wasm::ValType::F32);
608
0
    Params.push_back(wasm::ValType::F32);
609
0
    Params.push_back(wasm::ValType::I32);
610
0
    break;
611
1
  case f32_func_i64_i64:
612
1
    Rets.push_back(wasm::ValType::F32);
613
1
    Params.push_back(wasm::ValType::I64);
614
1
    Params.push_back(wasm::ValType::I64);
615
1
    break;
616
13
  case f64_func_f64_f64:
617
13
    Rets.push_back(wasm::ValType::F64);
618
13
    Params.push_back(wasm::ValType::F64);
619
13
    Params.push_back(wasm::ValType::F64);
620
13
    break;
621
7
  case f64_func_f64_i32:
622
7
    Rets.push_back(wasm::ValType::F64);
623
7
    Params.push_back(wasm::ValType::F64);
624
7
    Params.push_back(wasm::ValType::I32);
625
7
    break;
626
0
  case f64_func_i64_i64:
627
0
    Rets.push_back(wasm::ValType::F64);
628
0
    Params.push_back(wasm::ValType::I64);
629
0
    Params.push_back(wasm::ValType::I64);
630
0
    break;
631
5
  case i16_func_f32:
632
5
    Rets.push_back(wasm::ValType::I32);
633
5
    Params.push_back(wasm::ValType::F32);
634
5
    break;
635
2
  case i16_func_f64:
636
2
    Rets.push_back(wasm::ValType::I32);
637
2
    Params.push_back(wasm::ValType::F64);
638
2
    break;
639
0
  case i16_func_i64_i64:
640
0
    Rets.push_back(wasm::ValType::I32);
641
0
    Params.push_back(wasm::ValType::I64);
642
0
    Params.push_back(wasm::ValType::I64);
643
0
    break;
644
0
  case i8_func_i8_i8:
645
0
    Rets.push_back(wasm::ValType::I32);
646
0
    Params.push_back(wasm::ValType::I32);
647
0
    Params.push_back(wasm::ValType::I32);
648
0
    break;
649
0
  case func_f32_iPTR_iPTR:
650
0
    Params.push_back(wasm::ValType::F32);
651
0
    Params.push_back(PtrTy);
652
0
    Params.push_back(PtrTy);
653
0
    break;
654
0
  case func_f64_iPTR_iPTR:
655
0
    Params.push_back(wasm::ValType::F64);
656
0
    Params.push_back(PtrTy);
657
0
    Params.push_back(PtrTy);
658
0
    break;
659
0
  case i16_func_i16_i16:
660
0
    Rets.push_back(wasm::ValType::I32);
661
0
    Params.push_back(wasm::ValType::I32);
662
0
    Params.push_back(wasm::ValType::I32);
663
0
    break;
664
0
  case i32_func_f32_f32:
665
0
    Rets.push_back(wasm::ValType::I32);
666
0
    Params.push_back(wasm::ValType::F32);
667
0
    Params.push_back(wasm::ValType::F32);
668
0
    break;
669
0
  case i32_func_f64_f64:
670
0
    Rets.push_back(wasm::ValType::I32);
671
0
    Params.push_back(wasm::ValType::F64);
672
0
    Params.push_back(wasm::ValType::F64);
673
0
    break;
674
0
  case i32_func_i32_i32:
675
0
    Rets.push_back(wasm::ValType::I32);
676
0
    Params.push_back(wasm::ValType::I32);
677
0
    Params.push_back(wasm::ValType::I32);
678
0
    break;
679
0
  case i32_func_i32_i32_iPTR:
680
0
    Rets.push_back(wasm::ValType::I32);
681
0
    Params.push_back(wasm::ValType::I32);
682
0
    Params.push_back(wasm::ValType::I32);
683
0
    Params.push_back(PtrTy);
684
0
    break;
685
0
  case i64_func_i64_i64:
686
0
    Rets.push_back(wasm::ValType::I64);
687
0
    Params.push_back(wasm::ValType::I64);
688
0
    Params.push_back(wasm::ValType::I64);
689
0
    break;
690
0
  case i64_func_i64_i64_iPTR:
691
0
    Rets.push_back(wasm::ValType::I64);
692
0
    Params.push_back(wasm::ValType::I64);
693
0
    Params.push_back(wasm::ValType::I64);
694
0
    Params.push_back(PtrTy);
695
0
    break;
696
1
  case i64_i64_func_f32:
697
1
    if (Subtarget.hasMultivalue()) {
698
0
      Rets.push_back(wasm::ValType::I64);
699
0
      Rets.push_back(wasm::ValType::I64);
700
1
    } else {
701
1
      Params.push_back(PtrTy);
702
1
    }
703
1
    Params.push_back(wasm::ValType::F32);
704
1
    break;
705
0
  case i64_i64_func_f64:
706
0
    if (Subtarget.hasMultivalue()) {
707
0
      Rets.push_back(wasm::ValType::I64);
708
0
      Rets.push_back(wasm::ValType::I64);
709
0
    } else {
710
0
      Params.push_back(PtrTy);
711
0
    }
712
0
    Params.push_back(wasm::ValType::F64);
713
0
    break;
714
0
  case i16_i16_func_i16_i16:
715
0
    if (Subtarget.hasMultivalue()) {
716
0
      Rets.push_back(wasm::ValType::I32);
717
0
      Rets.push_back(wasm::ValType::I32);
718
0
    } else {
719
0
      Params.push_back(PtrTy);
720
0
    }
721
0
    Params.push_back(wasm::ValType::I32);
722
0
    Params.push_back(wasm::ValType::I32);
723
0
    break;
724
0
  case i32_i32_func_i32_i32:
725
0
    if (Subtarget.hasMultivalue()) {
726
0
      Rets.push_back(wasm::ValType::I32);
727
0
      Rets.push_back(wasm::ValType::I32);
728
0
    } else {
729
0
      Params.push_back(PtrTy);
730
0
    }
731
0
    Params.push_back(wasm::ValType::I32);
732
0
    Params.push_back(wasm::ValType::I32);
733
0
    break;
734
0
  case i64_i64_func_i64_i64:
735
0
    if (Subtarget.hasMultivalue()) {
736
0
      Rets.push_back(wasm::ValType::I64);
737
0
      Rets.push_back(wasm::ValType::I64);
738
0
    } else {
739
0
      Params.push_back(PtrTy);
740
0
    }
741
0
    Params.push_back(wasm::ValType::I64);
742
0
    Params.push_back(wasm::ValType::I64);
743
0
    break;
744
2
  case i64_i64_func_i64_i64_i64_i64:
745
2
    if (Subtarget.hasMultivalue()) {
746
0
      Rets.push_back(wasm::ValType::I64);
747
0
      Rets.push_back(wasm::ValType::I64);
748
2
    } else {
749
2
      Params.push_back(PtrTy);
750
2
    }
751
2
    Params.push_back(wasm::ValType::I64);
752
2
    Params.push_back(wasm::ValType::I64);
753
2
    Params.push_back(wasm::ValType::I64);
754
2
    Params.push_back(wasm::ValType::I64);
755
2
    break;
756
0
  case i64_i64_func_i64_i64_i64_i64_iPTR:
757
0
    if (Subtarget.hasMultivalue()) {
758
0
      Rets.push_back(wasm::ValType::I64);
759
0
      Rets.push_back(wasm::ValType::I64);
760
0
    } else {
761
0
      Params.push_back(PtrTy);
762
0
    }
763
0
    Params.push_back(wasm::ValType::I64);
764
0
    Params.push_back(wasm::ValType::I64);
765
0
    Params.push_back(wasm::ValType::I64);
766
0
    Params.push_back(wasm::ValType::I64);
767
0
    Params.push_back(PtrTy);
768
0
    break;
769
0
  case i64_i64_i64_i64_func_i64_i64_i64_i64:
770
0
    if (Subtarget.hasMultivalue()) {
771
0
      Rets.push_back(wasm::ValType::I64);
772
0
      Rets.push_back(wasm::ValType::I64);
773
0
      Rets.push_back(wasm::ValType::I64);
774
0
      Rets.push_back(wasm::ValType::I64);
775
0
    } else {
776
0
      Params.push_back(PtrTy);
777
0
    }
778
0
    Params.push_back(wasm::ValType::I64);
779
0
    Params.push_back(wasm::ValType::I64);
780
0
    Params.push_back(wasm::ValType::I64);
781
0
    Params.push_back(wasm::ValType::I64);
782
0
    break;
783
0
  case i64_i64_func_i64_i64_i32:
784
0
    if (Subtarget.hasMultivalue()) {
785
0
      Rets.push_back(wasm::ValType::I64);
786
0
      Rets.push_back(wasm::ValType::I64);
787
0
    } else {
788
0
      Params.push_back(PtrTy);
789
0
    }
790
0
    Params.push_back(wasm::ValType::I64);
791
0
    Params.push_back(wasm::ValType::I64);
792
0
    Params.push_back(wasm::ValType::I32);
793
0
    break;
794
0
  case iPTR_func_i32:
795
0
    Rets.push_back(PtrTy);
796
0
    Params.push_back(wasm::ValType::I32);
797
0
    break;
798
0
  case iPTR_func_iPTR_i32_iPTR:
799
0
    Rets.push_back(PtrTy);
800
0
    Params.push_back(PtrTy);
801
0
    Params.push_back(wasm::ValType::I32);
802
0
    Params.push_back(PtrTy);
803
0
    break;
804
0
  case iPTR_func_iPTR_iPTR_iPTR:
805
0
    Rets.push_back(PtrTy);
806
0
    Params.push_back(PtrTy);
807
0
    Params.push_back(PtrTy);
808
0
    Params.push_back(PtrTy);
809
0
    break;
810
10
  case f32_func_f32_f32_f32:
811
10
    Rets.push_back(wasm::ValType::F32);
812
10
    Params.push_back(wasm::ValType::F32);
813
10
    Params.push_back(wasm::ValType::F32);
814
10
    Params.push_back(wasm::ValType::F32);
815
10
    break;
816
3
  case f64_func_f64_f64_f64:
817
3
    Rets.push_back(wasm::ValType::F64);
818
3
    Params.push_back(wasm::ValType::F64);
819
3
    Params.push_back(wasm::ValType::F64);
820
3
    Params.push_back(wasm::ValType::F64);
821
3
    break;
822
0
  case func_i64_i64_iPTR_iPTR:
823
0
    Params.push_back(wasm::ValType::I64);
824
0
    Params.push_back(wasm::ValType::I64);
825
0
    Params.push_back(PtrTy);
826
0
    Params.push_back(PtrTy);
827
0
    break;
828
0
  case i32_func_i64_i64:
829
0
    Rets.push_back(wasm::ValType::I32);
830
0
    Params.push_back(wasm::ValType::I64);
831
0
    Params.push_back(wasm::ValType::I64);
832
0
    break;
833
2
  case i32_func_i64_i64_i64_i64:
834
2
    Rets.push_back(wasm::ValType::I32);
835
2
    Params.push_back(wasm::ValType::I64);
836
2
    Params.push_back(wasm::ValType::I64);
837
2
    Params.push_back(wasm::ValType::I64);
838
2
    Params.push_back(wasm::ValType::I64);
839
2
    break;
840
0
  case iPTR_func_f32:
841
0
    Rets.push_back(PtrTy);
842
0
    Params.push_back(wasm::ValType::F32);
843
0
    break;
844
0
  case iPTR_func_f64:
845
0
    Rets.push_back(PtrTy);
846
0
    Params.push_back(wasm::ValType::F64);
847
0
    break;
848
0
  case iPTR_func_i64_i64:
849
0
    Rets.push_back(PtrTy);
850
0
    Params.push_back(wasm::ValType::I64);
851
0
    Params.push_back(wasm::ValType::I64);
852
0
    break;
853
0
  case i64_i64_func_i64_i64_i64_i64_i64_i64:
854
0
    if (Subtarget.hasMultivalue()) {
855
0
      Rets.push_back(wasm::ValType::I64);
856
0
      Rets.push_back(wasm::ValType::I64);
857
0
    } else {
858
0
      Params.push_back(PtrTy);
859
0
    }
860
0
    Params.push_back(wasm::ValType::I64);
861
0
    Params.push_back(wasm::ValType::I64);
862
0
    Params.push_back(wasm::ValType::I64);
863
0
    Params.push_back(wasm::ValType::I64);
864
0
    Params.push_back(wasm::ValType::I64);
865
0
    Params.push_back(wasm::ValType::I64);
866
0
    break;
867
0
  case i64_i64_func_i32:
868
0
    if (Subtarget.hasMultivalue()) {
869
0
      Rets.push_back(wasm::ValType::I64);
870
0
      Rets.push_back(wasm::ValType::I64);
871
0
    } else {
872
0
      Params.push_back(PtrTy);
873
0
    }
874
0
    Params.push_back(wasm::ValType::I32);
875
0
    break;
876
0
  case i64_i64_func_i64:
877
0
    if (Subtarget.hasMultivalue()) {
878
0
      Rets.push_back(wasm::ValType::I64);
879
0
      Rets.push_back(wasm::ValType::I64);
880
0
    } else {
881
0
      Params.push_back(PtrTy);
882
0
    }
883
0
    Params.push_back(wasm::ValType::I64);
884
0
    break;
885
0
  case unsupported:
886
0
    llvm_unreachable("unsupported runtime library signature");
887
174
  }
888
174
}
889
890
// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unused
891
// other than here, just roll its logic into this version.
892
void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
893
                               StringRef Name,
894
                               SmallVectorImpl<wasm::ValType> &Rets,
895
174
                               SmallVectorImpl<wasm::ValType> &Params) {
896
174
  static StaticLibcallNameMap LibcallNameMap;
897
174
  auto &Map = LibcallNameMap.Map;
898
174
  auto Val = Map.find(Name);
899
174
#ifndef NDEBUG
900
174
  if (Val == Map.end()) {
901
0
    auto Message =
902
0
        std::string("unexpected runtime library name: ") + std::string(Name);
903
0
    llvm_unreachable(Message.c_str());
904
0
  }
905
174
#endif
906
174
  return getLibcallSignature(Subtarget, Val->second, Rets, Params);
907
174
}