110e730a2SDan Gohman //=- WebAssemblyMachineFunctionInfo.cpp - WebAssembly Machine Function Info -=// 210e730a2SDan Gohman // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 610e730a2SDan Gohman // 710e730a2SDan Gohman //===----------------------------------------------------------------------===// 810e730a2SDan Gohman /// 910e730a2SDan Gohman /// \file 105f8f34e4SAdrian Prantl /// This file implements WebAssembly-specific per-machine-function 1110e730a2SDan Gohman /// information. 1210e730a2SDan Gohman /// 1310e730a2SDan Gohman //===----------------------------------------------------------------------===// 1410e730a2SDan Gohman 1510e730a2SDan Gohman #include "WebAssemblyMachineFunctionInfo.h" 162726b88cSDan Gohman #include "WebAssemblyISelLowering.h" 172726b88cSDan Gohman #include "WebAssemblySubtarget.h" 182726b88cSDan Gohman #include "llvm/CodeGen/Analysis.h" 1910e730a2SDan Gohman using namespace llvm; 2010e730a2SDan Gohman 2118c56a07SHeejin Ahn WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() = default; // anchor. 22058fce54SDan Gohman 23058fce54SDan Gohman void WebAssemblyFunctionInfo::initWARegs() { 24058fce54SDan Gohman assert(WARegs.empty()); 25058fce54SDan Gohman unsigned Reg = UnusedReg; 26058fce54SDan Gohman WARegs.resize(MF.getRegInfo().getNumVirtRegs(), Reg); 27058fce54SDan Gohman } 282726b88cSDan Gohman 2918c56a07SHeejin Ahn void llvm::computeLegalValueVTs(const Function &F, const TargetMachine &TM, 302726b88cSDan Gohman Type *Ty, SmallVectorImpl<MVT> &ValueVTs) { 312726b88cSDan Gohman const DataLayout &DL(F.getParent()->getDataLayout()); 322726b88cSDan Gohman const WebAssemblyTargetLowering &TLI = 332726b88cSDan Gohman *TM.getSubtarget<WebAssemblySubtarget>(F).getTargetLowering(); 342726b88cSDan Gohman SmallVector<EVT, 4> VTs; 352726b88cSDan Gohman ComputeValueVTs(TLI, DL, Ty, VTs); 362726b88cSDan Gohman 372726b88cSDan Gohman for (EVT VT : VTs) { 382726b88cSDan Gohman unsigned NumRegs = TLI.getNumRegisters(F.getContext(), VT); 392726b88cSDan Gohman MVT RegisterVT = TLI.getRegisterType(F.getContext(), VT); 4018c56a07SHeejin Ahn for (unsigned I = 0; I != NumRegs; ++I) 412726b88cSDan Gohman ValueVTs.push_back(RegisterVT); 422726b88cSDan Gohman } 432726b88cSDan Gohman } 442726b88cSDan Gohman 4518c56a07SHeejin Ahn void llvm::computeSignatureVTs(const FunctionType *Ty, const Function &F, 4677a7a380SDerek Schuff const TargetMachine &TM, 472726b88cSDan Gohman SmallVectorImpl<MVT> &Params, 482726b88cSDan Gohman SmallVectorImpl<MVT> &Results) { 4918c56a07SHeejin Ahn computeLegalValueVTs(F, TM, Ty->getReturnType(), Results); 502726b88cSDan Gohman 5177a7a380SDerek Schuff MVT PtrVT = MVT::getIntegerVT(TM.createDataLayout().getPointerSizeInBits()); 52*00f9e5aaSThomas Lively if (Results.size() > 1 && 53*00f9e5aaSThomas Lively !TM.getSubtarget<WebAssemblySubtarget>(F).hasMultivalue()) { 54*00f9e5aaSThomas Lively // WebAssembly can't lower returns of multiple values without demoting to 55*00f9e5aaSThomas Lively // sret unless multivalue is enabled (see 56*00f9e5aaSThomas Lively // WebAssemblyTargetLowering::CanLowerReturn). So replace multiple return 57*00f9e5aaSThomas Lively // values with a poitner parameter. 582726b88cSDan Gohman Results.clear(); 5977a7a380SDerek Schuff Params.push_back(PtrVT); 602726b88cSDan Gohman } 612726b88cSDan Gohman 6277a7a380SDerek Schuff for (auto *Param : Ty->params()) 6318c56a07SHeejin Ahn computeLegalValueVTs(F, TM, Param, Params); 6477a7a380SDerek Schuff if (Ty->isVarArg()) 6577a7a380SDerek Schuff Params.push_back(PtrVT); 6677a7a380SDerek Schuff } 6777a7a380SDerek Schuff 6818c56a07SHeejin Ahn void llvm::valTypesFromMVTs(const ArrayRef<MVT> &In, 6949482f82SWouter van Oortmerssen SmallVectorImpl<wasm::ValType> &Out) { 7049482f82SWouter van Oortmerssen for (MVT Ty : In) 7149482f82SWouter van Oortmerssen Out.push_back(WebAssembly::toValType(Ty)); 7249482f82SWouter van Oortmerssen } 7349482f82SWouter van Oortmerssen 7477a7a380SDerek Schuff std::unique_ptr<wasm::WasmSignature> 7518c56a07SHeejin Ahn llvm::signatureFromMVTs(const SmallVectorImpl<MVT> &Results, 7677a7a380SDerek Schuff const SmallVectorImpl<MVT> &Params) { 770eaee545SJonas Devlieghere auto Sig = std::make_unique<wasm::WasmSignature>(); 7818c56a07SHeejin Ahn valTypesFromMVTs(Results, Sig->Returns); 7918c56a07SHeejin Ahn valTypesFromMVTs(Params, Sig->Params); 8077a7a380SDerek Schuff return Sig; 812726b88cSDan Gohman } 8252221d56SHeejin Ahn 8352221d56SHeejin Ahn yaml::WebAssemblyFunctionInfo::WebAssemblyFunctionInfo( 841aaa481fSHeejin Ahn const llvm::WebAssemblyFunctionInfo &MFI) 851aaa481fSHeejin Ahn : CFGStackified(MFI.isCFGStackified()) {} 8652221d56SHeejin Ahn 8752221d56SHeejin Ahn void yaml::WebAssemblyFunctionInfo::mappingImpl(yaml::IO &YamlIO) { 8852221d56SHeejin Ahn MappingTraits<WebAssemblyFunctionInfo>::mapping(YamlIO, *this); 8952221d56SHeejin Ahn } 9052221d56SHeejin Ahn 9152221d56SHeejin Ahn void WebAssemblyFunctionInfo::initializeBaseYamlFields( 921aaa481fSHeejin Ahn const yaml::WebAssemblyFunctionInfo &YamlMFI) { 931aaa481fSHeejin Ahn CFGStackified = YamlMFI.CFGStackified; 941aaa481fSHeejin Ahn } 95