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 | |
15 | namespace llvm { |
16 | class BasicBlock; |
17 | class Function; |
18 | class Triple; |
19 | class Value; |
20 | |
21 | enum 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. |
41 | EHPersonality classifyEHPersonality(const Value *Pers); |
42 | |
43 | StringRef getEHPersonalityName(EHPersonality Pers); |
44 | |
45 | EHPersonality getDefaultEHPersonality(const Triple &T); |
46 | |
47 | /// Returns true if this personality function catches asynchronous |
48 | /// exceptions. |
49 | inline 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). |
64 | inline 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. |
79 | inline 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. |
95 | inline 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 | |
106 | bool canSimplifyInvokeNoUnwind(const Function *F); |
107 | |
108 | typedef 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. |
114 | DenseMap<BasicBlock *, ColorVector> colorEHFunclets(Function &F); |
115 | |
116 | } // end namespace llvm |
117 | |
118 | #endif // LLVM_IR_EHPERSONALITIES_H |
119 | |