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

source code of llvm/include/llvm/IR/EHPersonalities.h