X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fswr%2Frasterizer%2Fjitter%2FJitManager.cpp;h=bfb1d2e0c8b078db98a616538894d336abe876aa;hb=8f848ada8a42d9aaa8136afa1bafe32281a0fb48;hp=70f31379a79b656cbe844ad41569f29b5405d936;hpb=fe107e3c1702c23cb8e3cdf01f3aef83b2e5abcb;p=mesa.git diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp index 70f31379a79..bfb1d2e0c8b 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp @@ -47,7 +47,7 @@ #define JITTER_OUTPUT_DIR SWR_OUTPUT_DIR "\\Jitter" #endif // _WIN32 -#if defined(__APPLE) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__) +#if defined(__APPLE__) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__) #include #include #endif @@ -71,11 +71,6 @@ JitManager::JitManager(uint32_t simdWidth, const char *arch, const char* core) tOpts.NoInfsFPMath = false; tOpts.NoNaNsFPMath = false; tOpts.UnsafeFPMath = false; -#if defined(_DEBUG) -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR < 7 - tOpts.NoFramePointerElim = true; -#endif -#endif //tOpts.PrintMachineCode = true; @@ -128,7 +123,8 @@ JitManager::JitManager(uint32_t simdWidth, const char *arch, const char* core) #endif std::vector fsArgs; - fsArgs.push_back(PointerType::get(Type::getVoidTy(mContext), 0)); + // llvm5 is picky and does not take a void * type + fsArgs.push_back(PointerType::get(Gen_SWR_FETCH_CONTEXT(this), 0)); fsArgs.push_back(PointerType::get(Gen_SWR_FETCH_CONTEXT(this), 0)); #if USE_SIMD16_SHADERS @@ -292,6 +288,7 @@ DIType* JitManager::GetDebugIntegerType(Type* pTy) case 16: return builder.createBasicType("int16", 16, dwarf::DW_ATE_signed); break; case 32: return builder.createBasicType("int", 32, dwarf::DW_ATE_signed); break; case 64: return builder.createBasicType("int64", 64, dwarf::DW_ATE_signed); break; + case 128: return builder.createBasicType("int128", 128, dwarf::DW_ATE_signed); break; default: SWR_ASSERT(false, "Unimplemented integer bit width"); } return nullptr; @@ -406,8 +403,7 @@ void JitManager::DumpToFile(Function *f, const char *fileName) sprintf(fName, "%s.%s.ll", funcName, fileName); #endif raw_fd_ostream fd(fName, EC, llvm::sys::fs::F_None); - Module* pModule = f->getParent(); - pModule->print(fd, nullptr); + f->print(fd, nullptr); #if defined(_WIN32) sprintf(fName, "%s\\cfg.%s.%s.dot", outDir.c_str(), funcName, fileName); @@ -455,12 +451,16 @@ extern "C" ////////////////////////////////////////////////////////////////////////// struct JitCacheFileHeader { - void Init(uint32_t llCRC, uint32_t objCRC, const std::string& moduleID, const std::string& cpu, uint32_t optLevel, uint64_t bufferSize) + void Init( + uint32_t llCRC, + uint32_t objCRC, + const std::string& moduleID, + const std::string& cpu, + uint32_t optLevel, + uint64_t objSize) { - m_MagicNumber = JC_MAGIC_NUMBER; - m_BufferSize = bufferSize; + m_objSize = objSize; m_llCRC = llCRC; - m_platformKey = JC_PLATFORM_KEY; m_objCRC = objCRC; strncpy(m_ModuleID, moduleID.c_str(), JC_STR_MAX_LEN - 1); m_ModuleID[JC_STR_MAX_LEN - 1] = 0; @@ -469,6 +469,7 @@ struct JitCacheFileHeader m_optLevel = optLevel; } + bool IsValid(uint32_t llCRC, const std::string& moduleID, const std::string& cpu, uint32_t optLevel) { if ((m_MagicNumber != JC_MAGIC_NUMBER) || @@ -494,11 +495,11 @@ struct JitCacheFileHeader return true; } - uint64_t GetBufferSize() const { return m_BufferSize; } - uint64_t GetBufferCRC() const { return m_objCRC; } + uint64_t GetObjectSize() const { return m_objSize; } + uint64_t GetObjectCRC() const { return m_objCRC; } private: - static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543211ULL + 2; + static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543211ULL + 3; static const size_t JC_STR_MAX_LEN = 32; static const uint32_t JC_PLATFORM_KEY = (LLVM_VERSION_MAJOR << 24) | @@ -506,14 +507,14 @@ private: (LLVM_VERSION_PATCH << 8) | ((sizeof(void*) > sizeof(uint32_t)) ? 1 : 0); - uint64_t m_MagicNumber; - uint64_t m_BufferSize; - uint32_t m_llCRC; - uint32_t m_platformKey; - uint32_t m_objCRC; - uint32_t m_optLevel; - char m_ModuleID[JC_STR_MAX_LEN]; - char m_Cpu[JC_STR_MAX_LEN]; + uint64_t m_MagicNumber = JC_MAGIC_NUMBER; + uint64_t m_objSize = 0; + uint32_t m_llCRC = 0; + uint32_t m_platformKey = JC_PLATFORM_KEY; + uint32_t m_objCRC = 0; + uint32_t m_optLevel = 0; + char m_ModuleID[JC_STR_MAX_LEN] = {}; + char m_Cpu[JC_STR_MAX_LEN] = {}; }; static inline uint32_t ComputeModuleCRC(const llvm::Module* M) @@ -532,7 +533,7 @@ static inline uint32_t ComputeModuleCRC(const llvm::Module* M) /// constructor JitCache::JitCache() { -#if defined(__APPLE) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__) +#if defined(__APPLE__) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__) if (strncmp(KNOB_JIT_CACHE_DIR.c_str(), "~/", 2) == 0) { char *homedir; if (!(homedir = getenv("HOME"))) { @@ -547,49 +548,13 @@ JitCache::JitCache() } } -#if defined(_WIN32) -int ExecUnhookedProcess(const char* pCmdLine) +int ExecUnhookedProcess(const std::string& CmdLine, std::string* pStdOut, std::string* pStdErr) { static const char *g_pEnv = "RASTY_DISABLE_HOOK=1\0"; - STARTUPINFOA StartupInfo{}; - StartupInfo.cb = sizeof(STARTUPINFOA); - PROCESS_INFORMATION procInfo{}; - - BOOL ProcessValue = CreateProcessA( - NULL, - (LPSTR)pCmdLine, - NULL, - NULL, - TRUE, - 0, - (LPVOID)g_pEnv, - NULL, - &StartupInfo, - &procInfo); - - if (ProcessValue && procInfo.hProcess) - { - WaitForSingleObject(procInfo.hProcess, INFINITE); - DWORD exitVal = 0; - if (!GetExitCodeProcess(procInfo.hProcess, &exitVal)) - { - exitVal = 1; - } - - CloseHandle(procInfo.hProcess); - - return exitVal; - } - - return -1; + return ExecCmd(CmdLine, g_pEnv, pStdOut, pStdErr); } -#endif -#if defined(_WIN64) && defined(ENABLE_JIT_DEBUG) && defined(JIT_BASE_DIR) -EXTERN_C IMAGE_DOS_HEADER __ImageBase; -static __inline HINSTANCE GetModuleHINSTANCE() { return (HINSTANCE)&__ImageBase; } -#endif /// notifyObjectCompiled - Provides a pointer to compiled code for Module M. void JitCache::notifyObjectCompiled(const llvm::Module *M, llvm::MemoryBufferRef Obj) @@ -607,31 +572,33 @@ void JitCache::notifyObjectCompiled(const llvm::Module *M, llvm::MemoryBufferRef return; } + JitCacheFileHeader header; + llvm::SmallString filePath = mCacheDir; llvm::sys::path::append(filePath, moduleID); + llvm::SmallString objPath = filePath; + objPath += JIT_OBJ_EXT; + { std::error_code err; - llvm::raw_fd_ostream fileObj(filePath.c_str(), err, llvm::sys::fs::F_None); - - uint32_t objcrc = ComputeCRC(0, Obj.getBufferStart(), Obj.getBufferSize()); - - JitCacheFileHeader header; - header.Init(mCurrentModuleCRC, objcrc, moduleID, mCpu, mOptLevel, Obj.getBufferSize()); - - fileObj.write((const char*)&header, sizeof(header)); + llvm::raw_fd_ostream fileObj(objPath.c_str(), err, llvm::sys::fs::F_None); + fileObj << Obj.getBuffer(); fileObj.flush(); } - filePath += JIT_OBJ_EXT; { std::error_code err; llvm::raw_fd_ostream fileObj(filePath.c_str(), err, llvm::sys::fs::F_None); - fileObj << Obj.getBuffer(); + + uint32_t objcrc = ComputeCRC(0, Obj.getBufferStart(), Obj.getBufferSize()); + + header.Init(mCurrentModuleCRC, objcrc, moduleID, mCpu, mOptLevel, Obj.getBufferSize()); + + fileObj.write((const char*)&header, sizeof(header)); fileObj.flush(); } - } /// Returns a pointer to a newly allocated MemoryBuffer that contains the @@ -686,23 +653,25 @@ std::unique_ptr JitCache::getObject(const llvm::Module* M) } #if LLVM_VERSION_MAJOR < 6 - pBuf = llvm::MemoryBuffer::getNewUninitMemBuffer(size_t(header.GetBufferSize())); + pBuf = llvm::MemoryBuffer::getNewUninitMemBuffer(size_t(header.GetObjectSize())); #else - pBuf = llvm::WritableMemoryBuffer::getNewUninitMemBuffer(size_t(header.GetBufferSize())); + pBuf = llvm::WritableMemoryBuffer::getNewUninitMemBuffer(size_t(header.GetObjectSize())); #endif - if (!fread(const_cast(pBuf->getBufferStart()), header.GetBufferSize(), 1, fpObjIn)) + if (!fread(const_cast(pBuf->getBufferStart()), header.GetObjectSize(), 1, fpObjIn)) { pBuf = nullptr; break; } - if (header.GetBufferCRC() != ComputeCRC(0, pBuf->getBufferStart(), pBuf->getBufferSize())) + if (header.GetObjectCRC() != ComputeCRC(0, pBuf->getBufferStart(), pBuf->getBufferSize())) { SWR_TRACE("Invalid object cache file, ignoring: %s", filePath.c_str()); pBuf = nullptr; break; } - } while (0); + + } + while (0); fclose(fpIn); @@ -711,5 +680,6 @@ std::unique_ptr JitCache::getObject(const llvm::Module* M) fclose(fpObjIn); } + return pBuf; }