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