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, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11 * either express or implied. See the License for the specific language governing permissions and limitations under the
12 * License.
13 */
14
15 #include <cassert>
16 #include <cstdint>
17 #include "libabckit/include/c/abckit.h"
18 #include "libabckit/include/c/metadata_core.h"
19
20 #include "libabckit/include/c/statuses.h"
21 #include "libabckit/src/macros.h"
22
23 #include "libabckit/src/metadata_inspect_impl.h"
24 #include "libabckit/src/ir_impl.h"
25 #include "libabckit/src/adapter_dynamic/metadata_modify_dynamic.h"
26 #include "libabckit/src/adapter_static/metadata_modify_static.h"
27 #include "libabckit/src/helpers_common.h"
28 #include "libabckit/src/statuses_impl.h"
29
30 namespace libabckit {
31
32 // ========================================
33 // File
34 // ========================================
35
36 // ========================================
37 // Module
38 // ========================================
39
40 // ========================================
41 // Class
42 // ========================================
43
44 // ========================================
45 // AnnotationInterface
46 // ========================================
47
48 // ========================================
49 // Function
50 // ========================================
51
FunctionSetGraph(AbckitCoreFunction * function,AbckitGraph * graph)52 extern "C" void FunctionSetGraph(AbckitCoreFunction *function, AbckitGraph *graph)
53 {
54 LIBABCKIT_CLEAR_LAST_ERROR;
55 LIBABCKIT_IMPLEMENTED;
56
57 LIBABCKIT_BAD_ARGUMENT_VOID(function)
58 LIBABCKIT_BAD_ARGUMENT_VOID(graph)
59
60 LIBABCKIT_WRONG_CTX_VOID(function->owningModule->file, graph->file);
61
62 if (IsDynamic(function->owningModule->target)) {
63 FunctionSetGraphDynamic(function, graph);
64 } else {
65 FunctionSetGraphStatic(function, graph);
66 }
67 }
68
69 // ========================================
70 // Annotation
71 // ========================================
72
73 // ========================================
74 // Type
75 // ========================================
76
CreateType(AbckitFile * file,AbckitTypeId id)77 extern "C" AbckitType *CreateType(AbckitFile *file, AbckitTypeId id)
78 {
79 LIBABCKIT_CLEAR_LAST_ERROR;
80 LIBABCKIT_IMPLEMENTED;
81
82 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
83 if (id == ABCKIT_TYPE_ID_INVALID) {
84 statuses::SetLastError(ABCKIT_STATUS_BAD_ARGUMENT);
85 return nullptr;
86 }
87 return GetOrCreateType(file, id, 0, nullptr);
88 }
89
CreateReferenceType(AbckitFile * file,AbckitCoreClass * klass)90 extern "C" AbckitType *CreateReferenceType(AbckitFile *file, AbckitCoreClass *klass)
91 {
92 LIBABCKIT_CLEAR_LAST_ERROR;
93 LIBABCKIT_IMPLEMENTED;
94
95 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
96 LIBABCKIT_BAD_ARGUMENT(klass, nullptr);
97 return GetOrCreateType(file, AbckitTypeId::ABCKIT_TYPE_ID_REFERENCE, 0, klass);
98 }
99
100 // ========================================
101 // Value
102 // ========================================
103
CreateValueU1(AbckitFile * file,bool value)104 extern "C" AbckitValue *CreateValueU1(AbckitFile *file, bool value)
105 {
106 LIBABCKIT_CLEAR_LAST_ERROR;
107 LIBABCKIT_IMPLEMENTED;
108
109 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
110 switch (file->frontend) {
111 case Mode::DYNAMIC:
112 return FindOrCreateValueU1Dynamic(file, value);
113 case Mode::STATIC:
114 return FindOrCreateValueU1Static(file, value);
115 default:
116 LIBABCKIT_UNREACHABLE;
117 }
118 }
119
CreateValueDouble(AbckitFile * file,double value)120 extern "C" AbckitValue *CreateValueDouble(AbckitFile *file, double value)
121 {
122 LIBABCKIT_CLEAR_LAST_ERROR;
123 LIBABCKIT_IMPLEMENTED;
124
125 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
126 switch (file->frontend) {
127 case Mode::DYNAMIC:
128 return FindOrCreateValueDoubleDynamic(file, value);
129 case Mode::STATIC:
130 return FindOrCreateValueDoubleStatic(file, value);
131 default:
132 LIBABCKIT_UNREACHABLE;
133 }
134 }
135
CreateValueString(AbckitFile * file,const char * value,size_t len)136 extern "C" AbckitValue *CreateValueString(AbckitFile *file, const char *value, size_t len)
137 {
138 LIBABCKIT_CLEAR_LAST_ERROR;
139 LIBABCKIT_IMPLEMENTED;
140
141 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
142 LIBABCKIT_BAD_ARGUMENT(value, nullptr);
143 LIBABCKIT_ZERO_ARGUMENT(len, nullptr);
144 switch (file->frontend) {
145 case Mode::DYNAMIC:
146 return FindOrCreateValueStringDynamic(file, value, len);
147 case Mode::STATIC:
148 return FindOrCreateValueStringStatic(file, value, len);
149 default:
150 LIBABCKIT_UNREACHABLE;
151 }
152 }
153
CreateLiteralArrayValue(AbckitFile * file,AbckitValue ** value,size_t size)154 extern "C" AbckitValue *CreateLiteralArrayValue(AbckitFile *file, AbckitValue **value, size_t size)
155 {
156 LIBABCKIT_CLEAR_LAST_ERROR;
157 LIBABCKIT_IMPLEMENTED;
158
159 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
160 LIBABCKIT_BAD_ARGUMENT(value, nullptr);
161 switch (file->frontend) {
162 case Mode::DYNAMIC:
163 return FindOrCreateLiteralArrayValueDynamic(file, value, size);
164 case Mode::STATIC:
165 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
166 return nullptr;
167 default:
168 LIBABCKIT_UNREACHABLE;
169 }
170 }
171
172 // ========================================
173 // String
174 // ========================================
175
CreateString(AbckitFile * file,const char * value,size_t len)176 extern "C" AbckitString *CreateString(AbckitFile *file, const char *value, size_t len)
177 {
178 LIBABCKIT_CLEAR_LAST_ERROR;
179 LIBABCKIT_IMPLEMENTED;
180
181 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
182 LIBABCKIT_BAD_ARGUMENT(value, nullptr);
183 LIBABCKIT_ZERO_ARGUMENT(len, nullptr);
184 switch (file->frontend) {
185 case Mode::DYNAMIC:
186 return CreateStringDynamic(file, value, len);
187 case Mode::STATIC:
188 return CreateStringStatic(file, value, len);
189 default:
190 LIBABCKIT_UNREACHABLE;
191 }
192 }
193
194 // ========================================
195 // LiteralArray
196 // ========================================
197
CreateLiteralArray(AbckitFile * file,AbckitLiteral ** value,size_t size)198 extern "C" AbckitLiteralArray *CreateLiteralArray(AbckitFile *file, AbckitLiteral **value, size_t size)
199 {
200 LIBABCKIT_CLEAR_LAST_ERROR;
201 LIBABCKIT_IMPLEMENTED;
202
203 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
204 LIBABCKIT_BAD_ARGUMENT(value, nullptr);
205 switch (file->frontend) {
206 case Mode::DYNAMIC:
207 return CreateLiteralArrayDynamic(file, value, size);
208 case Mode::STATIC:
209 return CreateLiteralArrayStatic(file, value, size);
210 default:
211 LIBABCKIT_UNREACHABLE;
212 }
213 }
214
CreateLiteralBool(AbckitFile * file,bool value)215 extern "C" AbckitLiteral *CreateLiteralBool(AbckitFile *file, bool value)
216 {
217 LIBABCKIT_CLEAR_LAST_ERROR;
218 LIBABCKIT_IMPLEMENTED;
219
220 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
221 switch (file->frontend) {
222 case Mode::DYNAMIC:
223 return FindOrCreateLiteralBoolDynamic(file, value);
224 case Mode::STATIC:
225 return FindOrCreateLiteralBoolStatic(file, value);
226 default:
227 LIBABCKIT_UNREACHABLE;
228 }
229 }
230
CreateLiteralU8(AbckitFile * file,uint8_t value)231 extern "C" AbckitLiteral *CreateLiteralU8(AbckitFile *file, uint8_t value)
232 {
233 LIBABCKIT_CLEAR_LAST_ERROR;
234 LIBABCKIT_IMPLEMENTED;
235
236 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
237 switch (file->frontend) {
238 case Mode::DYNAMIC:
239 return FindOrCreateLiteralU8Dynamic(file, value);
240 case Mode::STATIC:
241 return FindOrCreateLiteralU8Static(file, value);
242 default:
243 LIBABCKIT_UNREACHABLE;
244 }
245 }
246
CreateLiteralU16(AbckitFile * file,uint16_t value)247 extern "C" AbckitLiteral *CreateLiteralU16(AbckitFile *file, uint16_t value)
248 {
249 LIBABCKIT_CLEAR_LAST_ERROR;
250 LIBABCKIT_IMPLEMENTED;
251
252 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
253 switch (file->frontend) {
254 case Mode::DYNAMIC:
255 return FindOrCreateLiteralU16Dynamic(file, value);
256 case Mode::STATIC:
257 return FindOrCreateLiteralU16Static(file, value);
258 default:
259 LIBABCKIT_UNREACHABLE;
260 }
261 }
262
CreateLiteralMethodAffiliate(AbckitFile * file,uint16_t value)263 extern "C" AbckitLiteral *CreateLiteralMethodAffiliate(AbckitFile *file, uint16_t value)
264 {
265 LIBABCKIT_CLEAR_LAST_ERROR;
266 LIBABCKIT_IMPLEMENTED;
267
268 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
269 switch (file->frontend) {
270 case Mode::DYNAMIC:
271 return FindOrCreateLiteralMethodAffiliateDynamic(file, value);
272 case Mode::STATIC:
273 return FindOrCreateLiteralMethodAffiliateStatic(file, value);
274 default:
275 LIBABCKIT_UNREACHABLE;
276 }
277 }
CreateLiteralU32(AbckitFile * file,uint32_t value)278 extern "C" AbckitLiteral *CreateLiteralU32(AbckitFile *file, uint32_t value)
279 {
280 LIBABCKIT_CLEAR_LAST_ERROR;
281 LIBABCKIT_IMPLEMENTED;
282
283 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
284 switch (file->frontend) {
285 case Mode::DYNAMIC:
286 return FindOrCreateLiteralU32Dynamic(file, value);
287 case Mode::STATIC:
288 return FindOrCreateLiteralU32Static(file, value);
289 default:
290 LIBABCKIT_UNREACHABLE;
291 }
292 }
293
CreateLiteralU64(AbckitFile * file,uint64_t value)294 extern "C" AbckitLiteral *CreateLiteralU64(AbckitFile *file, uint64_t value)
295 {
296 LIBABCKIT_CLEAR_LAST_ERROR;
297 LIBABCKIT_IMPLEMENTED;
298
299 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
300 switch (file->frontend) {
301 case Mode::DYNAMIC:
302 return FindOrCreateLiteralU64Dynamic(file, value);
303 case Mode::STATIC:
304 return FindOrCreateLiteralU64Static(file, value);
305 default:
306 LIBABCKIT_UNREACHABLE;
307 }
308 }
309
CreateLiteralFloat(AbckitFile * file,float value)310 extern "C" AbckitLiteral *CreateLiteralFloat(AbckitFile *file, float value)
311 {
312 LIBABCKIT_CLEAR_LAST_ERROR;
313 LIBABCKIT_IMPLEMENTED;
314
315 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
316 switch (file->frontend) {
317 case Mode::DYNAMIC:
318 return FindOrCreateLiteralFloatDynamic(file, value);
319 case Mode::STATIC:
320 return FindOrCreateLiteralFloatStatic(file, value);
321 default:
322 LIBABCKIT_UNREACHABLE;
323 }
324 }
325
CreateLiteralDouble(AbckitFile * file,double value)326 extern "C" AbckitLiteral *CreateLiteralDouble(AbckitFile *file, double value)
327 {
328 LIBABCKIT_CLEAR_LAST_ERROR;
329 LIBABCKIT_IMPLEMENTED;
330
331 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
332 switch (file->frontend) {
333 case Mode::DYNAMIC:
334 return FindOrCreateLiteralDoubleDynamic(file, value);
335 case Mode::STATIC:
336 return FindOrCreateLiteralDoubleStatic(file, value);
337 default:
338 LIBABCKIT_UNREACHABLE;
339 }
340 }
341
CreateLiteralLiteralArray(AbckitFile * file,AbckitLiteralArray * litarr)342 extern "C" AbckitLiteral *CreateLiteralLiteralArray(AbckitFile *file, AbckitLiteralArray *litarr)
343 {
344 LIBABCKIT_CLEAR_LAST_ERROR;
345 LIBABCKIT_IMPLEMENTED;
346
347 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
348 LIBABCKIT_BAD_ARGUMENT(litarr, nullptr);
349 switch (file->frontend) {
350 case Mode::DYNAMIC:
351 return FindOrCreateLiteralLiteralArrayDynamic(file, litarr);
352 case Mode::STATIC:
353 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
354 return nullptr;
355 default:
356 LIBABCKIT_UNREACHABLE;
357 }
358 }
359
CreateLiteralString(AbckitFile * file,const char * value,size_t len)360 extern "C" AbckitLiteral *CreateLiteralString(AbckitFile *file, const char *value, size_t len)
361 {
362 LIBABCKIT_CLEAR_LAST_ERROR;
363 LIBABCKIT_IMPLEMENTED;
364
365 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
366 LIBABCKIT_BAD_ARGUMENT(value, nullptr);
367 LIBABCKIT_ZERO_ARGUMENT(len, nullptr);
368 switch (file->frontend) {
369 case Mode::DYNAMIC:
370 return FindOrCreateLiteralStringDynamic(file, value, len);
371 case Mode::STATIC:
372 return FindOrCreateLiteralStringStatic(file, value, len);
373 default:
374 LIBABCKIT_UNREACHABLE;
375 }
376 }
377
CreateLiteralMethod(AbckitFile * file,AbckitCoreFunction * function)378 extern "C" AbckitLiteral *CreateLiteralMethod(AbckitFile *file, AbckitCoreFunction *function)
379 {
380 LIBABCKIT_CLEAR_LAST_ERROR;
381 LIBABCKIT_IMPLEMENTED;
382
383 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
384 LIBABCKIT_BAD_ARGUMENT(function, nullptr);
385 switch (file->frontend) {
386 case Mode::DYNAMIC:
387 return FindOrCreateLiteralMethodDynamic(file, function);
388 case Mode::STATIC:
389 return FindOrCreateLiteralMethodStatic(file, function);
390 default:
391 LIBABCKIT_UNREACHABLE;
392 }
393 }
394
395 AbckitModifyApi g_modifyApiImpl = {
396
397 // ========================================
398 // File
399 // ========================================
400
401 // ========================================
402 // Module
403 // ========================================
404
405 // ========================================
406 // Class
407 // ========================================
408
409 // ========================================
410 // AnnotationInterface
411 // ========================================
412
413 // ========================================
414 // Function
415 // ========================================
416
417 FunctionSetGraph,
418
419 // ========================================
420 // Annotation
421 // ========================================
422
423 // ========================================
424 // Type
425 // ========================================
426
427 CreateType,
428 CreateReferenceType,
429
430 // ========================================
431 // Value
432 // ========================================
433
434 CreateValueU1,
435 CreateValueDouble,
436 CreateValueString,
437 CreateLiteralArrayValue,
438
439 // ========================================
440 // String
441 // ========================================
442
443 CreateString,
444
445 // ========================================
446 // LiteralArray
447 // ========================================
448
449 CreateLiteralArray,
450
451 // ========================================
452 // LiteralArray
453 // ========================================
454
455 CreateLiteralBool,
456 CreateLiteralU8,
457 CreateLiteralU16,
458 CreateLiteralMethodAffiliate,
459 CreateLiteralU32,
460 CreateLiteralU64,
461 CreateLiteralFloat,
462 CreateLiteralDouble,
463 CreateLiteralLiteralArray,
464 CreateLiteralString,
465 CreateLiteralMethod,
466 };
467
468 } // namespace libabckit
469
470 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
471 #include "./mock/abckit_mock.h"
472 #endif
473
AbckitGetModifyApiImpl(AbckitApiVersion version)474 extern "C" AbckitModifyApi const *AbckitGetModifyApiImpl(AbckitApiVersion version)
475 {
476 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
477 return AbckitGetMockModifyApiImpl(version);
478 #endif
479 switch (version) {
480 case ABCKIT_VERSION_RELEASE_1_0_0:
481 return &libabckit::g_modifyApiImpl;
482 default:
483 libabckit::statuses::SetLastError(ABCKIT_STATUS_UNKNOWN_API_VERSION);
484 return nullptr;
485 }
486 }
487