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