#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
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;
#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
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;
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);
//////////////////////////////////////////////////////////////////////////
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;
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) ||
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) |
(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)
/// 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"))) {
}
}
-#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)
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
}
#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);
fclose(fpObjIn);
}
+
return pBuf;
}