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

ruihangl 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 b40b6fa52d [REFACTOR][FFI] Update symbol name for library module 
(#18042)
b40b6fa52d is described below

commit b40b6fa52d299573b89860168f5c927c10f6df96
Author: Tianqi Chen <[email protected]>
AuthorDate: Thu Jun 5 13:33:25 2025 -0400

    [REFACTOR][FFI] Update symbol name for library module (#18042)
    
    This PR updates the symbol name for library module to reflect
    the latest design. The goal is to stablize the name so we can also
    bring module to ffi layer.
---
 docs/arch/introduction_to_module_serialization.rst | 17 +++++----
 ffi/include/tvm/ffi/c_api.h                        |  4 +-
 include/tvm/runtime/module.h                       | 16 ++------
 python/tvm/ffi/cython/base.pxi                     |  2 +-
 src/runtime/library_module.cc                      | 13 ++++---
 src/target/codegen.cc                              |  4 +-
 src/target/llvm/codegen_blob.cc                    | 43 +++++++++++-----------
 src/target/llvm/codegen_cpu.cc                     |  3 +-
 src/target/llvm/llvm_module.cc                     |  8 ++--
 src/target/source/codegen_c_host.cc                |  4 +-
 src/tir/transforms/make_packed_api.cc              |  2 +-
 11 files changed, 56 insertions(+), 60 deletions(-)

diff --git a/docs/arch/introduction_to_module_serialization.rst 
b/docs/arch/introduction_to_module_serialization.rst
index 49cb7d8e45..50eeb6df22 100644
--- a/docs/arch/introduction_to_module_serialization.rst
+++ b/docs/arch/introduction_to_module_serialization.rst
@@ -133,7 +133,7 @@ before. The ``import_tree_logic`` is just to write 
``import_tree_row_ptr_``
 and ``import_tree_child_indices_`` into stream.
 
 After this step, we will pack it into a symbol
-``runtime::symbol::tvm_dev_mblob`` that can be recovered in the dynamic
+``runtime::symbol::tvm_ffi_library_bin`` that can be recovered in the dynamic
 library.
 
 Now, we complete the serialization part. As you have seen, we could
@@ -152,18 +152,19 @@ according to the function logic, we will call 
``module.loadfile_so`` in
 .. code:: c++
 
    // Load the imported modules
-   const char* dev_mblob = reinterpret_cast<const 
char*>(lib->GetSymbol(runtime::symbol::tvm_dev_mblob));
+   const char* library_bin = reinterpret_cast<const char*>(
+      lib->GetSymbol(runtime::symbol::tvm_ffi_library_bin));
    Module root_mod;
-   if (dev_mblob != nullptr) {
-   root_mod = ProcessModuleBlob(dev_mblob, lib);
+   if (library_bin != nullptr) {
+      root_mod = ProcessLibraryBin(library_bin, lib);
    } else {
-   // Only have one single DSO Module
-   root_mod = Module(n);
+      // Only have one single DSO Module
+      root_mod = Module(n);
    }
 
 As said before, we will pack the blob into the symbol
-``runtime::symbol::tvm_dev_mblob``. During deserialization part, we will
-inspect it. If we have ``runtime::symbol::tvm_dev_mblob``, we will call 
``ProcessModuleBlob``,
+``runtime::symbol::tvm_ffi_library_bin``. During deserialization part, we will
+inspect it. If we have ``runtime::symbol::tvm_ffi_library_bin``, we will call 
``ProcessLibraryBin``,
 whose logic like this:
 
 .. code:: c++
diff --git a/ffi/include/tvm/ffi/c_api.h b/ffi/include/tvm/ffi/c_api.h
index 996eaa369b..7cf7543f48 100644
--- a/ffi/include/tvm/ffi/c_api.h
+++ b/ffi/include/tvm/ffi/c_api.h
@@ -251,7 +251,7 @@ typedef struct {
  *
  * Safe call explicitly catches exception on function boundary.
  *
- * \param self The function handle
+ * \param handle The function handle
  * \param num_args Number of input arguments
  * \param args The input arguments to the call.
  * \param result Store output result.
@@ -278,7 +278,7 @@ typedef struct {
  * \sa TVMFFIErrorSetRaised
  * \sa TVMFFIErrorSetRaisedByCStr
  */
-typedef int (*TVMFFISafeCallType)(void* self, const TVMFFIAny* args, int32_t 
num_args,
+typedef int (*TVMFFISafeCallType)(void* handle, const TVMFFIAny* args, int32_t 
num_args,
                                   TVMFFIAny* result);
 
 /*!
diff --git a/include/tvm/runtime/module.h b/include/tvm/runtime/module.h
index 705fb276d9..efbaa6508a 100644
--- a/include/tvm/runtime/module.h
+++ b/include/tvm/runtime/module.h
@@ -286,12 +286,10 @@ inline ffi::Function Module::GetFunction(const String& 
name, bool query_imports)
 
 /*! \brief namespace for constant symbols */
 namespace symbol {
-/*! \brief A ffi::Function that retrieves exported metadata. */
-constexpr const char* tvm_get_c_metadata = "get_c_metadata";
-/*! \brief Global variable to store module context. */
-constexpr const char* tvm_module_ctx = "__tvm_module_ctx";
-/*! \brief Global variable to store device module blob */
-constexpr const char* tvm_dev_mblob = "__tvm_dev_mblob";
+/*! \brief Global variable to store context pointer for a library module. */
+constexpr const char* tvm_ffi_library_ctx = "__tvm_ffi_library_ctx";
+/*! \brief Global variable to store binary data alongside a library module. */
+constexpr const char* tvm_ffi_library_bin = "__tvm_ffi_library_bin";
 /*! \brief global function to set device */
 constexpr const char* tvm_set_device = "__tvm_set_device";
 /*! \brief Auxiliary counter to global barrier. */
@@ -300,12 +298,6 @@ constexpr const char* tvm_global_barrier_state = 
"__tvm_global_barrier_state";
 constexpr const char* tvm_prepare_global_barrier = 
"__tvm_prepare_global_barrier";
 /*! \brief Placeholder for the module's entry function. */
 constexpr const char* tvm_module_main = "__tvm_main__";
-/*! \brief Prefix for parameter symbols emitted into the main program. */
-constexpr const char* tvm_param_prefix = "__tvm_param__";
-/*! \brief A ffi::Function that looks up linked parameters by storage_id. */
-constexpr const char* tvm_lookup_linked_param = "_lookup_linked_param";
-/*! \brief Model entrypoint generated as an interface to the AOT function 
outside of TIR */
-constexpr const char* tvm_entrypoint_suffix = "run";
 }  // namespace symbol
 
 // implementations of inline functions.
diff --git a/python/tvm/ffi/cython/base.pxi b/python/tvm/ffi/cython/base.pxi
index 8b9c1f3d94..e18d52fc8d 100644
--- a/python/tvm/ffi/cython/base.pxi
+++ b/python/tvm/ffi/cython/base.pxi
@@ -131,7 +131,7 @@ cdef extern from "tvm/ffi/c_api.h":
         void (*update_traceback)(TVMFFIObjectHandle self, const 
TVMFFIByteArray* traceback)
 
     ctypedef int (*TVMFFISafeCallType)(
-        void* ctx, const TVMFFIAny* args, int32_t num_args,
+        void* handle, const TVMFFIAny* args, int32_t num_args,
         TVMFFIAny* result) noexcept
 
     int TVMFFIObjectFree(TVMFFIObjectHandle obj) nogil
diff --git a/src/runtime/library_module.cc b/src/runtime/library_module.cc
index 18f973daf1..39690bd81b 100644
--- a/src/runtime/library_module.cc
+++ b/src/runtime/library_module.cc
@@ -113,7 +113,7 @@ Module LoadModuleFromBinary(const std::string& type_key, 
dmlc::Stream* stream) {
  * \param root_module the output root module
  * \param dso_ctx_addr the output dso module
  */
-void ProcessModuleBlob(const char* mblob, ObjectPtr<Library> lib,
+void ProcessLibraryBin(const char* mblob, ObjectPtr<Library> lib,
                        FFIFunctionWrapper packed_func_wrapper, 
runtime::Module* root_module,
                        runtime::ModuleNode** dso_ctx_addr = nullptr) {
   ICHECK(mblob != nullptr);
@@ -184,13 +184,13 @@ Module CreateModuleFromLibrary(ObjectPtr<Library> lib, 
FFIFunctionWrapper packed
   InitContextFunctions([lib](const char* fname) { return 
lib->GetSymbol(fname); });
   auto n = make_object<LibraryModuleNode>(lib, packed_func_wrapper);
   // Load the imported modules
-  const char* dev_mblob =
-      reinterpret_cast<const 
char*>(lib->GetSymbol(runtime::symbol::tvm_dev_mblob));
+  const char* library_bin =
+      reinterpret_cast<const 
char*>(lib->GetSymbol(runtime::symbol::tvm_ffi_library_bin));
 
   Module root_mod;
   runtime::ModuleNode* dso_ctx_addr = nullptr;
-  if (dev_mblob != nullptr) {
-    ProcessModuleBlob(dev_mblob, lib, packed_func_wrapper, &root_mod, 
&dso_ctx_addr);
+  if (library_bin != nullptr) {
+    ProcessLibraryBin(library_bin, lib, packed_func_wrapper, &root_mod, 
&dso_ctx_addr);
   } else {
     // Only have one single DSO Module
     root_mod = Module(n);
@@ -198,7 +198,8 @@ Module CreateModuleFromLibrary(ObjectPtr<Library> lib, 
FFIFunctionWrapper packed
   }
 
   // allow lookup of symbol from root (so all symbols are visible).
-  if (auto* ctx_addr = 
reinterpret_cast<void**>(lib->GetSymbol(runtime::symbol::tvm_module_ctx))) {
+  if (auto* ctx_addr =
+          
reinterpret_cast<void**>(lib->GetSymbol(runtime::symbol::tvm_ffi_library_ctx))) 
{
     *ctx_addr = dso_ctx_addr;
   }
 
diff --git a/src/target/codegen.cc b/src/target/codegen.cc
index 8ddc071cba..9d3f1529c8 100644
--- a/src/target/codegen.cc
+++ b/src/target/codegen.cc
@@ -305,7 +305,7 @@ std::string PackImportsToC(const runtime::Module& mod, bool 
system_lib,
         << "c_symbol_prefix advanced option should be used in conjuction with 
system-lib";
   }
 
-  std::string mdev_blob_name = c_symbol_prefix + 
runtime::symbol::tvm_dev_mblob;
+  std::string mdev_blob_name = c_symbol_prefix + 
runtime::symbol::tvm_ffi_library_bin;
   std::string blob = PackImportsToBytes(mod);
 
   // translate to C program
@@ -365,7 +365,7 @@ 
TVM_FFI_REGISTER_GLOBAL("target.Build").set_body_typed(Build);
 
 // Export a few auxiliary function to the runtime namespace.
 TVM_FFI_REGISTER_GLOBAL("runtime.ModuleImportsBlobName").set_body_typed([]() 
-> std::string {
-  return runtime::symbol::tvm_dev_mblob;
+  return runtime::symbol::tvm_ffi_library_bin;
 });
 
 TVM_FFI_REGISTER_GLOBAL("runtime.ModulePackImportsToNDArray")
diff --git a/src/target/llvm/codegen_blob.cc b/src/target/llvm/codegen_blob.cc
index 343fdca3ee..8ea964b6d2 100644
--- a/src/target/llvm/codegen_blob.cc
+++ b/src/target/llvm/codegen_blob.cc
@@ -73,9 +73,9 @@ std::unique_ptr<llvm::Module> CodeGenBlob(const std::string& 
data, bool system_l
   llvm_target->SetTargetMetadata(module.get());
   module->setDataLayout(tm->createDataLayout());
   auto* blob_value = llvm::ConstantDataArray::getString(*ctx, data, false);
-  std::string mdev_blob_name = c_symbol_prefix + 
runtime::symbol::tvm_dev_mblob;
+  std::string mdev_blob_name = c_symbol_prefix + 
runtime::symbol::tvm_ffi_library_bin;
 
-  auto* tvm_dev_mblob = new llvm::GlobalVariable(
+  auto* tvm_ffi_library_bin = new llvm::GlobalVariable(
       *module, blob_value->getType(), true, 
llvm::GlobalValue::ExternalLinkage, blob_value,
       mdev_blob_name, nullptr, llvm::GlobalVariable::NotThreadLocal, 0);
 
@@ -88,17 +88,17 @@ std::unique_ptr<llvm::Module> CodeGenBlob(const 
std::string& data, bool system_l
   const size_t large_data_threshold = 1 << 30;
   if (data.size() > large_data_threshold && triple.getArch() == 
llvm::Triple::x86_64 &&
       triple.isOSBinFormatELF()) {
-    tvm_dev_mblob->setSection(".lrodata");
+    tvm_ffi_library_bin->setSection(".lrodata");
   }
 
 #if TVM_LLVM_VERSION >= 100
-  tvm_dev_mblob->setAlignment(llvm::Align(1));
+  tvm_ffi_library_bin->setAlignment(llvm::Align(1));
 #else
-  tvm_dev_mblob->setAlignment(1);
+  tvm_ffi_library_bin->setAlignment(1);
 #endif
 
   if (triple.isOSWindows()) {
-    
tvm_dev_mblob->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
+    
tvm_ffi_library_bin->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
   }
 
   if (system_lib) {
@@ -109,31 +109,32 @@ std::unique_ptr<llvm::Module> CodeGenBlob(const 
std::string& data, bool system_l
     auto int8_ptr_ty = llvmGetPointerTo(int8_ty, 0);
 
     llvm::Constant* constant_zero = llvm::Constant::getNullValue(int32_ty);
-    auto* tvm_dev_mblob_reg =
+    auto* tvm_ffi_library_bin_reg =
         new llvm::GlobalVariable(*module, int32_ty, false, 
llvm::GlobalValue::InternalLinkage,
                                  constant_zero, mdev_blob_name + "_reg_");
-    auto tvm_dev_mblob_reg_alignment =
+    auto tvm_ffi_library_bin_reg_alignment =
 #if TVM_LLVM_VERSION >= 110
         module->getDataLayout().getABITypeAlign(int32_ty);
 #else
         module->getDataLayout().getABITypeAlignment(int32_ty);
 #endif
 #if TVM_LLVM_VERSION >= 100
-    tvm_dev_mblob_reg->setAlignment(llvm::Align(tvm_dev_mblob_reg_alignment));
+    
tvm_ffi_library_bin_reg->setAlignment(llvm::Align(tvm_ffi_library_bin_reg_alignment));
 #else
-    tvm_dev_mblob_reg->setAlignment(tvm_dev_mblob_reg_alignment);
+    tvm_ffi_library_bin_reg->setAlignment(tvm_ffi_library_bin_reg_alignment);
 #endif
 
-    auto* tvm_dev_mblob_string_ty = llvm::ArrayType::get(int8_ty, 
mdev_blob_name.length() + 1);
-    auto* tvm_dev_mblob_string_value =
+    auto* tvm_ffi_library_bin_string_ty =
+        llvm::ArrayType::get(int8_ty, mdev_blob_name.length() + 1);
+    auto* tvm_ffi_library_bin_string_value =
         llvm::ConstantDataArray::getString(*ctx, mdev_blob_name, true);
-    auto* tvm_dev_mblob_string = new llvm::GlobalVariable(
-        *module, tvm_dev_mblob_string_ty, true, 
llvm::GlobalValue::PrivateLinkage,
-        tvm_dev_mblob_string_value, mdev_blob_name + ".str");
+    auto* tvm_ffi_library_bin_string = new llvm::GlobalVariable(
+        *module, tvm_ffi_library_bin_string_ty, true, 
llvm::GlobalValue::PrivateLinkage,
+        tvm_ffi_library_bin_string_value, mdev_blob_name + ".str");
 #if TVM_LLVM_VERSION >= 100
-    tvm_dev_mblob_string->setAlignment(llvm::Align(1));
+    tvm_ffi_library_bin_string->setAlignment(llvm::Align(1));
 #else
-    tvm_dev_mblob_string->setAlignment(1);
+    tvm_ffi_library_bin_string->setAlignment(1);
 #endif
 
     // Global init function
@@ -185,12 +186,12 @@ std::unique_ptr<llvm::Module> CodeGenBlob(const 
std::string& data, bool system_l
     ir_builder.SetInsertPoint(var_init_fn_bb);
     llvm::Constant* indices[] = {constant_zero, constant_zero};
     llvm::SmallVector<llvm::Value*, 2> args;
-    
args.push_back(llvm::ConstantExpr::getGetElementPtr(tvm_dev_mblob_string_ty,
-                                                        tvm_dev_mblob_string, 
indices));
+    
args.push_back(llvm::ConstantExpr::getGetElementPtr(tvm_ffi_library_bin_string_ty,
+                                                        
tvm_ffi_library_bin_string, indices));
     args.push_back(
-        llvm::ConstantExpr::getGetElementPtr(blob_value->getType(), 
tvm_dev_mblob, indices));
+        llvm::ConstantExpr::getGetElementPtr(blob_value->getType(), 
tvm_ffi_library_bin, indices));
     auto* tvm_backend_fn_ret_value = ir_builder.CreateCall(tvm_backend_fn, 
args);
-    ir_builder.CreateStore(tvm_backend_fn_ret_value, tvm_dev_mblob_reg);
+    ir_builder.CreateStore(tvm_backend_fn_ret_value, tvm_ffi_library_bin_reg);
     ir_builder.CreateRetVoid();
   }
 
diff --git a/src/target/llvm/codegen_cpu.cc b/src/target/llvm/codegen_cpu.cc
index bfbd65e524..42a4151f2c 100644
--- a/src/target/llvm/codegen_cpu.cc
+++ b/src/target/llvm/codegen_cpu.cc
@@ -434,7 +434,8 @@ llvm::Value* 
CodeGenCPU::GetContextPtr(llvm::GlobalVariable* gv) {
 }
 
 void CodeGenCPU::InitGlobalContext(bool dynamic_lookup) {
-  std::string ctx_symbol = system_lib_prefix_.value_or("") + 
tvm::runtime::symbol::tvm_module_ctx;
+  std::string ctx_symbol =
+      system_lib_prefix_.value_or("") + 
tvm::runtime::symbol::tvm_ffi_library_ctx;
   // Module context
   gv_mod_ctx_ = InitContextPtr(t_void_p_, ctx_symbol);
   // Register back the locations.
diff --git a/src/target/llvm/llvm_module.cc b/src/target/llvm/llvm_module.cc
index ed70d86926..552c2b74c6 100644
--- a/src/target/llvm/llvm_module.cc
+++ b/src/target/llvm/llvm_module.cc
@@ -437,8 +437,8 @@ void LLVMModuleNode::InitMCJIT() {
   // run ctors
   mcjit_ee_->runStaticConstructorsDestructors(false);
 
-  if (void** ctx_addr =
-          
reinterpret_cast<void**>(GetGlobalAddr(runtime::symbol::tvm_module_ctx, 
*llvm_target))) {
+  if (void** ctx_addr = reinterpret_cast<void**>(
+          GetGlobalAddr(runtime::symbol::tvm_ffi_library_ctx, *llvm_target))) {
     *ctx_addr = this;
   }
   runtime::InitContextFunctions(
@@ -561,8 +561,8 @@ void LLVMModuleNode::InitORCJIT() {
   err = ctorRunner.run();
   ICHECK(!err) << llvm::toString(std::move(err));
 
-  if (void** ctx_addr =
-          
reinterpret_cast<void**>(GetGlobalAddr(runtime::symbol::tvm_module_ctx, 
*llvm_target))) {
+  if (void** ctx_addr = reinterpret_cast<void**>(
+          GetGlobalAddr(runtime::symbol::tvm_ffi_library_ctx, *llvm_target))) {
     *ctx_addr = this;
   }
   runtime::InitContextFunctions(
diff --git a/src/target/source/codegen_c_host.cc 
b/src/target/source/codegen_c_host.cc
index ad73fc9079..e2535dbf68 100644
--- a/src/target/source/codegen_c_host.cc
+++ b/src/target/source/codegen_c_host.cc
@@ -34,7 +34,7 @@
 namespace tvm {
 namespace codegen {
 
-CodeGenCHost::CodeGenCHost() { module_name_ = 
name_supply_->FreshName("__tvm_module_ctx"); }
+CodeGenCHost::CodeGenCHost() { module_name_ = 
name_supply_->FreshName("__tvm_ffi_library_ctx"); }
 
 void CodeGenCHost::Init(bool output_ssa, bool emit_asserts, bool 
emit_fwd_func_decl,
                         std::string target_str, const 
std::unordered_set<std::string>& devices) {
@@ -53,7 +53,7 @@ void CodeGenCHost::Init(bool output_ssa, bool emit_asserts, 
bool emit_fwd_func_d
 }
 
 void CodeGenCHost::InitGlobalContext() {
-  decl_stream << "void* " << tvm::runtime::symbol::tvm_module_ctx << " = 
NULL;\n";
+  decl_stream << "void* " << tvm::runtime::symbol::tvm_ffi_library_ctx << " = 
NULL;\n";
 }
 
 void CodeGenCHost::DefineModuleName() { decl_stream << "void* " << 
module_name_ << " = NULL;\n"; }
diff --git a/src/tir/transforms/make_packed_api.cc 
b/src/tir/transforms/make_packed_api.cc
index 340e018a8d..250f51d09c 100644
--- a/src/tir/transforms/make_packed_api.cc
+++ b/src/tir/transforms/make_packed_api.cc
@@ -336,7 +336,7 @@ PrimFunc MakePackedAPI(PrimFunc func) {
     }
   }
 
-  // signature: (void* self, TVMFFIAny* packed_args, int num_args, TVMFFIAny* 
v_result)
+  // signature: (void* handle, TVMFFIAny* packed_args, int num_args, 
TVMFFIAny* v_result)
   Array<Var> args{v_self_handle, v_packed_args, v_num_packed_args, v_result};
 
   // Arg definitions are defined before buffer binding to avoid the use before

Reply via email to