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