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/abckit.h"
17
18 #include "libabckit/include/c/statuses.h"
19 #include "libabckit/src/macros.h"
20 #include "libabckit/src/helpers_common.h"
21 #include "libabckit/src/statuses_impl.h"
22 #include "libabckit/src/metadata_inspect_impl.h"
23 #include "libabckit/src/ir_impl.h"
24 #include "libabckit/src/adapter_dynamic/abckit_dynamic.h"
25 #include "libabckit/src/adapter_static/abckit_static.h"
26 #include "libabckit/src/mem_manager/mem_manager.h"
27 #include "libabckit/src/logger.h"
28 #include "libabckit/src/abckit_options.h"
29
30 #include <cstddef>
31 #include <iostream>
32
33 libabckit::Logger *libabckit::Logger::logger_ = nullptr;
34 thread_local libabckit::NullBuffer libabckit::g_nB {};
35 thread_local std::ostream libabckit::g_nullStream {&g_nB};
36
37 namespace libabckit {
38 libabckit::Options g_abckitOptions("");
39
GetAbckitLastError()40 extern "C" AbckitStatus GetAbckitLastError()
41 {
42 LIBABCKIT_IMPLEMENTED;
43 return statuses::GetLastError();
44 }
45
OpenAbc(const char * path,size_t len)46 extern "C" AbckitFile *OpenAbc(const char *path, size_t len)
47 {
48 LIBABCKIT_CLEAR_LAST_ERROR;
49 LIBABCKIT_IMPLEMENTED;
50
51 LIBABCKIT_BAD_ARGUMENT(path, nullptr);
52 LIBABCKIT_ZERO_ARGUMENT(len, nullptr);
53
54 auto spath = std::string(path, len);
55 LIBABCKIT_LOG(DEBUG) << spath << '\n';
56
57 MemManager::Initialize(g_abckitOptions.GetMemorySizeLimit());
58
59 AbckitFile *file = nullptr;
60
61 file = OpenAbcStatic(path, len);
62 if (file != nullptr) {
63 return file;
64 }
65
66 LIBABCKIT_LOG(DEBUG) << (std::string() + "Load file with path '" + spath +
67 "' failed for static mode, trying dynamic mode\n");
68
69 file = OpenAbcDynamic(path, len);
70 if (file != nullptr) {
71 return file;
72 }
73
74 LIBABCKIT_LOG(DEBUG) << (std::string() + "Load file with path '" + spath + "' failed for both modes\n");
75
76 // Input abc file is neither for dynamic vm nor static vm
77 statuses::SetLastError(AbckitStatus::ABCKIT_STATUS_BAD_ARGUMENT);
78
79 return nullptr;
80 }
81
WriteAbc(AbckitFile * file,const char * path,size_t len)82 extern "C" void WriteAbc(AbckitFile *file, const char *path, size_t len)
83 {
84 LIBABCKIT_CLEAR_LAST_ERROR;
85 LIBABCKIT_IMPLEMENTED;
86
87 LIBABCKIT_BAD_ARGUMENT_VOID(file)
88 LIBABCKIT_BAD_ARGUMENT_VOID(path)
89 LIBABCKIT_ZERO_ARGUMENT_VOID(len)
90
91 switch (file->frontend) {
92 case Mode::DYNAMIC:
93 return WriteAbcDynamic(file, path, len);
94 case Mode::STATIC:
95 return WriteAbcStatic(file, path, len);
96 default:
97 LIBABCKIT_UNREACHABLE;
98 }
99 }
100
CloseFile(AbckitFile * file)101 extern "C" void CloseFile(AbckitFile *file)
102 {
103 LIBABCKIT_CLEAR_LAST_ERROR;
104 LIBABCKIT_IMPLEMENTED;
105
106 LIBABCKIT_BAD_ARGUMENT_VOID(file);
107
108 switch (file->frontend) {
109 case Mode::DYNAMIC:
110 return CloseFileDynamic(file);
111 case Mode::STATIC:
112 return CloseFileStatic(file);
113 default:
114 LIBABCKIT_UNREACHABLE;
115 }
116 }
117
DestroyGraph(AbckitGraph * graph)118 extern "C" void DestroyGraph(AbckitGraph *graph)
119 {
120 LIBABCKIT_CLEAR_LAST_ERROR;
121 LIBABCKIT_IMPLEMENTED;
122
123 LIBABCKIT_BAD_ARGUMENT_VOID(graph);
124
125 if (IsDynamic(graph->function->owningModule->target)) {
126 return DestroyGraphDynamic(graph);
127 }
128 DestroyGraphStatic(graph);
129 }
130
131 AbckitApi g_impl = {
132 // ========================================
133 // Common API
134 // ========================================
135
136 ABCKIT_VERSION_RELEASE_1_0_0,
137 GetAbckitLastError,
138
139 // ========================================
140 // Inspection API entrypoints
141 // ========================================
142
143 OpenAbc,
144 WriteAbc,
145 CloseFile,
146
147 // ========================================
148 // IR API entrypoints
149 // ========================================
150
151 DestroyGraph,
152 };
153
154 } // namespace libabckit
155
156 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
157 #include "./mock/abckit_mock.h"
158 #endif
159
AbckitGetApiImpl(AbckitApiVersion version)160 extern "C" AbckitApi const *AbckitGetApiImpl(AbckitApiVersion version)
161 {
162 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
163 return AbckitGetMockApiImpl(version);
164 #endif
165 switch (version) {
166 case ABCKIT_VERSION_RELEASE_1_0_0:
167 return &libabckit::g_impl;
168 default:
169 libabckit::statuses::SetLastError(ABCKIT_STATUS_UNKNOWN_API_VERSION);
170 return nullptr;
171 }
172 }
173