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