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 "helpers/helpers_wrong_imm.h"
17
18 #include "libabckit/include/c/abckit.h"
19
20 #include <gtest/gtest.h>
21
22 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
23 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
24
25 namespace libabckit::test::helpers_wrong_imm {
26
27 // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast)
28 static AbckitCoreModule *g_dummyModule = new AbckitCoreModule();
29 static AbckitCoreFunction *g_dummyMethod = new AbckitCoreFunction();
30 static AbckitInst *g_dummyInsT1 = new AbckitInst();
31 static AbckitInst *g_dummyInsT2 = new AbckitInst();
32 static AbckitLiteralArray *g_dummyLitarr = (AbckitLiteralArray *)(0x1);
33 // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast)
34
OpenWrongImmFile()35 AbckitGraph *OpenWrongImmFile()
36 {
37 constexpr auto INPUT_PATH = ABCKIT_ABC_DIR "wrong_imm_tests/wrong_imm_test_dynamic.abc";
38 auto *file = g_impl->openAbc(INPUT_PATH, strlen(INPUT_PATH));
39 auto *foo = helpers::FindMethodByName(file, "foo");
40 auto *graph = g_implI->createGraphFromFunction(foo);
41 return graph;
42 }
43
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,uint64_t imm0),AbckitBitImmSize bitsize)44 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, uint64_t imm0), AbckitBitImmSize bitsize)
45 {
46 auto *graph = OpenWrongImmFile();
47 auto *instr = apiToCheck(graph, 1UL << bitsize);
48 ASSERT_EQ(instr, nullptr);
49 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
50 auto *file = graph->file;
51 g_impl->destroyGraph(graph);
52 g_impl->closeFile(file);
53 }
54
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,uint64_t imm0,uint64_t imm1),AbckitBitImmSize bitsize)55 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, uint64_t imm0, uint64_t imm1), AbckitBitImmSize bitsize)
56 {
57 auto *graph = OpenWrongImmFile();
58 auto *instr = apiToCheck(graph, 1UL << bitsize, 0x0);
59 ASSERT_EQ(instr, nullptr);
60 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
61
62 instr = apiToCheck(graph, 0x0, 1UL << bitsize);
63 ASSERT_EQ(instr, nullptr);
64 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
65
66 instr = apiToCheck(graph, 1UL << bitsize, 1UL << bitsize);
67 ASSERT_EQ(instr, nullptr);
68 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
69 auto *file = graph->file;
70 g_impl->destroyGraph(graph);
71 g_impl->closeFile(file);
72 }
73
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * input0,uint64_t imm0),AbckitBitImmSize bitsize)74 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *input0, uint64_t imm0),
75 AbckitBitImmSize bitsize)
76 {
77 auto *graph = OpenWrongImmFile();
78 g_dummyInsT1->graph = graph;
79
80 auto *instr = apiToCheck(graph, g_dummyInsT1, 1UL << bitsize);
81 ASSERT_EQ(instr, nullptr);
82 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
83 auto *file = graph->file;
84 g_impl->destroyGraph(graph);
85 g_impl->closeFile(file);
86 }
87
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * input0,AbckitInst * input1,uint64_t imm0,...),AbckitBitImmSize bitsize)88 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *input0, AbckitInst *input1, uint64_t imm0,
89 ...),
90 AbckitBitImmSize bitsize)
91 {
92 auto *graph = OpenWrongImmFile();
93 g_dummyInsT1->graph = graph;
94 g_dummyInsT2->graph = graph;
95
96 auto *instr = apiToCheck(graph, g_dummyInsT1, g_dummyInsT2, 1UL << bitsize);
97 ASSERT_EQ(instr, nullptr);
98 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
99 auto *file = graph->file;
100 g_impl->destroyGraph(graph);
101 g_impl->closeFile(file);
102
103 // NOTE varargs processing
104 }
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * inst,uint64_t imm0,AbckitInst * inst1),AbckitBitImmSize bitsize)105 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *inst, uint64_t imm0, AbckitInst *inst1),
106 AbckitBitImmSize bitsize)
107 {
108 auto *graph = OpenWrongImmFile();
109 g_dummyInsT1->graph = graph;
110 g_dummyInsT2->graph = graph;
111
112 auto *instr = apiToCheck(graph, g_dummyInsT1, 1UL << bitsize, g_dummyInsT2);
113 ASSERT_EQ(instr, nullptr);
114 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
115 auto *file = graph->file;
116 g_impl->destroyGraph(graph);
117 g_impl->closeFile(file);
118 }
119
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * inst,uint64_t imm0,uint64_t imm1,AbckitInst * inst1),AbckitBitImmSize bitsize)120 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *inst, uint64_t imm0, uint64_t imm1,
121 AbckitInst *inst1),
122 AbckitBitImmSize bitsize)
123 {
124 auto *graph = OpenWrongImmFile();
125 g_dummyInsT1->graph = graph;
126 g_dummyInsT2->graph = graph;
127
128 auto *instr = apiToCheck(graph, g_dummyInsT1, 1UL << bitsize, 0x0, g_dummyInsT2);
129 ASSERT_EQ(instr, nullptr);
130 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
131
132 instr = apiToCheck(graph, g_dummyInsT1, 0x0, 1UL << bitsize, g_dummyInsT2);
133 ASSERT_EQ(instr, nullptr);
134 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
135
136 instr = apiToCheck(graph, g_dummyInsT1, 1UL << bitsize, 1UL << bitsize, g_dummyInsT2);
137 ASSERT_EQ(instr, nullptr);
138 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
139 auto *file = graph->file;
140 g_impl->destroyGraph(graph);
141 g_impl->closeFile(file);
142 }
143
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * inst,uint64_t imm0,uint64_t imm1),AbckitBitImmSize bitsize)144 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *inst, uint64_t imm0, uint64_t imm1),
145 AbckitBitImmSize bitsize)
146 {
147 auto *graph = OpenWrongImmFile();
148 g_dummyInsT1->graph = graph;
149
150 auto *instr = apiToCheck(graph, g_dummyInsT1, 1UL << bitsize, 0x0);
151 ASSERT_EQ(instr, nullptr);
152 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
153
154 instr = apiToCheck(graph, g_dummyInsT1, 0x0, 1UL << bitsize);
155 ASSERT_EQ(instr, nullptr);
156 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
157
158 instr = apiToCheck(graph, g_dummyInsT1, 1UL << bitsize, 1UL << bitsize);
159 ASSERT_EQ(instr, nullptr);
160 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
161 auto *file = graph->file;
162 g_impl->destroyGraph(graph);
163 g_impl->closeFile(file);
164 }
165
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,uint64_t imm0,AbckitInst * inst0,AbckitInst * inst1),AbckitBitImmSize bitsize)166 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, uint64_t imm0, AbckitInst *inst0, AbckitInst *inst1),
167 AbckitBitImmSize bitsize)
168 {
169 auto *graph = OpenWrongImmFile();
170 g_dummyInsT1->graph = graph;
171 g_dummyInsT2->graph = graph;
172
173 auto *instr = apiToCheck(graph, 1UL << bitsize, g_dummyInsT1, g_dummyInsT2);
174 ASSERT_EQ(instr, nullptr);
175 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
176 auto *file = graph->file;
177 g_impl->destroyGraph(graph);
178 g_impl->closeFile(file);
179 }
180
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitCoreFunction * method,uint64_t imm),AbckitBitImmSize bitsize)181 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitCoreFunction *method, uint64_t imm),
182 AbckitBitImmSize bitsize)
183 {
184 auto *graph = OpenWrongImmFile();
185 g_dummyModule->file = graph->file;
186 g_dummyMethod->owningModule = g_dummyModule;
187
188 auto *instr = apiToCheck(graph, g_dummyMethod, 1UL << bitsize);
189 ASSERT_EQ(instr, nullptr);
190 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
191 auto *file = graph->file;
192 g_impl->destroyGraph(graph);
193 g_impl->closeFile(file);
194 }
195
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * acc,AbckitCoreFunction * method,uint64_t imm0),AbckitBitImmSize bitsize)196 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *acc, AbckitCoreFunction *method,
197 uint64_t imm0),
198 AbckitBitImmSize bitsize)
199 {
200 auto *graph = OpenWrongImmFile();
201 g_dummyModule->file = graph->file;
202 g_dummyMethod->owningModule = g_dummyModule;
203 g_dummyInsT1->graph = graph;
204 auto *instr = apiToCheck(graph, g_dummyInsT1, g_dummyMethod, 1UL << bitsize);
205 ASSERT_EQ(instr, nullptr);
206 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
207 auto *file = graph->file;
208 g_impl->destroyGraph(graph);
209 g_impl->closeFile(file);
210 }
211
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * input0,AbckitInst * input1,uint64_t imm0),AbckitBitImmSize bitsize)212 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *input0, AbckitInst *input1, uint64_t imm0),
213 AbckitBitImmSize bitsize)
214 {
215 auto *graph = OpenWrongImmFile();
216 g_dummyInsT1->graph = graph;
217 g_dummyInsT2->graph = graph;
218
219 auto *instr = apiToCheck(graph, g_dummyInsT1, g_dummyInsT2, 1UL << bitsize);
220 ASSERT_EQ(instr, nullptr);
221 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
222 auto *file = graph->file;
223 g_impl->destroyGraph(graph);
224 g_impl->closeFile(file);
225 }
226
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,uint64_t imm0,AbckitLiteralArray * litarr),AbckitBitImmSize bitsize)227 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, uint64_t imm0, AbckitLiteralArray *litarr),
228 AbckitBitImmSize bitsize)
229 {
230 auto *graph = OpenWrongImmFile();
231 AbckitInst *inst = apiToCheck(graph, 1UL << bitsize, g_dummyLitarr);
232 ASSERT_EQ(inst, nullptr);
233 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
234 auto *file = graph->file;
235 g_impl->destroyGraph(graph);
236 g_impl->closeFile(file);
237 }
238
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitCoreFunction * m,AbckitLiteralArray * litarr,uint64_t imm0,AbckitInst * inst),AbckitBitImmSize bitsize)239 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitCoreFunction *m, AbckitLiteralArray *litarr,
240 uint64_t imm0, AbckitInst *inst),
241 AbckitBitImmSize bitsize)
242 {
243 auto *graph = OpenWrongImmFile();
244 g_dummyModule->file = graph->file;
245 g_dummyMethod->owningModule = g_dummyModule;
246 g_dummyInsT1->graph = graph;
247
248 auto *instr = apiToCheck(graph, g_dummyMethod, g_dummyLitarr, 1UL << bitsize, g_dummyInsT1);
249 ASSERT_EQ(instr, nullptr);
250 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
251 auto *file = graph->file;
252 g_impl->destroyGraph(graph);
253 g_impl->closeFile(file);
254 }
255
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,size_t argCount,...),AbckitBitImmSize bitsize)256 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, size_t argCount, ...), AbckitBitImmSize bitsize)
257 {
258 auto *graph = OpenWrongImmFile();
259 auto *inst = apiToCheck(graph, 1UL << bitsize);
260 ASSERT_EQ(inst, nullptr);
261 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
262 auto *file = graph->file;
263 g_impl->destroyGraph(graph);
264 g_impl->closeFile(file);
265 }
266
TestWrongImm(AbckitInst * (* apiToCheck)(AbckitGraph * graph,AbckitInst * input,size_t argCount,...),AbckitBitImmSize bitsize)267 void TestWrongImm(AbckitInst *(*apiToCheck)(AbckitGraph *graph, AbckitInst *input, size_t argCount, ...),
268 AbckitBitImmSize bitsize)
269 {
270 auto *graph = OpenWrongImmFile();
271 g_dummyInsT1->graph = graph;
272 auto *inst = apiToCheck(graph, g_dummyInsT1, 1UL << bitsize);
273 ASSERT_EQ(inst, nullptr);
274 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
275 auto *file = graph->file;
276 g_impl->destroyGraph(graph);
277 g_impl->closeFile(file);
278 }
279
280 } // namespace libabckit::test::helpers_wrong_imm
281