Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- EHPersonalities.h - Compute EH-related information -----------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
 
9
#ifndef LLVM_ANALYSIS_EHPERSONALITIES_H
10
#define LLVM_ANALYSIS_EHPERSONALITIES_H
11
 
12
#include "llvm/ADT/DenseMap.h"
13
#include "llvm/ADT/TinyPtrVector.h"
14
 
15
namespace llvm {
16
class BasicBlock;
17
class Function;
18
class Triple;
19
class Value;
20
 
21
enum class EHPersonality {
22
  Unknown,
23
  GNU_Ada,
24
  GNU_C,
25
  GNU_C_SjLj,
26
  GNU_CXX,
27
  GNU_CXX_SjLj,
28
  GNU_ObjC,
29
  MSVC_X86SEH,
30
  MSVC_TableSEH,
31
  MSVC_CXX,
32
  CoreCLR,
33
  Rust,
34
  Wasm_CXX,
35
  XL_CXX
36
};
37
 
38
/// 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.
41
EHPersonality classifyEHPersonality(const Value *Pers);
42
 
43
StringRef getEHPersonalityName(EHPersonality Pers);
44
 
45
EHPersonality getDefaultEHPersonality(const Triple &T);
46
 
47
/// Returns true if this personality function catches asynchronous
48
/// exceptions.
49
inline 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_TableSEH:
55
    return true;
56
  default:
57
    return false;
58
  }
59
  llvm_unreachable("invalid enum");
60
}
61
 
62
/// Returns true if this is a personality function that invokes
63
/// handler funclets (which must return to it).
64
inline bool isFuncletEHPersonality(EHPersonality Pers) {
65
  switch (Pers) {
66
  case EHPersonality::MSVC_CXX:
67
  case EHPersonality::MSVC_X86SEH:
68
  case EHPersonality::MSVC_TableSEH:
69
  case EHPersonality::CoreCLR:
70
    return true;
71
  default:
72
    return false;
73
  }
74
  llvm_unreachable("invalid enum");
75
}
76
 
77
/// Returns true if this personality uses scope-style EH IR instructions:
78
/// catchswitch, catchpad/ret, and cleanuppad/ret.
79
inline bool isScopedEHPersonality(EHPersonality Pers) {
80
  switch (Pers) {
81
  case EHPersonality::MSVC_CXX:
82
  case EHPersonality::MSVC_X86SEH:
83
  case EHPersonality::MSVC_TableSEH:
84
  case EHPersonality::CoreCLR:
85
  case EHPersonality::Wasm_CXX:
86
    return true;
87
  default:
88
    return false;
89
  }
90
  llvm_unreachable("invalid enum");
91
}
92
 
93
/// Return true if this personality may be safely removed if there
94
/// are no invoke instructions remaining in the current function.
95
inline bool isNoOpWithoutInvoke(EHPersonality Pers) {
96
  switch (Pers) {
97
  case EHPersonality::Unknown:
98
    return false;
99
  // All known personalities currently have this behavior
100
  default:
101
    return true;
102
  }
103
  llvm_unreachable("invalid enum");
104
}
105
 
106
bool canSimplifyInvokeNoUnwind(const Function *F);
107
 
108
typedef TinyPtrVector<BasicBlock *> ColorVector;
109
 
110
/// If an EH funclet personality is in use (see isFuncletEHPersonality),
111
/// this will recompute which blocks are in which funclet. It is possible that
112
/// some blocks are in multiple funclets. Consider this analysis to be
113
/// expensive.
114
DenseMap<BasicBlock *, ColorVector> colorEHFunclets(Function &F);
115
 
116
} // end namespace llvm
117
 
118
#endif