1//===- EHPersonalities.h - Compute EH-related information -----------------===//
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#ifndef LLVM_ANALYSIS_EHPERSONALITIES_H
10#define LLVM_ANALYSIS_EHPERSONALITIES_H
11
12#include "llvm/ADT/DenseMap.h"
13#include "llvm/ADT/TinyPtrVector.h"
14#include "llvm/Support/ErrorHandling.h"
15
16namespace llvm {
17class BasicBlock;
18class Function;
19class Triple;
20class Value;
21
22enum class EHPersonality {
23  Unknown,
24  GNU_Ada,
25  GNU_C,
26  GNU_C_SjLj,
27  GNU_CXX,
28  GNU_CXX_SjLj,
29  GNU_ObjC,
30  MSVC_X86SEH,
31  MSVC_TableSEH,
32  MSVC_CXX,
33  CoreCLR,
34  Rust,
35  Wasm_CXX,
36  XL_CXX
37};
38
39/// See if the given exception handling personality function is one
40/// that we understand.  If so, return a description of it; otherwise return
41/// Unknown.
42EHPersonality classifyEHPersonality(const Value *Pers);
43
44StringRef getEHPersonalityName(EHPersonality Pers);
45
46EHPersonality getDefaultEHPersonality(const Triple &T);
47
48/// Returns true if this personality function catches asynchronous
49/// exceptions.
50inline bool isAsynchronousEHPersonality(EHPersonality Pers) {
51  // The two SEH personality functions can catch asynch exceptions. We assume
52  // unknown personalities don't catch asynch exceptions.
53  switch (Pers) {
54  case EHPersonality::MSVC_X86SEH:
55  case EHPersonality::MSVC_TableSEH:
56    return true;
57  default:
58    return false;
59  }
60  llvm_unreachable("invalid enum");
61}
62
63/// Returns true if this is a personality function that invokes
64/// handler funclets (which must return to it).
65inline bool isFuncletEHPersonality(EHPersonality Pers) {
66  switch (Pers) {
67  case EHPersonality::MSVC_CXX:
68  case EHPersonality::MSVC_X86SEH:
69  case EHPersonality::MSVC_TableSEH:
70  case EHPersonality::CoreCLR:
71    return true;
72  default:
73    return false;
74  }
75  llvm_unreachable("invalid enum");
76}
77
78/// Returns true if this personality uses scope-style EH IR instructions:
79/// catchswitch, catchpad/ret, and cleanuppad/ret.
80inline bool isScopedEHPersonality(EHPersonality Pers) {
81  switch (Pers) {
82  case EHPersonality::MSVC_CXX:
83  case EHPersonality::MSVC_X86SEH:
84  case EHPersonality::MSVC_TableSEH:
85  case EHPersonality::CoreCLR:
86  case EHPersonality::Wasm_CXX:
87    return true;
88  default:
89    return false;
90  }
91  llvm_unreachable("invalid enum");
92}
93
94/// Return true if this personality may be safely removed if there
95/// are no invoke instructions remaining in the current function.
96inline bool isNoOpWithoutInvoke(EHPersonality Pers) {
97  switch (Pers) {
98  case EHPersonality::Unknown:
99    return false;
100  // All known personalities currently have this behavior
101  default:
102    return true;
103  }
104  llvm_unreachable("invalid enum");
105}
106
107bool canSimplifyInvokeNoUnwind(const Function *F);
108
109typedef TinyPtrVector<BasicBlock *> ColorVector;
110
111/// If an EH funclet personality is in use (see isFuncletEHPersonality),
112/// this will recompute which blocks are in which funclet. It is possible that
113/// some blocks are in multiple funclets. Consider this analysis to be
114/// expensive.
115DenseMap<BasicBlock *, ColorVector> colorEHFunclets(Function &F);
116
117} // end namespace llvm
118
119#endif
120