1//===--- llvm/CodeGen/WasmEHFuncInfo.h --------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// Data structures for Wasm exception handling schemes. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_CODEGEN_WASMEHFUNCINFO_H 14#define LLVM_CODEGEN_WASMEHFUNCINFO_H 15 16#include "llvm/ADT/DenseMap.h" 17#include "llvm/ADT/PointerUnion.h" 18#include "llvm/CodeGen/MachineBasicBlock.h" 19#include "llvm/IR/BasicBlock.h" 20 21namespace llvm { 22 23enum EventTag { CPP_EXCEPTION = 0, C_LONGJMP = 1 }; 24 25using BBOrMBB = PointerUnion<const BasicBlock *, MachineBasicBlock *>; 26 27struct WasmEHFuncInfo { 28 // When there is an entry <A, B>, if an exception is not caught by A, it 29 // should next unwind to the EH pad B. 30 DenseMap<BBOrMBB, BBOrMBB> EHPadUnwindMap; 31 32 // Helper functions 33 const BasicBlock *getEHPadUnwindDest(const BasicBlock *BB) const { 34 return EHPadUnwindMap.lookup(BB).get<const BasicBlock *>(); 35 } 36 void setEHPadUnwindDest(const BasicBlock *BB, const BasicBlock *Dest) { 37 EHPadUnwindMap[BB] = Dest; 38 } 39 bool hasEHPadUnwindDest(const BasicBlock *BB) const { 40 return EHPadUnwindMap.count(BB); 41 } 42 43 MachineBasicBlock *getEHPadUnwindDest(MachineBasicBlock *MBB) const { 44 return EHPadUnwindMap.lookup(MBB).get<MachineBasicBlock *>(); 45 } 46 void setEHPadUnwindDest(MachineBasicBlock *MBB, MachineBasicBlock *Dest) { 47 EHPadUnwindMap[MBB] = Dest; 48 } 49 bool hasEHPadUnwindDest(MachineBasicBlock *MBB) const { 50 return EHPadUnwindMap.count(MBB); 51 } 52}; 53 54// Analyze the IR in the given function to build WasmEHFuncInfo. 55void calculateWasmEHInfo(const Function *F, WasmEHFuncInfo &EHInfo); 56 57} // namespace llvm 58 59#endif // LLVM_CODEGEN_WASMEHFUNCINFO_H 60