2015-06-30 07:51:55 +08:00
|
|
|
//=- WebAssemblyMachineFunctionInfo.cpp - WebAssembly Machine Function Info -=//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
///
|
|
|
|
/// \file
|
|
|
|
/// \brief This file implements WebAssembly-specific per-machine-function
|
|
|
|
/// information.
|
|
|
|
///
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "WebAssemblyMachineFunctionInfo.h"
|
2016-10-07 06:29:32 +08:00
|
|
|
#include "WebAssemblyISelLowering.h"
|
|
|
|
#include "WebAssemblySubtarget.h"
|
|
|
|
#include "llvm/CodeGen/Analysis.h"
|
2015-06-30 07:51:55 +08:00
|
|
|
using namespace llvm;
|
|
|
|
|
|
|
|
WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() {}
|
2015-11-13 08:21:05 +08:00
|
|
|
|
|
|
|
void WebAssemblyFunctionInfo::initWARegs() {
|
|
|
|
assert(WARegs.empty());
|
|
|
|
unsigned Reg = UnusedReg;
|
|
|
|
WARegs.resize(MF.getRegInfo().getNumVirtRegs(), Reg);
|
|
|
|
}
|
2016-10-07 06:29:32 +08:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|