From 5637f52e002d5494ce1143efcbbadb44e6a5e40d Mon Sep 17 00:00:00 2001 From: foreman Date: Mon, 13 Jul 2015 18:17:22 -0400 Subject: [PATCH] P4 to Git Change 1170017 by kebai@kebai-lnx-desktop on 2015/07/13 14:12:55 ECR #304775 - Back out CL 1170011 Affected files ... ... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/cache.cpp#2 delete ... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/cache.hpp#2 delete ... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/frontend.cpp#35 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/frontend_clang.cpp#21 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/v0_8/if_acl.cpp#69 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/gpu/amdil_be.cpp#44 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/gpu/hsail_be.cpp#43 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/utils/OPTIONS.def#125 edit ... //depot/stg/opencl/drivers/opencl/tests/kcache/Makefile#2 delete ... //depot/stg/opencl/drivers/opencl/tests/kcache/build/Makefile#2 delete ... //depot/stg/opencl/drivers/opencl/tests/kcache/build/Makefile.kcache#2 delete ... //depot/stg/opencl/drivers/opencl/tests/kcache/kCacheTest_std.txt#2 delete ... //depot/stg/opencl/drivers/opencl/tests/kcache/kernel.cl#2 delete ... //depot/stg/opencl/drivers/opencl/tests/kcache/main.cpp#2 delete --- rocclr/compiler/lib/backends/common/cache.cpp | 1152 ----------------- rocclr/compiler/lib/backends/common/cache.hpp | 123 -- .../compiler/lib/backends/common/frontend.cpp | 52 +- .../lib/backends/common/frontend_clang.cpp | 55 +- .../lib/backends/common/v0_8/if_acl.cpp | 129 +- rocclr/compiler/lib/utils/OPTIONS.def | 8 - 6 files changed, 11 insertions(+), 1508 deletions(-) delete mode 100644 rocclr/compiler/lib/backends/common/cache.cpp delete mode 100644 rocclr/compiler/lib/backends/common/cache.hpp diff --git a/rocclr/compiler/lib/backends/common/cache.cpp b/rocclr/compiler/lib/backends/common/cache.cpp deleted file mode 100644 index b0a1e814ed..0000000000 --- a/rocclr/compiler/lib/backends/common/cache.cpp +++ /dev/null @@ -1,1152 +0,0 @@ -#include -#include "cache.hpp" - -// Check if a file exists -// -// In: -// fileName - Path to file -// -// Out: -// none -// -// Returns: -// true if the file exists -// false otherwise -// -bool KernelCache::fileExists(const std::string &fileName) -{ - struct stat info; - return 0 == stat(fileName.c_str(), &info); -} - -// Wipe the cache folder structure -// -// In: -// none -// -// Out: -// none -// -// Returns: -// true if folder wipe is ok -// false otherwise -// -bool KernelCache::wipeCacheFolders() -{ - for (int i = 0; i < 16; ++i) { - std::string dir = rootPath; - std::stringstream ss; - ss << amd::Os::fileSeparator() << std::hex << i; - dir += ss.str(); - if (amd::Os::pathExists(dir)) { - if (false == amd::Os::removePath(dir)) { - errorMsg = "Error deleting directory in cache"; - return false; - } - } - } - return true; -} - -// Setup cache tree structure -// -// In: -// none -// -// Out: -// none -// -// Returns: -// true if folders setup is ok -// false otherwise -// -bool KernelCache::setUpCacheFolders() -{ - // Directory structure is distributed as 16 * 16 in order to keep the file count per directory low - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - std::string dir = rootPath; - std::stringstream ss; - ss << amd::Os::fileSeparator() << std::hex << i << amd::Os::fileSeparator() << j; - dir += ss.str(); - if (false == amd::Os::createPath(dir)) { - errorMsg = "Error creating directory in cache"; - return false; - } - // Set folder to only owner accessible - if (!setAccessPermission(rootPath)) { - return false; - } - } - } - return true; -} - -#if _WIN32 -// Get Sid of account -// Caller will need to free the SID buffer (returned in sid) -// -// In: -// userName - accont name -// -// Out: -// sid - Sid of account -// -// Return: -// true if SID is obtained, false otherwise -// -bool KernelCache::getSid(TCHAR *username, PSID &sid) -{ - if (username == NULL) { - errorMsg = "Invalid user name in getSid mehtod"; - return false; - } - // If a buffer is too small, the count parameter will be set to the size needed. - const DWORD INITIAL_SIZE = 32; - SID_NAME_USE sidNameUse; - DWORD cbSid = 0, cchDomainName = 0; - DWORD dwSidBufferSize = INITIAL_SIZE, dwDomainBufferSize = INITIAL_SIZE; - // Create buffers for the SID and the domain name - sid = (PSID) new BYTE[dwSidBufferSize]; - if (sid == NULL) { - errorMsg = "Failed to allocate space for SID"; - return false; - } - memset(sid, 0, dwSidBufferSize); - TCHAR *wszDomainName = new TCHAR[dwDomainBufferSize]; - if (wszDomainName == NULL) { - delete[] sid; - errorMsg = "Failed to allocate space for domain name"; - return false; - } - memset(wszDomainName, 0, dwDomainBufferSize * sizeof(TCHAR)); - // Obtain the SID for the account name passed - while (true) { - // Set the count variables to the buffer sizes and retrieve the SID - cbSid = dwSidBufferSize; - cchDomainName = dwDomainBufferSize; - if (LookupAccountName(NULL, username, sid, &cbSid, wszDomainName, &cchDomainName, &sidNameUse)) { - if (IsValidSid(sid) == FALSE) { - delete[] sid; - delete[] wszDomainName; - errorMsg = "The SID for the account is invalid"; - return false; - } - break; - } - DWORD dwErrorCode = GetLastError(); - if (dwErrorCode == ERROR_INSUFFICIENT_BUFFER) { - if (cbSid > dwSidBufferSize) { - // Reallocate memory for the SID buffer - delete[] sid; - sid = (PSID) new BYTE[cbSid]; - if (sid == NULL) { - delete[] wszDomainName; - errorMsg = "Failed to allocate space for SID"; - return false; - } - memset(sid, 0, cbSid); - dwSidBufferSize = cbSid; - } - if (cchDomainName > dwDomainBufferSize) { - // Reallocate memory for the domain name buffer - delete[] wszDomainName; - wszDomainName = new TCHAR[cchDomainName]; - if (wszDomainName == NULL) { - delete[] sid; - errorMsg = "Failed to allocate space for domain name"; - } - memset(wszDomainName, 0, cchDomainName * sizeof(TCHAR)); - dwDomainBufferSize = cchDomainName; - } - } else { - delete[] sid; - delete[] wszDomainName; - errorMsg = "Failed to get user security identifier for the account, GetLastError returned" - + dwErrorCode; - return false; - } - } - delete[] wszDomainName; - return true; -} -#endif - -// Set file to only owner accessible -// -// In: -// fileName - Path to file -// isFile - True if fileName is a file, false if it is a path; false by default -// -// Out: -// none -// -// Returns: -// true if access permission is under control -// false otherwise -// -bool KernelCache::setAccessPermission(const std::string fileName, bool isFile) -{ -#if _WIN32 - TCHAR username[UNLEN + 1]; - DWORD username_len = UNLEN + 1; - if (!GetUserName(username, &username_len)) { - errorMsg = "Failed to get user name for the account"; - return false; - } - PSID sid = NULL; - if (!getSid(username, sid)) { - return false; - } - if (SetNamedSecurityInfo((LPTSTR)(fileName.c_str()), SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, - sid, NULL, NULL, NULL) != ERROR_SUCCESS ) { - delete[] sid; - errorMsg = "Failed to set user access permission"; - return false; - } - delete[] sid; -#else - int ret = -1; - if (isFile) { - ret = chmod(fileName.c_str(), S_IRUSR | S_IWUSR); - } else { - ret = chmod(fileName.c_str(), S_IRUSR | S_IWUSR | S_IXUSR); - } - if (ret < 0) { - errorMsg = "Failed to set user access permission"; - return false; - } -#endif - return true; -} - -// Open a file and read its contents -// Caller will need to free the memory created by this function (returned in contents) -// -// In: -// fileName - Path to file -// fileSize - File size -// -// Out: -// conttents - Pointer to file contents -// -// Returns: -// true if the file is read successfully -// false otherwise -// -bool KernelCache::readFile(const std::string &fileName, char **contents, size_t &fileSize) -{ - *contents = NULL; -#if _WIN32 - HANDLE hFile = CreateFile(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) { - errorMsg = "Error opening file for reading"; - return false; - } - LARGE_INTEGER size; - if (!GetFileSizeEx(hFile, &size)) { - errorMsg = "Last error code is " + std::to_string(GetLastError()); - CloseHandle(hFile); - return false; - } - char *memblock = new char [size.QuadPart]; - if (memblock == NULL) { - errorMsg = "Out of memory"; - CloseHandle(hFile); - return false; - } - DWORD dwBytesRead = 0; - if(FALSE == ReadFile(hFile, memblock, size.QuadPart, &dwBytesRead, NULL)) { - errorMsg = "Unable to read cache file"; - CloseHandle(hFile); - return false; - } - if (dwBytesRead != size.QuadPart) { - errorMsg = "Error reading cache file"; - CloseHandle(hFile); - return false; - } - CloseHandle(hFile); - *contents = memblock; - fileSize = size.QuadPart; -#else - FILE *cacheFile = fopen(fileName.c_str(), "rb"); - if (cacheFile == NULL) { - errorMsg = "Error opening file for reading"; - return false; - } - // Read lock for cache file - int fd = fileno(cacheFile); - if (fd == -1) { - errorMsg = "Error getting file descriptor"; - fclose(cacheFile); - return false; - } - struct flock fl = {F_RDLCK, SEEK_SET, 0, 0}; - if (fcntl(fd, F_SETLK, &fl) == -1) { - errorMsg = "Error setting file read lock"; - fclose(cacheFile); - return false; - } - // Read the file - fseek(cacheFile, 0, SEEK_END); - size_t size = ftell(cacheFile); - rewind(cacheFile); - char *memblock = new char [size]; - if (memblock == NULL) { - errorMsg = "Out of memory"; - fclose(cacheFile); - return false; - } - size_t result = fread(memblock, sizeof(char), size, cacheFile); - // Unlock the file - fl.l_type = F_UNLCK; - if (fcntl(fd, F_SETLK, &fl) == -1) { - errorMsg = "Error unlock file read lock"; - fclose(cacheFile); - return false; - } - if (result != size) { - errorMsg = "Error reading cache file"; - fclose(cacheFile); - delete[] memblock; - return false; - } - fclose(cacheFile); - *contents = memblock; - fileSize = size; -#endif - return true; -} - -// Open a file and write its contents -// -// In: -// fileName - Path to file -// data - Pointer to file contents -// size - Data size -// -// Out: -// none -// -// Returns: -// true if the file is written to file successfully -// false otherwise -// -bool KernelCache::writeFile(const std::string &fileName, const char *data, size_t size) -{ -#if _WIN32 - HANDLE hFile = CreateFile(fileName.c_str(), GENERIC_WRITE | WRITE_OWNER | READ_CONTROL, - 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) { - errorMsg = "Error opening file for writing"; - return false; - } - // Write file exclusively - DWORD dwBytesWritten = 0; - if (FALSE == WriteFile(hFile, data, size, &dwBytesWritten, NULL)) { - errorMsg = "Unable to write to file"; - CloseHandle(hFile); - return false; - } - if (dwBytesWritten != size) { - errorMsg = "Error writing cache file"; - CloseHandle(hFile); - return false; - } - CloseHandle(hFile); -#else - FILE *cacheFile = fopen(fileName.c_str(), "wb"); - if (cacheFile == NULL) { - errorMsg = "Error opening file for writing"; - return false; - } - // Exclusive write lock for cache file - int fd = fileno(cacheFile); - if (fd == -1) { - errorMsg = "Error getting file descriptor"; - fclose(cacheFile); - return false; - } - struct flock fl = {F_WRLCK, SEEK_SET, 0, 0}; - if (fcntl(fd, F_SETLK, &fl) == -1) { - errorMsg = "Error setting file write lock"; - std::cout << errorMsg << std::endl; - fclose(cacheFile); - return false; - } - // Write data to file - fwrite(data, sizeof(char), size, cacheFile); - // Unlock the file - fl.l_type = F_UNLCK; - if (fcntl(fd, F_SETLK, &fl) == -1) { - errorMsg = "Error unlock file write lock"; - fclose(cacheFile); - return false; - } - fclose(cacheFile); -#endif - // Set file to only owner accessible - if (!setAccessPermission(fileName, true)) { - return false; - } - return true; -} - -// Set the cache's root path -// -// In: -// chipName - Chip name -// -// Out: -// none -// -// Returns: -// true if root path of cache is set successfully -// false otherwise -// -bool KernelCache::setRootPath(const std::string &chipName) -{ - bool ok = false; - rootPath.clear(); -#if _WIN32 - // Set root path to \AppData\Local\AMD\CLCache - TCHAR userLocalAppDir[_MAX_PATH]; - // Get path for user specific and non-roaming data - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, userLocalAppDir))) { - rootPath = userLocalAppDir; - } else { - errorMsg = "User's local app dir is not found"; - return false; - } - // Ok, we have \AppData\Local, let's check for the rest and create if needed - rootPath += "\\AMD"; - if (!amd::Os::pathExists(rootPath)) { - ok = amd::Os::createPath(rootPath); - if (!ok) { - errorMsg = "Failed to create AMD directory"; - return false; - } - } - rootPath += "\\CLCache"; - if (!amd::Os::pathExists(rootPath)) { - ok = amd::Os::createPath(rootPath); - if (!ok) { - errorMsg = "Failed to create CLCache directory"; - return false; - } - } - // Set folder to only owner accessible - if (!setAccessPermission(rootPath)) { - return false; - } - rootPath += "\\" + chipName; - if (!amd::Os::pathExists(rootPath)) { - ok = amd::Os::createPath(rootPath); - if (!ok) { - errorMsg = "Failed to create " + chipName + " directory"; - return false; - } - } - // Set folder to only owner accessible - if (!setAccessPermission(rootPath)) { - return false; - } -#else - const char *homedir = getpwuid(getuid())->pw_dir; - if (homedir == NULL) { - errorMsg = "Failed to get HOME directory"; - return false; - } - rootPath = homedir; - // Verify the path exists - if (!amd::Os::pathExists(rootPath)) { - errorMsg = "User's home directory is not created"; - return false; - } - // Ok, we have , let's check for the rest and create if needed - rootPath += "/.AMD"; - if (!amd::Os::pathExists(rootPath)) { - ok = amd::Os::createPath(rootPath); - if (!ok) { - errorMsg = "Failed to create AMD directory"; - return false; - } - } - rootPath += "/CLCache"; - if (!amd::Os::pathExists(rootPath)) { - ok = amd::Os::createPath(rootPath); - if (!ok) { - errorMsg = "Failed to create CLCache directory"; - return false; - } - } - // Set folder to only owner accessible - if (!setAccessPermission(rootPath)) { - return false; - } - rootPath += "/" + chipName; - if (!amd::Os::pathExists(rootPath)) { - ok = amd::Os::createPath(rootPath); - if (!ok) { - errorMsg = "Failed to create " + chipName + " directory"; - return false; - } - } - // Set folder to only owner accessible - if (!setAccessPermission(rootPath)) { - return false; - } -#endif - return true; -} - -// Set the cache version and size -// -// In: -// newVersion - New version for the cache -// newSize - New size for the cache -// -// Out: -// none -// -// Returns: -// true if successful -// false otherwise -// -bool KernelCache::setCacheInfo(unsigned int newVersion, unsigned int newSize) -{ - bool ok = true; - char fileData[8]; - char *dataPtr = fileData; - *(unsigned int *)dataPtr = newVersion; - dataPtr += sizeof(unsigned int); - *(unsigned int *)dataPtr = newSize; - ok = writeFile(indexName, fileData, sizeof(fileData)); - if (!ok) { - errorMsg = "Failed to update the index file"; - return false; - } - version = newVersion; - cacheSize = newSize; - return ok; -} - -// Get the version and size of the cache -// -// In: -// none -// -// Out: -// none -// -// Returns: -// true if successful -// false otherwise -// -bool KernelCache::getCacheInfo() -{ - bool ok = true; - indexName = rootPath; - indexName += amd::Os::fileSeparator(); - indexName += "cacheDir"; - // Check for cache index file - char *contents = NULL; - size_t size; - ok = readFile(indexName, &contents, size); - if (ok) { - char *tmp = contents; - if (size >= 8) { - version = *(unsigned int *)tmp; - tmp += sizeof(unsigned int); - cacheSize = *(unsigned int *)tmp; - } else { - errorMsg = "Index file truncated"; - ok = false; - } - delete[] contents; - } else { - ok = setCacheInfo(-1, 0); - } - return ok; -} - -// Initialize the cache -// -// In: -// compilerVersion - Compiler version -// -// Out: -// none -// -// Returns: -// true if successful -// false otherwise -// -bool KernelCache::cacheInit(unsigned int compilerVersion, const std::string &chipName) -{ - if (!setRootPath(chipName)) { - return false; - } - if (!getCacheInfo()) { - return false; - } - // Limit cache size to default cache size, and wipe out all cache files when it's exceed - // TODO: need to implement cache eviction policy - if (version != compilerVersion || cacheSize > DEFAULT_CACHE_SIZE) { - if (!wipeCacheFolders()) { - return false; - } - if (!setCacheInfo(compilerVersion, 0)) { - return false; - } - if (!setUpCacheFolders()) { - return false; - } - } - return true; -} - -// Compute the hash value for a buffer of data along with the kernelName and buildOpts -// -// In: -// data - Data to hash -// size - Size of data -// buildOpts - Build options -// kernelName - Kernel name -// -// Out: -// none -// -// Returns: -// Hash value computed from the inputs -// -unsigned int KernelCache::computeHash(const KernelCacheData *data, const unsigned int numData, - const std::string &buildOpts, const std::string &kernelName) -{ - unsigned int hashVal = 0; - // Two big prime numbers to start the multiplicative hash - unsigned int seed0 = 500321; - unsigned int seed1 = 72701; - for (unsigned int i = 0; i < numData; ++i) { - for (unsigned int j = 0; j < data[i].dataSize; ++j) { - hashVal = hashVal * seed0 + data[i].data[j]; - seed0 *= seed1; - } - } - char *strData = (char *)buildOpts.c_str(); - for (unsigned int i = 0; i < buildOpts.size(); ++i) { - hashVal = hashVal * seed0 + strData[i]; - seed0 *= seed1; - } - strData = (char *)kernelName.c_str(); - for (unsigned int i = 0; i < kernelName.size(); ++i) { - hashVal = hashVal * seed0 + strData[i]; - seed0 *= seed1; - } - return hashVal; -} - -// Parses a cache file and returns the contents -// -// In: -// fileData - File data we are to parse -// dataSize - Size of file data -// -// Out: -// srcData - Pointer to pointer to source data allocated here -// srcSize - Size of source data -// buildOpts - Build options from file -// kernelName - Kernel name from file -// dstData - Pointer to pointer to destination data allocation here -// dstSize - Size of destination data -// dstHash - Destination hash from file -// -// Returns: -// true if no errors during parsing -// false otherwise -// -bool KernelCache::parseFile(const char *fileData, const unsigned int dataSize, - KernelCacheData **srcData, unsigned int &srcNum, std::string &buildOpts, - std::string &kernelName, char **dstData, unsigned int &dstSize, unsigned int &dstHash) -{ - unsigned int dataLeft = dataSize; - char *data = (char *)fileData; - errorMsg = "Error parsing file"; - if ((dataLeft > 3) && ((fileData[0] != 'A') || (fileData[1] != 'M') || (fileData[2] != 'D'))) { - errorMsg = "Not a valid cache file"; - return false; - } - data += 3; - dataLeft -= 3; - if (dataLeft < sizeof(unsigned int)) { - errorMsg = "Error in cache file"; - return false; - } - dstHash = *(unsigned int*)data; - data += sizeof(unsigned int); - dataLeft -= sizeof(unsigned int); - if (dataLeft-- < 1 || *data++ != ESCAPE) { - errorMsg = "Error in cache file"; - return false; - } - if (dataLeft < sizeof(unsigned int)) { - errorMsg = "Error in cache file"; - return false; - } - srcNum = *(unsigned int*)data; - data += sizeof(unsigned int); - dataLeft -= sizeof(unsigned int); - if (dataLeft-- < 1 || *data++ != ESCAPE) { - errorMsg = "Error in cache file"; - return false; - } - *srcData = new KernelCacheData [srcNum]; - if (*srcData == NULL) { - errorMsg = "Failed to alloc srcData"; - return false; - } - for (unsigned int i = 0; i < srcNum; ++i) { - if (dataLeft < sizeof(unsigned int)) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - (*srcData)[i].dataSize = *(unsigned int*)data; - data += sizeof(unsigned int); - dataLeft -= sizeof(unsigned int); - if (dataLeft-- < 1 || *data++ != ESCAPE) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - (*srcData)[i].data = data; - if (dataLeft < (*srcData)[i].dataSize) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - memcpy((*srcData)[i].data, data, (*srcData)[i].dataSize); - data += (*srcData)[i].dataSize; - dataLeft -= (*srcData)[i].dataSize; - if (dataLeft-- < 1 || *data++ != ESCAPE) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - } - unsigned int buildOptsSize = 0; - if (dataLeft < sizeof(unsigned int)) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - buildOptsSize = *(unsigned int*)data; - data += sizeof(unsigned int); - dataLeft -= sizeof(unsigned int); - if (dataLeft-- < 1 || *data++ != ESCAPE) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - buildOpts = data; - if (dataLeft < buildOptsSize) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - data += buildOptsSize; - dataLeft -= buildOptsSize; - if (dataLeft-- < 1 || *data++ != ESCAPE) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - unsigned int kernelNameSize; - if (dataLeft < sizeof(unsigned int)) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - kernelNameSize = *(unsigned int*)data; - data += sizeof(unsigned int); - dataLeft -= sizeof(unsigned int); - if (dataLeft-- < 1 || *data++ != ESCAPE) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - kernelName = data; - if (dataLeft < kernelNameSize) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - data += kernelNameSize; - dataLeft -= kernelNameSize; - if (dataLeft-- < 1 || *data++ != ESCAPE) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - if (dataLeft < sizeof(unsigned int)) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - dstSize = *(unsigned int*)data; - data += sizeof(unsigned int); - dataLeft -= sizeof(unsigned int); - if (dataLeft-- < 1 || *data++ != ESCAPE) { - delete[] *srcData; - *srcData = NULL; - srcNum = 0; - errorMsg = "Error in cache file"; - return false; - } - *dstData = new char [dstSize]; - if (!*dstData || dataLeft != dstSize) { - if (!*dstData) { - errorMsg = "Failed to alloc dstData"; - } else { - errorMsg = "Error in cache file"; - } - delete[] srcData; - srcData = NULL; - srcNum = 0; - return false; - } - memcpy(*dstData, data, dstSize); - errorMsg.clear(); - return true; -} - -// Control kernel cache test -// -// In: -// canUseCache - flag to indicate whether turn on/off cache test -// -// Out: -// none -// -bool KernelCache::internalKCacheTestSwitch(bool &canUseCache) { -#ifndef OPENCL_MAINLINE - const char *cache_test_switch = getenv("AMD_FORCE_KCACHE_TEST"); - if (!(cache_test_switch && strcmp(cache_test_switch,"1") == 0)) { - canUseCache = false; - return false; - } else { - return true; - } -#else - return false; -#endif -} - -// Allocate memory for cache file and build file structure -// -// In: -// srcData - Source data -// srcSize - Source data size -// buildOpts - Build options -// kernelName - Kernel name -// dstData - Destination data -// dstSize - Destination data size -// dstHash - Hash of destination data, buildOpts and kernelName -// -// Out: -// fileData - Pointer to pointer to file data -// dataSize - Size of file data -// -// Returns: -// true if successful -// false otherwise -// -bool KernelCache::buildFile(const KernelCacheData *srcData, const unsigned int srcNum, - const std::string &buildOpts, const std::string &kernelName, const char *dstData, - const unsigned int dstSize, const unsigned int dstHash, char **fileData, unsigned int &dataSize) -{ - bool ok = false; - const unsigned int buildOptsSize = buildOpts.size() + 1; // Add one for NULL terminator - const unsigned int kernelNameSize = kernelName.size() + 1; // Add one for NULL terminator - dataSize = 3 /* 'AMD' */ + sizeof(dstHash) + 1 /* ESC */ + sizeof(srcNum) + 1 /* ESC */ - + sizeof(buildOptsSize) + 1 /* ESC */ - + buildOptsSize /* buildOpts data with NULL termination */ + 1 /* ESC */ - + sizeof(kernelNameSize) + 1 /* ESC */ - + kernelNameSize /* kernelName with NULL termination */ + 1 /* ESC */ - + sizeof(dstSize) + 1 /* ESC */ - + dstSize /* dst data */; - for (unsigned int i = 0; i < srcNum; ++i) { - dataSize += sizeof(srcData[i].dataSize) + 1 + srcData[i].dataSize + 1; - } - *fileData = new char [dataSize]; - if (fileData) { - char *tmp = *fileData; - tmp[0] = 'A'; - tmp[1] = 'M'; - tmp[2] = 'D'; - tmp += 3; - *(unsigned int *)tmp = dstHash; - tmp += sizeof(dstHash); - *tmp++ = ESCAPE; - *(unsigned int *)tmp = srcNum; - tmp += sizeof(srcNum); - *tmp++ = ESCAPE; - for (unsigned int i = 0; i < srcNum; ++i) { - *(unsigned int *)tmp = srcData[i].dataSize; - tmp += sizeof(srcData[i].dataSize); - *tmp++ = ESCAPE; - memcpy(tmp, srcData[i].data, srcData[i].dataSize); - tmp += srcData[i].dataSize; - *tmp++ = ESCAPE; - } - *(unsigned int *)tmp = (unsigned int)buildOptsSize; - tmp += sizeof(unsigned int); - *tmp++ = ESCAPE; - memcpy(tmp, buildOpts.c_str(), buildOptsSize); - tmp += buildOptsSize; - *tmp++ = ESCAPE; - *(unsigned int *)tmp = (unsigned int)kernelNameSize; - tmp += sizeof(unsigned int); - *tmp++ = ESCAPE; - memcpy(tmp, kernelName.c_str(), kernelNameSize); - tmp += kernelNameSize; - *tmp++ = ESCAPE; - *(unsigned int*)tmp = dstSize; - tmp += sizeof(dstSize); - *tmp++ = ESCAPE; - memcpy(tmp, dstData, dstSize); - ok = true; - } else { - errorMsg = "Out of memory allocating fileData"; - } - return ok; -} - -// Generate file path from a hash value -// -// In: -// hashVal - A hash value -// pathToFile - Path to the file -// -// Returns: -// nothing -// -void KernelCache::getFilePathFromHash(const unsigned int hashVal, std::string &pathToFile) -{ - char textHash[9]; - sprintf(textHash, "%08x", hashVal); - std::string fileName = textHash; - pathToFile = rootPath; - pathToFile += amd::Os::fileSeparator(); - // First char determines first dir level - pathToFile += fileName[0]; - pathToFile += amd::Os::fileSeparator(); - // Second char determines second dir level - pathToFile += fileName[1]; - pathToFile += amd::Os::fileSeparator(); - // Rest of file name determines name - pathToFile += fileName.c_str() + 2; -} - -// Use data, buildOpts and kernelName to generate a file name -// -// In: -// data - Pointer to data list -// numData - Size of the list -// buildOpts - Build options -// kernelName - Kernel name -// -// Out: -// pathToFile - Path to the file -// -// Returns: -// nothing -// -void KernelCache::makeFileName(const KernelCacheData *data, const unsigned int numData, - const std::string &buildOpts, const std::string &kernelName, std::string &pathToFile) -{ - unsigned int hashVal; - hashVal = computeHash(data, numData, buildOpts, kernelName); - getFilePathFromHash(hashVal, pathToFile); -} - -// Get the path to a cache entry based on the input data -// -// In: -// data - Pointer to data list -// numData - Size of the list -// buildOpts - Build options -// kernelName - Kernel name -// -// Out: -// pathToFile - Path to the file -// -// Returns: -// true if file exists, false otherwise -// -bool KernelCache::findCacheEntry(const KernelCacheData *data, const unsigned int numData, - const std::string &buildOpts, const std::string &kernelName, std::string &pathToFile) -{ - makeFileName(data, numData, buildOpts, kernelName, pathToFile); - return fileExists(pathToFile); -} - -// Use srcData, buildOpts and kernelName to find the corresponding cache entry, if it exists -// -// In: -// srcData - Source data -// srcNum - Number of source data -// buildOpts - Build options -// kernelName - Kernel name -// -// Out: -// dstData - Destination data -// dstSize - Destination size -// dstHash - Destination hash -// -// Returns: -// true if entry found -// false otherwise, check errorMsg for errors -// -bool KernelCache::getCacheEntry(const KernelCacheData *srcData, const unsigned int srcNum, - const std::string &buildOpts, const std::string &kernelName, char **dstData, unsigned int &dstSize, - unsigned int &dstHash) -{ - std::string pathToFile; - *dstData = NULL; - dstSize = 0; - errorMsg.clear(); - bool ok = findCacheEntry(srcData, srcNum, buildOpts, kernelName, pathToFile); - if (ok) { - // Found cache entry - char *contents; - size_t size; - ok = readFile(pathToFile, &contents, size); - if (ok) { - // Found entry in cache - KernelCacheData *fileSrcData; - unsigned int fileSrcNum; - std::string fileBuildOpts, fileKernelName; - ok = parseFile(contents, size, &fileSrcData, fileSrcNum, fileBuildOpts, fileKernelName, dstData, dstSize, dstHash); - if (srcNum == fileSrcNum) { - for (unsigned int i = 0; i < srcNum; ++i) { - if (fileSrcData[i].dataSize == srcData[i].dataSize) { - if (!compareData((const char *)fileSrcData[i].data, srcData[i].data, srcData[i].dataSize)) { - ok = false; - errorMsg = "Cache collision: Size matches, contents do not"; - } else { - } - } else { - ok = false; - errorMsg = "Cache collision: Data size does not match"; - } - } - if (ok == true) { - if (buildOpts.size() == fileBuildOpts.size()) { - if (memcmp(buildOpts.c_str(), fileBuildOpts.c_str(), buildOpts.size())) { - ok = false; - errorMsg = "Cache collision: Build opts do not match"; - } else if (kernelName.size() == fileKernelName.size()) { - if (memcmp(kernelName.c_str(), fileKernelName.c_str(), kernelName.size())) { - ok = false; - errorMsg = "Cache collision: Kernel names do not match"; - } - } else { - ok = false; - errorMsg = "Cache collision: Kernel name lengths do not match"; - } - } else { - ok = false; - errorMsg = "Cache collision: Build options lengths do not match"; - } - } - } - if (fileSrcData) { - delete[] fileSrcData; - } - } - delete[] contents; - } - if (!ok) { - delete[] *dstData; - dstData = NULL; - dstSize = 0; - } - return ok; -} - -// Use srcdata, buildOpts and kernelName to generate a cache entry -// -// In: -// srcData - Source data -// srcNum - Number of source data -// buildOpts - Build options -// kernelName - Kernel name -// dstData - Destination data -// dstSize - Destination size -// -// Returns: -// true if entry created -// false otherwise, check errorMsg for errors -// -bool KernelCache::makeCacheEntry(const KernelCacheData *srcData, const unsigned int srcNum, - const std::string &buildOpts, const std::string &kernelName, const char *dstData, const unsigned int dstSize) -{ - bool ok; - std::string fileName; - char *fileData = NULL; - unsigned int fileSize; - errorMsg.clear(); - makeFileName(srcData, srcNum, buildOpts, kernelName, fileName); - unsigned int dstHashVal = 0; - KernelCacheData cacheData; - cacheData.data = (char *)dstData; - cacheData.dataSize = dstSize; - dstHashVal = computeHash((const KernelCacheData *)&cacheData, 1, buildOpts, kernelName); - ok = buildFile(srcData, srcNum, buildOpts, kernelName, dstData, dstSize, dstHashVal, &fileData, fileSize); - if (!ok) { - // Return an error - return false; - } - ok = writeFile(fileName, fileData, fileSize); - delete[] fileData; - if (!ok) { - // Return an error - return false; - } - ok = setCacheInfo(version, cacheSize + fileSize); - if (!ok) { - errorMsg = "Cache version and size is not updated successfully"; - // Return an error - return false; - } - return ok; -} diff --git a/rocclr/compiler/lib/backends/common/cache.hpp b/rocclr/compiler/lib/backends/common/cache.hpp deleted file mode 100644 index 735e7ac62a..0000000000 --- a/rocclr/compiler/lib/backends/common/cache.hpp +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef AMD_KERNEL_CACHE_H_ -#define AMD_KERNEL_CACHE_H_ - -#include -#include -#include -#include -#include -#ifdef __linux__ -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#include "os/os.hpp" - -typedef struct _KernelCacheData { - char *data; - unsigned int dataSize; -} KernelCacheData; - -class KernelCache { -private: - static const char ESCAPE = 0x7f; - // TODO: the default cache size (512MB) might be changed later - static const unsigned int DEFAULT_CACHE_SIZE = 512 * 1024 * 1024; - unsigned int version; - unsigned int cacheSize; - std::string rootPath; - std::string indexName; - std::string errorMsg; - - // Set the root path for the cache - bool setRootPath(const std::string &chipName); - - // Check if file exists - bool fileExists(const std::string &fileName); - - // Wipe the cache folder structure - bool wipeCacheFolders(); - - // Setup cache tree structure - bool setUpCacheFolders(); - - // Get the cache version and size from the index file - bool getCacheInfo(); - - // Set the cache version and size in the index file - bool setCacheInfo(unsigned int newVersion, unsigned int newSize); - - // Read contents of a file - bool readFile(const std::string &fileName, char **contents, size_t &fileSize); - - // Write data to a file - bool writeFile(const std::string &fileName, const char *data, size_t fileSize); - - // Compute hash value for chunks of data - unsigned int computeHash(const KernelCacheData *data, const unsigned int numData, const std::string &buildOpts, const std::string &kernelName); - - // Compares two sets of data - inline bool compareData(const char *data0, const char *data1, const unsigned int size) { - return (memcmp(data0, data1, size) == 0); - } - - // Computes hash and file name from given data - void makeFileName(const KernelCacheData *data, const unsigned int numData, const std::string &buildOpts, const std::string &kernelName, std::string &pathToFile); - - // Finds path to a file from a given hash value - void getFilePathFromHash(const unsigned int hash, std::string &pathToFile); - - // Finds the cache entry for a chunk of data - bool findCacheEntry(const KernelCacheData *data, const unsigned int numData, const std::string &buildOpts, const std::string &kernelName, std::string &pathToFile); - - // Creates a cache file in the cache heirarchy - bool makeCacheEntry(const KernelCacheData *srcData, const unsigned int srcNum, const std::string &buildOpts, const char *dstData, unsigned int dstSize, bool fromModule); - - // Builds a file for storage into the cache - bool buildFile(const KernelCacheData *srcData, const unsigned int srcNum, const std::string &buildOpts, const std::string &kernelName, const char *dstData, const unsigned int dstSize, const unsigned int dstHash, char **fileData, unsigned int &dataSize); - - // Parses data from a file - bool parseFile(const char *fileData, const unsigned int dataSize, KernelCacheData **srcData, unsigned int &srcNum, std::string &buildOpts, std::string &kernelName, char **dstData, unsigned int &dstSize, unsigned int &dstHash); - -#if _WIN32 - // Get Sid of account - bool getSid(TCHAR *userName, PSID &sid); -#endif - - // Set file to only owner accessible - bool setAccessPermission(const std::string fileName, bool isFile = false); -public: - KernelCache() : version(0) {rootPath.clear(); indexName.clear(); errorMsg.clear(); } - - bool cacheInit(unsigned int compilerVersion, const std::string &chipName); - - // Get cache entry corresponding to srcData, if it exists - bool getCacheEntry(const KernelCacheData *srcData, const unsigned int srcNum, const std::string &buildOpts, const std::string &kernelName, char **dstData, unsigned int &dstSize, unsigned int &dstHash); - - // Make cache entry corresponding to srcData, dstData, buildOpts and kernelName - bool makeCacheEntry(const KernelCacheData *srcData, const unsigned int srcNum, const std::string &buildOpts, const std::string &kernelName, const char *dstData, const unsigned int dstSize); - - std::string ErrorMsg() { return errorMsg; } - - // Control kernel cache test - bool internalKCacheTestSwitch(bool &canUseCache); - - // Log caching error messages for debugging the cache and/or detecting collisions - void saveLogToFile(std::string extraMsg = " ") { - if (amd::Os::pathExists(rootPath)) { - std::string fileName = rootPath + amd::Os::fileSeparator() + "cacheError.log"; - errorMsg += extraMsg; - writeFile(fileName, errorMsg.c_str(), errorMsg.length()); - } - } - -}; - -#endif // AMD_KERNEL_CACHE_H_ diff --git a/rocclr/compiler/lib/backends/common/frontend.cpp b/rocclr/compiler/lib/backends/common/frontend.cpp index f4ce0dd8cd..ac7625d346 100644 --- a/rocclr/compiler/lib/backends/common/frontend.cpp +++ b/rocclr/compiler/lib/backends/common/frontend.cpp @@ -4,8 +4,6 @@ #include "top.hpp" #include "frontend.hpp" #include "bif/bifbase.hpp" -#include "cache.hpp" -#include "../../../sc/Interface/SCLib_Ver.h" #include "utils/libUtils.h" #include "utils/target_mappings.h" #include "utils/options.hpp" @@ -221,55 +219,7 @@ amdcl::OCLFrontend::compileCommand(const std::string& singleSrc) if (!checkFlag(aclutGetCaps(Elf()), capSaveSOURCE)) { CL()->clAPI.remSec(CL(), Elf(), aclSOURCE); } - int ret = 0; - KernelCache kc; - KernelCacheData clSrc; - std::string kernelID; - char *llvmIR = NULL; - unsigned int llvmIRSize = 0; - bool isCacheReady = false, kernelCached = false; - bool canUseCache = !Options()->oVariables->DisableKernelCaching; - bool kCacheTest = kc.internalKCacheTestSwitch(canUseCache); - size_t pos = frontendCmd.find("--error_output"); - std::string buildOpts = frontendCmd.substr(0, pos); - if (canUseCache && Options()->oVariables->OptLevel > 0) { - std::string deviceName(getDeviceName(Elf()->target)); - isCacheReady = kc.cacheInit(SC_BUILD_NUMBER, deviceName); - if (!isCacheReady) { - kc.saveLogToFile(); - } else { - unsigned int hashVal = 0; - const char *name = Options()->getCurrKernelName(); - kernelID = name ? name : " "; - clSrc.data = const_cast(singleSrc.c_str()); - clSrc.dataSize = singleSrc.size(); - - kernelCached = kc.getCacheEntry((const KernelCacheData *)&clSrc, 1, buildOpts, kernelID, &llvmIR, llvmIRSize, hashVal); - if (!kc.ErrorMsg().empty()) { - kc.saveLogToFile(); - } - } - } - - if (kernelCached) { - if (kCacheTest) { - fprintf(stdout, "FE to IR stage is cached!\n"); - fflush(stdout); - } - source_.assign(llvmIR, llvmIRSize); - if (llvmIR) delete[] llvmIR; - } else { - if (kCacheTest) { - fprintf(stdout, "FE to IR stage is not cached!\n"); - fflush(stdout); - } - ret = openclFrontEnd(frontendCmd.c_str(), &Source(), NULL); - - // Caching LLVM IR - if (isCacheReady && !kc.makeCacheEntry((const KernelCacheData *)&clSrc, 1, buildOpts, kernelID, Source().data(), Source().size())) { - kc.saveLogToFile(); - } - } + int ret = openclFrontEnd(frontendCmd.c_str(), &Source(), NULL); // We dump the preprocessed code by invoking clc a second time after the // original call, just in case somthing really bad happens in the original diff --git a/rocclr/compiler/lib/backends/common/frontend_clang.cpp b/rocclr/compiler/lib/backends/common/frontend_clang.cpp index c8af83fc40..08690a4cdd 100644 --- a/rocclr/compiler/lib/backends/common/frontend_clang.cpp +++ b/rocclr/compiler/lib/backends/common/frontend_clang.cpp @@ -5,8 +5,6 @@ #include "OpenCLFE.h" #include "bif/bifbase.hpp" -#include "cache.hpp" -#include "../../../sc/Interface/SCLib_Ver.h" #include "frontend.hpp" #include "os/os.hpp" #include "top.hpp" @@ -160,62 +158,11 @@ int amdcl::ClangOCLFrontend::compileCommand(const std::string& src) { ret |= 1; return ret; #else - KernelCache kc; - KernelCacheData clSrc; - std::string kernelID, buildOpts; - char *llvmIR = NULL; - unsigned int llvmIRSize = 0; - bool isCacheReady = false, kernelCached = false; - bool canUseCache = !Options()->oVariables->DisableKernelCaching; - bool kCacheTest = kc.internalKCacheTestSwitch(canUseCache); - if (canUseCache && Options()->oVariables->OptLevel > 0) { - std::string deviceName(getDeviceName(Elf()->target)); - isCacheReady = kc.cacheInit(SC_BUILD_NUMBER, deviceName); - if (!isCacheReady) { - kc.saveLogToFile(); - } else { - unsigned int hashVal = 0; - const char *name = Options()->getCurrKernelName(); - kernelID = name ? name : " "; - clSrc.data = const_cast(src.c_str()); - clSrc.dataSize = src.size(); - for (std::vector::const_iterator it = argsToClang.begin(); - it != argsToClang.end(); ++it) { - std::string arg(*it); - buildOpts += arg; - } - - kernelCached = kc.getCacheEntry((const KernelCacheData *)&clSrc, 1, - buildOpts, kernelID, &llvmIR, llvmIRSize, hashVal); - if (!kc.ErrorMsg().empty()) { - kc.saveLogToFile(); - } - } - } - - if (kernelCached) { - if (kCacheTest) { - fprintf(stdout, "FE to IR stage is cached!\n"); - fflush(stdout); - } - source_.assign(llvmIR, llvmIRSize); - if (llvmIR) delete[] llvmIR; - } else { - if (kCacheTest) { - fprintf(stdout, "FE to IR stage is not cached!\n"); - fflush(stdout); - } - if (!parseOCLSource(ClangOptions, argsToClang, &Source(), &logFromClang)) { + if (!parseOCLSource(ClangOptions, argsToClang, &Source(), &logFromClang)) { log_ += logFromClang; log_ += "\nerror: Clang front-end compilation failed!\n"; ret |= 1; return ret; - } - - // Caching LLVM IR - if (isCacheReady && !kc.makeCacheEntry((const KernelCacheData *)&clSrc, 1, buildOpts, kernelID, Source().data(), Source().size())) { - kc.saveLogToFile(); - } } #endif diff --git a/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp b/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp index 305f7ce7ef..b910ad34c6 100644 --- a/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp +++ b/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp @@ -13,8 +13,6 @@ #include "acl.h" #include "aclTypes.h" -#include "cache.hpp" -#include "../../../../sc/Interface/SCLib_Ver.h" #include "compiler_stage.hpp" #include "frontend.hpp" #include "spir.hpp" @@ -1108,16 +1106,6 @@ aclCompileInternal( acl_error error_code = ACL_SUCCESS; aclLoaderData *ald; - amd::option::Options* Opts = reinterpret_cast(bin->options);; - KernelCache kc; - KernelCacheData llvmIR; - std::string kernelName; - char *IL = NULL; - unsigned int ILSize = 0; - bool kCacheTest = false; - bool isCacheReady = false, kernelCached = false, llvmIRbinPath = true, canUseCache = true; - bool bHsailTextInput = false; - char *hsail_text_input = NULL; // Load the frontend to convert from Source to LLVM-IR if (useFE) { @@ -1145,103 +1133,6 @@ aclCompileInternal( } } - if (useCG) { - ald = cl->cgAPI.init(cl, bin, compile_callback, &error_code); -#ifdef WITH_TARGET_HSAIL - if (isHSAILTarget(bin->target)) { - bool hsailBinary = (!useFE && !useLinker && !useOpt); - hsail_text_input = getenv("AMD_DEBUG_HSAIL_TEXT_INPUT"); - // Verify that the internal (blit) kernel is not being compiled - if (hsail_text_input && strcmp(hsail_text_input, "") != 0 && !Opts->oVariables->clInternalKernel) { - bHsailTextInput = true; - } - llvmIRbinPath = !bHsailTextInput && !hsailBinary; - } else -#endif - cl->cgAPI.fini(ald); - - canUseCache = !Opts->oVariables->DisableKernelCaching; - kCacheTest = kc.internalKCacheTestSwitch(canUseCache); - if (canUseCache && llvmIRbinPath && Opts->oVariables->OptLevel > 0) { - unsigned int hashVal = 0; - std::string deviceName(getDeviceName(bin->target)); - isCacheReady = kc.cacheInit(SC_BUILD_NUMBER, deviceName); - if (!isCacheReady) { - kc.saveLogToFile(); - } else { - const char *name = Opts->getCurrKernelName(); - kernelName.assign(name ? name : " "); - llvmIR.data = const_cast(data); - llvmIR.dataSize = data_size; - - kernelCached = kc.getCacheEntry((const KernelCacheData *)&llvmIR, 1, - Opts->origOptionStr, kernelName, &IL, ILSize, hashVal); - if (!kc.ErrorMsg().empty()) { - kc.saveLogToFile(); - } - } - } - } - if (kernelCached) { - if (kCacheTest) { - fprintf(stdout, "IR to IL stage is cached!\n"); - fflush(stdout); - } - uint64_t start_time = 0, stop_time = 0; - if (Opts->oVariables->EnableBuildTiming) { - start_time = amd::Os::timeNanos(); - } - - ald = cl->cgAPI.init(cl, bin, compile_callback, &error_code); - amdcl::CLCodeGen *aclCG = reinterpret_cast(ald); -#ifdef WITH_TARGET_HSAIL - amdcl::HSAIL *acl = reinterpret_cast(ald); - if (isHSAILTarget(acl->Elf()->target)) { - // from ACL_TYPE_LLVMIR_BINARY - aclCG->Source().assign(IL, ILSize); - if (IL) delete[] IL; - - if (!acl->insertBRIG(aclCG->Source())) { - appendLogToCL(cl, "ERROR: BRIG inserting failed."); - error_code = ACL_CODEGEN_ERROR; - goto internal_compile_failure; - } - - char* dumpFileName = ::getenv("AMD_DEBUG_DUMP_HSAIL_ALL_KERNELS"); - if (Opts->isDumpFlagSet(amd::option::DUMP_CGIL) || dumpFileName) { - acl->dumpHSAIL(acl->disassembleBRIG(), ".hsail"); - } - bifbase *elfBin = reinterpret_cast(bin->bin); - elfBin->setType(ET_EXEC); - } else -#endif - { - dataStr.assign(IL, ILSize); - if (IL) delete[] IL; - - if (checkFlag(aclutGetCaps(aclCG->Elf()), capSaveCG)) { - aclCG->CL()->clAPI.insSec(aclCG->CL(), aclCG->Elf(), - dataStr.data(), dataStr.size(), aclCODEGEN); - } - } - if (!checkFlag(aclutGetCaps(bin), capSaveLLVMIR) || !Opts->oVariables->BinLLVMIR) { - cl->clAPI.remSec(cl, bin, aclLLVMIR); - } - cl->cgAPI.fini(ald); - - if (Opts->oVariables->EnableBuildTiming) { - stop_time = amd::Os::timeNanos(); - std::stringstream tmp_ss; - tmp_ss << " LLVM time (link+opt+codegen): " - << (stop_time - start_time)/1000ULL - << "us\n"; - appendLogToCL(cl, tmp_ss.str()); - } - } else { - if (kCacheTest) { - fprintf(stdout, "IR to IL stage is not cached!\n"); - fflush(stdout); - } // Use the linker to link in the libraries to the current module. if (useLinker) { ald = cl->linkAPI.init(cl, bin, compile_callback, &error_code); @@ -1268,6 +1159,12 @@ aclCompileInternal( #ifdef WITH_TARGET_HSAIL amdcl::HSAIL *acl = reinterpret_cast(ald); if (isHSAILTarget(acl->Elf()->target)) { + bool bHsailTextInput = false; + const char *hsail_text_input = getenv("AMD_DEBUG_HSAIL_TEXT_INPUT"); + // Verify that the internal (blit) kernel is not being compiled + if (hsail_text_input && strcmp(hsail_text_input, "") != 0 && !acl->Options()->oVariables->clInternalKernel) { + bHsailTextInput = true; + } if (!bHsailTextInput) { // from ACL_TYPE_HSAIL_BINARY if (!useFE && !useLinker && !useOpt) { @@ -1302,10 +1199,6 @@ aclCompileInternal( if (!cg || error_code != ACL_SUCCESS) { goto internal_compile_failure; } - // Caching HSAIL - if (isCacheReady && !kc.makeCacheEntry((const KernelCacheData *)&llvmIR, 1, Opts->origOptionStr, kernelName, (*cg).c_str(), (*cg).size())) { - kc.saveLogToFile(); - } if (!acl->insertBRIG(*cg)) { appendLogToCL(cl, "ERROR: BRIG inserting failed."); error_code = ACL_CODEGEN_ERROR; @@ -1357,7 +1250,7 @@ aclCompileInternal( } } char* dumpFileName = ::getenv("AMD_DEBUG_DUMP_HSAIL_ALL_KERNELS"); - if (Opts->isDumpFlagSet(amd::option::DUMP_CGIL) || dumpFileName) { + if (acl->Options()->isDumpFlagSet(amd::option::DUMP_CGIL) || dumpFileName) { acl->dumpHSAIL(acl->disassembleBRIG(), ".hsail"); } bifbase *elfBin = reinterpret_cast(bin->bin); @@ -1370,12 +1263,9 @@ aclCompileInternal( goto internal_compile_failure; } dataStr = *cg; - // Caching AMDIL - if (isCacheReady && !kc.makeCacheEntry((const KernelCacheData *)&llvmIR, 1, Opts->origOptionStr, kernelName, (*cg).c_str(), (*cg).size())) { - kc.saveLogToFile(); - } } - if (!checkFlag(aclutGetCaps(bin), capSaveLLVMIR) || !Opts->oVariables->BinLLVMIR) { + if (!checkFlag(aclutGetCaps(bin), capSaveLLVMIR) || + !(reinterpret_cast(ald))->Options()->oVariables->BinLLVMIR) { cl->clAPI.remSec(cl, bin, aclLLVMIR); } cl->cgAPI.fini(ald); @@ -1383,7 +1273,6 @@ aclCompileInternal( goto internal_compile_failure; } } - } if (useISA) { ald = cl->beAPI.init(cl, bin, compile_callback, &error_code); diff --git a/rocclr/compiler/lib/utils/OPTIONS.def b/rocclr/compiler/lib/utils/OPTIONS.def index 65deb9a63d..56057b14aa 100644 --- a/rocclr/compiler/lib/utils/OPTIONS.def +++ b/rocclr/compiler/lib/utils/OPTIONS.def @@ -1032,14 +1032,6 @@ OPTION(OT_BOOL, \ false, 0, 0, NULL, \ "Enable timing for Kernel build.") -// -kcache-disable -OPTION(OT_BOOL, \ - OA_RUNTIME|OVIS_SUPPORT|OVA_DISALLOWED, \ - "kcache-disable", NULL, \ - DisableKernelCaching, \ - false, 0, 0, NULL, \ - "Disable kernel caching functionality.") - // -print-compile-phases OPTION(OT_BOOL, \ OA_RUNTIME|OVIS_SUPPORT|OVA_DISALLOWED, \