blob: eed91e70aaa6be025f9bf42bf7a719e7855e1e8e [file] [log] [blame]
Dan Gohman4fc4e422016-10-24 19:49:43 +00001//===-- WebAssemblyUtilities.cpp - WebAssembly Utility Functions ----------===//
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/// \file
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000011/// This file implements several utility functions for WebAssembly.
Dan Gohman4fc4e422016-10-24 19:49:43 +000012///
13//===----------------------------------------------------------------------===//
14
15#include "WebAssemblyUtilities.h"
16#include "WebAssemblyMachineFunctionInfo.h"
17#include "llvm/CodeGen/MachineInstr.h"
Dan Gohmanf52ee172017-02-27 22:38:58 +000018#include "llvm/CodeGen/MachineLoopInfo.h"
Dan Gohman4fc4e422016-10-24 19:49:43 +000019using namespace llvm;
20
Heejin Ahn817811ca2018-06-19 00:32:03 +000021const char *const WebAssembly::ClangCallTerminateFn = "__clang_call_terminate";
22const char *const WebAssembly::CxaBeginCatchFn = "__cxa_begin_catch";
23const char *const WebAssembly::CxaRethrowFn = "__cxa_rethrow";
24const char *const WebAssembly::StdTerminateFn = "_ZSt9terminatev";
25const char *const WebAssembly::PersonalityWrapperFn =
26 "_Unwind_Wasm_CallPersonality";
27
Dan Gohman4fc4e422016-10-24 19:49:43 +000028bool WebAssembly::isArgument(const MachineInstr &MI) {
29 switch (MI.getOpcode()) {
30 case WebAssembly::ARGUMENT_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000031 case WebAssembly::ARGUMENT_I32_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000032 case WebAssembly::ARGUMENT_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000033 case WebAssembly::ARGUMENT_I64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000034 case WebAssembly::ARGUMENT_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000035 case WebAssembly::ARGUMENT_F32_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000036 case WebAssembly::ARGUMENT_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000037 case WebAssembly::ARGUMENT_F64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000038 case WebAssembly::ARGUMENT_v16i8:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000039 case WebAssembly::ARGUMENT_v16i8_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000040 case WebAssembly::ARGUMENT_v8i16:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000041 case WebAssembly::ARGUMENT_v8i16_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000042 case WebAssembly::ARGUMENT_v4i32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000043 case WebAssembly::ARGUMENT_v4i32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +000044 case WebAssembly::ARGUMENT_v2i64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000045 case WebAssembly::ARGUMENT_v2i64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000046 case WebAssembly::ARGUMENT_v4f32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000047 case WebAssembly::ARGUMENT_v4f32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +000048 case WebAssembly::ARGUMENT_v2f64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000049 case WebAssembly::ARGUMENT_v2f64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000050 return true;
51 default:
52 return false;
53 }
54}
55
56bool WebAssembly::isCopy(const MachineInstr &MI) {
57 switch (MI.getOpcode()) {
58 case WebAssembly::COPY_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000059 case WebAssembly::COPY_I32_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000060 case WebAssembly::COPY_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000061 case WebAssembly::COPY_I64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000062 case WebAssembly::COPY_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000063 case WebAssembly::COPY_F32_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000064 case WebAssembly::COPY_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000065 case WebAssembly::COPY_F64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000066 return true;
67 default:
68 return false;
69 }
70}
71
72bool WebAssembly::isTee(const MachineInstr &MI) {
73 switch (MI.getOpcode()) {
74 case WebAssembly::TEE_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000075 case WebAssembly::TEE_I32_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000076 case WebAssembly::TEE_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000077 case WebAssembly::TEE_I64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000078 case WebAssembly::TEE_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000079 case WebAssembly::TEE_F32_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000080 case WebAssembly::TEE_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000081 case WebAssembly::TEE_F64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000082 return true;
83 default:
84 return false;
85 }
86}
87
88/// Test whether MI is a child of some other node in an expression tree.
89bool WebAssembly::isChild(const MachineInstr &MI,
90 const WebAssemblyFunctionInfo &MFI) {
91 if (MI.getNumOperands() == 0)
92 return false;
93 const MachineOperand &MO = MI.getOperand(0);
94 if (!MO.isReg() || MO.isImplicit() || !MO.isDef())
95 return false;
96 unsigned Reg = MO.getReg();
97 return TargetRegisterInfo::isVirtualRegister(Reg) &&
98 MFI.isVRegStackified(Reg);
99}
Dan Gohmand934cb82017-02-24 23:18:00 +0000100
Heejin Ahn817811ca2018-06-19 00:32:03 +0000101bool WebAssembly::isCallDirect(const MachineInstr &MI) {
102 switch (MI.getOpcode()) {
103 case WebAssembly::CALL_VOID:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000104 case WebAssembly::CALL_VOID_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000105 case WebAssembly::CALL_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000106 case WebAssembly::CALL_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000107 case WebAssembly::CALL_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000108 case WebAssembly::CALL_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000109 case WebAssembly::CALL_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000110 case WebAssembly::CALL_F32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000111 case WebAssembly::CALL_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000112 case WebAssembly::CALL_F64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000113 case WebAssembly::CALL_v16i8:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000114 case WebAssembly::CALL_v16i8_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000115 case WebAssembly::CALL_v8i16:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000116 case WebAssembly::CALL_v8i16_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000117 case WebAssembly::CALL_v4i32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000118 case WebAssembly::CALL_v4i32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +0000119 case WebAssembly::CALL_v2i64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000120 case WebAssembly::CALL_v2i64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000121 case WebAssembly::CALL_v4f32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000122 case WebAssembly::CALL_v4f32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +0000123 case WebAssembly::CALL_v2f64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000124 case WebAssembly::CALL_v2f64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000125 case WebAssembly::CALL_EXCEPT_REF:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000126 case WebAssembly::CALL_EXCEPT_REF_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000127 return true;
128 default:
129 return false;
130 }
131}
132
Dan Gohmand934cb82017-02-24 23:18:00 +0000133bool WebAssembly::isCallIndirect(const MachineInstr &MI) {
134 switch (MI.getOpcode()) {
135 case WebAssembly::CALL_INDIRECT_VOID:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000136 case WebAssembly::CALL_INDIRECT_VOID_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000137 case WebAssembly::CALL_INDIRECT_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000138 case WebAssembly::CALL_INDIRECT_I32_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000139 case WebAssembly::CALL_INDIRECT_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000140 case WebAssembly::CALL_INDIRECT_I64_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000141 case WebAssembly::CALL_INDIRECT_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000142 case WebAssembly::CALL_INDIRECT_F32_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000143 case WebAssembly::CALL_INDIRECT_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000144 case WebAssembly::CALL_INDIRECT_F64_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000145 case WebAssembly::CALL_INDIRECT_v16i8:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000146 case WebAssembly::CALL_INDIRECT_v16i8_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000147 case WebAssembly::CALL_INDIRECT_v8i16:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000148 case WebAssembly::CALL_INDIRECT_v8i16_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000149 case WebAssembly::CALL_INDIRECT_v4i32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000150 case WebAssembly::CALL_INDIRECT_v4i32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +0000151 case WebAssembly::CALL_INDIRECT_v2i64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000152 case WebAssembly::CALL_INDIRECT_v2i64_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000153 case WebAssembly::CALL_INDIRECT_v4f32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000154 case WebAssembly::CALL_INDIRECT_v4f32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +0000155 case WebAssembly::CALL_INDIRECT_v2f64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000156 case WebAssembly::CALL_INDIRECT_v2f64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000157 case WebAssembly::CALL_INDIRECT_EXCEPT_REF:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000158 case WebAssembly::CALL_INDIRECT_EXCEPT_REF_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000159 return true;
160 default:
161 return false;
162 }
163}
Dan Gohmanf52ee172017-02-27 22:38:58 +0000164
Heejin Ahn817811ca2018-06-19 00:32:03 +0000165unsigned WebAssembly::getCalleeOpNo(const MachineInstr &MI) {
166 switch (MI.getOpcode()) {
167 case WebAssembly::CALL_VOID:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000168 case WebAssembly::CALL_VOID_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000169 case WebAssembly::CALL_INDIRECT_VOID:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000170 case WebAssembly::CALL_INDIRECT_VOID_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000171 return 0;
172 case WebAssembly::CALL_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000173 case WebAssembly::CALL_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000174 case WebAssembly::CALL_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000175 case WebAssembly::CALL_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000176 case WebAssembly::CALL_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000177 case WebAssembly::CALL_F32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000178 case WebAssembly::CALL_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000179 case WebAssembly::CALL_F64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000180 case WebAssembly::CALL_EXCEPT_REF:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000181 case WebAssembly::CALL_EXCEPT_REF_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000182 case WebAssembly::CALL_INDIRECT_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000183 case WebAssembly::CALL_INDIRECT_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000184 case WebAssembly::CALL_INDIRECT_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000185 case WebAssembly::CALL_INDIRECT_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000186 case WebAssembly::CALL_INDIRECT_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000187 case WebAssembly::CALL_INDIRECT_F32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000188 case WebAssembly::CALL_INDIRECT_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000189 case WebAssembly::CALL_INDIRECT_F64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000190 case WebAssembly::CALL_INDIRECT_EXCEPT_REF:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000191 case WebAssembly::CALL_INDIRECT_EXCEPT_REF_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000192 return 1;
193 default:
194 llvm_unreachable("Not a call instruction");
195 }
196}
197
198bool WebAssembly::isMarker(const MachineInstr &MI) {
199 switch (MI.getOpcode()) {
200 case WebAssembly::BLOCK:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000201 case WebAssembly::BLOCK_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000202 case WebAssembly::END_BLOCK:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000203 case WebAssembly::END_BLOCK_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000204 case WebAssembly::LOOP:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000205 case WebAssembly::LOOP_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000206 case WebAssembly::END_LOOP:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000207 case WebAssembly::END_LOOP_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000208 case WebAssembly::TRY:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000209 case WebAssembly::TRY_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000210 case WebAssembly::END_TRY:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000211 case WebAssembly::END_TRY_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000212 return true;
213 default:
214 return false;
215 }
216}
217
218bool WebAssembly::isThrow(const MachineInstr &MI) {
219 switch (MI.getOpcode()) {
220 case WebAssembly::THROW_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000221 case WebAssembly::THROW_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000222 case WebAssembly::THROW_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000223 case WebAssembly::THROW_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000224 return true;
225 default:
226 return false;
227 }
228}
229
230bool WebAssembly::isRethrow(const MachineInstr &MI) {
231 switch (MI.getOpcode()) {
232 case WebAssembly::RETHROW:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000233 case WebAssembly::RETHROW_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000234 case WebAssembly::RETHROW_TO_CALLER:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000235 case WebAssembly::RETHROW_TO_CALLER_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000236 return true;
237 default:
238 return false;
239 }
240}
241
242bool WebAssembly::isCatch(const MachineInstr &MI) {
243 switch (MI.getOpcode()) {
244 case WebAssembly::CATCH_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000245 case WebAssembly::CATCH_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000246 case WebAssembly::CATCH_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000247 case WebAssembly::CATCH_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000248 case WebAssembly::CATCH_ALL:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000249 case WebAssembly::CATCH_ALL_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000250 return true;
251 default:
252 return false;
253 }
254}
255
256bool WebAssembly::mayThrow(const MachineInstr &MI) {
257 switch (MI.getOpcode()) {
258 case WebAssembly::THROW_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000259 case WebAssembly::THROW_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000260 case WebAssembly::THROW_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000261 case WebAssembly::THROW_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000262 case WebAssembly::RETHROW:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000263 case WebAssembly::RETHROW_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000264 return true;
265 }
266 if (isCallIndirect(MI))
267 return true;
268 if (!MI.isCall())
269 return false;
270
271 const MachineOperand &MO = MI.getOperand(getCalleeOpNo(MI));
272 assert(MO.isGlobal());
273 const auto *F = dyn_cast<Function>(MO.getGlobal());
274 if (!F)
275 return true;
276 if (F->doesNotThrow())
277 return false;
278 // These functions never throw
279 if (F->getName() == CxaBeginCatchFn || F->getName() == PersonalityWrapperFn ||
280 F->getName() == ClangCallTerminateFn || F->getName() == StdTerminateFn)
281 return false;
282 return true;
283}
284
285bool WebAssembly::isCatchTerminatePad(const MachineBasicBlock &MBB) {
286 if (!MBB.isEHPad())
287 return false;
288 bool SeenCatch = false;
289 for (auto &MI : MBB) {
290 if (MI.getOpcode() == WebAssembly::CATCH_I32 ||
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000291 MI.getOpcode() == WebAssembly::CATCH_I64 ||
292 MI.getOpcode() == WebAssembly::CATCH_I32_S ||
293 MI.getOpcode() == WebAssembly::CATCH_I64_S)
Heejin Ahn817811ca2018-06-19 00:32:03 +0000294 SeenCatch = true;
295 if (SeenCatch && MI.isCall()) {
296 const MachineOperand &CalleeOp = MI.getOperand(getCalleeOpNo(MI));
297 if (CalleeOp.isGlobal() &&
298 CalleeOp.getGlobal()->getName() == ClangCallTerminateFn)
299 return true;
300 }
301 }
302 return false;
303}
304
305bool WebAssembly::isCatchAllTerminatePad(const MachineBasicBlock &MBB) {
306 if (!MBB.isEHPad())
307 return false;
308 bool SeenCatchAll = false;
309 for (auto &MI : MBB) {
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000310 if (MI.getOpcode() == WebAssembly::CATCH_ALL ||
311 MI.getOpcode() == WebAssembly::CATCH_ALL_S)
Heejin Ahn817811ca2018-06-19 00:32:03 +0000312 SeenCatchAll = true;
313 if (SeenCatchAll && MI.isCall()) {
314 const MachineOperand &CalleeOp = MI.getOperand(getCalleeOpNo(MI));
315 if (CalleeOp.isGlobal() &&
316 CalleeOp.getGlobal()->getName() == StdTerminateFn)
317 return true;
318 }
319 }
320 return false;
Dan Gohmanf52ee172017-02-27 22:38:58 +0000321}