WebAssembly: Remove MachineFunction reference from MFI

The MachineFunctionInfo here is a bit awkward because
WasmEHInfo is in the MachineFunction but handled from
the target code. Either everything should move into WebAssembly
or into the MachineFunction for MIR serialization.
This commit is contained in:
Matt Arsenault 2022-11-02 14:46:00 -07:00
parent 76db4e3c43
commit ff2b60bbcb
4 changed files with 22 additions and 29 deletions

View File

@ -280,6 +280,7 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction {
// Keep track of the function section.
MCSection *Section = nullptr;
// Catchpad unwind destination info for wasm EH.
// Keeps track of Wasm exception handling related data. This will be null for
// functions that aren't using a wasm EH personality.
WasmEHFuncInfo *WasmEHInfo = nullptr;

View File

@ -28,10 +28,9 @@ MachineFunctionInfo *WebAssemblyFunctionInfo::clone(
BumpPtrAllocator &Allocator, MachineFunction &DestMF,
const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB)
const {
WebAssemblyFunctionInfo *Clone =
DestMF.cloneInfo<WebAssemblyFunctionInfo>(*this);
Clone->MF = &DestMF;
return Clone;
// TODO: Implement cloning for WasmEHFuncInfo. This will have invalid block
// references.
return DestMF.cloneInfo<WebAssemblyFunctionInfo>(*this);
}
void WebAssemblyFunctionInfo::initWARegs(MachineRegisterInfo &MRI) {
@ -122,11 +121,8 @@ llvm::signatureFromMVTs(const SmallVectorImpl<MVT> &Results,
}
yaml::WebAssemblyFunctionInfo::WebAssemblyFunctionInfo(
const llvm::WebAssemblyFunctionInfo &MFI)
const llvm::MachineFunction &MF, const llvm::WebAssemblyFunctionInfo &MFI)
: CFGStackified(MFI.isCFGStackified()) {
auto *EHInfo = MFI.getWasmEHFuncInfo();
const llvm::MachineFunction &MF = MFI.getMachineFunction();
for (auto VT : MFI.getParams())
Params.push_back(EVT(VT).getEVTString());
for (auto VT : MFI.getResults())
@ -134,7 +130,8 @@ yaml::WebAssemblyFunctionInfo::WebAssemblyFunctionInfo(
// MFI.getWasmEHFuncInfo() is non-null only for functions with the
// personality function.
if (EHInfo) {
if (auto *EHInfo = MF.getWasmEHFuncInfo()) {
// SrcToUnwindDest can contain stale mappings in case BBs are removed in
// optimizations, in case, for example, they are unreachable. We should not
// include their info.
@ -155,15 +152,19 @@ void yaml::WebAssemblyFunctionInfo::mappingImpl(yaml::IO &YamlIO) {
}
void WebAssemblyFunctionInfo::initializeBaseYamlFields(
const yaml::WebAssemblyFunctionInfo &YamlMFI) {
MachineFunction &MF, const yaml::WebAssemblyFunctionInfo &YamlMFI) {
CFGStackified = YamlMFI.CFGStackified;
for (auto VT : YamlMFI.Params)
addParam(WebAssembly::parseMVT(VT.Value));
for (auto VT : YamlMFI.Results)
addResult(WebAssembly::parseMVT(VT.Value));
if (WasmEHInfo) {
// FIXME: WasmEHInfo is defined in the MachineFunction, but serialized
// here. Either WasmEHInfo should be moved out of MachineFunction, or the
// serialization handling should be moved to MachineFunction.
if (WasmEHFuncInfo *WasmEHInfo = MF.getWasmEHFuncInfo()) {
for (auto KV : YamlMFI.SrcToUnwindDest)
WasmEHInfo->setUnwindDest(MF->getBlockNumbered(KV.first),
MF->getBlockNumbered(KV.second));
WasmEHInfo->setUnwindDest(MF.getBlockNumbered(KV.first),
MF.getBlockNumbered(KV.second));
}
}

View File

@ -31,8 +31,6 @@ struct WebAssemblyFunctionInfo;
/// This class is derived from MachineFunctionInfo and contains private
/// WebAssembly-specific information for each MachineFunction.
class WebAssemblyFunctionInfo final : public MachineFunctionInfo {
const MachineFunction *MF;
std::vector<MVT> Params;
std::vector<MVT> Results;
std::vector<MVT> Locals;
@ -66,12 +64,8 @@ class WebAssemblyFunctionInfo final : public MachineFunctionInfo {
// Function properties.
bool CFGStackified = false;
// Catchpad unwind destination info for wasm EH.
WasmEHFuncInfo *WasmEHInfo = nullptr;
public:
explicit WebAssemblyFunctionInfo(MachineFunction &MF_)
: MF(&MF_), WasmEHInfo(MF_.getWasmEHFuncInfo()) {}
explicit WebAssemblyFunctionInfo(MachineFunction &) {}
~WebAssemblyFunctionInfo() override;
MachineFunctionInfo *
@ -79,9 +73,8 @@ public:
const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB)
const override;
const MachineFunction &getMachineFunction() const { return *MF; }
void initializeBaseYamlFields(const yaml::WebAssemblyFunctionInfo &YamlMFI);
void initializeBaseYamlFields(MachineFunction &MF,
const yaml::WebAssemblyFunctionInfo &YamlMFI);
void addParam(MVT VT) { Params.push_back(VT); }
const std::vector<MVT> &getParams() const { return Params; }
@ -166,9 +159,6 @@ public:
bool isCFGStackified() const { return CFGStackified; }
void setCFGStackified(bool Value = true) { CFGStackified = Value; }
WasmEHFuncInfo *getWasmEHFuncInfo() const { return WasmEHInfo; }
void setWasmEHFuncInfo(WasmEHFuncInfo *Info) { WasmEHInfo = Info; }
};
void computeLegalValueVTs(const WebAssemblyTargetLowering &TLI,
@ -205,7 +195,8 @@ struct WebAssemblyFunctionInfo final : public yaml::MachineFunctionInfo {
BBNumberMap SrcToUnwindDest;
WebAssemblyFunctionInfo() = default;
WebAssemblyFunctionInfo(const llvm::WebAssemblyFunctionInfo &MFI);
WebAssemblyFunctionInfo(const llvm::MachineFunction &MF,
const llvm::WebAssemblyFunctionInfo &MFI);
void mappingImpl(yaml::IO &YamlIO) override;
~WebAssemblyFunctionInfo() = default;

View File

@ -585,7 +585,7 @@ WebAssemblyTargetMachine::createDefaultFuncInfoYAML() const {
yaml::MachineFunctionInfo *WebAssemblyTargetMachine::convertFuncInfoToYAML(
const MachineFunction &MF) const {
const auto *MFI = MF.getInfo<WebAssemblyFunctionInfo>();
return new yaml::WebAssemblyFunctionInfo(*MFI);
return new yaml::WebAssemblyFunctionInfo(MF, *MFI);
}
bool WebAssemblyTargetMachine::parseMachineFunctionInfo(
@ -593,6 +593,6 @@ bool WebAssemblyTargetMachine::parseMachineFunctionInfo(
SMDiagnostic &Error, SMRange &SourceRange) const {
const auto &YamlMFI = static_cast<const yaml::WebAssemblyFunctionInfo &>(MFI);
MachineFunction &MF = PFS.MF;
MF.getInfo<WebAssemblyFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
MF.getInfo<WebAssemblyFunctionInfo>()->initializeBaseYamlFields(MF, YamlMFI);
return false;
}