From 34bbcb5052c57148a22a6a48a6538f983d62fbae Mon Sep 17 00:00:00 2001 From: George Kyriazis Date: Fri, 19 Jan 2018 15:47:00 -0600 Subject: [PATCH] swr/rast: Debug Symbols work Added support for Fetch / Sample / LD functions Added DLL link to JitCache implementation Reviewed-by: Bruce Cherniak --- .../swr/rasterizer/jitter/JitManager.cpp | 92 +++++++++++++++---- .../swr/rasterizer/jitter/JitManager.h | 7 +- .../swr/rasterizer/jitter/fetch_jit.cpp | 2 + .../drivers/swr/rasterizer/jitter/jit_pch.hpp | 6 ++ 4 files changed, 88 insertions(+), 19 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp index 2b993613f53..a3bda616f95 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp @@ -104,7 +104,7 @@ JitManager::JitManager(uint32_t simdWidth, const char *arch, const char* core) if (KNOB_JIT_ENABLE_CACHE) { - mCache.SetCpu(hostCPUName); + mCache.Init(this, hostCPUName); mpExec->setObjectCache(&mCache); } @@ -474,7 +474,7 @@ struct JitCacheFileHeader uint64_t GetBufferCRC() const { return m_objCRC; } private: - static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543211ULL; + static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543211ULL + 1; static const size_t JC_STR_MAX_LEN = 32; static const uint32_t JC_PLATFORM_KEY = (LLVM_VERSION_MAJOR << 24) | @@ -522,6 +522,45 @@ JitCache::JitCache() } } +#if defined(_WIN32) +int ExecUnhookedProcess(const char* pCmdLine) +{ + 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; +} +#endif + /// notifyObjectCompiled - Provides a pointer to compiled code for Module M. void JitCache::notifyObjectCompiled(const llvm::Module *M, llvm::MemoryBufferRef Obj) { @@ -541,24 +580,28 @@ void JitCache::notifyObjectCompiled(const llvm::Module *M, llvm::MemoryBufferRef llvm::SmallString filePath = mCacheDir; llvm::sys::path::append(filePath, moduleID); - std::error_code err; - llvm::raw_fd_ostream fileObj(filePath.c_str(), err, llvm::sys::fs::F_None); + { + 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()); - uint32_t objcrc = ComputeCRC(0, Obj.getBufferStart(), Obj.getBufferSize()); + JitCacheFileHeader header; + header.Init(mCurrentModuleCRC, objcrc, moduleID, mCpu, Obj.getBufferSize()); - JitCacheFileHeader header; - header.Init(mCurrentModuleCRC, objcrc, moduleID, mCpu, Obj.getBufferSize()); + fileObj.write((const char*)&header, sizeof(header)); + fileObj.flush(); + } - fileObj.write((const char*)&header, sizeof(header)); - 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(); + fileObj.flush(); + } - llvm::SmallString filePath2 = filePath; - filePath2 += ".obj"; - - llvm::raw_fd_ostream fileObj2(filePath2.c_str(), err, llvm::sys::fs::F_None); - fileObj2 << Obj.getBuffer(); - fileObj2.flush(); } /// Returns a pointer to a newly allocated MemoryBuffer that contains the @@ -582,6 +625,10 @@ std::unique_ptr JitCache::getObject(const llvm::Module* M) llvm::SmallString filePath = mCacheDir; llvm::sys::path::append(filePath, moduleID); + llvm::SmallString objFilePath = filePath; + objFilePath += JIT_OBJ_EXT; + + FILE* fpObjIn = nullptr; FILE* fpIn = fopen(filePath.c_str(), "rb"); if (!fpIn) { @@ -602,12 +649,18 @@ std::unique_ptr JitCache::getObject(const llvm::Module* M) break; } + fpObjIn = fopen(objFilePath.c_str(), "rb"); + if (!fpObjIn) + { + break; + } + #if LLVM_VERSION_MAJOR < 6 pBuf = llvm::MemoryBuffer::getNewUninitMemBuffer(size_t(header.GetBufferSize())); #else pBuf = llvm::WritableMemoryBuffer::getNewUninitMemBuffer(size_t(header.GetBufferSize())); #endif - if (!fread(const_cast(pBuf->getBufferStart()), header.GetBufferSize(), 1, fpIn)) + if (!fread(const_cast(pBuf->getBufferStart()), header.GetBufferSize(), 1, fpObjIn)) { pBuf = nullptr; break; @@ -623,5 +676,10 @@ std::unique_ptr JitCache::getObject(const llvm::Module* M) fclose(fpIn); + if (fpObjIn) + { + fclose(fpObjIn); + } + return pBuf; } diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h index 4cf2214fd6f..fb20a36625d 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h @@ -84,9 +84,11 @@ struct JitLLVMContext : llvm::LLVMContext { }; + ////////////////////////////////////////////////////////////////////////// /// JitCache ////////////////////////////////////////////////////////////////////////// +struct JitManager; // Forward Decl class JitCache : public llvm::ObjectCache { public: @@ -94,7 +96,7 @@ public: JitCache(); virtual ~JitCache() {} - void SetCpu(const llvm::StringRef& cpu) { mCpu = cpu.str(); } + void Init(JitManager* pJitMgr, const llvm::StringRef& cpu) { mCpu = cpu.str(); mpJitMgr = pJitMgr; } /// notifyObjectCompiled - Provides a pointer to compiled code for Module M. virtual void notifyObjectCompiled(const llvm::Module *M, llvm::MemoryBufferRef Obj); @@ -107,7 +109,8 @@ public: private: std::string mCpu; llvm::SmallString mCacheDir; - uint32_t mCurrentModuleCRC; + uint32_t mCurrentModuleCRC = 0; + JitManager* mpJitMgr = nullptr; }; ////////////////////////////////////////////////////////////////////////// diff --git a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp index d835f2d0296..87363d27ef1 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp @@ -358,6 +358,7 @@ Function* FetchJit::Create(const FETCH_COMPILE_STATE& fetchState) JitManager::DumpToFile(fetch, "opt"); + return fetch; } @@ -2917,6 +2918,7 @@ PFN_FETCH_FUNC JitFetchFunc(HANDLE hJitMgr, const HANDLE hFunc) pJitMgr->DumpAsm(const_cast(func), "final"); + return pfnFetch; } diff --git a/src/gallium/drivers/swr/rasterizer/jitter/jit_pch.hpp b/src/gallium/drivers/swr/rasterizer/jitter/jit_pch.hpp index d0bb479128f..53c03214aad 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/jit_pch.hpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/jit_pch.hpp @@ -132,3 +132,9 @@ using PassManager = llvm::legacy::PassManager; #include #include "common/os.h" + +#if defined(_WIN32) +#define JIT_OBJ_EXT ".obj" +#else +#define JIT_OBJ_EXT ".o" +#endif // _WIN32 -- 2.30.2