You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.179
Former-commit-id: 67aa10e65b237e1c4537630979ee99ebe1374215
This commit is contained in:
parent
d6bde52373
commit
8625704ad8
62
external/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp
vendored
Normal file
62
external/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp
vendored
Normal file
@ -0,0 +1,62 @@
|
||||
//=- 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"
|
||||
#include "WebAssemblyISelLowering.h"
|
||||
#include "WebAssemblySubtarget.h"
|
||||
#include "llvm/CodeGen/Analysis.h"
|
||||
using namespace llvm;
|
||||
|
||||
WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() {}
|
||||
|
||||
void WebAssemblyFunctionInfo::initWARegs() {
|
||||
assert(WARegs.empty());
|
||||
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);
|
||||
}
|
Reference in New Issue
Block a user