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
114ba319b5SDimitry Andric /// 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 
~WebAssemblyFunctionInfo()223dac3a9bSDimitry Andric WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() {}
237d523365SDimitry Andric 
initWARegs()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 
ComputeLegalValueVTs(const Function & F,const TargetMachine & TM,Type * Ty,SmallVectorImpl<MVT> & ValueVTs)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 
ComputeSignatureVTs(const FunctionType * Ty,const Function & F,const TargetMachine & TM,SmallVectorImpl<MVT> & Params,SmallVectorImpl<MVT> & Results)46*b5893f02SDimitry Andric void llvm::ComputeSignatureVTs(const FunctionType *Ty, const Function &F,
47*b5893f02SDimitry Andric                                const TargetMachine &TM,
48d88c1a5aSDimitry Andric                                SmallVectorImpl<MVT> &Params,
49d88c1a5aSDimitry Andric                                SmallVectorImpl<MVT> &Results) {
50*b5893f02SDimitry Andric   ComputeLegalValueVTs(F, TM, Ty->getReturnType(), Results);
51d88c1a5aSDimitry Andric 
52*b5893f02SDimitry Andric   MVT PtrVT = MVT::getIntegerVT(TM.createDataLayout().getPointerSizeInBits());
53d88c1a5aSDimitry Andric   if (Results.size() > 1) {
54d88c1a5aSDimitry Andric     // WebAssembly currently can't lower returns of multiple values without
55d88c1a5aSDimitry Andric     // demoting to sret (see WebAssemblyTargetLowering::CanLowerReturn). So
56d88c1a5aSDimitry Andric     // replace multiple return values with a pointer parameter.
57d88c1a5aSDimitry Andric     Results.clear();
58*b5893f02SDimitry Andric     Params.push_back(PtrVT);
59d88c1a5aSDimitry Andric   }
60d88c1a5aSDimitry Andric 
61*b5893f02SDimitry Andric   for (auto *Param : Ty->params())
62*b5893f02SDimitry Andric     ComputeLegalValueVTs(F, TM, Param, Params);
63*b5893f02SDimitry Andric   if (Ty->isVarArg())
64*b5893f02SDimitry Andric     Params.push_back(PtrVT);
65*b5893f02SDimitry Andric }
66*b5893f02SDimitry Andric 
ValTypesFromMVTs(const ArrayRef<MVT> & In,SmallVectorImpl<wasm::ValType> & Out)67*b5893f02SDimitry Andric void llvm::ValTypesFromMVTs(const ArrayRef<MVT> &In,
68*b5893f02SDimitry Andric                             SmallVectorImpl<wasm::ValType> &Out) {
69*b5893f02SDimitry Andric   for (MVT Ty : In)
70*b5893f02SDimitry Andric     Out.push_back(WebAssembly::toValType(Ty));
71*b5893f02SDimitry Andric }
72*b5893f02SDimitry Andric 
73*b5893f02SDimitry Andric std::unique_ptr<wasm::WasmSignature>
SignatureFromMVTs(const SmallVectorImpl<MVT> & Results,const SmallVectorImpl<MVT> & Params)74*b5893f02SDimitry Andric llvm::SignatureFromMVTs(const SmallVectorImpl<MVT> &Results,
75*b5893f02SDimitry Andric                         const SmallVectorImpl<MVT> &Params) {
76*b5893f02SDimitry Andric   auto Sig = make_unique<wasm::WasmSignature>();
77*b5893f02SDimitry Andric   ValTypesFromMVTs(Results, Sig->Returns);
78*b5893f02SDimitry Andric   ValTypesFromMVTs(Params, Sig->Params);
79*b5893f02SDimitry Andric   return Sig;
80d88c1a5aSDimitry Andric }
81