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