#pragma once // // This file hsa the code for explicity loading amdoclcl.dll. // Exported functions from amdoclcl.dll can be added for usage as need-basis. // With explicit/dynamic loading roc will not have any linkage to amdoclcl.lib. // #include "thread/thread.hpp" #include "acl.h" #include "utils/debug.hpp" #if defined(WITH_LIGHTNING_COMPILER) #error Should not include this file #endif // defined(WITH_LIGHTNING_COMPILER) using namespace amd; namespace roc { // // To use any new exported function from amdhsacl.dll please add/make that function specific changes // in typedef below, struct CompLibApi and in hsacompilerLib.cpp::LoadCompLib() function. // // // Convention: The typedefed function name must be prefixed with pfn_ // typedef aclCompiler* (ACL_API_ENTRY *pfn_aclCompilerInit) (aclCompilerOptions *opts, acl_error *error_code); typedef aclTargetInfo (ACL_API_ENTRY *pfn_aclGetTargetInfo) (const char*, const char*, acl_error*); typedef aclBinary* (ACL_API_ENTRY *pfn_aclBinaryInit) (size_t, const aclTargetInfo*, const aclBinaryOptions*, acl_error*); typedef acl_error (ACL_API_ENTRY *pfn_aclInsertSection) (aclCompiler *cl, aclBinary *binary, const void *data, size_t data_size, aclSections id); typedef acl_error (ACL_API_ENTRY *pfn_aclCompile) (aclCompiler *cl, aclBinary *bin, const char *options, aclType from, aclType to, aclLogFunction compile_callback); typedef acl_error (ACL_API_ENTRY *pfn_aclCompilerFini) (aclCompiler *cl); typedef acl_error (ACL_API_ENTRY *pfn_aclBinaryFini) (aclBinary *bin); typedef acl_error (ACL_API_ENTRY *pfn_aclWriteToMem) (aclBinary *bin,void **mem, size_t *size); typedef acl_error (ACL_API_ENTRY *pfn_aclQueryInfo) (aclCompiler *cl, const aclBinary *binary, aclQueryType query, const char *kernel, void *data_ptr, size_t *ptr_size); typedef const void* (ACL_API_ENTRY *pfn_aclExtractSymbol) (aclCompiler *cl,const aclBinary *binary,size_t *size,aclSections id,const char *symbol,acl_error *error_code); typedef aclBinary* (ACL_API_ENTRY *pfn_aclReadFromMem) (void *mem,size_t size, acl_error *error_code); typedef char* (ACL_API_ENTRY *pfn_aclGetCompilerLog) (aclCompiler* cl); typedef aclBinary* (ACL_API_ENTRY *pfn_aclCreateFromBinary) (const aclBinary *binary,aclBIFVersion version); typedef aclBIFVersion (ACL_API_ENTRY *pfn_aclBinaryVersion) (const aclBinary *binary); typedef acl_error (ACL_API_ENTRY *pfn_aclLink) (aclCompiler* cl, aclBinary *src_bin, unsigned int num_libs, aclBinary **libs, aclType link_mode,const char* options, aclLogFunction link_callback); // // Convention: prefix struct member variable with with underscore '_' // would be nice if there was no underscore prfix, but on Linux the token // pasting in the macro is srtict and his is the workaround. // struct CompLibApi { pfn_aclCompilerInit _aclCompilerInit; pfn_aclGetTargetInfo _aclGetTargetInfo; pfn_aclBinaryInit _aclBinaryInit; pfn_aclInsertSection _aclInsertSection; pfn_aclCompile _aclCompile; pfn_aclCompilerFini _aclCompilerFini; pfn_aclBinaryFini _aclBinaryFini; pfn_aclWriteToMem _aclWriteToMem; pfn_aclQueryInfo _aclQueryInfo; pfn_aclExtractSymbol _aclExtractSymbol; pfn_aclReadFromMem _aclReadFromMem; pfn_aclGetCompilerLog _aclGetCompilerLog; pfn_aclCreateFromBinary _aclCreateFromBinary; pfn_aclBinaryVersion _aclBinaryVersion; pfn_aclLink _aclLink; }; // // Use g_ prefix for all global variables. // extern void* g_complibModule; extern CompLibApi g_complibApi; // Note: initializes global variable g_complibApi. // Not sure what error values we have, for now returning false on failure. bool LoadCompLib(bool isOfflineDevice=false); void UnloadCompLib(); } // namespace roc