swr/rast: Start refactoring of builder/packetizer.
[mesa.git] / src / gallium / drivers / swr / rasterizer / jitter / JitManager.cpp
index 70f31379a79b656cbe844ad41569f29b5405d936..bfb1d2e0c8b078db98a616538894d336abe876aa 100644 (file)
@@ -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 <pwd.h>
 #include <sys/stat.h>
 #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<Type*> 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<MAX_PATH> filePath = mCacheDir;
     llvm::sys::path::append(filePath, moduleID);
 
+    llvm::SmallString<MAX_PATH> 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<llvm::MemoryBuffer> 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<char*>(pBuf->getBufferStart()), header.GetBufferSize(), 1, fpObjIn))
+        if (!fread(const_cast<char*>(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<llvm::MemoryBuffer> JitCache::getObject(const llvm::Module* M)
         fclose(fpObjIn);
     }
 
+
     return pBuf;
 }