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/Support/ErrorHandling.h" 16 17namespace llvm { 18class BasicBlock; 19class Function; 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_Win64SEH, 32 MSVC_CXX, 33 CoreCLR, 34 Rust 35}; 36 37/// \brief See if the given exception handling personality function is one 38/// that we understand. If so, return a description of it; otherwise return 39/// Unknown. 40EHPersonality classifyEHPersonality(const Value *Pers); 41 42/// \brief Returns true if this personality function catches asynchronous 43/// exceptions. 44inline bool isAsynchronousEHPersonality(EHPersonality Pers) { 45 // The two SEH personality functions can catch asynch exceptions. We assume 46 // unknown personalities don't catch asynch exceptions. 47 switch (Pers) { 48 case EHPersonality::MSVC_X86SEH: 49 case EHPersonality::MSVC_Win64SEH: 50 return true; 51 default: 52 return false; 53 } 54 llvm_unreachable("invalid enum"); 55} 56 57/// \brief Returns true if this is a personality function that invokes 58/// handler funclets (which must return to it). 59inline bool isFuncletEHPersonality(EHPersonality Pers) { 60 switch (Pers) { 61 case EHPersonality::MSVC_CXX: 62 case EHPersonality::MSVC_X86SEH: 63 case EHPersonality::MSVC_Win64SEH: 64 case EHPersonality::CoreCLR: 65 return true; 66 default: 67 return false; 68 } 69 llvm_unreachable("invalid enum"); 70} 71 72/// \brief Return true if this personality may be safely removed if there 73/// are no invoke instructions remaining in the current function. 74inline bool isNoOpWithoutInvoke(EHPersonality Pers) { 75 switch (Pers) { 76 case EHPersonality::Unknown: 77 return false; 78 // All known personalities currently have this behavior 79 default: 80 return true; 81 } 82 llvm_unreachable("invalid enum"); 83} 84 85bool canSimplifyInvokeNoUnwind(const Function *F); 86 87typedef TinyPtrVector<BasicBlock *> ColorVector; 88 89/// \brief If an EH funclet personality is in use (see isFuncletEHPersonality), 90/// this will recompute which blocks are in which funclet. It is possible that 91/// some blocks are in multiple funclets. Consider this analysis to be 92/// expensive. 93DenseMap<BasicBlock *, ColorVector> colorEHFunclets(Function &F); 94 95} // end namespace llvm 96 97#endif 98