diff options
Diffstat (limited to 'lib/Target/WebAssembly/WebAssemblyUtilities.h')
-rw-r--r-- | lib/Target/WebAssembly/WebAssemblyUtilities.h | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/lib/Target/WebAssembly/WebAssemblyUtilities.h b/lib/Target/WebAssembly/WebAssemblyUtilities.h index 595491f1bf5b..cdb7873e9013 100644 --- a/lib/Target/WebAssembly/WebAssemblyUtilities.h +++ b/lib/Target/WebAssembly/WebAssemblyUtilities.h @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// /// /// \file -/// \brief This file contains the declaration of the WebAssembly-specific +/// This file contains the declaration of the WebAssembly-specific /// utility functions. /// //===----------------------------------------------------------------------===// @@ -16,11 +16,10 @@ #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYUTILITIES_H #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYUTILITIES_H +#include "llvm/CodeGen/MachineBasicBlock.h" + namespace llvm { -class MachineBasicBlock; -class MachineInstr; -class MachineLoop; class WebAssemblyFunctionInfo; namespace WebAssembly { @@ -29,14 +28,44 @@ 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); -} // end namespace WebAssembly +/// 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); -/// Return the "bottom" block of a loop. This differs from -/// MachineLoop::getBottomBlock in that it works even if the loop is -/// discontiguous. -MachineBasicBlock *LoopBottom(const MachineLoop *Loop); +// 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 |