BfIRCodeGen.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #pragma once
  2. #include "BfIRBuilder.h"
  3. #include "BfSystem.h"
  4. #include "BfTargetTriple.h"
  5. namespace llvm
  6. {
  7. class Constant;
  8. class Value;
  9. class Type;
  10. class BasicBlock;
  11. class Function;
  12. class FunctionType;
  13. class MDNode;
  14. class InlineAsm;
  15. class DIType;
  16. class DIBuilder;
  17. class DICompileUnit;
  18. class AttributeList;
  19. class Module;
  20. class LLVMContext;
  21. class TargetMachine;
  22. };
  23. NS_BF_BEGIN
  24. enum BfIRCodeGenEntryKind
  25. {
  26. BfIRCodeGenEntryKind_None,
  27. BfIRCodeGenEntryKind_LLVMValue,
  28. BfIRCodeGenEntryKind_LLVMValue_Aligned,
  29. BfIRCodeGenEntryKind_LLVMType,
  30. BfIRCodeGenEntryKind_LLVMBasicBlock,
  31. BfIRCodeGenEntryKind_LLVMMetadata,
  32. BfIRCodeGenEntryKind_IntrinsicData,
  33. };
  34. class BfIRIntrinsicData
  35. {
  36. public:
  37. String mName;
  38. BfIRIntrinsic mIntrinsic;
  39. llvm::Type* mReturnType;
  40. };
  41. struct BfIRCodeGenEntry
  42. {
  43. BfIRCodeGenEntryKind mKind;
  44. union
  45. {
  46. llvm::Value* mLLVMValue;
  47. llvm::Type* mLLVMType;
  48. llvm::BasicBlock* mLLVMBlock;
  49. llvm::MDNode* mLLVMMetadata;
  50. BfIRIntrinsicData* mIntrinsicData;
  51. };
  52. };
  53. class BfIRTypeEntry
  54. {
  55. public:
  56. int mTypeId;
  57. int mSize;
  58. int mAlign;
  59. llvm::DIType* mDIType;
  60. llvm::DIType* mInstDIType;
  61. llvm::Type* mLLVMType;
  62. llvm::Type* mAlignLLVMType;
  63. llvm::Type* mInstLLVMType;
  64. public:
  65. BfIRTypeEntry()
  66. {
  67. mTypeId = -1;
  68. mSize = -1;
  69. mAlign = -1;
  70. mDIType = NULL;
  71. mInstDIType = NULL;
  72. mLLVMType = NULL;
  73. mAlignLLVMType = NULL;
  74. mInstLLVMType = NULL;
  75. }
  76. };
  77. enum BfIRSizeAlignKind
  78. {
  79. BfIRSizeAlignKind_NoTransform,
  80. BfIRSizeAlignKind_Original,
  81. BfIRSizeAlignKind_Aligned,
  82. };
  83. class BfIRCodeGen : public BfIRCodeGenBase
  84. {
  85. public:
  86. BfIRBuilder* mBfIRBuilder;
  87. BumpAllocator mAlloc;
  88. BfTargetTriple mTargetTriple;
  89. String mTargetCPU;
  90. String mModuleName;
  91. llvm::LLVMContext* mLLVMContext;
  92. llvm::Module* mLLVMModule;
  93. llvm::Function* mActiveFunction;
  94. llvm::IRBuilder<>* mIRBuilder;
  95. llvm::AttributeList* mAttrSet;
  96. llvm::DIBuilder* mDIBuilder;
  97. llvm::DICompileUnit* mDICompileUnit;
  98. llvm::TargetMachine* mLLVMTargetMachine;
  99. Array<llvm::DebugLoc> mSavedDebugLocs;
  100. llvm::InlineAsm* mNopInlineAsm;
  101. llvm::InlineAsm* mObjectCheckAsm;
  102. llvm::InlineAsm* mOverflowCheckAsm;
  103. llvm::DebugLoc mDebugLoc;
  104. BfCodeGenOptions mCodeGenOptions;
  105. bool mHasDebugLoc;
  106. bool mIsCodeView;
  107. bool mHadDLLExport;
  108. int mConstValIdx;
  109. int mCmdCount;
  110. Dictionary<int, BfIRCodeGenEntry> mResults;
  111. Dictionary<int, BfIRTypeEntry> mTypes;
  112. Dictionary<int, llvm::Function*> mIntrinsicMap;
  113. Dictionary<llvm::Function*, int> mIntrinsicReverseMap;
  114. Array<llvm::Constant*> mConfigConsts32;
  115. Array<llvm::Constant*> mConfigConsts64;
  116. Dictionary<llvm::Type*, llvm::Value*> mReflectDataMap;
  117. Dictionary<llvm::Type*, llvm::Type*> mAlignedTypeToNormalType;
  118. Dictionary<llvm::Type*, int> mTypeToTypeIdMap;
  119. HashSet<llvm::BasicBlock*> mLockedBlocks;
  120. OwnedArray<BfIRIntrinsicData> mIntrinsicData;
  121. public:
  122. void InitTarget();
  123. void FixValues(llvm::StructType* structType, llvm::SmallVector<llvm::Value*, 8>& values);
  124. void FixIndexer(llvm::Value*& val);
  125. BfTypeCode GetTypeCode(llvm::Type* type, bool isSigned);
  126. llvm::Type* GetLLVMType(BfTypeCode typeCode, bool& isSigned);
  127. BfIRTypeEntry& GetTypeEntry(int typeId);
  128. BfIRTypeEntry* GetTypeEntry(llvm::Type* type);
  129. void SetResult(int id, llvm::Value* value);
  130. void SetResultAligned(int id, llvm::Value* value);
  131. void SetResult(int id, llvm::Type* value);
  132. void SetResult(int id, llvm::BasicBlock* value);
  133. void SetResult(int id, llvm::MDNode* value);
  134. void CreateMemSet(llvm::Value* addr, llvm::Value* val, llvm::Value* size, int alignment, bool isVolatile = false);
  135. void AddNop();
  136. llvm::Value* TryToVector(llvm::Value* value);
  137. llvm::Value* TryToVector(llvm::Value* value, llvm::Type* elemType);
  138. llvm::Type* GetElemType(llvm::Value* value);
  139. bool TryMemCpy(llvm::Value* ptr, llvm::Value* val);
  140. bool TryVectorCpy(llvm::Value* ptr, llvm::Value* val);
  141. llvm::Type* GetSizeAlignedType(BfIRTypeEntry* typeEntry);
  142. llvm::Value* GetAlignedPtr(llvm::Value* val);
  143. llvm::Value* FixGEP(llvm::Value* fromValue, llvm::Value* result);
  144. llvm::Value* DoCheckedIntrinsic(llvm::Intrinsic::ID intrin, llvm::Value* lhs, llvm::Value* rhs, bool useAsm);
  145. public:
  146. BfIRCodeGen();
  147. ~BfIRCodeGen();
  148. void FatalError(const StringImpl& str);
  149. virtual void Fail(const StringImpl& error) override;
  150. void ProcessBfIRData(const BfSizedArray<uint8>& buffer) override;
  151. void PrintModule();
  152. void PrintFunction();
  153. int64 ReadSLEB128();
  154. void Read(StringImpl& str);
  155. void Read(int& i);
  156. void Read(int64& i);
  157. void Read(Val128& i);
  158. void Read(bool& val);
  159. void Read(int8& val);
  160. void Read(BfIRTypeEntry*& type);
  161. void Read(llvm::Type*& llvmType, BfIRTypeEntry** outTypeEntry = NULL);
  162. void Read(llvm::FunctionType*& llvmType);
  163. void Read(llvm::Value*& llvmValue, BfIRCodeGenEntry** codeGenEntry = NULL, BfIRSizeAlignKind sizeAlignKind = BfIRSizeAlignKind_Original);
  164. void Read(llvm::Constant*& llvmConstant, BfIRSizeAlignKind sizeAlignKind = BfIRSizeAlignKind_Original);
  165. void Read(llvm::Function*& llvmFunc);
  166. void Read(llvm::BasicBlock*& llvmBlock);
  167. void Read(llvm::MDNode*& llvmMD);
  168. void Read(llvm::Metadata*& llvmMD);
  169. template <typename T>
  170. void Read(llvm::SmallVectorImpl<T>& vec)
  171. {
  172. int len = (int)ReadSLEB128();
  173. for (int i = 0; i < len; i++)
  174. {
  175. T result;
  176. Read(result);
  177. vec.push_back(result);
  178. }
  179. }
  180. void Read(llvm::SmallVectorImpl<llvm::Value*>& vec, BfIRSizeAlignKind sizeAlignKind = BfIRSizeAlignKind_Original)
  181. {
  182. int len = (int)ReadSLEB128();
  183. for (int i = 0; i < len; i++)
  184. {
  185. llvm::Value* result;
  186. Read(result, NULL, sizeAlignKind);
  187. vec.push_back(result);
  188. }
  189. }
  190. void Read(llvm::SmallVectorImpl<llvm::Constant*>& vec, BfIRSizeAlignKind sizeAlignKind = BfIRSizeAlignKind_Original)
  191. {
  192. int len = (int)ReadSLEB128();
  193. for (int i = 0; i < len; i++)
  194. {
  195. llvm::Constant* result;
  196. Read(result, sizeAlignKind);
  197. vec.push_back(result);
  198. }
  199. }
  200. void HandleNextCmd() override;
  201. void SetCodeGenOptions(BfCodeGenOptions codeGenOptions);
  202. void SetConfigConst(int idx, int value) override;
  203. llvm::Value* GetLLVMValue(int streamId);
  204. llvm::Type* GetLLVMType(int streamId);
  205. llvm::BasicBlock* GetLLVMBlock(int streamId);
  206. llvm::MDNode* GetLLVMMetadata(int streamId);
  207. llvm::Type* GetLLVMTypeById(int id);
  208. ///
  209. bool WriteObjectFile(const StringImpl& outFileName);
  210. bool WriteIR(const StringImpl& outFileName, StringImpl& error);
  211. static int GetIntrinsicId(const StringImpl& name);
  212. static const char* GetIntrinsicName(int intrinId);
  213. static void SetAsmKind(BfAsmKind asmKind);
  214. static void StaticInit();
  215. };
  216. NS_BF_END