13dac3a9bSDimitry Andric //=- WebAssemblyMachineFunctionInfo.cpp - WebAssembly Machine Function Info -=// 23dac3a9bSDimitry Andric // 33dac3a9bSDimitry Andric // The LLVM Compiler Infrastructure 43dac3a9bSDimitry Andric // 53dac3a9bSDimitry Andric // This file is distributed under the University of Illinois Open Source 63dac3a9bSDimitry Andric // License. See LICENSE.TXT for details. 73dac3a9bSDimitry Andric // 83dac3a9bSDimitry Andric //===----------------------------------------------------------------------===// 93dac3a9bSDimitry Andric /// 103dac3a9bSDimitry Andric /// \file 113dac3a9bSDimitry Andric /// \brief This file implements WebAssembly-specific per-machine-function 123dac3a9bSDimitry Andric /// information. 133dac3a9bSDimitry Andric /// 143dac3a9bSDimitry Andric //===----------------------------------------------------------------------===// 153dac3a9bSDimitry Andric 163dac3a9bSDimitry Andric #include "WebAssemblyMachineFunctionInfo.h" 17d88c1a5aSDimitry Andric #include "WebAssemblyISelLowering.h" 18d88c1a5aSDimitry Andric #include "WebAssemblySubtarget.h" 19d88c1a5aSDimitry Andric #include "llvm/CodeGen/Analysis.h" 203dac3a9bSDimitry Andric using namespace llvm; 213dac3a9bSDimitry Andric 223dac3a9bSDimitry Andric WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() {} 237d523365SDimitry Andric 247d523365SDimitry Andric void WebAssemblyFunctionInfo::initWARegs() { 257d523365SDimitry Andric assert(WARegs.empty()); 267d523365SDimitry Andric unsigned Reg = UnusedReg; 277d523365SDimitry Andric WARegs.resize(MF.getRegInfo().getNumVirtRegs(), Reg); 287d523365SDimitry Andric } 29d88c1a5aSDimitry Andric 30d88c1a5aSDimitry Andric void llvm::ComputeLegalValueVTs(const Function &F, const TargetMachine &TM, 31d88c1a5aSDimitry Andric Type *Ty, SmallVectorImpl<MVT> &ValueVTs) { 32d88c1a5aSDimitry Andric const DataLayout &DL(F.getParent()->getDataLayout()); 33d88c1a5aSDimitry Andric const WebAssemblyTargetLowering &TLI = 34d88c1a5aSDimitry Andric *TM.getSubtarget<WebAssemblySubtarget>(F).getTargetLowering(); 35d88c1a5aSDimitry Andric SmallVector<EVT, 4> VTs; 36d88c1a5aSDimitry Andric ComputeValueVTs(TLI, DL, Ty, VTs); 37d88c1a5aSDimitry Andric 38d88c1a5aSDimitry Andric for (EVT VT : VTs) { 39d88c1a5aSDimitry Andric unsigned NumRegs = TLI.getNumRegisters(F.getContext(), VT); 40d88c1a5aSDimitry Andric MVT RegisterVT = TLI.getRegisterType(F.getContext(), VT); 41d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumRegs; ++i) 42d88c1a5aSDimitry Andric ValueVTs.push_back(RegisterVT); 43d88c1a5aSDimitry Andric } 44d88c1a5aSDimitry Andric } 45d88c1a5aSDimitry Andric 46d88c1a5aSDimitry Andric void llvm::ComputeSignatureVTs(const Function &F, const TargetMachine &TM, 47d88c1a5aSDimitry Andric SmallVectorImpl<MVT> &Params, 48d88c1a5aSDimitry Andric SmallVectorImpl<MVT> &Results) { 49d88c1a5aSDimitry Andric ComputeLegalValueVTs(F, TM, F.getReturnType(), Results); 50d88c1a5aSDimitry Andric 51d88c1a5aSDimitry Andric if (Results.size() > 1) { 52d88c1a5aSDimitry Andric // WebAssembly currently can't lower returns of multiple values without 53d88c1a5aSDimitry Andric // demoting to sret (see WebAssemblyTargetLowering::CanLowerReturn). So 54d88c1a5aSDimitry Andric // replace multiple return values with a pointer parameter. 55d88c1a5aSDimitry Andric Results.clear(); 56d88c1a5aSDimitry Andric Params.push_back( 57d88c1a5aSDimitry Andric MVT::getIntegerVT(TM.createDataLayout().getPointerSizeInBits())); 58d88c1a5aSDimitry Andric } 59d88c1a5aSDimitry Andric 60d88c1a5aSDimitry Andric for (auto &Arg : F.args()) 61d88c1a5aSDimitry Andric ComputeLegalValueVTs(F, TM, Arg.getType(), Params); 62d88c1a5aSDimitry Andric } 63