This is an automated email from the ASF dual-hosted git repository.

jwfromm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git


The following commit(s) were added to refs/heads/main by this push:
     new c94ebf9206 [runtime][hexagon] improved file-copy logic (#12194)
c94ebf9206 is described below

commit c94ebf9206baf566a7337fdd5910ee8ecc430e48
Author: Christian Convey <ccon...@octoml.ai>
AuthorDate: Wed Jul 27 13:42:30 2022 -0400

    [runtime][hexagon] improved file-copy logic (#12194)
    
    - Add `tvm::runtime::CopyFile` function.
    
    - Change `HexagonModuleNode::SaveToFile` to use new function
      instead of a shell `cp` invocation.
    
      This fixes a problem where the `cp`-based implementation
      couldn't handle certain valid filenames.
    
      This also fixes a bug where `SaveToFile` simply skips the
      file-copying step on Mac OSX.
---
 src/runtime/file_utils.cc             | 22 +++++++++++++++++++++-
 src/runtime/file_utils.h              |  8 ++++++++
 src/runtime/hexagon/hexagon_module.cc |  5 +----
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/src/runtime/file_utils.cc b/src/runtime/file_utils.cc
index 35832e83f5..1e7cc6ad44 100644
--- a/src/runtime/file_utils.cc
+++ b/src/runtime/file_utils.cc
@@ -159,7 +159,27 @@ void LoadMetaDataFromFile(const std::string& file_name,
   fs.close();
 }
 
-void RemoveFile(const std::string& file_name) { 
std::remove(file_name.c_str()); }
+void RemoveFile(const std::string& file_name) {
+  // FIXME: This doesn't check the return code.
+  std::remove(file_name.c_str());
+}
+
+void CopyFile(const std::string& src_file_name, const std::string& 
dest_file_name) {
+  std::ifstream src(src_file_name, std::ios::binary);
+  ICHECK(src) << "Unable to open source file '" << src_file_name << "'";
+
+  std::ofstream dest(dest_file_name, std::ios::binary | std::ios::trunc);
+  ICHECK(dest) << "Unable to destination source file '" << src_file_name << 
"'";
+
+  dest << src.rdbuf();
+
+  src.close();
+  dest.close();
+
+  ICHECK(dest) << "File-copy operation failed."
+               << " src='" << src_file_name << "'"
+               << " dest='" << dest_file_name << "'";
+}
 
 Map<String, NDArray> LoadParams(const std::string& param_blob) {
   dmlc::MemoryStringStream strm(const_cast<std::string*>(&param_blob));
diff --git a/src/runtime/file_utils.h b/src/runtime/file_utils.h
index 4e7f158bb0..bd3bec9031 100644
--- a/src/runtime/file_utils.h
+++ b/src/runtime/file_utils.h
@@ -90,6 +90,14 @@ void SaveMetaDataToFile(const std::string& file_name,
 void LoadMetaDataFromFile(const std::string& file_name,
                           std::unordered_map<std::string, FunctionInfo>* fmap);
 
+/*!
+ * \brief Copy the content of an existing file to another file.
+ * \param src_file_name Path to the source file.
+ * \param dest_file_name Path of the destination file.  If this file already 
exists,
+ *    replace its content.
+ */
+void CopyFile(const std::string& src_file_name, const std::string& 
dest_file_name);
+
 /*!
  * \brief Remove (unlink) a file.
  * \param file_name The file name.
diff --git a/src/runtime/hexagon/hexagon_module.cc 
b/src/runtime/hexagon/hexagon_module.cc
index 3f72070aeb..c00e33f4c4 100644
--- a/src/runtime/hexagon/hexagon_module.cc
+++ b/src/runtime/hexagon/hexagon_module.cc
@@ -63,10 +63,7 @@ void HexagonModuleNode::SaveToFile(const std::string& 
file_name, const std::stri
   if (fmt == "so" || fmt == "dll" || fmt == "hexagon") {
     std::string meta_file = GetMetaFilePath(file_name);
     SaveMetaDataToFile(meta_file, fmap_);
-#if !defined(__APPLE__)
-    std::string c = "cp " + data_ + " " + file_name;
-    ICHECK(std::system(c.c_str()) == 0) << "Cannot create " + file_name;
-#endif
+    CopyFile(data_, file_name);
   } else if (fmt == "s" || fmt == "asm") {
     ICHECK(!asm_.empty()) << "Assembler source not available";
     SaveBinaryToFile(file_name, asm_);

Reply via email to