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/isa/isa_dynamic.h"
19 #include "libabckit/include/c/abckit.h"
20
21 #include "helpers/helpers.h"
22 #include "ir_impl.h"
23
24 #include <gtest/gtest.h>
25
26 namespace libabckit::test {
27
28 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
29 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
30 static auto g_implG = AbckitGetGraphApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
31 static auto g_dynG = AbckitGetIsaApiDynamicImpl(ABCKIT_VERSION_RELEASE_1_0_0);
32
33 static const uint8_t TEST_UINT4 = 0x1;
34 static const uint8_t TEST_UINT8 = 0x10;
35 static const uint16_t TEST_UINT16 = 0x100;
36
37 class LibAbcKitCheckDynInstImmSize : public ::testing::Test {};
38
OpenImmSizeFile()39 AbckitGraph *OpenImmSizeFile()
40 {
41 constexpr auto INPUT_PATH = ABCKIT_ABC_DIR "ut/isa/isa_dynamic/immsize/immsize_dynamic.abc";
42 auto *file = g_impl->openAbc(INPUT_PATH, strlen(INPUT_PATH));
43 auto *bar = helpers::FindMethodByName(file, "bar");
44 auto *graph = g_implI->createGraphFromFunction(bar);
45 return graph;
46 }
47
CreateImmInst(AbckitInst * (* apiToCheck)(AbckitGraph * graph,uint64_t imm0,uint64_t imm1),uint64_t imm0,uint64_t imm1,AbckitBitImmSize expBitSize)48 static void CreateImmInst(AbckitInst *(*apiToCheck)(AbckitGraph *graph, uint64_t imm0, uint64_t imm1), uint64_t imm0,
49 uint64_t imm1, AbckitBitImmSize expBitSize)
50 {
51 auto *graph = OpenImmSizeFile();
52
53 auto *instr = apiToCheck(graph, imm0, imm1);
54 ASSERT_NE(instr, nullptr);
55 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
56
57 auto imm0BitSize = g_implG->iGetImmediateSize(instr, 0);
58 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
59 ASSERT_EQ(imm0BitSize, expBitSize);
60
61 auto imm1BitSize = g_implG->iGetImmediateSize(instr, 1);
62 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
63 ASSERT_EQ(imm1BitSize, expBitSize);
64
65 auto *file = graph->file;
66 g_impl->destroyGraph(graph);
67 g_impl->closeFile(file);
68 }
69
CreateImmInst(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * input0,uint64_t imm0,uint64_t imm1),uint64_t imm0,uint64_t imm1,AbckitBitImmSize expBitSize)70 static void CreateImmInst(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *input0, uint64_t imm0,
71 uint64_t imm1),
72 uint64_t imm0, uint64_t imm1, AbckitBitImmSize expBitSize)
73 {
74 auto *graph = OpenImmSizeFile();
75
76 auto loadStr = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_LOADSTRING);
77 ASSERT_NE(loadStr, nullptr);
78
79 auto *instr = apiToCheck(graph, loadStr, imm0, imm1);
80 ASSERT_NE(instr, nullptr);
81 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
82
83 auto imm0BitSize = g_implG->iGetImmediateSize(instr, 0);
84 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
85 ASSERT_EQ(imm0BitSize, expBitSize);
86
87 auto imm1BitSize = g_implG->iGetImmediateSize(instr, 1);
88 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
89 ASSERT_EQ(imm1BitSize, expBitSize);
90
91 auto *file = graph->file;
92 g_impl->destroyGraph(graph);
93 g_impl->closeFile(file);
94 }
95
CreateImmInst(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * input0,uint64_t imm0),uint64_t imm0,AbckitBitImmSize expBitSize)96 static void CreateImmInst(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *input0, uint64_t imm0),
97 uint64_t imm0, AbckitBitImmSize expBitSize)
98 {
99 auto *graph = OpenImmSizeFile();
100
101 auto loadStr = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_LOADSTRING);
102 ASSERT_NE(loadStr, nullptr);
103
104 auto *instr = apiToCheck(graph, loadStr, imm0);
105 ASSERT_NE(instr, nullptr);
106 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
107
108 auto immBitSize = g_implG->iGetImmediateSize(instr, 0);
109 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
110 ASSERT_EQ(immBitSize, expBitSize);
111
112 auto *file = graph->file;
113 g_impl->destroyGraph(graph);
114 g_impl->closeFile(file);
115 }
116
117 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateStlexvar,
118 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateStlexvarImm4)119 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateStlexvarImm4)
120 {
121 CreateImmInst(g_dynG->iCreateStlexvar, TEST_UINT4, TEST_UINT4, AbckitBitImmSize::BITSIZE_4);
122 }
123
124 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateStlexvar,
125 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateStlexvarImm8)126 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateStlexvarImm8)
127 {
128 CreateImmInst(g_dynG->iCreateStlexvar, TEST_UINT8, TEST_UINT8, AbckitBitImmSize::BITSIZE_8);
129 }
130
131 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateLdlexvar,
132 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateLdlexvarImm4)133 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateLdlexvarImm4)
134 {
135 CreateImmInst(g_dynG->iCreateLdlexvar, TEST_UINT4, TEST_UINT4, AbckitBitImmSize::BITSIZE_4);
136 }
137
138 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateLdlexvar,
139 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateLdlexvarImm8)140 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateLdlexvarImm8)
141 {
142 CreateImmInst(g_dynG->iCreateLdlexvar, TEST_UINT8, TEST_UINT8, AbckitBitImmSize::BITSIZE_8);
143 }
144
145 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeStsendablevar,
146 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateCallruntimeStsendablevarImm4)147 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateCallruntimeStsendablevarImm4)
148 {
149 CreateImmInst(g_dynG->iCreateCallruntimeStsendablevar, TEST_UINT4, TEST_UINT4, AbckitBitImmSize::BITSIZE_4);
150 }
151
152 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeStsendablevar,
153 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateCallruntimeStsendablevarImm8)154 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateCallruntimeStsendablevarImm8)
155 {
156 CreateImmInst(g_dynG->iCreateCallruntimeStsendablevar, TEST_UINT8, TEST_UINT8, AbckitBitImmSize::BITSIZE_8);
157 }
158
159 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeLdsendablevar,
160 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateCallruntimeLdsendablevarImm4)161 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateCallruntimeLdsendablevarImm4)
162 {
163 CreateImmInst(g_dynG->iCreateCallruntimeLdsendablevar, TEST_UINT4, TEST_UINT4, AbckitBitImmSize::BITSIZE_4);
164 }
165
166 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeLdsendablevar,
167 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateCallruntimeLdsendablevarImm8)168 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateCallruntimeLdsendablevarImm8)
169 {
170 CreateImmInst(g_dynG->iCreateCallruntimeLdsendablevar, TEST_UINT8, TEST_UINT8, AbckitBitImmSize::BITSIZE_8);
171 }
172
173 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateThrowIfsupernotcorrectcall,
174 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateThrowIfsupernotcorrectcallImm8)175 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateThrowIfsupernotcorrectcallImm8)
176 {
177 CreateImmInst(g_dynG->iCreateThrowIfsupernotcorrectcall, TEST_UINT8, AbckitBitImmSize::BITSIZE_8);
178 }
179
180 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateThrowIfsupernotcorrectcall,
181 // abc-kind=ArkTS1, category=positive
TEST_F(LibAbcKitCheckDynInstImmSize,iCreateThrowIfsupernotcorrectcallImm16)182 TEST_F(LibAbcKitCheckDynInstImmSize, iCreateThrowIfsupernotcorrectcallImm16)
183 {
184 CreateImmInst(g_dynG->iCreateThrowIfsupernotcorrectcall, TEST_UINT16, AbckitBitImmSize::BITSIZE_16);
185 }
186
187 } // namespace libabckit::test
188