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 ZOS_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_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). 65 inline 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. 80 inline 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. 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 // LLVM_IR_EHPERSONALITIES_H 120