mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
879878fa13
Summary: Before when we implemented the first EH proposal, 'catch <tag>' instruction may not catch an exception so there were multiple EH pads an exception can unwind to. That means a BB could have multiple EH pad successors. Now after we switched to the new proposal, every 'catch' instruction catches an exception, and there is only one catchpad per catchswitch, so we at most have one EH pad successor, making `ThrowUnwindDest` map in `WasmEHInfo` unnecessary. Keeping `ThrowUnwindDest` map in `WasmEHInfo` has its own problems, because other optimization passes can split a BB that contains possibly throwing calls (previously invokes), and we have to update the map every time that happens, which is not easy for common CodeGen passes. This also correctly updates successor info in LateEHPrepare when we add a rethrow instruction. Reviewers: dschuff Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58486 llvm-svn: 355296
60 lines
1.9 KiB
C++
60 lines
1.9 KiB
C++
//===--- llvm/CodeGen/WasmEHFuncInfo.h --------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Data structures for Wasm exception handling schemes.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CODEGEN_WASMEHFUNCINFO_H
|
|
#define LLVM_CODEGEN_WASMEHFUNCINFO_H
|
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/PointerUnion.h"
|
|
#include "llvm/CodeGen/MachineBasicBlock.h"
|
|
#include "llvm/IR/BasicBlock.h"
|
|
|
|
namespace llvm {
|
|
|
|
enum EventTag { CPP_EXCEPTION = 0, C_LONGJMP = 1 };
|
|
|
|
using BBOrMBB = PointerUnion<const BasicBlock *, MachineBasicBlock *>;
|
|
|
|
struct WasmEHFuncInfo {
|
|
// When there is an entry <A, B>, if an exception is not caught by A, it
|
|
// should next unwind to the EH pad B.
|
|
DenseMap<BBOrMBB, BBOrMBB> EHPadUnwindMap;
|
|
|
|
// Helper functions
|
|
const BasicBlock *getEHPadUnwindDest(const BasicBlock *BB) const {
|
|
return EHPadUnwindMap.lookup(BB).get<const BasicBlock *>();
|
|
}
|
|
void setEHPadUnwindDest(const BasicBlock *BB, const BasicBlock *Dest) {
|
|
EHPadUnwindMap[BB] = Dest;
|
|
}
|
|
bool hasEHPadUnwindDest(const BasicBlock *BB) const {
|
|
return EHPadUnwindMap.count(BB);
|
|
}
|
|
|
|
MachineBasicBlock *getEHPadUnwindDest(MachineBasicBlock *MBB) const {
|
|
return EHPadUnwindMap.lookup(MBB).get<MachineBasicBlock *>();
|
|
}
|
|
void setEHPadUnwindDest(MachineBasicBlock *MBB, MachineBasicBlock *Dest) {
|
|
EHPadUnwindMap[MBB] = Dest;
|
|
}
|
|
bool hasEHPadUnwindDest(MachineBasicBlock *MBB) const {
|
|
return EHPadUnwindMap.count(MBB);
|
|
}
|
|
};
|
|
|
|
// Analyze the IR in the given function to build WasmEHFuncInfo.
|
|
void calculateWasmEHInfo(const Function *F, WasmEHFuncInfo &EHInfo);
|
|
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_CODEGEN_WASMEHFUNCINFO_H
|