diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 | 
| commit | b915e9e0fc85ba6f398b3fab0db6a81a8913af94 (patch) | |
| tree | 98b8f811c7aff2547cab8642daf372d6c59502fb /lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp | |
| parent | 6421cca32f69ac849537a3cff78c352195e99f1b (diff) | |
Notes
Diffstat (limited to 'lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp')
| -rw-r--r-- | lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp | 37 | 
1 files changed, 37 insertions, 0 deletions
| diff --git a/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp b/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp index 225c5d32cb5d..ccf6a18b32ea 100644 --- a/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp +++ b/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp @@ -14,6 +14,9 @@  //===----------------------------------------------------------------------===//  #include "WebAssemblyMachineFunctionInfo.h" +#include "WebAssemblyISelLowering.h" +#include "WebAssemblySubtarget.h" +#include "llvm/CodeGen/Analysis.h"  using namespace llvm;  WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() {} @@ -23,3 +26,37 @@ void WebAssemblyFunctionInfo::initWARegs() {    unsigned Reg = UnusedReg;    WARegs.resize(MF.getRegInfo().getNumVirtRegs(), Reg);  } + +void llvm::ComputeLegalValueVTs(const Function &F, const TargetMachine &TM, +                                Type *Ty, SmallVectorImpl<MVT> &ValueVTs) { +  const DataLayout &DL(F.getParent()->getDataLayout()); +  const WebAssemblyTargetLowering &TLI = +      *TM.getSubtarget<WebAssemblySubtarget>(F).getTargetLowering(); +  SmallVector<EVT, 4> VTs; +  ComputeValueVTs(TLI, DL, Ty, VTs); + +  for (EVT VT : VTs) { +    unsigned NumRegs = TLI.getNumRegisters(F.getContext(), VT); +    MVT RegisterVT = TLI.getRegisterType(F.getContext(), VT); +    for (unsigned i = 0; i != NumRegs; ++i) +      ValueVTs.push_back(RegisterVT); +  } +} + +void llvm::ComputeSignatureVTs(const Function &F, const TargetMachine &TM, +                               SmallVectorImpl<MVT> &Params, +                               SmallVectorImpl<MVT> &Results) { +  ComputeLegalValueVTs(F, TM, F.getReturnType(), Results); + +  if (Results.size() > 1) { +    // WebAssembly currently can't lower returns of multiple values without +    // demoting to sret (see WebAssemblyTargetLowering::CanLowerReturn). So +    // replace multiple return values with a pointer parameter. +    Results.clear(); +    Params.push_back( +        MVT::getIntegerVT(TM.createDataLayout().getPointerSizeInBits())); +  } + +  for (auto &Arg : F.args()) +    ComputeLegalValueVTs(F, TM, Arg.getType(), Params); +} | 
