EHPersonalities.h revision 314564
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/ADT/Triple.h" 16#include "llvm/Support/ErrorHandling.h" 17 18namespace llvm { 19class BasicBlock; 20class Function; 21class Value; 22 23enum class EHPersonality { 24 Unknown, 25 GNU_Ada, 26 GNU_C, 27 GNU_C_SjLj, 28 GNU_CXX, 29 GNU_CXX_SjLj, 30 GNU_ObjC, 31 MSVC_X86SEH, 32 MSVC_Win64SEH, 33 MSVC_CXX, 34 CoreCLR, 35 Rust 36}; 37 38/// \brief 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. 41EHPersonality classifyEHPersonality(const Value *Pers); 42 43StringRef getEHPersonalityName(EHPersonality Pers); 44 45EHPersonality getDefaultEHPersonality(const Triple &T); 46 47/// \brief Returns true if this personality function catches asynchronous 48/// exceptions. 49inline 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_Win64SEH: 55 return true; 56 default: 57 return false; 58 } 59 llvm_unreachable("invalid enum"); 60} 61 62/// \brief Returns true if this is a personality function that invokes 63/// handler funclets (which must return to it). 64inline bool isFuncletEHPersonality(EHPersonality Pers) { 65 switch (Pers) { 66 case EHPersonality::MSVC_CXX: 67 case EHPersonality::MSVC_X86SEH: 68 case EHPersonality::MSVC_Win64SEH: 69 case EHPersonality::CoreCLR: 70 return true; 71 default: 72 return false; 73 } 74 llvm_unreachable("invalid enum"); 75} 76 77/// \brief Return true if this personality may be safely removed if there 78/// are no invoke instructions remaining in the current function. 79inline bool isNoOpWithoutInvoke(EHPersonality Pers) { 80 switch (Pers) { 81 case EHPersonality::Unknown: 82 return false; 83 // All known personalities currently have this behavior 84 default: 85 return true; 86 } 87 llvm_unreachable("invalid enum"); 88} 89 90bool canSimplifyInvokeNoUnwind(const Function *F); 91 92typedef TinyPtrVector<BasicBlock *> ColorVector; 93 94/// \brief If an EH funclet personality is in use (see isFuncletEHPersonality), 95/// this will recompute which blocks are in which funclet. It is possible that 96/// some blocks are in multiple funclets. Consider this analysis to be 97/// expensive. 98DenseMap<BasicBlock *, ColorVector> colorEHFunclets(Function &F); 99 100} // end namespace llvm 101 102#endif 103