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