LLVM  16.0.0git
EHPersonalities.h
Go to the documentation of this file.
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 
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,
28  GNU_ObjC,
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.
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.
50  // The two SEH personality functions can catch asynch exceptions. We assume
51  // unknown personalities don't catch asynch exceptions.
52  switch (Pers) {
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).
65  switch (Pers) {
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.
80  switch (Pers) {
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.
96  switch (Pers) {
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 
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.
115 
116 } // end namespace llvm
117 
118 #endif
llvm::EHPersonality::MSVC_CXX
@ MSVC_CXX
llvm::isAsynchronousEHPersonality
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
Definition: EHPersonalities.h:49
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
llvm::EHPersonality::GNU_C_SjLj
@ GNU_C_SjLj
llvm::EHPersonality::GNU_Ada
@ GNU_Ada
llvm::ColorVector
TinyPtrVector< BasicBlock * > ColorVector
Definition: EHPersonalities.h:108
llvm::Function
Definition: Function.h:60
DenseMap.h
llvm::EHPersonality::GNU_ObjC
@ GNU_ObjC
F
#define F(x, y, z)
Definition: MD5.cpp:55
llvm::classifyEHPersonality
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
Definition: EHPersonalities.cpp:22
llvm::EHPersonality::GNU_C
@ GNU_C
llvm::isNoOpWithoutInvoke
bool isNoOpWithoutInvoke(EHPersonality Pers)
Return true if this personality may be safely removed if there are no invoke instructions remaining i...
Definition: EHPersonalities.h:95
llvm::EHPersonality::Wasm_CXX
@ Wasm_CXX
llvm::EHPersonality::GNU_CXX_SjLj
@ GNU_CXX_SjLj
llvm::colorEHFunclets
DenseMap< BasicBlock *, ColorVector > colorEHFunclets(Function &F)
If an EH funclet personality is in use (see isFuncletEHPersonality), this will recompute which blocks...
Definition: EHPersonalities.cpp:85
llvm::canSimplifyInvokeNoUnwind
bool canSimplifyInvokeNoUnwind(const Function *F)
Definition: EHPersonalities.cpp:77
llvm::DenseMap
Definition: DenseMap.h:714
llvm::isScopedEHPersonality
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
Definition: EHPersonalities.h:79
llvm::ISD::BasicBlock
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:71
llvm::getEHPersonalityName
StringRef getEHPersonalityName(EHPersonality Pers)
Definition: EHPersonalities.cpp:47
TinyPtrVector.h
llvm::EHPersonality::CoreCLR
@ CoreCLR
llvm::EHPersonality::MSVC_TableSEH
@ MSVC_TableSEH
llvm::EHPersonality::GNU_CXX
@ GNU_CXX
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition: ErrorHandling.h:143
llvm::EHPersonality::XL_CXX
@ XL_CXX
llvm::getDefaultEHPersonality
EHPersonality getDefaultEHPersonality(const Triple &T)
Definition: EHPersonalities.cpp:70
llvm::EHPersonality
EHPersonality
Definition: EHPersonalities.h:21
llvm::EHPersonality::MSVC_X86SEH
@ MSVC_X86SEH
llvm::EHPersonality::Unknown
@ Unknown
llvm::TargetStackID::Value
Value
Definition: TargetFrameLowering.h:27
llvm::EHPersonality::Rust
@ Rust
llvm::TinyPtrVector
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
Definition: TinyPtrVector.h:30
llvm::codeview::PublicSymFlags::Function
@ Function
llvm::isFuncletEHPersonality
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
Definition: EHPersonalities.h:64