]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/Analysis/EHPersonalities.h
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / Analysis / EHPersonalities.h
1 //===- EHPersonalities.h - Compute EH-related information -----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef LLVM_ANALYSIS_EHPERSONALITIES_H
11 #define LLVM_ANALYSIS_EHPERSONALITIES_H
12
13 #include "llvm/ADT/DenseMap.h"
14 #include "llvm/ADT/TinyPtrVector.h"
15 #include "llvm/ADT/Triple.h"
16 #include "llvm/Support/ErrorHandling.h"
17
18 namespace llvm {
19 class BasicBlock;
20 class Function;
21 class Value;
22
23 enum class EHPersonality {
24   Unknown,
25   GNU_Ada,
26   GNU_C,
27   GNU_C_SjLj,
28   GNU_CXX,
29   GNU_CXX_SjLj,
30   GNU_ObjC,
31   MSVC_X86SEH,
32   MSVC_Win64SEH,
33   MSVC_CXX,
34   CoreCLR,
35   Rust,
36   Wasm_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.
42 EHPersonality classifyEHPersonality(const Value *Pers);
43
44 StringRef getEHPersonalityName(EHPersonality Pers);
45
46 EHPersonality getDefaultEHPersonality(const Triple &T);
47
48 /// Returns true if this personality function catches asynchronous
49 /// exceptions.
50 inline 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_Win64SEH:
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).
65 inline bool isFuncletEHPersonality(EHPersonality Pers) {
66   switch (Pers) {
67   case EHPersonality::MSVC_CXX:
68   case EHPersonality::MSVC_X86SEH:
69   case EHPersonality::MSVC_Win64SEH:
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.
80 inline bool isScopedEHPersonality(EHPersonality Pers) {
81   switch (Pers) {
82   case EHPersonality::MSVC_CXX:
83   case EHPersonality::MSVC_X86SEH:
84   case EHPersonality::MSVC_Win64SEH:
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.
96 inline 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
107 bool canSimplifyInvokeNoUnwind(const Function *F);
108
109 typedef 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.
115 DenseMap<BasicBlock *, ColorVector> colorEHFunclets(Function &F);
116
117 } // end namespace llvm
118
119 #endif