1//===-- WebAssemblyUtilities - WebAssembly Utility Functions ---*- 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/// \file
10/// This file contains the declaration of the WebAssembly-specific
11/// utility functions.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYUTILITIES_H
16#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYUTILITIES_H
17
18#include "llvm/CodeGen/MachineBasicBlock.h"
19
20namespace llvm {
21
22class WebAssemblyFunctionInfo;
23
24namespace WebAssembly {
25
26bool isChild(const MachineInstr &MI, const WebAssemblyFunctionInfo &MFI);
27bool mayThrow(const MachineInstr &MI);
28
29// Exception-related function names
30extern const char *const ClangCallTerminateFn;
31extern const char *const CxaBeginCatchFn;
32extern const char *const CxaRethrowFn;
33extern const char *const StdTerminateFn;
34extern const char *const PersonalityWrapperFn;
35
36/// Return the "bottom" block of an entity, which can be either a MachineLoop or
37/// WebAssemblyException. This differs from MachineLoop::getBottomBlock in that
38/// it works even if the entity is discontiguous.
39template <typename T> MachineBasicBlock *getBottom(const T *Unit) {
40  MachineBasicBlock *Bottom = Unit->getHeader();
41  for (MachineBasicBlock *MBB : Unit->blocks())
42    if (MBB->getNumber() > Bottom->getNumber())
43      Bottom = MBB;
44  return Bottom;
45}
46
47/// Returns the operand number of a callee, assuming the argument is a call
48/// instruction.
49const MachineOperand &getCalleeOp(const MachineInstr &MI);
50
51} // end namespace WebAssembly
52
53} // end namespace llvm
54
55#endif
56