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