• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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