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
TransformMethodStaticValid(AbckitGraph * graph,const std::string & functionName)34 static void TransformMethodStaticValid(AbckitGraph *graph, const std::string &functionName)
35 {
36 AbckitInst *constant = nullptr;
37 if (functionName == "foo1") {
38 constant = g_implG->gFindOrCreateConstantU64(graph, 0xa);
39 } else if (functionName == "foo2") {
40 constant = g_implG->gFindOrCreateConstantF64(graph, 12.16);
41 } else if (functionName == "foo3") {
42 constant = g_implG->gFindOrCreateConstantI64(graph, -5);
43 } else if (functionName == "foo5") {
44 constant = g_implG->gFindOrCreateConstantI64(graph, 5);
45 } else {
46 LIBABCKIT_UNREACHABLE_TEST(DEBUG);
47 }
48
49 AbckitInst *retOp = helpers::FindFirstInst(graph, ABCKIT_ISA_API_STATIC_OPCODE_RETURN);
50 g_implG->iSetInput(retOp, constant, 0);
51 }
52
TransformMethodStaticUnconnected(AbckitGraph * graph,const std::string & typeName)53 static void TransformMethodStaticUnconnected(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 {
78 2, ABCKIT_ISA_API_STATIC_OPCODE_CONSTANT, {}}; // NOTE: NEED TO VERIFY VALUE OF CONSTANT
79
80 // Verify graph
81 std::vector<helpers::BBSchema<AbckitIsaApiStaticOpcode>> bbSchemas(
82 {{{},
83 {1},
84 {
85 {4, ABCKIT_ISA_API_STATIC_OPCODE_PARAMETER, {}},
86 constantInstr,
87 }},
88 {{0},
89 {2},
90 {
91 {3, ABCKIT_ISA_API_STATIC_OPCODE_RETURN, {2}},
92 }},
93 {{1}, {}, {}}});
94 helpers::VerifyGraph(graph, bbSchemas);
95 }
96
97 class LibAbcKitCreateConstantTest : public ::testing::Test {};
98
99 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantU64, abc-kind=ArkTS2, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,StaticCreateConstantU64Valid)100 TEST_F(LibAbcKitCreateConstantTest, StaticCreateConstantU64Valid)
101 {
102 helpers::TransformMethod(
103 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static.abc",
104 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static_modify.abc", "foo1",
105 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
106 TransformMethodStaticValid(graph, "foo1");
107 },
108 [](AbckitGraph *graph) { VerifyTransformations(graph); });
109 }
110
111 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantF64, abc-kind=ArkTS2, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,StaticCreateConstantF64Valid)112 TEST_F(LibAbcKitCreateConstantTest, StaticCreateConstantF64Valid)
113 {
114 helpers::TransformMethod(
115 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static.abc",
116 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static_modified.abc", "foo2",
117 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
118 TransformMethodStaticValid(graph, "foo2");
119 },
120 [](AbckitGraph *graph) { VerifyTransformations(graph); });
121 }
122
123 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantI64, abc-kind=ArkTS2, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,StaticCreateConstantI64Valid)124 TEST_F(LibAbcKitCreateConstantTest, StaticCreateConstantI64Valid)
125 {
126 helpers::TransformMethod(
127 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static.abc",
128 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static_modified.abc", "foo3",
129 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
130 TransformMethodStaticValid(graph, "foo3");
131 },
132 [](AbckitGraph *graph) { VerifyTransformations(graph); });
133 }
134
135 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantU64, abc-kind=ArkTS2, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,StaticCreateConstantU64Unconnected)136 TEST_F(LibAbcKitCreateConstantTest, StaticCreateConstantU64Unconnected)
137 {
138 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static.abc", "foo4",
139 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
140 TransformMethodStaticUnconnected(graph, "u64");
141 });
142 }
143
144 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantI64, abc-kind=ArkTS2, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,StaticCreateConstantI64Unconnected)145 TEST_F(LibAbcKitCreateConstantTest, StaticCreateConstantI64Unconnected)
146 {
147 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static.abc", "foo4",
148 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
149 TransformMethodStaticUnconnected(graph, "i64");
150 });
151 }
152
153 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantF64, abc-kind=ArkTS2, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,StaticCreateConstantF64Unconnected)154 TEST_F(LibAbcKitCreateConstantTest, StaticCreateConstantF64Unconnected)
155 {
156 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static.abc", "foo4",
157 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
158 TransformMethodStaticUnconnected(graph, "f64");
159 });
160 }
161
162 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantI32, abc-kind=ArkTS2, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,StaticCreateConstantI32Valid)163 TEST_F(LibAbcKitCreateConstantTest, StaticCreateConstantI32Valid)
164 {
165 helpers::TransformMethod(
166 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static.abc",
167 ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static_modified.abc", "foo5",
168 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
169 TransformMethodStaticValid(graph, "foo5");
170 },
171 [](AbckitGraph *graph) { VerifyTransformations(graph); });
172 }
173
174 // Test: test-kind=api, api=GraphApiImpl::gFindOrCreateConstantI32, abc-kind=ArkTS2, category=positive, extension=c
TEST_F(LibAbcKitCreateConstantTest,StaticCreateConstantI32Unconnected)175 TEST_F(LibAbcKitCreateConstantTest, StaticCreateConstantI32Unconnected)
176 {
177 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/ir_core/create_constant/create_constant_static.abc", "foo4",
178 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
179 TransformMethodStaticUnconnected(graph, "i32");
180 });
181 }
182
183 } // namespace libabckit::test
184
185 // NOLINTEND(readability-magic-numbers)
186