// // NVIDIA_COPYRIGHT_BEGIN // // Copyright (c) 2014-2023, NVIDIA CORPORATION. All rights reserved. // // NVIDIA CORPORATION and its licensors retain all intellectual property // and proprietary rights in and to this software, related documentation // and any modifications thereto. Any use, reproduction, disclosure or // distribution of this software and related documentation without an express // license agreement from NVIDIA CORPORATION is strictly prohibited. // // NVIDIA_COPYRIGHT_END // #ifndef NVVM_H #define NVVM_H #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include /*****************************//** * * \defgroup error Error Handling * ********************************/ /** * \ingroup error * \brief NVVM API call result code. */ typedef enum { NVVM_SUCCESS = 0, NVVM_ERROR_OUT_OF_MEMORY = 1, NVVM_ERROR_PROGRAM_CREATION_FAILURE = 2, NVVM_ERROR_IR_VERSION_MISMATCH = 3, NVVM_ERROR_INVALID_INPUT = 4, NVVM_ERROR_INVALID_PROGRAM = 5, NVVM_ERROR_INVALID_IR = 6, NVVM_ERROR_INVALID_OPTION = 7, NVVM_ERROR_NO_MODULE_IN_PROGRAM = 8, NVVM_ERROR_COMPILATION = 9 } nvvmResult; /** * \ingroup error * \brief Get the message string for the given #nvvmResult code. * * \param [in] result NVVM API result code. * \return Message string for the given #nvvmResult code. */ const char *nvvmGetErrorString(nvvmResult result); /****************************************//** * * \defgroup query General Information Query * *******************************************/ /** * \ingroup query * \brief Get the NVVM version. * * \param [out] major NVVM major version number. * \param [out] minor NVVM minor version number. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * */ nvvmResult nvvmVersion(int *major, int *minor); /** * \ingroup query * \brief Get the NVVM IR version. * * \param [out] majorIR NVVM IR major version number. * \param [out] minorIR NVVM IR minor version number. * \param [out] majorDbg NVVM IR debug metadata major version number. * \param [out] minorDbg NVVM IR debug metadata minor version number. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * */ nvvmResult nvvmIRVersion(int *majorIR, int *minorIR, int *majorDbg, int *minorDbg); /********************************//** * * \defgroup compilation Compilation * ***********************************/ /** * \ingroup compilation * \brief NVVM Program. * * An opaque handle for a program. */ typedef struct _nvvmProgram *nvvmProgram; /** * \ingroup compilation * \brief Create a program, and set the value of its handle to \p *prog. * * \param [in] prog NVVM program. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_OUT_OF_MEMORY \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink * * \see nvvmDestroyProgram() */ nvvmResult nvvmCreateProgram(nvvmProgram *prog); /** * \ingroup compilation * \brief Destroy a program. * * \param [in] prog NVVM program. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink * * \see nvvmCreateProgram() */ nvvmResult nvvmDestroyProgram(nvvmProgram *prog); /** * \ingroup compilation * \brief Add a module level NVVM IR to a program. * * The \p buffer should contain an NVVM IR module. * The module should have NVVM IR either in the LLVM 7.0.1 bitcode * representation or in the LLVM 7.0.1 text representation. Support for reading * the text representation of NVVM IR is deprecated and may be removed in a * later version. * * \param [in] prog NVVM program. * \param [in] buffer NVVM IR module in the bitcode or text * representation. * \param [in] size Size of the NVVM IR module. * \param [in] name Name of the NVVM IR module. * If NULL, "" is used as the name. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_OUT_OF_MEMORY \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_INPUT \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink */ nvvmResult nvvmAddModuleToProgram(nvvmProgram prog, const char *buffer, size_t size, const char *name); /** * \ingroup compilation * \brief Add a module level NVVM IR to a program. * * The \p buffer should contain an NVVM IR module. The module should have NVVM * IR in the LLVM 7.0.1 bitcode representation. * * A module added using this API is lazily loaded - the only symbols loaded * are those that are required by module(s) loaded using * nvvmAddModuleToProgram. It is an error for a program to have * all modules loaded using this API. Compiler may also optimize entities * in this module by making them internal to the linked NVVM IR module, * making them eligible for other optimizations. Due to these * optimizations, this API to load a module is more efficient and should * be used where possible. * * \param [in] prog NVVM program. * \param [in] buffer NVVM IR module in the bitcode representation. * \param [in] size Size of the NVVM IR module. * \param [in] name Name of the NVVM IR module. * If NULL, "" is used as the name. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_OUT_OF_MEMORY \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_INPUT \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink */ nvvmResult nvvmLazyAddModuleToProgram(nvvmProgram prog, const char *buffer, size_t size, const char *name); /** * \ingroup compilation * \brief Compile the NVVM program. * * The NVVM IR modules in the program will be linked at the IR level. * The linked IR program is compiled to PTX. * * The target datalayout in the linked IR program is used to * determine the address size (32bit vs 64bit). * * The valid compiler options are: * * - -g (enable generation of full debugging information). * Full debug support is only valid with '-opt=0'. Debug support * requires the input module to utilize NVVM IR Debug Metadata. * Line number (line info) only generation is also enabled via NVVM IR * Debug Metadata, there is no specific libNVVM API flag for that case. * - -opt= * - 0 (disable optimizations) * - 3 (default, enable optimizations) * - -arch= * - compute_50 * - compute_52 (default) * - compute_53 * - compute_60 * - compute_61 * - compute_62 * - compute_70 * - compute_72 * - compute_75 * - compute_80 * - compute_87 * - compute_89 * - compute_90 * - -ftz= * - 0 (default, preserve denormal values, when performing * single-precision floating-point operations) * - 1 (flush denormal values to zero, when performing * single-precision floating-point operations) * - -prec-sqrt= * - 0 (use a faster approximation for single-precision * floating-point square root) * - 1 (default, use IEEE round-to-nearest mode for * single-precision floating-point square root) * - -prec-div= * - 0 (use a faster approximation for single-precision * floating-point division and reciprocals) * - 1 (default, use IEEE round-to-nearest mode for * single-precision floating-point division and reciprocals) * - -fma= * - 0 (disable FMA contraction) * - 1 (default, enable FMA contraction) * - -jump-table-density=[0-101] * Specify the case density percentage in switch statements, and use * it as a minimal threshold to determine whether jump table(brx.idx * instruction) will be used to implement a switch statement. Default * value is 101. The percentage ranges from 0 to 101 inclusively. * - -gen-lto (Generate LTO IR instead of PTX). * * \param [in] prog NVVM program. * \param [in] numOptions Number of compiler \p options passed. * \param [in] options Compiler options in the form of C string array. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_OUT_OF_MEMORY \endlink * - \link ::nvvmResult NVVM_ERROR_IR_VERSION_MISMATCH \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_OPTION \endlink * - \link ::nvvmResult NVVM_ERROR_NO_MODULE_IN_PROGRAM \endlink * - \link ::nvvmResult NVVM_ERROR_COMPILATION \endlink */ nvvmResult nvvmCompileProgram(nvvmProgram prog, int numOptions, const char **options); /** * \ingroup compilation * \brief Verify the NVVM program. * * The valid compiler options are: * * Same as for nvvmCompileProgram(). * * \param [in] prog NVVM program. * \param [in] numOptions Number of compiler \p options passed. * \param [in] options Compiler options in the form of C string array. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_OUT_OF_MEMORY \endlink * - \link ::nvvmResult NVVM_ERROR_IR_VERSION_MISMATCH \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_IR \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_OPTION \endlink * - \link ::nvvmResult NVVM_ERROR_NO_MODULE_IN_PROGRAM \endlink * * \see nvvmCompileProgram() */ nvvmResult nvvmVerifyProgram(nvvmProgram prog, int numOptions, const char **options); /** * \ingroup compilation * \brief Get the size of the compiled result. * * \param [in] prog NVVM program. * \param [out] bufferSizeRet Size of the compiled result (including the * trailing NULL). * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink */ nvvmResult nvvmGetCompiledResultSize(nvvmProgram prog, size_t *bufferSizeRet); /** * \ingroup compilation * \brief Get the compiled result. * * The result is stored in the memory pointed to by \p buffer. * * \param [in] prog NVVM program. * \param [out] buffer Compiled result. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink */ nvvmResult nvvmGetCompiledResult(nvvmProgram prog, char *buffer); /** * \ingroup compilation * \brief Get the Size of Compiler/Verifier Message. * * The size of the message string (including the trailing NULL) is stored into * \p bufferSizeRet when the return value is NVVM_SUCCESS. * * \param [in] prog NVVM program. * \param [out] bufferSizeRet Size of the compilation/verification log (including the trailing NULL). * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink */ nvvmResult nvvmGetProgramLogSize(nvvmProgram prog, size_t *bufferSizeRet); /** * \ingroup compilation * \brief Get the Compiler/Verifier Message. * * The NULL terminated message string is stored in the memory pointed to by * \p buffer when the return value is NVVM_SUCCESS. * * \param [in] prog NVVM program. * \param [out] buffer Compilation/Verification log. * \return * - \link ::nvvmResult NVVM_SUCCESS \endlink * - \link ::nvvmResult NVVM_ERROR_INVALID_PROGRAM \endlink */ nvvmResult nvvmGetProgramLog(nvvmProgram prog, char *buffer); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* NVVM_H */