BfCodeGen.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #pragma once
  2. #include "BeefySysLib/util/PerfTimer.h"
  3. #include "BeefySysLib/util/CritSect.h"
  4. #include "BeefySysLib/Common.h"
  5. #include "BeefySysLib/util/PerfTimer.h"
  6. #include "BfAst.h"
  7. #include "BfSystem.h"
  8. namespace llvm
  9. {
  10. class Module;
  11. class LLVMContext;
  12. class TargetMachine;
  13. }
  14. NS_BF_BEGIN
  15. class BfModule;
  16. enum BfCodeGenResultType
  17. {
  18. BfCodeGenResult_NotDone,
  19. BfCodeGenResult_Done,
  20. BfCodeGenResult_DoneCached,
  21. BfCodeGenResult_Failed,
  22. BfCodeGenResult_Aborted,
  23. };
  24. struct BfCodeGenResult
  25. {
  26. static const int kErrorMsgBufSize = 1024;
  27. BfCodeGenResultType mType;
  28. char mErrorMsgBuf[kErrorMsgBufSize]; // not using String etc. since can be modified cross-process
  29. int mErrorMsgBufLen;
  30. BfCodeGenResult() { mType = BfCodeGenResult_NotDone; mErrorMsgBufLen = 0; }
  31. };
  32. class BfCodeGenErrorEntry
  33. {
  34. public:
  35. BfModule* mSrcModule;
  36. String mOutFileName;
  37. Array<String> mErrorMessages;
  38. };
  39. class BfCodeGenRequest
  40. {
  41. public:
  42. BfModule* mSrcModule;
  43. BfCodeGenOptions mOptions;
  44. BfCodeGenResult mResult;
  45. Array<uint8> mOutBuffer;
  46. BfSizedArray<uint8> mData;
  47. String mOutFileName;
  48. BfCodeGenResult* mExternResultPtr;
  49. public:
  50. BfCodeGenRequest()
  51. {
  52. mSrcModule = NULL;
  53. mResult.mType = BfCodeGenResult_NotDone;
  54. mResult.mErrorMsgBufLen = 0;
  55. mExternResultPtr = NULL;
  56. }
  57. ~BfCodeGenRequest()
  58. {
  59. }
  60. void DbgSaveData();
  61. };
  62. class BfCodeGen;
  63. class BfCodeGenThread
  64. {
  65. public:
  66. BfCodeGen* mCodeGen;
  67. int mThreadIdx;
  68. //std::vector<BfCodeGenRequest*> mRequests;
  69. volatile bool mShuttingDown;
  70. volatile bool mRunning;
  71. public:
  72. bool RawWriteObjectFile(llvm::Module* module, const StringImpl& outFileName, const BfCodeGenOptions& codeGenOptions);
  73. public:
  74. BfCodeGenThread();
  75. ~BfCodeGenThread();
  76. void RunLoop();
  77. void Shutdown();
  78. void Start();
  79. };
  80. class BfCodeGenFileData
  81. {
  82. public:
  83. Val128 mIRHash; // Equal when exact IR bits are equal
  84. Val128 mIROrderedHash; // Equal when isomorphic (when alphabetically reordered functions hash equally)
  85. bool mLastWasObjectWrite;
  86. };
  87. class BfCodeGenDirectoryData
  88. {
  89. public:
  90. BfCodeGen* mCodeGen;
  91. Dictionary<String, BfCodeGenFileData> mFileMap;
  92. Dictionary<String, String> mBuildSettings;
  93. String mDirectoryName;
  94. bool mDirty;
  95. bool mVerified;
  96. int64 mFileTime;
  97. String mError;
  98. bool mFileFailed;
  99. public:
  100. BfCodeGenDirectoryData()
  101. {
  102. mCodeGen = NULL;
  103. mDirty = true;
  104. mVerified = true;
  105. mFileTime = 0;
  106. mFileFailed = false;
  107. }
  108. String GetDataFileName();
  109. void Read();
  110. void Write();
  111. void Verify();
  112. void Clear();
  113. bool CheckCache(const StringImpl& fileName, Val128 hash, Val128* outOrderedHash, bool disallowObjectWrite);
  114. void SetHash(const StringImpl& fileName, Val128 hash, Val128 orderedHash, bool isObjectWrite);
  115. void ClearHash(const StringImpl& fileName);
  116. void FileFailed();
  117. String GetValue(const StringImpl& key);
  118. void SetValue(const StringImpl& key, const StringImpl& value);
  119. };
  120. class BfCodeGenFileEntry
  121. {
  122. public:
  123. String mFileName;
  124. BfModule* mModule;
  125. BfProject* mProject;
  126. bool mWasCached;
  127. bool mModuleHotReferenced; // Only applicable for hot loading
  128. };
  129. class BfCodeGen
  130. {
  131. public:
  132. typedef int (BF_CALLTYPE* ClearCacheFunc)();
  133. typedef int (BF_CALLTYPE* GetVersionFunc)();
  134. typedef void (BF_CALLTYPE* KillFunc)();
  135. typedef void (BF_CALLTYPE* CancelFunc)();
  136. typedef void (BF_CALLTYPE* FinishFunc)();
  137. typedef void (BF_CALLTYPE* GenerateObjFunc)(const void* ptr, int size, const char* outFileName, BfCodeGenResult* resultPtr, const BfCodeGenOptions& options);
  138. public:
  139. BfpDynLib* mReleaseModule;
  140. bool mAttemptedReleaseThunkLoad;
  141. bool mIsUsingReleaseThunk;
  142. ClearCacheFunc mClearCacheFunc;
  143. GetVersionFunc mGetVersionFunc;
  144. KillFunc mKillFunc;
  145. CancelFunc mCancelFunc;
  146. FinishFunc mFinishFunc;
  147. GenerateObjFunc mGenerateObjFunc;
  148. Val128 mBackendHash;
  149. int mMaxThreadCount;
  150. CritSect mThreadsCritSect;
  151. Array<BfCodeGenThread*> mThreads;
  152. Array<BfCodeGenThread*> mOldThreads;
  153. Deque<BfCodeGenRequest*> mRequests;
  154. CritSect mPendingRequestCritSect;
  155. Deque<BfCodeGenRequest*> mPendingRequests;
  156. SyncEvent mRequestEvent;
  157. int mRequestIdx;
  158. SyncEvent mDoneEvent;
  159. int mQueuedCount;
  160. int mCompletionCount;
  161. Array<BfCodeGenErrorEntry> mFailedRequests;
  162. Array<BfCodeGenFileEntry> mCodeGenFiles;
  163. CritSect mCacheCritSect;
  164. bool mDisableCacheReads;
  165. Dictionary<String, BfCodeGenDirectoryData*> mDirectoryCache;
  166. public:
  167. void SetMaxThreads(int maxThreads);
  168. void BindReleaseThunks();
  169. void ClearResults();
  170. void DoWriteObjectFile(BfCodeGenRequest* codeGenRequest, const void* ptr, int size, const StringImpl& outFileName, BfCodeGenResult* externResultPtr);
  171. bool ExternWriteObjectFile(BfCodeGenRequest* codeGenRequest);
  172. void ClearOldThreads(bool waitForThread);
  173. void ClearBuildCache();
  174. void RequestComplete(BfCodeGenRequest* request);
  175. void ProcessErrors(BfPassInstance* passInstance, bool canceled);
  176. BfCodeGenDirectoryData* GetDirCache(const StringImpl& cacheDir);
  177. public:
  178. BfCodeGen();
  179. ~BfCodeGen();
  180. void ResetStats();
  181. void UpdateStats();
  182. void WriteObjectFile(BfModule* module, const StringImpl& outFileName, const BfCodeGenOptions& options);
  183. String GetBuildValue(const StringImpl& buildDir, const StringImpl& key);
  184. void SetBuildValue(const StringImpl& buildDir, const StringImpl& key, const StringImpl& value);
  185. void WriteBuildCache(const StringImpl& buildDir);
  186. void Cancel();
  187. bool Finish();
  188. };
  189. NS_BF_END