• 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 
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