blob: a25ec7cf4c2af9f3ffc9b71214149ad451f00689 [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:
Thomas Livelyabf6bdc2018-08-30 22:10:43 +000066 case WebAssembly::COPY_V128:
67 case WebAssembly::COPY_V128_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000068 return true;
69 default:
70 return false;
71 }
72}
73
74bool WebAssembly::isTee(const MachineInstr &MI) {
75 switch (MI.getOpcode()) {
76 case WebAssembly::TEE_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000077 case WebAssembly::TEE_I32_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000078 case WebAssembly::TEE_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000079 case WebAssembly::TEE_I64_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000080 case WebAssembly::TEE_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000081 case WebAssembly::TEE_F32_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000082 case WebAssembly::TEE_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +000083 case WebAssembly::TEE_F64_S:
Thomas Livelyabf6bdc2018-08-30 22:10:43 +000084 case WebAssembly::TEE_V128:
85 case WebAssembly::TEE_V128_S:
Dan Gohman4fc4e422016-10-24 19:49:43 +000086 return true;
87 default:
88 return false;
89 }
90}
91
92/// Test whether MI is a child of some other node in an expression tree.
93bool WebAssembly::isChild(const MachineInstr &MI,
94 const WebAssemblyFunctionInfo &MFI) {
95 if (MI.getNumOperands() == 0)
96 return false;
97 const MachineOperand &MO = MI.getOperand(0);
98 if (!MO.isReg() || MO.isImplicit() || !MO.isDef())
99 return false;
100 unsigned Reg = MO.getReg();
101 return TargetRegisterInfo::isVirtualRegister(Reg) &&
102 MFI.isVRegStackified(Reg);
103}
Dan Gohmand934cb82017-02-24 23:18:00 +0000104
Heejin Ahn817811ca2018-06-19 00:32:03 +0000105bool WebAssembly::isCallDirect(const MachineInstr &MI) {
106 switch (MI.getOpcode()) {
107 case WebAssembly::CALL_VOID:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000108 case WebAssembly::CALL_VOID_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000109 case WebAssembly::CALL_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000110 case WebAssembly::CALL_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000111 case WebAssembly::CALL_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000112 case WebAssembly::CALL_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000113 case WebAssembly::CALL_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000114 case WebAssembly::CALL_F32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000115 case WebAssembly::CALL_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000116 case WebAssembly::CALL_F64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000117 case WebAssembly::CALL_v16i8:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000118 case WebAssembly::CALL_v16i8_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000119 case WebAssembly::CALL_v8i16:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000120 case WebAssembly::CALL_v8i16_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000121 case WebAssembly::CALL_v4i32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000122 case WebAssembly::CALL_v4i32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +0000123 case WebAssembly::CALL_v2i64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000124 case WebAssembly::CALL_v2i64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000125 case WebAssembly::CALL_v4f32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000126 case WebAssembly::CALL_v4f32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +0000127 case WebAssembly::CALL_v2f64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000128 case WebAssembly::CALL_v2f64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000129 case WebAssembly::CALL_EXCEPT_REF:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000130 case WebAssembly::CALL_EXCEPT_REF_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000131 return true;
132 default:
133 return false;
134 }
135}
136
Dan Gohmand934cb82017-02-24 23:18:00 +0000137bool WebAssembly::isCallIndirect(const MachineInstr &MI) {
138 switch (MI.getOpcode()) {
139 case WebAssembly::CALL_INDIRECT_VOID:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000140 case WebAssembly::CALL_INDIRECT_VOID_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000141 case WebAssembly::CALL_INDIRECT_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000142 case WebAssembly::CALL_INDIRECT_I32_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000143 case WebAssembly::CALL_INDIRECT_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000144 case WebAssembly::CALL_INDIRECT_I64_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000145 case WebAssembly::CALL_INDIRECT_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000146 case WebAssembly::CALL_INDIRECT_F32_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000147 case WebAssembly::CALL_INDIRECT_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000148 case WebAssembly::CALL_INDIRECT_F64_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000149 case WebAssembly::CALL_INDIRECT_v16i8:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000150 case WebAssembly::CALL_INDIRECT_v16i8_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000151 case WebAssembly::CALL_INDIRECT_v8i16:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000152 case WebAssembly::CALL_INDIRECT_v8i16_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000153 case WebAssembly::CALL_INDIRECT_v4i32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000154 case WebAssembly::CALL_INDIRECT_v4i32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +0000155 case WebAssembly::CALL_INDIRECT_v2i64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000156 case WebAssembly::CALL_INDIRECT_v2i64_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000157 case WebAssembly::CALL_INDIRECT_v4f32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000158 case WebAssembly::CALL_INDIRECT_v4f32_S:
Derek Schuff51ed1312018-08-07 21:24:01 +0000159 case WebAssembly::CALL_INDIRECT_v2f64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000160 case WebAssembly::CALL_INDIRECT_v2f64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000161 case WebAssembly::CALL_INDIRECT_EXCEPT_REF:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000162 case WebAssembly::CALL_INDIRECT_EXCEPT_REF_S:
Dan Gohmand934cb82017-02-24 23:18:00 +0000163 return true;
164 default:
165 return false;
166 }
167}
Dan Gohmanf52ee172017-02-27 22:38:58 +0000168
Heejin Ahn817811ca2018-06-19 00:32:03 +0000169unsigned WebAssembly::getCalleeOpNo(const MachineInstr &MI) {
170 switch (MI.getOpcode()) {
171 case WebAssembly::CALL_VOID:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000172 case WebAssembly::CALL_VOID_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000173 case WebAssembly::CALL_INDIRECT_VOID:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000174 case WebAssembly::CALL_INDIRECT_VOID_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000175 return 0;
176 case WebAssembly::CALL_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000177 case WebAssembly::CALL_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000178 case WebAssembly::CALL_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000179 case WebAssembly::CALL_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000180 case WebAssembly::CALL_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000181 case WebAssembly::CALL_F32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000182 case WebAssembly::CALL_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000183 case WebAssembly::CALL_F64_S:
Thomas Livelyabf6bdc2018-08-30 22:10:43 +0000184 case WebAssembly::CALL_v16i8:
185 case WebAssembly::CALL_v16i8_S:
186 case WebAssembly::CALL_v8i16:
187 case WebAssembly::CALL_v8i16_S:
188 case WebAssembly::CALL_v4i32:
189 case WebAssembly::CALL_v4i32_S:
190 case WebAssembly::CALL_v2i64:
191 case WebAssembly::CALL_v2i64_S:
192 case WebAssembly::CALL_v4f32:
193 case WebAssembly::CALL_v4f32_S:
194 case WebAssembly::CALL_v2f64:
195 case WebAssembly::CALL_v2f64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000196 case WebAssembly::CALL_EXCEPT_REF:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000197 case WebAssembly::CALL_EXCEPT_REF_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000198 case WebAssembly::CALL_INDIRECT_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000199 case WebAssembly::CALL_INDIRECT_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000200 case WebAssembly::CALL_INDIRECT_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000201 case WebAssembly::CALL_INDIRECT_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000202 case WebAssembly::CALL_INDIRECT_F32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000203 case WebAssembly::CALL_INDIRECT_F32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000204 case WebAssembly::CALL_INDIRECT_F64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000205 case WebAssembly::CALL_INDIRECT_F64_S:
Thomas Livelyabf6bdc2018-08-30 22:10:43 +0000206 case WebAssembly::CALL_INDIRECT_v16i8:
207 case WebAssembly::CALL_INDIRECT_v16i8_S:
208 case WebAssembly::CALL_INDIRECT_v8i16:
209 case WebAssembly::CALL_INDIRECT_v8i16_S:
210 case WebAssembly::CALL_INDIRECT_v4i32:
211 case WebAssembly::CALL_INDIRECT_v4i32_S:
212 case WebAssembly::CALL_INDIRECT_v2i64:
213 case WebAssembly::CALL_INDIRECT_v2i64_S:
214 case WebAssembly::CALL_INDIRECT_v4f32:
215 case WebAssembly::CALL_INDIRECT_v4f32_S:
216 case WebAssembly::CALL_INDIRECT_v2f64:
217 case WebAssembly::CALL_INDIRECT_v2f64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000218 case WebAssembly::CALL_INDIRECT_EXCEPT_REF:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000219 case WebAssembly::CALL_INDIRECT_EXCEPT_REF_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000220 return 1;
221 default:
222 llvm_unreachable("Not a call instruction");
223 }
224}
225
226bool WebAssembly::isMarker(const MachineInstr &MI) {
227 switch (MI.getOpcode()) {
228 case WebAssembly::BLOCK:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000229 case WebAssembly::BLOCK_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000230 case WebAssembly::END_BLOCK:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000231 case WebAssembly::END_BLOCK_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000232 case WebAssembly::LOOP:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000233 case WebAssembly::LOOP_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000234 case WebAssembly::END_LOOP:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000235 case WebAssembly::END_LOOP_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000236 case WebAssembly::TRY:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000237 case WebAssembly::TRY_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000238 case WebAssembly::END_TRY:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000239 case WebAssembly::END_TRY_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000240 return true;
241 default:
242 return false;
243 }
244}
245
246bool WebAssembly::isThrow(const MachineInstr &MI) {
247 switch (MI.getOpcode()) {
248 case WebAssembly::THROW_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000249 case WebAssembly::THROW_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000250 case WebAssembly::THROW_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000251 case WebAssembly::THROW_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000252 return true;
253 default:
254 return false;
255 }
256}
257
258bool WebAssembly::isRethrow(const MachineInstr &MI) {
259 switch (MI.getOpcode()) {
260 case WebAssembly::RETHROW:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000261 case WebAssembly::RETHROW_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000262 case WebAssembly::RETHROW_TO_CALLER:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000263 case WebAssembly::RETHROW_TO_CALLER_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000264 return true;
265 default:
266 return false;
267 }
268}
269
270bool WebAssembly::isCatch(const MachineInstr &MI) {
271 switch (MI.getOpcode()) {
272 case WebAssembly::CATCH_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000273 case WebAssembly::CATCH_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000274 case WebAssembly::CATCH_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000275 case WebAssembly::CATCH_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000276 case WebAssembly::CATCH_ALL:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000277 case WebAssembly::CATCH_ALL_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000278 return true;
279 default:
280 return false;
281 }
282}
283
284bool WebAssembly::mayThrow(const MachineInstr &MI) {
285 switch (MI.getOpcode()) {
286 case WebAssembly::THROW_I32:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000287 case WebAssembly::THROW_I32_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000288 case WebAssembly::THROW_I64:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000289 case WebAssembly::THROW_I64_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000290 case WebAssembly::RETHROW:
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000291 case WebAssembly::RETHROW_S:
Heejin Ahn817811ca2018-06-19 00:32:03 +0000292 return true;
293 }
294 if (isCallIndirect(MI))
295 return true;
296 if (!MI.isCall())
297 return false;
298
299 const MachineOperand &MO = MI.getOperand(getCalleeOpNo(MI));
300 assert(MO.isGlobal());
301 const auto *F = dyn_cast<Function>(MO.getGlobal());
302 if (!F)
303 return true;
304 if (F->doesNotThrow())
305 return false;
306 // These functions never throw
307 if (F->getName() == CxaBeginCatchFn || F->getName() == PersonalityWrapperFn ||
308 F->getName() == ClangCallTerminateFn || F->getName() == StdTerminateFn)
309 return false;
310 return true;
311}
312
313bool WebAssembly::isCatchTerminatePad(const MachineBasicBlock &MBB) {
314 if (!MBB.isEHPad())
315 return false;
316 bool SeenCatch = false;
317 for (auto &MI : MBB) {
318 if (MI.getOpcode() == WebAssembly::CATCH_I32 ||
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000319 MI.getOpcode() == WebAssembly::CATCH_I64 ||
320 MI.getOpcode() == WebAssembly::CATCH_I32_S ||
321 MI.getOpcode() == WebAssembly::CATCH_I64_S)
Heejin Ahn817811ca2018-06-19 00:32:03 +0000322 SeenCatch = true;
323 if (SeenCatch && MI.isCall()) {
324 const MachineOperand &CalleeOp = MI.getOperand(getCalleeOpNo(MI));
325 if (CalleeOp.isGlobal() &&
326 CalleeOp.getGlobal()->getName() == ClangCallTerminateFn)
327 return true;
328 }
329 }
330 return false;
331}
332
333bool WebAssembly::isCatchAllTerminatePad(const MachineBasicBlock &MBB) {
334 if (!MBB.isEHPad())
335 return false;
336 bool SeenCatchAll = false;
337 for (auto &MI : MBB) {
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +0000338 if (MI.getOpcode() == WebAssembly::CATCH_ALL ||
339 MI.getOpcode() == WebAssembly::CATCH_ALL_S)
Heejin Ahn817811ca2018-06-19 00:32:03 +0000340 SeenCatchAll = true;
341 if (SeenCatchAll && MI.isCall()) {
342 const MachineOperand &CalleeOp = MI.getOperand(getCalleeOpNo(MI));
343 if (CalleeOp.isGlobal() &&
344 CalleeOp.getGlobal()->getName() == StdTerminateFn)
345 return true;
346 }
347 }
348 return false;
Dan Gohmanf52ee172017-02-27 22:38:58 +0000349}