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