I’m studying apps/bundle_deploy example code which runs on crt runtime. This function was called at the beginning to pre-load all operator functions:
// src/runtime/crt/crt_backend_api.c:
int TVMBackendRegisterSystemLibSymbol(const char* name, void* ptr) {
g_fexecs = vrealloc(g_fexecs, sizeof(TVMPackedFunc) * (g_fexecs_count + 1));
snprintf(g_fexecs[g_fexecs_count].name, sizeof(g_fexecs[g_fexecs_count].name), "%s", name);
g_fexecs[g_fexecs_count].fexec = ptr;
g_fexecs_count++;
return 0;
}
However, I cannot find where this function was called by browsing source code. A brutal grep search indicates this one might be built within llvm host-side.
$ grep -R SystemLibSymbol *
Binary file apps/bundle_deploy/build/demo_static matches
Binary file apps/bundle_deploy/build/model.o matches
Binary file apps/bundle_deploy/build/bundle_static.o matches
Binary file apps/bundle_deploy/build/bundle.so matches
Binary file build/libtvm.so matches
Binary file build/libtvm_runtime.so matches
Binary file build/CMakeFiles/tvm.dir/src/target/llvm/codegen_cpu.cc.o matches
Binary file build/CMakeFiles/tvm.dir/src/target/llvm/codegen_blob.cc.o matches
Binary file build/CMakeFiles/tvm.dir/src/target/codegen.cc.o matches
Binary file build/CMakeFiles/tvm.dir/src/runtime/system_library.cc.o matches
Binary file build/CMakeFiles/tvm_runtime.dir/src/runtime/system_library.cc.o matches
include/tvm/runtime/c_backend_api.h:TVM_DLL int TVMBackendRegisterSystemLibSymbol(const char* name, void* ptr);
rust/runtime/src/module/syslib.rs:pub extern "C" fn TVMBackendRegisterSystemLibSymbol(
src/target/llvm/codegen_blob.cc: // Create TVMBackendRegisterSystemLibSymbol function
src/target/llvm/codegen_blob.cc: llvm::Twine("TVMBackendRegisterSystemLibSymbol"), module.get());
src/target/llvm/codegen_cpu.cc: llvm::Function::ExternalLinkage, "TVMBackendRegisterSystemLibSymbol", module_.get());
src/target/codegen.cc: os << "extern int TVMBackendRegisterSystemLibSymbol(const char*, void*);\n";
src/target/codegen.cc: << "TVMBackendRegisterSystemLibSymbol(\"" << runtime::symbol::tvm_dev_mblob << "\", (void*)"
src/runtime/system_library.cc:int TVMBackendRegisterSystemLibSymbol(const char* name, void* ptr) {
src/runtime/crt/crt_backend_api.c:int TVMBackendRegisterSystemLibSymbol(const char* name, void* ptr) {
Gdb calling stack shows it was called by __tvm_module_startup:
TVMBackendRegisterSystemLibSymbol(const char * ....)
__tvm_module_startup
__libc_csu_init
libc.so.6!__libc_start_main(int (*)(int, char...)
_start
Can anyone help point out how is __tvm_module_startup being invoked in source code or linker script somewhere?