1 //=- WebAssemblyMachineFunctionInfo.cpp - WebAssembly Machine Function Info -=// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// \file 11 /// This file implements WebAssembly-specific per-machine-function 12 /// information. 13 /// 14 //===----------------------------------------------------------------------===// 15 16 #include "WebAssemblyMachineFunctionInfo.h" 17 #include "WebAssemblyISelLowering.h" 18 #include "WebAssemblySubtarget.h" 19 #include "llvm/CodeGen/Analysis.h" 20 using namespace llvm; 21 22 WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() {} 23 24 void WebAssemblyFunctionInfo::initWARegs() { 25 assert(WARegs.empty()); 26 unsigned Reg = UnusedReg; 27 WARegs.resize(MF.getRegInfo().getNumVirtRegs(), Reg); 28 } 29 30 void llvm::ComputeLegalValueVTs(const Function &F, const TargetMachine &TM, 31 Type *Ty, SmallVectorImpl<MVT> &ValueVTs) { 32 const DataLayout &DL(F.getParent()->getDataLayout()); 33 const WebAssemblyTargetLowering &TLI = 34 *TM.getSubtarget<WebAssemblySubtarget>(F).getTargetLowering(); 35 SmallVector<EVT, 4> VTs; 36 ComputeValueVTs(TLI, DL, Ty, VTs); 37 38 for (EVT VT : VTs) { 39 unsigned NumRegs = TLI.getNumRegisters(F.getContext(), VT); 40 MVT RegisterVT = TLI.getRegisterType(F.getContext(), VT); 41 for (unsigned i = 0; i != NumRegs; ++i) 42 ValueVTs.push_back(RegisterVT); 43 } 44 } 45 46 void llvm::ComputeSignatureVTs(const FunctionType *Ty, const Function &F, 47 const TargetMachine &TM, 48 SmallVectorImpl<MVT> &Params, 49 SmallVectorImpl<MVT> &Results) { 50 ComputeLegalValueVTs(F, TM, Ty->getReturnType(), Results); 51 52 MVT PtrVT = MVT::getIntegerVT(TM.createDataLayout().getPointerSizeInBits()); 53 if (Results.size() > 1) { 54 // WebAssembly currently can't lower returns of multiple values without 55 // demoting to sret (see WebAssemblyTargetLowering::CanLowerReturn). So 56 // replace multiple return values with a pointer parameter. 57 Results.clear(); 58 Params.push_back(PtrVT); 59 } 60 61 for (auto *Param : Ty->params()) 62 ComputeLegalValueVTs(F, TM, Param, Params); 63 if (Ty->isVarArg()) 64 Params.push_back(PtrVT); 65 } 66 67 std::unique_ptr<wasm::WasmSignature> 68 llvm::SignatureFromMVTs(const SmallVectorImpl<MVT> &Results, 69 const SmallVectorImpl<MVT> &Params) { 70 auto Sig = make_unique<wasm::WasmSignature>(); 71 for (MVT Ty : Results) 72 Sig->Returns.push_back(WebAssembly::toValType(Ty)); 73 for (MVT Ty : Params) 74 Sig->Params.push_back(WebAssembly::toValType(Ty)); 75 return Sig; 76 } 77