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#include "llvm/Support/ErrorHandling.h" 15 16namespace llvm { 17class BasicBlock; 18class Function; 19class Triple; 20class Value; 21 22enum class EHPersonality { 23 Unknown, 24 GNU_Ada, 25 GNU_C, 26 GNU_C_SjLj, 27 GNU_CXX, 28 GNU_CXX_SjLj, 29 GNU_ObjC, 30 MSVC_X86SEH, 31 MSVC_TableSEH, 32 MSVC_CXX, 33 CoreCLR, 34 Rust, 35 Wasm_CXX, 36 XL_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. 42EHPersonality classifyEHPersonality(const Value *Pers); 43 44StringRef getEHPersonalityName(EHPersonality Pers); 45 46EHPersonality getDefaultEHPersonality(const Triple &T); 47 48/// Returns true if this personality function catches asynchronous 49/// exceptions. 50inline 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). 65inline 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. 80inline 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. 96inline 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 107bool canSimplifyInvokeNoUnwind(const Function *F); 108 109typedef 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. 115DenseMap<BasicBlock *, ColorVector> colorEHFunclets(Function &F); 116 117} // end namespace llvm 118 119#endif 120