1//===-- EscapeEnumerator.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// Defines a helper class that enumerates all possible exits from a function,
10// including exception handling.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_TRANSFORMS_UTILS_ESCAPEENUMERATOR_H
15#define LLVM_TRANSFORMS_UTILS_ESCAPEENUMERATOR_H
16
17#include "llvm/IR/Function.h"
18#include "llvm/IR/IRBuilder.h"
19
20namespace llvm {
21
22/// EscapeEnumerator - This is a little algorithm to find all escape points
23/// from a function so that "finally"-style code can be inserted. In addition
24/// to finding the existing return and unwind instructions, it also (if
25/// necessary) transforms any call instructions into invokes and sends them to
26/// a landing pad.
27class EscapeEnumerator {
28  Function &F;
29  const char *CleanupBBName;
30
31  Function::iterator StateBB, StateE;
32  IRBuilder<> Builder;
33  bool Done;
34  bool HandleExceptions;
35
36public:
37  EscapeEnumerator(Function &F, const char *N = "cleanup",
38                   bool HandleExceptions = true)
39      : F(F), CleanupBBName(N), StateBB(F.begin()), StateE(F.end()),
40        Builder(F.getContext()), Done(false),
41        HandleExceptions(HandleExceptions) {}
42
43  IRBuilder<> *Next();
44};
45
46}
47
48#endif // LLVM_TRANSFORMS_UTILS_ESCAPEENUMERATOR_H
49