text: //===-- WebAssemblyUtilities - WebAssembly Utility Functions ---*- C++ -*-====//
  //
  //                     The LLVM Compiler Infrastructure
  //
  // This file is distributed under the University of Illinois Open Source
  // License. See LICENSE.TXT for details.
  //
  //===----------------------------------------------------------------------===//
  ///
  /// \file
  /// This file contains the declaration of the WebAssembly-specific
  /// utility functions.
  ///
  //===----------------------------------------------------------------------===//
  
  #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYUTILITIES_H
  #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYUTILITIES_H
  
  #include "llvm/CodeGen/MachineBasicBlock.h"
  
  namespace llvm {
  
  class WebAssemblyFunctionInfo;
  
  namespace WebAssembly {
  
  bool isArgument(const MachineInstr &MI);
  bool isCopy(const MachineInstr &MI);
  bool isTee(const MachineInstr &MI);
  bool isChild(const MachineInstr &MI, const WebAssemblyFunctionInfo &MFI);
  bool isCallDirect(const MachineInstr &MI);
  bool isCallIndirect(const MachineInstr &MI);
  bool isMarker(const MachineInstr &MI);
  bool isThrow(const MachineInstr &MI);
  bool isRethrow(const MachineInstr &MI);
  bool isCatch(const MachineInstr &MI);
  bool mayThrow(const MachineInstr &MI);
  
  /// Returns the operand number of a callee, assuming the argument is a call
  /// instruction.
  unsigned getCalleeOpNo(const MachineInstr &MI);
  
  /// Returns if the given BB is a single BB terminate pad which starts with a
  /// 'catch' instruction.
  bool isCatchTerminatePad(const MachineBasicBlock &MBB);
  /// Returns if the given BB is a single BB terminate pad which starts with a
  /// 'catch_all' insrtruction.
  bool isCatchAllTerminatePad(const MachineBasicBlock &MBB);
  
  // Exception-related function names
  extern const char *const ClangCallTerminateFn;
  extern const char *const CxaBeginCatchFn;
  extern const char *const CxaRethrowFn;
  extern const char *const StdTerminateFn;
  extern const char *const PersonalityWrapperFn;
  
  /// Return the "bottom" block of an entity, which can be either a MachineLoop or
  /// WebAssemblyException. This differs from MachineLoop::getBottomBlock in that
  /// it works even if the entity is discontiguous.
  template <typename T> MachineBasicBlock *getBottom(const T *Unit) {
    MachineBasicBlock *Bottom = Unit->getHeader();
    for (MachineBasicBlock *MBB : Unit->blocks())
      if (MBB->getNumber() > Bottom->getNumber())
        Bottom = MBB;
    return Bottom;
  }
  
  } // end namespace WebAssembly
  
  } // end namespace llvm
  
  #endif
  