1 /**
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "libabckit/include/c/metadata_core.h"
17 #include "libabckit/include/c/ir_core.h"
18 #include "libabckit/include/c/abckit.h"
19 #include "helpers/helpers.h"
20 #include <gtest/gtest.h>
21 #include <cstdint>
22
23 // NOLINTBEGIN(readability-magic-numbers)
24
25 namespace libabckit::test {
26
27 class LibAbcKitTest : public ::testing::Test {};
28
29 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
30 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
31 static auto g_implM = AbckitGetModifyApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
32 static auto g_implG = AbckitGetGraphApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
33
TransformMethodDynamicValid(AbckitGraph * graph,const std::string & typeName)34 static void TransformMethodDynamicValid(AbckitGraph *graph, const std::string &typeName)
35 {
36 AbckitInst *constant = nullptr;
37 if (typeName == "u64") {
38 constant = g_implG->gFindOrCreateConstantU64(graph, 0xa);
39 } else if (typeName == "f64") {
40 constant = g_implG->gFindOrCreateConstantF64(graph, 12.16);
41 } else if (typeName == "i64") {
42 constant = g_implG->gFindOrCreateConstantI64(graph, -5);
43 } else if (typeName == "i32") {
44 constant = g_implG->gFindOrCreateConstantI32(graph, 5);
45 } else {
46 LIBABCKIT_UNREACHABLE_TEST(DEBUG);
47 }
48
49 AbckitInst *retOp = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURN);
50 g_implG->iSetInput(retOp, constant, 0);
51 }
52
TransformMethodDynamicUnconnected(AbckitGraph * graph,const std::string & typeName)53 static void TransformMethodDynamicUnconnected(AbckitGraph *graph, const std::string &typeName)
54 {
55 AbckitBasicBlock *startBB = g_implG->gGetStartBasicBlock(graph);
56
57 AbckitInst *constant = nullptr;
58 if (typeName == "u64") {
59 constant = g_implG->gFindOrCreateConstantU64(graph, 0xa);
60 } else if (typeName == "f64") {
61 constant = g_implG->gFindOrCreateConstantF64(graph, 12.16);
62 } else if (typeName == "i64") {
63 constant = g_implG->gFindOrCreateConstantI64(graph, -5);
64 } else if (typeName == "i32") {
65 constant = g_implG->gFindOrCreateConstantI32(graph, 5);
66 } else {
67 LIBABCKIT_UNREACHABLE_TEST(DEBUG);
68 }
69
70 ASSERT_NE(constant, nullptr);
71 g_implG->bbAddInstFront(startBB, constant);
72 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
73 }
74
VerifyTransformations(AbckitGraph * graph)75 static void VerifyTransformations(AbckitGraph *graph)
76 {
77 helpers::InstSchema constantInstr {2, ABCKIT_ISA_API_DYNAMIC_OPCODE_CONSTANT, {}};
78
79 // Verify graph
80 std::vector<helpers::BBSchema<AbckitIsaApiDynamicOpcode>> bbSchemas(
81 {{{},
82 {1},
83 {
84 {4, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
85 {5, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
86 {6, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
87 constantInstr,
88 }},
89 {{0}, {2}, {{3, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURN, {2}}}},
90 {{1}, {}, {}}});
91 helpers::VerifyGraph(graph, bbSchemas);
92 }
93
94 class LibAbcKitCreateConstantTest : public ::testing::Test {};
95
96 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantU64, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,DynamicCreateConstantU64Valid)97 TEST_F(LibAbcKitCreateConstantTest, DynamicCreateConstantU64Valid)
98 {
99 helpers::TransformMethod(
100 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic.abc",
101 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic_modify.abc", "foo1",
102 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
103 TransformMethodDynamicValid(graph, "u64");
104 },
105 [](AbckitGraph *graph) { VerifyTransformations(graph); });
106 }
107
108 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantF64, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,DynamicCreateConstantF64Valid)109 TEST_F(LibAbcKitCreateConstantTest, DynamicCreateConstantF64Valid)
110 {
111 helpers::TransformMethod(
112 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic.abc",
113 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic_modified.abc", "foo1",
114 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
115 TransformMethodDynamicValid(graph, "f64");
116 },
117 [](AbckitGraph *graph) { VerifyTransformations(graph); });
118 }
119
120 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantI64, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,DynamicCreateConstantI64Valid)121 TEST_F(LibAbcKitCreateConstantTest, DynamicCreateConstantI64Valid)
122 {
123 helpers::TransformMethod(
124 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic.abc",
125 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic_modified.abc", "foo1",
126 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
127 TransformMethodDynamicValid(graph, "i64");
128 },
129 [](AbckitGraph *graph) { VerifyTransformations(graph); });
130 }
131
132 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantI32, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,DynamicCreateConstantI32Valid)133 TEST_F(LibAbcKitCreateConstantTest, DynamicCreateConstantI32Valid)
134 {
135 helpers::TransformMethod(
136 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic.abc",
137 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic_modified.abc", "foo1",
138 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
139 TransformMethodDynamicValid(graph, "i32");
140 },
141 [](AbckitGraph *graph) { VerifyTransformations(graph); });
142 }
143
144 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantU64, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,DynamicCreateConstantU64Unconnected)145 TEST_F(LibAbcKitCreateConstantTest, DynamicCreateConstantU64Unconnected)
146 {
147 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic.abc", "foo2",
148 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
149 TransformMethodDynamicUnconnected(graph, "u64");
150 });
151 }
152
153 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantI64, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,DynamicCreateConstantI64Unconnected)154 TEST_F(LibAbcKitCreateConstantTest, DynamicCreateConstantI64Unconnected)
155 {
156 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic.abc", "foo2",
157 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
158 TransformMethodDynamicUnconnected(graph, "i64");
159 });
160 }
161
162 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantF64, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,DynamicCreateConstantF64Unconnected)163 TEST_F(LibAbcKitCreateConstantTest, DynamicCreateConstantF64Unconnected)
164 {
165 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic.abc", "foo2",
166 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
167 TransformMethodDynamicUnconnected(graph, "f64");
168 });
169 }
170
171 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantI32, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,DynamicCreateConstantI32Unconnected)172 TEST_F(LibAbcKitCreateConstantTest, DynamicCreateConstantI32Unconnected)
173 {
174 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_dynamic.abc", "foo2",
175 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
176 TransformMethodDynamicUnconnected(graph, "i32");
177 });
178 }
179 } // namespace libabckit::test
180
181 // NOLINTEND(readability-magic-numbers)
182