957 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This file contains signature information for runtime libcalls.11///12/// CodeGen uses external symbols, which it refers to by name. The WebAssembly13/// target needs type information for all functions. This file contains a big14/// table providing type signatures for all runtime library functions that LLVM15/// 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 25using namespace llvm;26 27namespace {28 29enum 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 unsupported92};93 94struct 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 // Integer100 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 // Conversion289 // 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 // Comparison338 // 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 // Memory362 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_fail367 Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func;368 369 // Return address handling370 Table[RTLIB::RETURN_ADDRESS] = iPTR_func_i32;371 372 // Element-wise Atomic memory373 // TODO: Fix these when we implement atomic support374 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 support393 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 support456 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 522RuntimeLibcallSignatureTable &getRuntimeLibcallSignatures() {523 static RuntimeLibcallSignatureTable RuntimeLibcallSignatures;524 return RuntimeLibcallSignatures;525}526 527// Maps libcall names to their RTLIB::Libcall number. Builds the map in a528// constructor for use with a static variable529struct StaticLibcallNameMap {530 StringMap<RTLIB::Libcall> Map;531 StaticLibcallNameMap(const Triple &TT) {532 // FIXME: This is broken if there are ever different triples compiled with533 // different libcalls.534 RTLIB::RuntimeLibcallsInfo RTCI(TT);535 536 ArrayRef<RuntimeLibcallSignature> Table =537 getRuntimeLibcallSignatures().Table;538 for (RTLIB::LibcallImpl Impl : RTLIB::libcall_impls()) {539 if (!RTCI.isAvailable(Impl))540 continue;541 RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl(Impl);542 if (Table[LC] != unsupported) {543 StringRef NameLibcall =544 RTLIB::RuntimeLibcallsInfo::getLibcallImplName(Impl);545 // FIXME: Map should be to LibcallImpl546 if (!Map.insert({NameLibcall, LC}).second)547 llvm_unreachable("duplicate libcall names in name map");548 }549 }550 }551};552 553} // end anonymous namespace554 555void WebAssembly::getLibcallSignature(const WebAssemblySubtarget &Subtarget,556 RTLIB::Libcall LC,557 SmallVectorImpl<wasm::ValType> &Rets,558 SmallVectorImpl<wasm::ValType> &Params) {559 assert(Rets.empty());560 assert(Params.empty());561 562 wasm::ValType PtrTy =563 Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;564 565 auto &Table = getRuntimeLibcallSignatures().Table;566 switch (Table[LC]) {567 case func:568 break;569 case f32_func_f32:570 Rets.push_back(wasm::ValType::F32);571 Params.push_back(wasm::ValType::F32);572 break;573 case f32_func_f64:574 Rets.push_back(wasm::ValType::F32);575 Params.push_back(wasm::ValType::F64);576 break;577 case f32_func_i32:578 Rets.push_back(wasm::ValType::F32);579 Params.push_back(wasm::ValType::I32);580 break;581 case f32_func_i64:582 Rets.push_back(wasm::ValType::F32);583 Params.push_back(wasm::ValType::I64);584 break;585 case f32_func_i16:586 Rets.push_back(wasm::ValType::F32);587 Params.push_back(wasm::ValType::I32);588 break;589 case f64_func_f32:590 Rets.push_back(wasm::ValType::F64);591 Params.push_back(wasm::ValType::F32);592 break;593 case f64_func_f64:594 Rets.push_back(wasm::ValType::F64);595 Params.push_back(wasm::ValType::F64);596 break;597 case f64_func_i32:598 Rets.push_back(wasm::ValType::F64);599 Params.push_back(wasm::ValType::I32);600 break;601 case f64_func_i64:602 Rets.push_back(wasm::ValType::F64);603 Params.push_back(wasm::ValType::I64);604 break;605 case i32_func_f32:606 Rets.push_back(wasm::ValType::I32);607 Params.push_back(wasm::ValType::F32);608 break;609 case i32_func_f64:610 Rets.push_back(wasm::ValType::I32);611 Params.push_back(wasm::ValType::F64);612 break;613 case i32_func_i32:614 Rets.push_back(wasm::ValType::I32);615 Params.push_back(wasm::ValType::I32);616 break;617 case i64_func_f32:618 Rets.push_back(wasm::ValType::I64);619 Params.push_back(wasm::ValType::F32);620 break;621 case i64_func_f64:622 Rets.push_back(wasm::ValType::I64);623 Params.push_back(wasm::ValType::F64);624 break;625 case i64_func_i64:626 Rets.push_back(wasm::ValType::I64);627 Params.push_back(wasm::ValType::I64);628 break;629 case f32_func_f32_f32:630 Rets.push_back(wasm::ValType::F32);631 Params.push_back(wasm::ValType::F32);632 Params.push_back(wasm::ValType::F32);633 break;634 case f32_func_f32_i32:635 Rets.push_back(wasm::ValType::F32);636 Params.push_back(wasm::ValType::F32);637 Params.push_back(wasm::ValType::I32);638 break;639 case f32_func_f32_iPTR:640 Rets.push_back(wasm::ValType::F32);641 Params.push_back(wasm::ValType::F32);642 Params.push_back(PtrTy);643 break;644 case f32_func_i64_i64:645 Rets.push_back(wasm::ValType::F32);646 Params.push_back(wasm::ValType::I64);647 Params.push_back(wasm::ValType::I64);648 break;649 case f64_func_f64_f64:650 Rets.push_back(wasm::ValType::F64);651 Params.push_back(wasm::ValType::F64);652 Params.push_back(wasm::ValType::F64);653 break;654 case f64_func_f64_i32:655 Rets.push_back(wasm::ValType::F64);656 Params.push_back(wasm::ValType::F64);657 Params.push_back(wasm::ValType::I32);658 break;659 case f64_func_i64_i64:660 Rets.push_back(wasm::ValType::F64);661 Params.push_back(wasm::ValType::I64);662 Params.push_back(wasm::ValType::I64);663 break;664 case f64_func_f64_iPTR:665 Rets.push_back(wasm::ValType::F64);666 Params.push_back(wasm::ValType::F64);667 Params.push_back(PtrTy);668 break;669 case i16_func_f32:670 Rets.push_back(wasm::ValType::I32);671 Params.push_back(wasm::ValType::F32);672 break;673 case i16_func_f64:674 Rets.push_back(wasm::ValType::I32);675 Params.push_back(wasm::ValType::F64);676 break;677 case i16_func_i64_i64:678 Rets.push_back(wasm::ValType::I32);679 Params.push_back(wasm::ValType::I64);680 Params.push_back(wasm::ValType::I64);681 break;682 case i8_func_i8_i8:683 Rets.push_back(wasm::ValType::I32);684 Params.push_back(wasm::ValType::I32);685 Params.push_back(wasm::ValType::I32);686 break;687 case func_f32_iPTR_iPTR:688 Params.push_back(wasm::ValType::F32);689 Params.push_back(PtrTy);690 Params.push_back(PtrTy);691 break;692 case func_f64_iPTR_iPTR:693 Params.push_back(wasm::ValType::F64);694 Params.push_back(PtrTy);695 Params.push_back(PtrTy);696 break;697 case i16_func_i16_i16:698 Rets.push_back(wasm::ValType::I32);699 Params.push_back(wasm::ValType::I32);700 Params.push_back(wasm::ValType::I32);701 break;702 case i32_func_f32_f32:703 Rets.push_back(wasm::ValType::I32);704 Params.push_back(wasm::ValType::F32);705 Params.push_back(wasm::ValType::F32);706 break;707 case i32_func_f64_f64:708 Rets.push_back(wasm::ValType::I32);709 Params.push_back(wasm::ValType::F64);710 Params.push_back(wasm::ValType::F64);711 break;712 case i32_func_i32_i32:713 Rets.push_back(wasm::ValType::I32);714 Params.push_back(wasm::ValType::I32);715 Params.push_back(wasm::ValType::I32);716 break;717 case i32_func_i32_i32_iPTR:718 Rets.push_back(wasm::ValType::I32);719 Params.push_back(wasm::ValType::I32);720 Params.push_back(wasm::ValType::I32);721 Params.push_back(PtrTy);722 break;723 case i64_func_i64_i64:724 Rets.push_back(wasm::ValType::I64);725 Params.push_back(wasm::ValType::I64);726 Params.push_back(wasm::ValType::I64);727 break;728 case i64_func_i64_i64_iPTR:729 Rets.push_back(wasm::ValType::I64);730 Params.push_back(wasm::ValType::I64);731 Params.push_back(wasm::ValType::I64);732 Params.push_back(PtrTy);733 break;734 case i64_i64_func_f32:735 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {736 Rets.push_back(wasm::ValType::I64);737 Rets.push_back(wasm::ValType::I64);738 } else {739 Params.push_back(PtrTy);740 }741 Params.push_back(wasm::ValType::F32);742 break;743 case i64_i64_func_f64:744 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {745 Rets.push_back(wasm::ValType::I64);746 Rets.push_back(wasm::ValType::I64);747 } else {748 Params.push_back(PtrTy);749 }750 Params.push_back(wasm::ValType::F64);751 break;752 case i16_i16_func_i16_i16:753 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {754 Rets.push_back(wasm::ValType::I32);755 Rets.push_back(wasm::ValType::I32);756 } else {757 Params.push_back(PtrTy);758 }759 Params.push_back(wasm::ValType::I32);760 Params.push_back(wasm::ValType::I32);761 break;762 case i32_i32_func_i32_i32:763 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {764 Rets.push_back(wasm::ValType::I32);765 Rets.push_back(wasm::ValType::I32);766 } else {767 Params.push_back(PtrTy);768 }769 Params.push_back(wasm::ValType::I32);770 Params.push_back(wasm::ValType::I32);771 break;772 case i64_i64_func_i64_i64:773 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {774 Rets.push_back(wasm::ValType::I64);775 Rets.push_back(wasm::ValType::I64);776 } else {777 Params.push_back(PtrTy);778 }779 Params.push_back(wasm::ValType::I64);780 Params.push_back(wasm::ValType::I64);781 break;782 case i64_i64_func_i64_i64_iPTR:783 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {784 Rets.push_back(wasm::ValType::I64);785 Rets.push_back(wasm::ValType::I64);786 } else {787 Params.push_back(PtrTy);788 }789 Params.push_back(wasm::ValType::I64);790 Params.push_back(wasm::ValType::I64);791 Params.push_back(PtrTy);792 break;793 case i64_i64_func_i64_i64_i64_i64:794 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {795 Rets.push_back(wasm::ValType::I64);796 Rets.push_back(wasm::ValType::I64);797 } else {798 Params.push_back(PtrTy);799 }800 Params.push_back(wasm::ValType::I64);801 Params.push_back(wasm::ValType::I64);802 Params.push_back(wasm::ValType::I64);803 Params.push_back(wasm::ValType::I64);804 break;805 case i64_i64_func_i64_i64_i64_i64_iPTR:806 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {807 Rets.push_back(wasm::ValType::I64);808 Rets.push_back(wasm::ValType::I64);809 } else {810 Params.push_back(PtrTy);811 }812 Params.push_back(wasm::ValType::I64);813 Params.push_back(wasm::ValType::I64);814 Params.push_back(wasm::ValType::I64);815 Params.push_back(wasm::ValType::I64);816 Params.push_back(PtrTy);817 break;818 case i64_i64_i64_i64_func_i64_i64_i64_i64:819 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {820 Rets.push_back(wasm::ValType::I64);821 Rets.push_back(wasm::ValType::I64);822 Rets.push_back(wasm::ValType::I64);823 Rets.push_back(wasm::ValType::I64);824 } else {825 Params.push_back(PtrTy);826 }827 Params.push_back(wasm::ValType::I64);828 Params.push_back(wasm::ValType::I64);829 Params.push_back(wasm::ValType::I64);830 Params.push_back(wasm::ValType::I64);831 break;832 case i64_i64_func_i64_i64_i32:833 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {834 Rets.push_back(wasm::ValType::I64);835 Rets.push_back(wasm::ValType::I64);836 } else {837 Params.push_back(PtrTy);838 }839 Params.push_back(wasm::ValType::I64);840 Params.push_back(wasm::ValType::I64);841 Params.push_back(wasm::ValType::I32);842 break;843 case iPTR_func_i32:844 Rets.push_back(PtrTy);845 Params.push_back(wasm::ValType::I32);846 break;847 case iPTR_func_iPTR_i32_iPTR:848 Rets.push_back(PtrTy);849 Params.push_back(PtrTy);850 Params.push_back(wasm::ValType::I32);851 Params.push_back(PtrTy);852 break;853 case iPTR_func_iPTR_iPTR_iPTR:854 Rets.push_back(PtrTy);855 Params.push_back(PtrTy);856 Params.push_back(PtrTy);857 Params.push_back(PtrTy);858 break;859 case f32_func_f32_f32_f32:860 Rets.push_back(wasm::ValType::F32);861 Params.push_back(wasm::ValType::F32);862 Params.push_back(wasm::ValType::F32);863 Params.push_back(wasm::ValType::F32);864 break;865 case f64_func_f64_f64_f64:866 Rets.push_back(wasm::ValType::F64);867 Params.push_back(wasm::ValType::F64);868 Params.push_back(wasm::ValType::F64);869 Params.push_back(wasm::ValType::F64);870 break;871 case func_i64_i64_iPTR_iPTR:872 Params.push_back(wasm::ValType::I64);873 Params.push_back(wasm::ValType::I64);874 Params.push_back(PtrTy);875 Params.push_back(PtrTy);876 break;877 case i32_func_i64_i64:878 Rets.push_back(wasm::ValType::I32);879 Params.push_back(wasm::ValType::I64);880 Params.push_back(wasm::ValType::I64);881 break;882 case i32_func_i64_i64_i64_i64:883 Rets.push_back(wasm::ValType::I32);884 Params.push_back(wasm::ValType::I64);885 Params.push_back(wasm::ValType::I64);886 Params.push_back(wasm::ValType::I64);887 Params.push_back(wasm::ValType::I64);888 break;889 case iPTR_func_f32:890 Rets.push_back(PtrTy);891 Params.push_back(wasm::ValType::F32);892 break;893 case iPTR_func_f64:894 Rets.push_back(PtrTy);895 Params.push_back(wasm::ValType::F64);896 break;897 case iPTR_func_i64_i64:898 Rets.push_back(PtrTy);899 Params.push_back(wasm::ValType::I64);900 Params.push_back(wasm::ValType::I64);901 break;902 case i64_i64_func_i64_i64_i64_i64_i64_i64:903 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {904 Rets.push_back(wasm::ValType::I64);905 Rets.push_back(wasm::ValType::I64);906 } else {907 Params.push_back(PtrTy);908 }909 Params.push_back(wasm::ValType::I64);910 Params.push_back(wasm::ValType::I64);911 Params.push_back(wasm::ValType::I64);912 Params.push_back(wasm::ValType::I64);913 Params.push_back(wasm::ValType::I64);914 Params.push_back(wasm::ValType::I64);915 break;916 case i64_i64_func_i32:917 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {918 Rets.push_back(wasm::ValType::I64);919 Rets.push_back(wasm::ValType::I64);920 } else {921 Params.push_back(PtrTy);922 }923 Params.push_back(wasm::ValType::I32);924 break;925 case i64_i64_func_i64:926 if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {927 Rets.push_back(wasm::ValType::I64);928 Rets.push_back(wasm::ValType::I64);929 } else {930 Params.push_back(PtrTy);931 }932 Params.push_back(wasm::ValType::I64);933 break;934 case unsupported:935 llvm_unreachable("unsupported runtime library signature");936 }937}938 939// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unused940// other than here, just roll its logic into this version.941void WebAssembly::getLibcallSignature(const WebAssemblySubtarget &Subtarget,942 StringRef Name,943 SmallVectorImpl<wasm::ValType> &Rets,944 SmallVectorImpl<wasm::ValType> &Params) {945 static StaticLibcallNameMap LibcallNameMap(Subtarget.getTargetTriple());946 auto &Map = LibcallNameMap.Map;947 auto Val = Map.find(Name);948#ifndef NDEBUG949 if (Val == Map.end()) {950 auto Message =951 std::string("unexpected runtime library name: ") + std::string(Name);952 llvm_unreachable(Message.c_str());953 }954#endif955 return getLibcallSignature(Subtarget, Val->second, Rets, Params);956}957