brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.2 KiB · f3c236c Raw
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