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