//===--- llvm/CodeGen/WasmEHFuncInfo.h --------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Data structures for Wasm exception handling schemes.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CODEGEN_WASMEHFUNCINFO_H
#define LLVM_CODEGEN_WASMEHFUNCINFO_H

#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/IR/BasicBlock.h"

namespace llvm {

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;
  // For entry <A, B>, A is a BB with an instruction that may throw
  // (invoke/cleanupret in LLVM IR, call/rethrow in the backend) and B is an EH
  // pad that A unwinds to.
  DenseMap<BBOrMBB, BBOrMBB> ThrowUnwindMap;

  // 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;
  }
  const BasicBlock *getThrowUnwindDest(BasicBlock *BB) const {
    return ThrowUnwindMap.lookup(BB).get<const BasicBlock *>();
  }
  void setThrowUnwindDest(const BasicBlock *BB, const BasicBlock *Dest) {
    ThrowUnwindMap[BB] = Dest;
  }
  bool hasEHPadUnwindDest(const BasicBlock *BB) const {
    return EHPadUnwindMap.count(BB);
  }
  bool hasThrowUnwindDest(const BasicBlock *BB) const {
    return ThrowUnwindMap.count(BB);
  }

  MachineBasicBlock *getEHPadUnwindDest(MachineBasicBlock *MBB) const {
    return EHPadUnwindMap.lookup(MBB).get<MachineBasicBlock *>();
  }
  void setEHPadUnwindDest(MachineBasicBlock *MBB, MachineBasicBlock *Dest) {
    EHPadUnwindMap[MBB] = Dest;
  }
  MachineBasicBlock *getThrowUnwindDest(MachineBasicBlock *MBB) const {
    return ThrowUnwindMap.lookup(MBB).get<MachineBasicBlock *>();
  }
  void setThrowUnwindDest(MachineBasicBlock *MBB, MachineBasicBlock *Dest) {
    ThrowUnwindMap[MBB] = Dest;
  }
  bool hasEHPadUnwindDest(MachineBasicBlock *MBB) const {
    return EHPadUnwindMap.count(MBB);
  }
  bool hasThrowUnwindDest(MachineBasicBlock *MBB) const {
    return ThrowUnwindMap.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
