1b1994897Sopenharmony_ci/* 2b1994897Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3b1994897Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4b1994897Sopenharmony_ci * you may not use this file except in compliance with the License. 5b1994897Sopenharmony_ci * You may obtain a copy of the License at 6b1994897Sopenharmony_ci * 7b1994897Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8b1994897Sopenharmony_ci * 9b1994897Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10b1994897Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11b1994897Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b1994897Sopenharmony_ci * See the License for the specific language governing permissions and 13b1994897Sopenharmony_ci * limitations under the License. 14b1994897Sopenharmony_ci */ 15b1994897Sopenharmony_ci 16b1994897Sopenharmony_ci#include <gtest/gtest.h> 17b1994897Sopenharmony_ci 18b1994897Sopenharmony_ci#include "assembly-parser.h" 19b1994897Sopenharmony_ci#include "bytecode_optimizer/ir_interface.h" 20b1994897Sopenharmony_ci#include "bytecode_optimizer/runtime_adapter.h" 21b1994897Sopenharmony_ci#include "libpandabase/mem/arena_allocator.h" 22b1994897Sopenharmony_ci#include "libpandabase/mem/pool_manager.h" 23b1994897Sopenharmony_ci#include "libpandafile/class_data_accessor.h" 24b1994897Sopenharmony_ci#include "libpandafile/class_data_accessor-inl.h" 25b1994897Sopenharmony_ci#include "libpandafile/method_data_accessor.h" 26b1994897Sopenharmony_ci#include "libpandafile/file.h" 27b1994897Sopenharmony_ci#include "macros.h" 28b1994897Sopenharmony_ci#include "optimizer/ir/graph.h" 29b1994897Sopenharmony_ci#include "optimizer/ir/inst.h" 30b1994897Sopenharmony_ci#include "optimizer/ir/runtime_interface.h" 31b1994897Sopenharmony_ci#include "optimizer/ir_builder/ir_builder.h" 32b1994897Sopenharmony_ci 33b1994897Sopenharmony_cinamespace panda::compiler { 34b1994897Sopenharmony_ciclass IrBuilderTest : public testing::Test { 35b1994897Sopenharmony_cipublic: 36b1994897Sopenharmony_ci static void SetUpTestCase(void) {}; 37b1994897Sopenharmony_ci static void TearDownTestCase(void) {}; 38b1994897Sopenharmony_ci void SetUp() {}; 39b1994897Sopenharmony_ci void TearDown() {}; 40b1994897Sopenharmony_ci 41b1994897Sopenharmony_ci IrBuilderTest() 42b1994897Sopenharmony_ci { 43b1994897Sopenharmony_ci PoolManager::Initialize(PoolType::MALLOC); 44b1994897Sopenharmony_ci } 45b1994897Sopenharmony_ci 46b1994897Sopenharmony_ci ~IrBuilderTest() 47b1994897Sopenharmony_ci { 48b1994897Sopenharmony_ci PoolManager::Finalize(); 49b1994897Sopenharmony_ci } 50b1994897Sopenharmony_ci 51b1994897Sopenharmony_ci template <class Callback> 52b1994897Sopenharmony_ci void TestBuildGraphFromFunc(pandasm::Program &prog, const char *methodName, const Callback &cb) 53b1994897Sopenharmony_ci { 54b1994897Sopenharmony_ci pandasm::AsmEmitter::PandaFileToPandaAsmMaps maps {}; 55b1994897Sopenharmony_ci auto pfile = pandasm::AsmEmitter::Emit(prog, &maps); 56b1994897Sopenharmony_ci for (uint32_t id : pfile->GetClasses()) { 57b1994897Sopenharmony_ci panda_file::File::EntityId record_id {id}; 58b1994897Sopenharmony_ci panda_file::ClassDataAccessor cda {*pfile, record_id}; 59b1994897Sopenharmony_ci 60b1994897Sopenharmony_ci cda.EnumerateMethods([&prog, maps, methodName, &cb](panda_file::MethodDataAccessor &mda) { 61b1994897Sopenharmony_ci auto ir_interface = panda::bytecodeopt::BytecodeOptIrInterface(&maps, &prog); 62b1994897Sopenharmony_ci auto func_name = ir_interface.GetMethodIdByOffset(mda.GetMethodId().GetOffset()); 63b1994897Sopenharmony_ci if (func_name != methodName) { 64b1994897Sopenharmony_ci return; 65b1994897Sopenharmony_ci } 66b1994897Sopenharmony_ci 67b1994897Sopenharmony_ci ArenaAllocator allocator {SpaceType::SPACE_TYPE_COMPILER}; 68b1994897Sopenharmony_ci ArenaAllocator local_allocator {SpaceType::SPACE_TYPE_COMPILER, nullptr, true}; 69b1994897Sopenharmony_ci 70b1994897Sopenharmony_ci auto method_ptr = reinterpret_cast<compiler::RuntimeInterface::MethodPtr>( 71b1994897Sopenharmony_ci mda.GetMethodId().GetOffset()); 72b1994897Sopenharmony_ci panda::BytecodeOptimizerRuntimeAdapter adapter(mda.GetPandaFile()); 73b1994897Sopenharmony_ci auto *graph = allocator.New<Graph>(&allocator, &local_allocator, Arch::NONE, method_ptr, &adapter, 74b1994897Sopenharmony_ci false, nullptr, true, true); 75b1994897Sopenharmony_ci graph->RunPass<panda::compiler::IrBuilder>(); 76b1994897Sopenharmony_ci cb(graph); 77b1994897Sopenharmony_ci }); 78b1994897Sopenharmony_ci } 79b1994897Sopenharmony_ci } 80b1994897Sopenharmony_ci 81b1994897Sopenharmony_ci template <class Callback> 82b1994897Sopenharmony_ci void TestBuildGraphFromFile(const std::string &pFileName, const Callback &cb) 83b1994897Sopenharmony_ci { 84b1994897Sopenharmony_ci auto pfile = panda_file::OpenPandaFile(pFileName); 85b1994897Sopenharmony_ci for (uint32_t id : pfile->GetClasses()) { 86b1994897Sopenharmony_ci panda_file::File::EntityId record_id {id}; 87b1994897Sopenharmony_ci 88b1994897Sopenharmony_ci if (pfile->IsExternal(record_id)) { 89b1994897Sopenharmony_ci continue; 90b1994897Sopenharmony_ci } 91b1994897Sopenharmony_ci 92b1994897Sopenharmony_ci panda_file::ClassDataAccessor cda {*pfile, record_id}; 93b1994897Sopenharmony_ci cda.EnumerateMethods([&pfile, &cb](panda_file::MethodDataAccessor &mda) { 94b1994897Sopenharmony_ci if (!mda.IsExternal()) { 95b1994897Sopenharmony_ci ArenaAllocator allocator {SpaceType::SPACE_TYPE_COMPILER}; 96b1994897Sopenharmony_ci ArenaAllocator local_allocator {SpaceType::SPACE_TYPE_COMPILER, nullptr, true}; 97b1994897Sopenharmony_ci 98b1994897Sopenharmony_ci auto method_ptr = reinterpret_cast<compiler::RuntimeInterface::MethodPtr>( 99b1994897Sopenharmony_ci mda.GetMethodId().GetOffset()); 100b1994897Sopenharmony_ci panda::BytecodeOptimizerRuntimeAdapter adapter(mda.GetPandaFile()); 101b1994897Sopenharmony_ci auto *graph = allocator.New<Graph>(&allocator, &local_allocator, Arch::NONE, method_ptr, &adapter, 102b1994897Sopenharmony_ci false, nullptr, true, true); 103b1994897Sopenharmony_ci graph->RunPass<panda::compiler::IrBuilder>(); 104b1994897Sopenharmony_ci 105b1994897Sopenharmony_ci auto method_name = std::string(utf::Mutf8AsCString(pfile->GetStringData(mda.GetNameId()).data)); 106b1994897Sopenharmony_ci auto pos = method_name.find_last_of("#"); 107b1994897Sopenharmony_ci if (pos != std::string::npos) { 108b1994897Sopenharmony_ci method_name = method_name.substr(pos + 1); 109b1994897Sopenharmony_ci } 110b1994897Sopenharmony_ci cb(graph, method_name); 111b1994897Sopenharmony_ci } 112b1994897Sopenharmony_ci }); 113b1994897Sopenharmony_ci } 114b1994897Sopenharmony_ci } 115b1994897Sopenharmony_ci}; 116b1994897Sopenharmony_ci 117b1994897Sopenharmony_ciHWTEST_F(IrBuilderTest, simpleTryCatchAsm, testing::ext::TestSize.Level1) 118b1994897Sopenharmony_ci{ 119b1994897Sopenharmony_ci /** 120b1994897Sopenharmony_ci * try { 121b1994897Sopenharmony_ci * a = 1; 122b1994897Sopenharmony_ci * } catch(e) { 123b1994897Sopenharmony_ci * a = 2; 124b1994897Sopenharmony_ci * } 125b1994897Sopenharmony_ci */ 126b1994897Sopenharmony_ci const auto source = R"( 127b1994897Sopenharmony_ci .language ECMAScript 128b1994897Sopenharmony_ci .function any foo(any a0, any a1, any a2) { 129b1994897Sopenharmony_ci mov v0, a0 130b1994897Sopenharmony_ci mov v1, a1 131b1994897Sopenharmony_ci mov v2, a2 132b1994897Sopenharmony_ci try_begin: 133b1994897Sopenharmony_ci ldai 0x1 134b1994897Sopenharmony_ci trystglobalbyname 0x0, "a" 135b1994897Sopenharmony_ci try_end: 136b1994897Sopenharmony_ci jmp catch_end 137b1994897Sopenharmony_ci catch_begin: 138b1994897Sopenharmony_ci sta v4 139b1994897Sopenharmony_ci tryldglobalbyname 0x1, "a" 140b1994897Sopenharmony_ci catch_end: 141b1994897Sopenharmony_ci returnundefined 142b1994897Sopenharmony_ci } 143b1994897Sopenharmony_ci )"; 144b1994897Sopenharmony_ci 145b1994897Sopenharmony_ci panda::pandasm::Parser parser; 146b1994897Sopenharmony_ci auto res = parser.Parse(source); 147b1994897Sopenharmony_ci auto &prog = res.Value(); 148b1994897Sopenharmony_ci for (auto &[name, func] : prog.function_table) { 149b1994897Sopenharmony_ci auto &catchBlock = func.catch_blocks.emplace_back(); 150b1994897Sopenharmony_ci catchBlock.try_begin_label = "try_begin"; 151b1994897Sopenharmony_ci catchBlock.try_end_label = "try_end"; 152b1994897Sopenharmony_ci catchBlock.catch_begin_label = "catch_begin"; 153b1994897Sopenharmony_ci catchBlock.catch_end_label = "catch_end"; 154b1994897Sopenharmony_ci } 155b1994897Sopenharmony_ci 156b1994897Sopenharmony_ci TestBuildGraphFromFunc(prog, "foo:(any,any,any)", [](Graph* graph) { 157b1994897Sopenharmony_ci EXPECT_NE(graph, nullptr); 158b1994897Sopenharmony_ci for (auto bb : graph->GetBlocksRPO()) { 159b1994897Sopenharmony_ci EXPECT_NE(bb, nullptr); 160b1994897Sopenharmony_ci if (bb->IsTryBegin()) { 161b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 162b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 163b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTry()); 164b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 165b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 166b1994897Sopenharmony_ci 167b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsTry()); 168b1994897Sopenharmony_ci continue; 169b1994897Sopenharmony_ci } 170b1994897Sopenharmony_ci 171b1994897Sopenharmony_ci if (bb->IsTry()) { 172b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 173b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin()); 174b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 175b1994897Sopenharmony_ci 176b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 177b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 178b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 179b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYSTGLOBALBYNAME_IMM8_ID16); 180b1994897Sopenharmony_ci continue; 181b1994897Sopenharmony_ci } 182b1994897Sopenharmony_ci 183b1994897Sopenharmony_ci if (bb->IsTryEnd()) { 184b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 185b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTry()); 186b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 187b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetGuestPc() == bb->GetGuestPc()); 188b1994897Sopenharmony_ci EXPECT_TRUE(!bb->GetSuccessor(0)->IsCatch()); 189b1994897Sopenharmony_ci EXPECT_TRUE(!bb->GetSuccessor(0)->IsCatchBegin()); 190b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 191b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 192b1994897Sopenharmony_ci 193b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 194b1994897Sopenharmony_ci continue; 195b1994897Sopenharmony_ci } 196b1994897Sopenharmony_ci 197b1994897Sopenharmony_ci if (bb->IsCatchBegin()) { 198b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 2); 199b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin()); 200b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(1)->IsTryEnd()); 201b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch()); 202b1994897Sopenharmony_ci 203b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 204b1994897Sopenharmony_ci continue; 205b1994897Sopenharmony_ci } 206b1994897Sopenharmony_ci 207b1994897Sopenharmony_ci if (bb->IsCatch() && !bb->IsCatchBegin()) { 208b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 209b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin()); 210b1994897Sopenharmony_ci 211b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetFirstInst()->IsSaveState()); 212b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetLastInst()->IsIntrinsic()); 213b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetSuccessor(0)->GetLastInst()))->GetIntrinsicId() == 214b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::RETURNUNDEFINED); 215b1994897Sopenharmony_ci 216b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 217b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 218b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 219b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16); 220b1994897Sopenharmony_ci continue; 221b1994897Sopenharmony_ci } 222b1994897Sopenharmony_ci } 223b1994897Sopenharmony_ci }); 224b1994897Sopenharmony_ci} 225b1994897Sopenharmony_ci 226b1994897Sopenharmony_ciHWTEST_F(IrBuilderTest, nestedTryCatchAsm, testing::ext::TestSize.Level1) 227b1994897Sopenharmony_ci{ 228b1994897Sopenharmony_ci /** 229b1994897Sopenharmony_ci * try { 230b1994897Sopenharmony_ci * try { 231b1994897Sopenharmony_ci * a = 1; 232b1994897Sopenharmony_ci * } catch(e) { 233b1994897Sopenharmony_ci * a; 234b1994897Sopenharmony_ci * } 235b1994897Sopenharmony_ci * } catch(e) { 236b1994897Sopenharmony_ci * print(e); 237b1994897Sopenharmony_ci * } 238b1994897Sopenharmony_ci */ 239b1994897Sopenharmony_ci const auto source = R"( 240b1994897Sopenharmony_ci .language ECMAScript 241b1994897Sopenharmony_ci .function any foo(any a0, any a1, any a2) { 242b1994897Sopenharmony_ci mov v2, a2 243b1994897Sopenharmony_ci mov v1, a1 244b1994897Sopenharmony_ci mov v0, a0 245b1994897Sopenharmony_ci lda.str "use strict" 246b1994897Sopenharmony_ci LABEL_0: 247b1994897Sopenharmony_ci LABEL_1: 248b1994897Sopenharmony_ci ldai 1 249b1994897Sopenharmony_ci trystglobalbyname 0, "a" 250b1994897Sopenharmony_ci LABEL_2: 251b1994897Sopenharmony_ci jmp LABEL_3 252b1994897Sopenharmony_ci LABEL_4: 253b1994897Sopenharmony_ci sta v3 254b1994897Sopenharmony_ci tryldglobalbyname 1, "a" 255b1994897Sopenharmony_ci LABEL_3: 256b1994897Sopenharmony_ci LABEL_5: 257b1994897Sopenharmony_ci jmp LABEL_6 258b1994897Sopenharmony_ci LABEL_7: 259b1994897Sopenharmony_ci sta v4 260b1994897Sopenharmony_ci tryldglobalbyname 2, "print" 261b1994897Sopenharmony_ci sta v5 262b1994897Sopenharmony_ci lda v4 263b1994897Sopenharmony_ci sta v6 264b1994897Sopenharmony_ci lda v5 265b1994897Sopenharmony_ci callarg1 3, v6 266b1994897Sopenharmony_ci LABEL_6: 267b1994897Sopenharmony_ci returnundefined 268b1994897Sopenharmony_ci } 269b1994897Sopenharmony_ci )"; 270b1994897Sopenharmony_ci 271b1994897Sopenharmony_ci panda::pandasm::Parser parser; 272b1994897Sopenharmony_ci auto res = parser.Parse(source); 273b1994897Sopenharmony_ci auto &prog = res.Value(); 274b1994897Sopenharmony_ci EXPECT_TRUE(prog.function_table.size() == 1); 275b1994897Sopenharmony_ci for (auto &[name, func] : prog.function_table) { 276b1994897Sopenharmony_ci auto &catchBlock1 = func.catch_blocks.emplace_back(); 277b1994897Sopenharmony_ci catchBlock1.try_begin_label = "LABEL_0"; 278b1994897Sopenharmony_ci catchBlock1.try_end_label = "LABEL_1"; 279b1994897Sopenharmony_ci catchBlock1.catch_begin_label = "LABEL_7"; 280b1994897Sopenharmony_ci catchBlock1.catch_end_label = "LABEL_6"; 281b1994897Sopenharmony_ci 282b1994897Sopenharmony_ci auto &catchBlock2 = func.catch_blocks.emplace_back(); 283b1994897Sopenharmony_ci catchBlock2.try_begin_label = "LABEL_1"; 284b1994897Sopenharmony_ci catchBlock2.try_end_label = "LABEL_2"; 285b1994897Sopenharmony_ci catchBlock2.catch_begin_label = "LABEL_4"; 286b1994897Sopenharmony_ci catchBlock2.catch_end_label = "LABEL_3"; 287b1994897Sopenharmony_ci 288b1994897Sopenharmony_ci auto &catchBlock3 = func.catch_blocks.emplace_back(); 289b1994897Sopenharmony_ci catchBlock3.try_begin_label = "LABEL_2"; 290b1994897Sopenharmony_ci catchBlock3.try_end_label = "LABEL_5"; 291b1994897Sopenharmony_ci catchBlock3.catch_begin_label = "LABEL_7"; 292b1994897Sopenharmony_ci catchBlock3.catch_end_label = "LABEL_6"; 293b1994897Sopenharmony_ci } 294b1994897Sopenharmony_ci 295b1994897Sopenharmony_ci TestBuildGraphFromFunc(prog, "foo:(any,any,any)", [](Graph* graph) { 296b1994897Sopenharmony_ci EXPECT_NE(graph, nullptr); 297b1994897Sopenharmony_ci int32_t numOfTry = 0; 298b1994897Sopenharmony_ci for (auto bb : graph->GetBlocksRPO()) { 299b1994897Sopenharmony_ci EXPECT_NE(bb, nullptr); 300b1994897Sopenharmony_ci if (bb->IsTryBegin()) { 301b1994897Sopenharmony_ci numOfTry++; 302b1994897Sopenharmony_ci 303b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 304b1994897Sopenharmony_ci 305b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 306b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTry()); 307b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 308b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 309b1994897Sopenharmony_ci 310b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetTryId() == bb->GetTryId()); 311b1994897Sopenharmony_ci continue; 312b1994897Sopenharmony_ci } 313b1994897Sopenharmony_ci 314b1994897Sopenharmony_ci if (bb->IsTry()) { 315b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 316b1994897Sopenharmony_ci if (!bb->GetPredecessor(0)->IsTryBegin()) { 317b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin()); 318b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch()); 319b1994897Sopenharmony_ci 320b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 321b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 322b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 323b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16); 324b1994897Sopenharmony_ci continue; 325b1994897Sopenharmony_ci } 326b1994897Sopenharmony_ci 327b1994897Sopenharmony_ci 328b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId()); 329b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetGuestPc() == bb->GetGuestPc()); 330b1994897Sopenharmony_ci if (bb->GetPredecessor(0)->GetTryId() == 1) { 331b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 332b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTryEnd()); 333b1994897Sopenharmony_ci 334b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 335b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 336b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 337b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYSTGLOBALBYNAME_IMM8_ID16); 338b1994897Sopenharmony_ci continue; 339b1994897Sopenharmony_ci } 340b1994897Sopenharmony_ci 341b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == 2); 342b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 343b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 344b1994897Sopenharmony_ci 345b1994897Sopenharmony_ci for (auto inst : bb->GetSuccessor(0)->AllInsts()) { 346b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsPhi()); 347b1994897Sopenharmony_ci } 348b1994897Sopenharmony_ci continue; 349b1994897Sopenharmony_ci } 350b1994897Sopenharmony_ci 351b1994897Sopenharmony_ci if (bb->IsTryEnd()) { 352b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 353b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTry()); 354b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId()); 355b1994897Sopenharmony_ci 356b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 357b1994897Sopenharmony_ci 358b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 359b1994897Sopenharmony_ci if (bb->GetTryId() == 1) { 360b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTryBegin()); 361b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetGuestPc() == bb->GetGuestPc()); 362b1994897Sopenharmony_ci 363b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 364b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 365b1994897Sopenharmony_ci 366b1994897Sopenharmony_ci for (auto inst : bb->GetSuccessor(1)->AllInsts()) { 367b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsCatchPhi()); 368b1994897Sopenharmony_ci } 369b1994897Sopenharmony_ci continue; 370b1994897Sopenharmony_ci } 371b1994897Sopenharmony_ci 372b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetTryId() == 2); 373b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 374b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 375b1994897Sopenharmony_ci for (auto inst : bb->GetSuccessor(0)->AllInsts()) { 376b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsPhi()); 377b1994897Sopenharmony_ci } 378b1994897Sopenharmony_ci continue; 379b1994897Sopenharmony_ci } 380b1994897Sopenharmony_ci 381b1994897Sopenharmony_ci if (bb->IsCatchBegin()) { 382b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 2); 383b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin()); 384b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(1)->IsTryEnd()); 385b1994897Sopenharmony_ci 386b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch()); 387b1994897Sopenharmony_ci continue; 388b1994897Sopenharmony_ci } 389b1994897Sopenharmony_ci 390b1994897Sopenharmony_ci if (bb->IsCatch() && !bb->IsCatchBegin()) { 391b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 392b1994897Sopenharmony_ci 393b1994897Sopenharmony_ci if (bb->IsTry()) { 394b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetTryId() == 2); 395b1994897Sopenharmony_ci 396b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 397b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTryEnd()); 398b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch()); 399b1994897Sopenharmony_ci 400b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 401b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 402b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 403b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16); 404b1994897Sopenharmony_ci continue; 405b1994897Sopenharmony_ci } 406b1994897Sopenharmony_ci 407b1994897Sopenharmony_ci if (bb->IsTryEnd()) { 408b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTry()); 409b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch()); 410b1994897Sopenharmony_ci 411b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 412b1994897Sopenharmony_ci for (auto inst : bb->GetSuccessor(0)->AllInsts()) { 413b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsPhi()); 414b1994897Sopenharmony_ci } 415b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 416b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 417b1994897Sopenharmony_ci 418b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 419b1994897Sopenharmony_ci continue; 420b1994897Sopenharmony_ci } 421b1994897Sopenharmony_ci 422b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin()); 423b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch()); 424b1994897Sopenharmony_ci 425b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 426b1994897Sopenharmony_ci auto *successor = bb->GetSuccessor(0); 427b1994897Sopenharmony_ci EXPECT_TRUE(successor->GetFirstInst()->IsSaveState()); 428b1994897Sopenharmony_ci EXPECT_TRUE(successor->GetLastInst()->IsIntrinsic()); 429b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(successor->GetLastInst()))->GetIntrinsicId() == 430b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::RETURNUNDEFINED); 431b1994897Sopenharmony_ci for (auto inst : successor->GetPredecessor(0)->AllInsts()) { 432b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsPhi()); 433b1994897Sopenharmony_ci } 434b1994897Sopenharmony_ci 435b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 436b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 437b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 438b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::CALLARG1_IMM8_V8); 439b1994897Sopenharmony_ci } 440b1994897Sopenharmony_ci } 441b1994897Sopenharmony_ci 442b1994897Sopenharmony_ci EXPECT_EQ(numOfTry, 2); 443b1994897Sopenharmony_ci }); 444b1994897Sopenharmony_ci} 445b1994897Sopenharmony_ci 446b1994897Sopenharmony_ciHWTEST_F(IrBuilderTest, simpleTryCatchAbc, testing::ext::TestSize.Level1) 447b1994897Sopenharmony_ci{ 448b1994897Sopenharmony_ci std::string pFile = GRAPH_TEST_ABC_DIR "simpleTryCatch.abc"; 449b1994897Sopenharmony_ci const char *testMethodName = "func_main_0"; 450b1994897Sopenharmony_ci TestBuildGraphFromFile(pFile, [&testMethodName](Graph* graph, std::string &methodName) { 451b1994897Sopenharmony_ci if (testMethodName != methodName) { 452b1994897Sopenharmony_ci return; 453b1994897Sopenharmony_ci } 454b1994897Sopenharmony_ci 455b1994897Sopenharmony_ci EXPECT_NE(graph, nullptr); 456b1994897Sopenharmony_ci for (auto bb : graph->GetBlocksRPO()) { 457b1994897Sopenharmony_ci EXPECT_NE(bb, nullptr); 458b1994897Sopenharmony_ci if (bb->IsTryBegin()) { 459b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 460b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 461b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTry()); 462b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 463b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 464b1994897Sopenharmony_ci 465b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsTry()); 466b1994897Sopenharmony_ci continue; 467b1994897Sopenharmony_ci } 468b1994897Sopenharmony_ci 469b1994897Sopenharmony_ci if (bb->IsTry()) { 470b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 471b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin()); 472b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 473b1994897Sopenharmony_ci 474b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 475b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 476b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 477b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYSTGLOBALBYNAME_IMM8_ID16); 478b1994897Sopenharmony_ci continue; 479b1994897Sopenharmony_ci } 480b1994897Sopenharmony_ci 481b1994897Sopenharmony_ci if (bb->IsTryEnd()) { 482b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 483b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTry()); 484b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 485b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetGuestPc() == bb->GetGuestPc()); 486b1994897Sopenharmony_ci EXPECT_TRUE(!bb->GetSuccessor(0)->IsCatch()); 487b1994897Sopenharmony_ci EXPECT_TRUE(!bb->GetSuccessor(0)->IsCatchBegin()); 488b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 489b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 490b1994897Sopenharmony_ci 491b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 492b1994897Sopenharmony_ci continue; 493b1994897Sopenharmony_ci } 494b1994897Sopenharmony_ci 495b1994897Sopenharmony_ci if (bb->IsCatchBegin()) { 496b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 2); 497b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin()); 498b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(1)->IsTryEnd()); 499b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch()); 500b1994897Sopenharmony_ci 501b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 502b1994897Sopenharmony_ci continue; 503b1994897Sopenharmony_ci } 504b1994897Sopenharmony_ci 505b1994897Sopenharmony_ci if (bb->IsCatch() && !bb->IsCatchBegin()) { 506b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 507b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin()); 508b1994897Sopenharmony_ci 509b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetFirstInst()->IsSaveState()); 510b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetLastInst()->IsIntrinsic()); 511b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetSuccessor(0)->GetLastInst()))->GetIntrinsicId() == 512b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::RETURNUNDEFINED); 513b1994897Sopenharmony_ci 514b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 515b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 516b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 517b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16); 518b1994897Sopenharmony_ci continue; 519b1994897Sopenharmony_ci } 520b1994897Sopenharmony_ci } 521b1994897Sopenharmony_ci }); 522b1994897Sopenharmony_ci} 523b1994897Sopenharmony_ci 524b1994897Sopenharmony_ciHWTEST_F(IrBuilderTest, nestedTryCatchAbc, testing::ext::TestSize.Level1) 525b1994897Sopenharmony_ci{ 526b1994897Sopenharmony_ci std::string pFile = GRAPH_TEST_ABC_DIR "nestedTryCatch.abc"; 527b1994897Sopenharmony_ci const char *testMethodName = "func_main_0"; 528b1994897Sopenharmony_ci TestBuildGraphFromFile(pFile, [testMethodName](Graph* graph, std::string &methodName) { 529b1994897Sopenharmony_ci if (testMethodName != methodName) { 530b1994897Sopenharmony_ci return; 531b1994897Sopenharmony_ci } 532b1994897Sopenharmony_ci 533b1994897Sopenharmony_ci EXPECT_NE(graph, nullptr); 534b1994897Sopenharmony_ci int32_t numOfTry = 0; 535b1994897Sopenharmony_ci for (auto bb : graph->GetBlocksRPO()) { 536b1994897Sopenharmony_ci EXPECT_NE(bb, nullptr); 537b1994897Sopenharmony_ci if (bb->IsTryBegin()) { 538b1994897Sopenharmony_ci numOfTry++; 539b1994897Sopenharmony_ci 540b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 541b1994897Sopenharmony_ci 542b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 543b1994897Sopenharmony_ci 544b1994897Sopenharmony_ci if (bb->GetTryId() == 0) { 545b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTry()); 546b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 547b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 548b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetTryId() == bb->GetTryId()); 549b1994897Sopenharmony_ci } 550b1994897Sopenharmony_ci 551b1994897Sopenharmony_ci if (bb->GetTryId() == 1) { 552b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTryBegin()); 553b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 554b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 555b1994897Sopenharmony_ci } 556b1994897Sopenharmony_ci 557b1994897Sopenharmony_ci continue; 558b1994897Sopenharmony_ci } 559b1994897Sopenharmony_ci 560b1994897Sopenharmony_ci if (bb->IsTry()) { 561b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 562b1994897Sopenharmony_ci if (bb->GetPredecessor(0)->IsTryBegin()) { 563b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId()); 564b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == 0); 565b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetGuestPc() == bb->GetGuestPc()); 566b1994897Sopenharmony_ci 567b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 568b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTryEnd()); 569b1994897Sopenharmony_ci 570b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 571b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 572b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 573b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYSTGLOBALBYNAME_IMM8_ID16); 574b1994897Sopenharmony_ci continue; 575b1994897Sopenharmony_ci } 576b1994897Sopenharmony_ci 577b1994897Sopenharmony_ci if (bb->GetPredecessor(0)->IsTryEnd()) { 578b1994897Sopenharmony_ci EXPECT_FALSE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId()); 579b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetGuestPc() == bb->GetGuestPc()); 580b1994897Sopenharmony_ci 581b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 582b1994897Sopenharmony_ci for (auto inst : bb->GetSuccessor(0)->AllInsts()) { 583b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsPhi()); 584b1994897Sopenharmony_ci } 585b1994897Sopenharmony_ci continue; 586b1994897Sopenharmony_ci } 587b1994897Sopenharmony_ci 588b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin()); 589b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch()); 590b1994897Sopenharmony_ci 591b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 592b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch()); 593b1994897Sopenharmony_ci 594b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 595b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 596b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 597b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16); 598b1994897Sopenharmony_ci continue; 599b1994897Sopenharmony_ci } 600b1994897Sopenharmony_ci 601b1994897Sopenharmony_ci if (bb->IsTryEnd()) { 602b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 603b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTry()); 604b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId()); 605b1994897Sopenharmony_ci 606b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 607b1994897Sopenharmony_ci 608b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 609b1994897Sopenharmony_ci if (bb->GetTryId() == 0) { 610b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTry()); 611b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->GetGuestPc() == bb->GetGuestPc()); 612b1994897Sopenharmony_ci 613b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 614b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 615b1994897Sopenharmony_ci 616b1994897Sopenharmony_ci for (auto inst : bb->GetSuccessor(1)->AllInsts()) { 617b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsCatchPhi()); 618b1994897Sopenharmony_ci } 619b1994897Sopenharmony_ci continue; 620b1994897Sopenharmony_ci } 621b1994897Sopenharmony_ci 622b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetTryId() == 1); 623b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 624b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 625b1994897Sopenharmony_ci for (auto inst : bb->GetSuccessor(0)->AllInsts()) { 626b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsPhi()); 627b1994897Sopenharmony_ci } 628b1994897Sopenharmony_ci continue; 629b1994897Sopenharmony_ci } 630b1994897Sopenharmony_ci 631b1994897Sopenharmony_ci if (bb->IsCatchBegin()) { 632b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 2); 633b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin()); 634b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(1)->IsTryEnd()); 635b1994897Sopenharmony_ci 636b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch()); 637b1994897Sopenharmony_ci continue; 638b1994897Sopenharmony_ci } 639b1994897Sopenharmony_ci 640b1994897Sopenharmony_ci if (bb->IsCatch() && !bb->IsCatchBegin()) { 641b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredsBlocks().size() == 1); 642b1994897Sopenharmony_ci 643b1994897Sopenharmony_ci if (bb->IsTry()) { 644b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetTryId() == 2); 645b1994897Sopenharmony_ci 646b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 647b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsTryEnd()); 648b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch()); 649b1994897Sopenharmony_ci 650b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 651b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 652b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 653b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16); 654b1994897Sopenharmony_ci continue; 655b1994897Sopenharmony_ci } 656b1994897Sopenharmony_ci 657b1994897Sopenharmony_ci if (bb->IsTryEnd()) { 658b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsTry()); 659b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch()); 660b1994897Sopenharmony_ci 661b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2); 662b1994897Sopenharmony_ci for (auto inst : bb->GetSuccessor(0)->AllInsts()) { 663b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsPhi()); 664b1994897Sopenharmony_ci } 665b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin()); 666b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch()); 667b1994897Sopenharmony_ci 668b1994897Sopenharmony_ci EXPECT_TRUE(bb->IsEmpty()); 669b1994897Sopenharmony_ci continue; 670b1994897Sopenharmony_ci } 671b1994897Sopenharmony_ci 672b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin()); 673b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch()); 674b1994897Sopenharmony_ci 675b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1); 676b1994897Sopenharmony_ci auto *successor = bb->GetSuccessor(0); 677b1994897Sopenharmony_ci EXPECT_TRUE(successor->GetFirstInst()->IsSaveState()); 678b1994897Sopenharmony_ci EXPECT_TRUE(successor->GetLastInst()->IsIntrinsic()); 679b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(successor->GetLastInst()))->GetIntrinsicId() == 680b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::RETURNUNDEFINED); 681b1994897Sopenharmony_ci for (auto inst : successor->GetPredecessor(0)->AllInsts()) { 682b1994897Sopenharmony_ci EXPECT_TRUE(inst->IsPhi()); 683b1994897Sopenharmony_ci } 684b1994897Sopenharmony_ci 685b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetFirstInst()->IsSaveState()); 686b1994897Sopenharmony_ci EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic()); 687b1994897Sopenharmony_ci EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() == 688b1994897Sopenharmony_ci RuntimeInterface::IntrinsicId::CALLARG1_IMM8_V8); 689b1994897Sopenharmony_ci } 690b1994897Sopenharmony_ci } 691b1994897Sopenharmony_ci 692b1994897Sopenharmony_ci EXPECT_EQ(numOfTry, 2); 693b1994897Sopenharmony_ci }); 694b1994897Sopenharmony_ci} 695b1994897Sopenharmony_ci} // namespace panda::compiler