From d9e6079b5bbdf77f74c60c40eee6b1a468e483c6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=84=B8=ED=9D=AC/On-Device=20Lab=28SR=29/Princip?= =?utf8?q?al=20Engineer/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Thu, 31 Oct 2019 14:07:27 +0900 Subject: [PATCH] [circle-verify] Introduce Model and empty Driver (#8641) * [circle-verify] Introduce Model and empty Driver This will introdue Model that will provide mmapped buffer and empty Driver Signed-off-by: SaeHie Park * apply comments --- compiler/circle-verify/CMakeLists.txt | 6 +++ compiler/circle-verify/requires.cmake | 2 + compiler/circle-verify/src/Driver.cpp | 24 ++++++++++ compiler/circle-verify/src/Model.cpp | 90 +++++++++++++++++++++++++++++++++++ compiler/circle-verify/src/Model.h | 38 +++++++++++++++ 5 files changed, 160 insertions(+) create mode 100644 compiler/circle-verify/CMakeLists.txt create mode 100644 compiler/circle-verify/requires.cmake create mode 100644 compiler/circle-verify/src/Driver.cpp create mode 100644 compiler/circle-verify/src/Model.cpp create mode 100644 compiler/circle-verify/src/Model.h diff --git a/compiler/circle-verify/CMakeLists.txt b/compiler/circle-verify/CMakeLists.txt new file mode 100644 index 0000000..cb145a2 --- /dev/null +++ b/compiler/circle-verify/CMakeLists.txt @@ -0,0 +1,6 @@ +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_executable(circle-verify ${SOURCES}) +target_include_directories(circle-verify PRIVATE src) +target_link_libraries(circle-verify safemain) +target_link_libraries(circle-verify cwrap) diff --git a/compiler/circle-verify/requires.cmake b/compiler/circle-verify/requires.cmake new file mode 100644 index 0000000..283c0a2 --- /dev/null +++ b/compiler/circle-verify/requires.cmake @@ -0,0 +1,2 @@ +require("safemain") +require("cwrap") diff --git a/compiler/circle-verify/src/Driver.cpp b/compiler/circle-verify/src/Driver.cpp new file mode 100644 index 0000000..d6cab32 --- /dev/null +++ b/compiler/circle-verify/src/Driver.cpp @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +int entry(int argc, char **argv) +{ + throw std::runtime_error("NYI"); + + return 0; +} diff --git a/compiler/circle-verify/src/Model.cpp b/compiler/circle-verify/src/Model.cpp new file mode 100644 index 0000000..efac121 --- /dev/null +++ b/compiler/circle-verify/src/Model.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Model.h" + +#include + +#include +#include +#include +#include + +namespace +{ + +class MemoryMappedModel final : public ModelData +{ +public: + /** + * @require fd and data SHOULD be valid + */ + explicit MemoryMappedModel(int fd, void *data, size_t size) : _fd{fd}, _data{data}, _size{size} + { + // DO NOTHING + } + +public: + ~MemoryMappedModel() + { + munmap(_data, _size); + close(_fd); + } + +public: + MemoryMappedModel(const MemoryMappedModel &) = delete; + MemoryMappedModel(MemoryMappedModel &&) = delete; + +public: + const void *data(void) const override { return _data; }; + const size_t size(void) const override { return _size; }; + +private: + int _fd = -1; + void *_data = nullptr; + size_t _size = 0; +}; + +} // namespace + +std::unique_ptr load_modeldata(const std::string &path) +{ + cwrap::Fildes fd(open(path.c_str(), O_RDONLY)); + + if (fd.get() == -1) + { + // Return nullptr on open failure + return nullptr; + } + + struct stat st; + if (fstat(fd.get(), &st) == -1) + { + // Return nullptr on fstat failure + return nullptr; + } + + auto size = st.st_size; + auto data = mmap(nullptr, size, PROT_READ, MAP_SHARED, fd.get(), 0); + + if (data == MAP_FAILED) + { + // Return nullptr on mmap failure + return nullptr; + } + + return std::unique_ptr{new MemoryMappedModel(fd.release(), data, size)}; +} diff --git a/compiler/circle-verify/src/Model.h b/compiler/circle-verify/src/Model.h new file mode 100644 index 0000000..e1bd839 --- /dev/null +++ b/compiler/circle-verify/src/Model.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MODEL_H__ +#define __MODEL_H__ + +#include +#include + +struct ModelData +{ + virtual ~ModelData() = default; + + virtual const void *data(void) const = 0; + virtual const size_t size(void) const = 0; +}; + +/** + * @brief Load Circle model (as a raw data) from a given path + * + * @note May return a nullptr + */ +std::unique_ptr load_modeldata(const std::string &path); + +#endif // __MODEL_H__ -- 2.7.4