TVM 宏

TVM 宏#

源码:tvm/include/tvm/runtime/c_runtime_api.h

// Macros to do weak linking
#ifdef _MSC_VER
#define TVM_WEAK __declspec(selectany)
#else
#define TVM_WEAK __attribute__((weak))
#endif

#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#define TVM_DLL EMSCRIPTEN_KEEPALIVE
#endif

// helper macro to suppress unused warning
#if defined(__GNUC__)
#define TVM_ATTRIBUTE_UNUSED __attribute__((unused))
#else
#define TVM_ATTRIBUTE_UNUSED
#endif

#ifndef TVM_DLL
#ifdef _WIN32
#ifdef TVM_EXPORTS
#define TVM_DLL __declspec(dllexport)
#else
#define TVM_DLL __declspec(dllimport)
#endif
#else
#define TVM_DLL __attribute__((visibility("default")))
#endif
#endif

这段代码主要是为了实现弱链接和动态库的导出。

  1. 首先,它定义了宏 TVM_WEAK,用于实现弱链接。在 Windows 平台上,使用 __declspec(selectany) 可以实现弱链接;在其他平台上,使用 __attribute__((weak)) 也可以实现弱链接。

  2. 然后,它检查是否定义了 __EMSCRIPTEN__。如果定义了,那么它会包含 <emscripten/emscripten.h> 头文件,并定义宏 TVM_DLL,值为 EMSCRIPTEN_KEEPALIVE。这个宏用于告诉 Emscripten 在生成的 JavaScript 代码中保留这个函数或变量,以便在运行时可以访问到。

  3. 接下来,它定义了宏 TVM_ATTRIBUTE_UNUSED,用于抑制未使用的警告。在 GCC 编译器下,使用 __attribute__((unused)) 可以实现这个功能;在其他编译器下,这个宏没有定义。

  4. 最后,它检查是否定义了 TVM_DLL。如果没有定义,那么它会再次检查是否定义了 _WIN32。如果定义了 _WIN32,那么它会检查是否定义了 TVM_EXPORTS。如果定义了 TVM_EXPORTS,那么它会定义宏 TVM_DLL,值为 __declspec(dllexport);否则,它会定义宏 TVM_DLL,值为 __declspec(dllimport)。如果 _WIN32 没有定义,那么它会定义宏 TVM_DLL,值为 __attribute__((visibility("default")))