CeMachine.h 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357
  1. #pragma once
  2. #include "BfSystem.h"
  3. #include "BfModule.h"
  4. #include "BeefySysLib/util/Heap.h"
  5. #include "BeefySysLib/util/AllocDebug.h"
  6. #include "BfMangler.h"
  7. NS_BF_BEGIN
  8. class BfParser;
  9. class BfReducer;
  10. class BfMethodInstance;
  11. class BeModule;
  12. class BeContext;
  13. class BeDbgLoc;
  14. class BeType;
  15. class BeValue;
  16. class BeConstant;
  17. class BeInst;
  18. class BeDbgFile;
  19. class BePhiInst;
  20. class BeFunction;
  21. class BeSwitchInst;
  22. class BeGlobalVariable;
  23. class CeMachine;
  24. class CeFunction;
  25. class CeDebugger;
  26. class CeBreakpoint;
  27. #define CEOP_SIZED(OPNAME) \
  28. CeOp_##OPNAME##_8, \
  29. CeOp_##OPNAME##_16, \
  30. CeOp_##OPNAME##_32, \
  31. CeOp_##OPNAME##_64, \
  32. CeOp_##OPNAME##_X
  33. #define CEOP_SIZED_FLOAT(OPNAME) \
  34. CeOp_##OPNAME##_F32, \
  35. CeOp_##OPNAME##_F64
  36. #define CEOP_SIZED_NUMERIC(OPNAME) \
  37. CeOp_##OPNAME##_I8, \
  38. CeOp_##OPNAME##_I16, \
  39. CeOp_##OPNAME##_I32, \
  40. CeOp_##OPNAME##_I64
  41. #define CEOP_SIZED_UNUMERIC(OPNAME) \
  42. CeOp_##OPNAME##_U8, \
  43. CeOp_##OPNAME##_U16, \
  44. CeOp_##OPNAME##_U32, \
  45. CeOp_##OPNAME##_U64
  46. #define CEOP_SIZED_NUMERIC_PLUSF(OPNAME) \
  47. CeOp_##OPNAME##_I8, \
  48. CeOp_##OPNAME##_I16, \
  49. CeOp_##OPNAME##_I32, \
  50. CeOp_##OPNAME##_I64, \
  51. CeOp_##OPNAME##_F32, \
  52. CeOp_##OPNAME##_F64
  53. enum CeErrorKind
  54. {
  55. CeErrorKind_None,
  56. CeErrorKind_Error,
  57. CeErrorKind_GlobalVariable,
  58. CeErrorKind_FunctionPointer,
  59. CeErrorKind_Intrinsic,
  60. CeErrorKind_ObjectDynCheckFailed
  61. };
  62. enum CeOp : int16
  63. {
  64. CeOp_InvalidOp,
  65. CeOp_Nop,
  66. CeOp_DbgBreak,
  67. CeOp_Ret,
  68. CeOp_SetRetType,
  69. CeOp_Jmp,
  70. CeOp_JmpIf,
  71. CeOp_JmpIfNot,
  72. CeOp_Error,
  73. CeOp_DynamicCastCheck,
  74. CeOp_GetReflectType,
  75. CeOp_GetString,
  76. CeOp_Malloc,
  77. CeOp_Free,
  78. CeOp_MemSet,
  79. CeOp_MemSet_Const,
  80. CeOp_MemCpy,
  81. CeOp_FrameAddr_32,
  82. CeOp_FrameAddr_64,
  83. CeOp_FrameAddrOfs_32,
  84. CeOp_ConstData,
  85. CeOp_ConstDataRef,
  86. CeOp_Zero,
  87. CEOP_SIZED(Const),
  88. CEOP_SIZED(Load),
  89. CEOP_SIZED(Store),
  90. CEOP_SIZED(Move),
  91. CEOP_SIZED(Push),
  92. CEOP_SIZED(Pop),
  93. CeOp_AdjustSP,
  94. CeOp_AdjustSPNeg,
  95. CeOp_AdjustSPConst,
  96. CeOp_GetSP,
  97. CeOp_SetSP,
  98. CeOp_GetStaticField,
  99. CeOp_GetStaticField_Initializer,
  100. CeOp_GetMethod,
  101. CeOp_GetMethod_Inner,
  102. CeOp_GetMethod_Virt,
  103. CeOp_GetMethod_IFace,
  104. CeOp_Call,
  105. CeOp_Conv_I8_I16,
  106. CeOp_Conv_I8_I32,
  107. CeOp_Conv_I8_I64,
  108. CeOp_Conv_I8_F32,
  109. CeOp_Conv_I8_F64,
  110. CeOp_Conv_I16_I32,
  111. CeOp_Conv_I16_I64,
  112. CeOp_Conv_I16_F32,
  113. CeOp_Conv_I16_F64,
  114. CeOp_Conv_I32_I64,
  115. CeOp_Conv_I32_F32,
  116. CeOp_Conv_I32_F64,
  117. CeOp_Conv_I64_F32,
  118. CeOp_Conv_I64_F64,
  119. CeOp_Conv_U8_U16,
  120. CeOp_Conv_U8_U32,
  121. CeOp_Conv_U8_U64,
  122. CeOp_Conv_U8_F32,
  123. CeOp_Conv_U8_F64,
  124. CeOp_Conv_U16_U32,
  125. CeOp_Conv_U16_U64,
  126. CeOp_Conv_U16_F32,
  127. CeOp_Conv_U16_F64,
  128. CeOp_Conv_U32_U64,
  129. CeOp_Conv_U32_F32,
  130. CeOp_Conv_U32_F64,
  131. CeOp_Conv_U64_F32,
  132. CeOp_Conv_U64_F64,
  133. CeOp_Conv_F32_I8,
  134. CeOp_Conv_F32_I16,
  135. CeOp_Conv_F32_I32,
  136. CeOp_Conv_F32_I64,
  137. CeOp_Conv_F32_U8,
  138. CeOp_Conv_F32_U16,
  139. CeOp_Conv_F32_U32,
  140. CeOp_Conv_F32_U64,
  141. CeOp_Conv_F32_F64,
  142. CeOp_Conv_F64_I8,
  143. CeOp_Conv_F64_I16,
  144. CeOp_Conv_F64_I32,
  145. CeOp_Conv_F64_I64,
  146. CeOp_Conv_F64_U8,
  147. CeOp_Conv_F64_U16,
  148. CeOp_Conv_F64_U32,
  149. CeOp_Conv_F64_U64,
  150. CeOp_Conv_F64_F32,
  151. CEOP_SIZED_NUMERIC_PLUSF(Abs),
  152. CEOP_SIZED_NUMERIC_PLUSF(AddConst),
  153. CEOP_SIZED_NUMERIC_PLUSF(Add),
  154. CEOP_SIZED_NUMERIC_PLUSF(Sub),
  155. CEOP_SIZED_NUMERIC_PLUSF(Mul),
  156. CEOP_SIZED_NUMERIC_PLUSF(Div),
  157. CEOP_SIZED_UNUMERIC(Div),
  158. CEOP_SIZED_NUMERIC_PLUSF(Mod),
  159. CEOP_SIZED_UNUMERIC(Mod),
  160. CEOP_SIZED_NUMERIC(And),
  161. CEOP_SIZED_NUMERIC(Or),
  162. CEOP_SIZED_NUMERIC(Xor),
  163. CEOP_SIZED_NUMERIC(Shl),
  164. CEOP_SIZED_NUMERIC(Shr),
  165. CEOP_SIZED_UNUMERIC(Shr),
  166. CEOP_SIZED_FLOAT(Acos),
  167. CEOP_SIZED_FLOAT(Asin),
  168. CEOP_SIZED_FLOAT(Atan),
  169. CEOP_SIZED_FLOAT(Atan2),
  170. CEOP_SIZED_FLOAT(Ceiling),
  171. CEOP_SIZED_FLOAT(Cos),
  172. CEOP_SIZED_FLOAT(Cosh),
  173. CEOP_SIZED_FLOAT(Exp),
  174. CEOP_SIZED_FLOAT(Floor),
  175. CEOP_SIZED_FLOAT(Log),
  176. CEOP_SIZED_FLOAT(Log10),
  177. CEOP_SIZED_FLOAT(Pow),
  178. CEOP_SIZED_FLOAT(Round),
  179. CEOP_SIZED_FLOAT(Sin),
  180. CEOP_SIZED_FLOAT(Sinh),
  181. CEOP_SIZED_FLOAT(Sqrt),
  182. CEOP_SIZED_FLOAT(Tan),
  183. CEOP_SIZED_FLOAT(Tanh),
  184. CEOP_SIZED_NUMERIC_PLUSF(Cmp_EQ),
  185. CEOP_SIZED_NUMERIC_PLUSF(Cmp_NE),
  186. CEOP_SIZED_NUMERIC_PLUSF(Cmp_SLT),
  187. CEOP_SIZED_NUMERIC(Cmp_ULT),
  188. CEOP_SIZED_NUMERIC_PLUSF(Cmp_SLE),
  189. CEOP_SIZED_NUMERIC(Cmp_ULE),
  190. CEOP_SIZED_NUMERIC_PLUSF(Cmp_SGT),
  191. CEOP_SIZED_NUMERIC(Cmp_UGT),
  192. CEOP_SIZED_NUMERIC_PLUSF(Cmp_SGE),
  193. CEOP_SIZED_NUMERIC(Cmp_UGE),
  194. CEOP_SIZED_NUMERIC_PLUSF(Neg),
  195. CeOp_Not_I1,
  196. CEOP_SIZED_NUMERIC(Not),
  197. CeOp_COUNT
  198. };
  199. enum CeOperandKind
  200. {
  201. CeOperandKind_None,
  202. CeOperandKind_FrameOfs,
  203. CeOperandKind_AllocaAddr,
  204. CeOperandKind_Block,
  205. CeOperandKind_Immediate,
  206. CeOperandKind_ConstStructTableIdx,
  207. CeOperandKind_CallTableIdx
  208. };
  209. class CeOperand
  210. {
  211. public:
  212. CeOperandKind mKind;
  213. union
  214. {
  215. int mFrameOfs;
  216. int mBlockIdx;
  217. int mImmediate;
  218. int mCallTableIdx;
  219. int mStructTableIdx;
  220. BeConstant* mConstant;
  221. };
  222. BeType* mType;
  223. public:
  224. CeOperand()
  225. {
  226. mKind = CeOperandKind_None;
  227. mFrameOfs = 0;
  228. mType = NULL;
  229. }
  230. operator bool() const
  231. {
  232. return mKind != CeOperandKind_None;
  233. }
  234. bool IsImmediate()
  235. {
  236. return mKind == CeOperandKind_Immediate;
  237. }
  238. };
  239. struct CeEmitEntry
  240. {
  241. int mCodePos;
  242. int mScope;
  243. int mLine;
  244. int mColumn;
  245. };
  246. struct CeDbgMethodRef
  247. {
  248. BfMethodRef mMethodRef;
  249. String mNameMod;
  250. String ToString();
  251. bool operator==(const CeDbgMethodRef& second) const
  252. {
  253. return (mMethodRef == second.mMethodRef) && (mNameMod == second.mNameMod);
  254. }
  255. };
  256. struct CeDbgScope
  257. {
  258. public:
  259. enum MethodValFlag
  260. {
  261. MethodValFlag_MethodRef = 0x40000000,
  262. MethodValFlag_IdxMask = 0x3FFFFFFF
  263. };
  264. public:
  265. String mFilePath;
  266. BfMethodRef mMethodRef;
  267. int mInlinedAt;
  268. int mMethodVal; // call table idx or methodRef idx, depending on MethodValFlag_MethodRef
  269. public:
  270. CeDbgScope()
  271. {
  272. mInlinedAt = -1;
  273. mMethodVal = -1;
  274. }
  275. };
  276. struct CeDbgInlineEntry
  277. {
  278. int mScope;
  279. int mLine;
  280. int mColumn;
  281. };
  282. class CeFunctionInfo
  283. {
  284. public:
  285. String mName;
  286. BfMethodInstance* mMethodInstance;
  287. BfMethodRef mMethodRef;
  288. CeFunction* mCeFunction;
  289. int mRefCount;
  290. public:
  291. CeFunctionInfo()
  292. {
  293. mMethodInstance = NULL;
  294. mCeFunction = NULL;
  295. mRefCount = 0;
  296. }
  297. ~CeFunctionInfo();
  298. BfTypeInstance* GetOwner()
  299. {
  300. if (mMethodInstance != NULL)
  301. return mMethodInstance->GetOwner();
  302. return mMethodRef.mTypeInstance;
  303. }
  304. };
  305. class CeCallEntry
  306. {
  307. public:
  308. CeFunctionInfo* mFunctionInfo;
  309. int mBindRevision;
  310. CeFunction* mFunction;
  311. public:
  312. CeCallEntry()
  313. {
  314. mFunctionInfo = NULL;
  315. mBindRevision = -1;
  316. mFunction = NULL;
  317. }
  318. };
  319. class CeStringEntry
  320. {
  321. public:
  322. int mStringId;
  323. int mBindExecuteId;
  324. addr_ce mStringAddr;
  325. public:
  326. CeStringEntry()
  327. {
  328. mStringId = -1;
  329. mBindExecuteId = -1;
  330. mStringAddr = 0;
  331. }
  332. };
  333. class CeInternalData
  334. {
  335. public:
  336. enum Kind
  337. {
  338. Kind_None,
  339. Kind_File,
  340. Kind_FindFileData,
  341. Kind_Spawn
  342. };
  343. public:
  344. Kind mKind;
  345. bool mReleased;
  346. int mRefCount;
  347. union
  348. {
  349. BfpFile* mFile;
  350. BfpFindFileData* mFindFileData;
  351. BfpSpawn* mSpawn;
  352. };
  353. CeInternalData()
  354. {
  355. mKind = Kind_None;
  356. mReleased = false;
  357. mRefCount = 1;
  358. }
  359. void AddRef()
  360. {
  361. BfpSystem_InterlockedExchangeAdd32((uint32*)&mRefCount, 1);
  362. }
  363. void Release()
  364. {
  365. if (BfpSystem_InterlockedExchangeAdd32((uint32*)&mRefCount, (uint32)-1) == 1)
  366. delete this;
  367. }
  368. ~CeInternalData();
  369. };
  370. enum CeFunctionKind
  371. {
  372. CeFunctionKind_NotSet,
  373. CeFunctionKind_Normal,
  374. CeFunctionKind_Extern,
  375. CeFunctionKind_OOB,
  376. CeFunctionKind_ObjectNotInitialized,
  377. CeFunctionKind_Malloc,
  378. CeFunctionKind_Free,
  379. CeFunctionKind_DynCheckFailed,
  380. CeFunctionKind_FatalError,
  381. CeFunctionKind_DebugWrite,
  382. CeFunctionKind_DebugWrite_Int,
  383. CeFunctionKind_GetReflectTypeDeclById,
  384. CeFunctionKind_GetReflectTypeDeclByName,
  385. CeFunctionKind_GetReflectNextTypeDecl,
  386. CeFunctionKind_GetBaseType,
  387. CeFunctionKind_HasDeclaredMember,
  388. CeFunctionKind_GetReflectType,
  389. CeFunctionKind_GetReflectTypeById,
  390. CeFunctionKind_GetWrappedType,
  391. CeFunctionKind_GetReflectTypeByName,
  392. CeFunctionKind_GetReflectSpecializedType,
  393. CeFunctionKind_Type_ToString,
  394. CeFunctionKind_TypeName_ToString,
  395. CeFunctionKind_Namespace_ToString,
  396. CeFunctionKind_Type_GetCustomAttribute,
  397. CeFunctionKind_Field_GetCustomAttribute,
  398. CeFunctionKind_Method_GetCustomAttribute,
  399. CeFunctionKind_Type_GetCustomAttributeType,
  400. CeFunctionKind_Field_GetCustomAttributeType,
  401. CeFunctionKind_Method_GetCustomAttributeType,
  402. CeFunctionKind_GetMethodCount,
  403. CeFunctionKind_GetMethod,
  404. CeFunctionKind_Method_ToString,
  405. CeFunctionKind_Method_GetName,
  406. CeFunctionKind_Method_GetInfo,
  407. CeFunctionKind_Method_GetParamInfo,
  408. CeFunctionKind_Method_GetGenericArg,
  409. CeFunctionKind_Field_GetStatic,
  410. CeFunctionKind_SetReturnType,
  411. CeFunctionKind_Align,
  412. CeFunctionKind_EmitTypeBody,
  413. CeFunctionKind_EmitAddInterface,
  414. CeFunctionKind_EmitMethodEntry,
  415. CeFunctionKind_EmitMethodExit,
  416. CeFunctionKind_EmitMixin,
  417. CeFunctionKind_GetStringById,
  418. CeFunctionKind_BfpDirectory_Create,
  419. CeFunctionKind_BfpDirectory_Rename,
  420. CeFunctionKind_BfpDirectory_Delete,
  421. CeFunctionKind_BfpDirectory_GetCurrent,
  422. CeFunctionKind_BfpDirectory_SetCurrent,
  423. CeFunctionKind_BfpDirectory_Exists,
  424. CeFunctionKind_BfpDirectory_GetSysDirectory,
  425. CeFunctionKind_BfpFile_Close,
  426. CeFunctionKind_BfpFile_Create,
  427. CeFunctionKind_BfpFile_Flush,
  428. CeFunctionKind_BfpFile_GetFileSize,
  429. CeFunctionKind_BfpFile_Read,
  430. CeFunctionKind_BfpFile_Release,
  431. CeFunctionKind_BfpFile_Seek,
  432. CeFunctionKind_BfpFile_Truncate,
  433. CeFunctionKind_BfpFile_Write,
  434. CeFunctionKind_BfpFile_GetTime_LastWrite,
  435. CeFunctionKind_BfpFile_GetAttributes,
  436. CeFunctionKind_BfpFile_SetAttributes,
  437. CeFunctionKind_BfpFile_Copy,
  438. CeFunctionKind_BfpFile_Rename,
  439. CeFunctionKind_BfpFile_Delete,
  440. CeFunctionKind_BfpFile_Exists,
  441. CeFunctionKind_BfpFile_GetTempPath,
  442. CeFunctionKind_BfpFile_GetTempFileName,
  443. CeFunctionKind_BfpFile_GetFullPath,
  444. CeFunctionKind_BfpFile_GetActualPath,
  445. CeFunctionKind_BfpFindFileData_FindFirstFile,
  446. CeFunctionKind_BfpFindFileData_FindNextFile,
  447. CeFunctionKind_BfpFindFileData_GetFileName,
  448. CeFunctionKind_BfpFindFileData_GetTime_LastWrite,
  449. CeFunctionKind_BfpFindFileData_GetTime_Created,
  450. CeFunctionKind_BfpFindFileData_GetTime_Access,
  451. CeFunctionKind_BfpFindFileData_GetFileAttributes,
  452. CeFunctionKind_BfpFindFileData_GetFileSize,
  453. CeFunctionKind_BfpFindFileData_Release,
  454. CeFunctionKind_BfpSpawn_Create,
  455. CeFunctionKind_BfpSpawn_GetStdHandles,
  456. CeFunctionKind_BfpSpawn_Kill,
  457. CeFunctionKind_BfpSpawn_Release,
  458. CeFunctionKind_BfpSpawn_WaitFor,
  459. CeFunctionKind_BfpSystem_GetTimeStamp,
  460. CeFunctionKind_Sleep,
  461. CeFunctionKind_Char32_ToLower,
  462. CeFunctionKind_Char32_ToUpper,
  463. CeFunctionKind_Char32_IsLower,
  464. CeFunctionKind_Char32_IsUpper,
  465. CeFunctionKind_Char32_IsWhiteSpace_EX,
  466. CeFunctionKind_Char32_IsLetterOrDigit,
  467. CeFunctionKind_Char32_IsLetter,
  468. CeFunctionKind_Char32_IsNumber,
  469. CeFunctionKind_Double_Strtod,
  470. CeFunctionKind_Double_Ftoa,
  471. CeFunctionKind_Double_ToString,
  472. CeFunctionKind_Float_ToString,
  473. CeFunctionKind_Math_Abs,
  474. CeFunctionKind_Math_Acos,
  475. CeFunctionKind_Math_Asin,
  476. CeFunctionKind_Math_Atan,
  477. CeFunctionKind_Math_Atan2,
  478. CeFunctionKind_Math_Ceiling,
  479. CeFunctionKind_Math_Cos,
  480. CeFunctionKind_Math_Cosh,
  481. CeFunctionKind_Math_Exp,
  482. CeFunctionKind_Math_Floor,
  483. CeFunctionKind_Math_Log,
  484. CeFunctionKind_Math_Log10,
  485. CeFunctionKind_Math_Mod,
  486. CeFunctionKind_Math_Pow,
  487. CeFunctionKind_Math_Round,
  488. CeFunctionKind_Math_Sin,
  489. CeFunctionKind_Math_Sinh,
  490. CeFunctionKind_Math_Sqrt,
  491. CeFunctionKind_Math_Tan,
  492. CeFunctionKind_Math_Tanh,
  493. };
  494. class CeConstStructFixup
  495. {
  496. public:
  497. enum Kind
  498. {
  499. Kind_None,
  500. Kind_StringPtr,
  501. Kind_StringCharPtr,
  502. };
  503. public:
  504. Kind mKind;
  505. int mValue;
  506. int mOffset;
  507. };
  508. class CeConstStructData
  509. {
  510. public:
  511. Val128 mHash;
  512. Array<uint8> mData;
  513. Array<uint8> mFixedData;
  514. Array<CeConstStructFixup> mFixups;
  515. addr_ce mAddr;
  516. int mBindExecuteId;
  517. bool mQueueFixups;
  518. public:
  519. CeConstStructData()
  520. {
  521. mBindExecuteId = -1;
  522. mAddr = 0;
  523. mQueueFixups = false;
  524. }
  525. };
  526. class CeInnerFunctionInfo
  527. {
  528. public:
  529. String mName;
  530. BeFunction* mBeFunction;
  531. CeFunction* mOwner;
  532. };
  533. class CeStaticFieldEntry
  534. {
  535. public:
  536. String mName;
  537. int mTypeId;
  538. int mSize;
  539. addr_ce mAddr;
  540. int mBindExecuteId;
  541. public:
  542. CeStaticFieldEntry()
  543. {
  544. mTypeId = -1;
  545. mSize = 0;
  546. mAddr = 0;
  547. mBindExecuteId = -1;
  548. }
  549. };
  550. class CeDbgVariable
  551. {
  552. public:
  553. String mName;
  554. CeOperand mValue;
  555. BfType* mType;
  556. int mScope;
  557. bool mIsConst;
  558. int mStartCodePos;
  559. int mEndCodePos;
  560. };
  561. class CeDbgFunctionInfo
  562. {
  563. public:
  564. Array<CeDbgVariable> mVariables;
  565. };
  566. class CeBreakpointBind
  567. {
  568. public:
  569. CeOp mPrevOpCode;
  570. CeBreakpoint* mBreakpoint;
  571. };
  572. class CeFunction
  573. {
  574. public:
  575. enum InitializeState
  576. {
  577. InitializeState_None,
  578. InitializeState_Initializing,
  579. InitializeState_Initializing_ReEntry,
  580. InitializeState_Initialized
  581. };
  582. public:
  583. CeMachine* mCeMachine;
  584. CeFunctionInfo* mCeFunctionInfo;
  585. CeInnerFunctionInfo* mCeInnerFunctionInfo;
  586. BfMethodInstance* mMethodInstance;
  587. CeFunctionKind mFunctionKind;
  588. InitializeState mInitializeState;
  589. bool mFailed;
  590. bool mIsVarReturn;
  591. Array<uint8> mCode;
  592. Array<CeDbgScope> mDbgScopes;
  593. Array<CeDbgInlineEntry> mDbgInlineTable;
  594. Array<CeDbgMethodRef> mDbgMethodRefTable;
  595. Array<CeEmitEntry> mEmitTable;
  596. Array<CeCallEntry> mCallTable;
  597. Array<CeStringEntry> mStringTable;
  598. Array<CeConstStructData> mConstStructTable;
  599. Array<CeStaticFieldEntry> mStaticFieldTable;
  600. Array<BfType*> mTypeTable;
  601. Array<CeFunction*> mInnerFunctions;
  602. Dictionary<int, CeBreakpointBind> mBreakpoints;
  603. String mGenError;
  604. int mFrameSize;
  605. int mMaxReturnSize;
  606. int mId;
  607. int mBreakpointVersion;
  608. CeDbgFunctionInfo* mDbgInfo;
  609. public:
  610. CeFunction()
  611. {
  612. mCeMachine = NULL;
  613. mCeFunctionInfo = NULL;
  614. mCeInnerFunctionInfo = NULL;
  615. mFunctionKind = CeFunctionKind_NotSet;
  616. mInitializeState = InitializeState_None;
  617. mMethodInstance = NULL;
  618. mFailed = false;
  619. mIsVarReturn = false;
  620. mFrameSize = 0;
  621. mMaxReturnSize = 0;
  622. mBreakpointVersion = 0;
  623. mId = -1;
  624. mDbgInfo = NULL;
  625. }
  626. ~CeFunction();
  627. BfTypeInstance* GetOwner();
  628. void Print();
  629. void UnbindBreakpoints();
  630. CeEmitEntry* FindEmitEntry(int loc, int* entryIdx = NULL);
  631. int SafeGetId();
  632. };
  633. enum CeEvalFlags
  634. {
  635. CeEvalFlags_None = 0,
  636. CeEvalFlags_Cascade = 1,
  637. CeEvalFlags_PersistantError = 2,
  638. CeEvalFlags_DeferIfNotOnlyError = 4,
  639. CeEvalFlags_NoRebuild = 8,
  640. CeEvalFlags_ForceReturnThis = 0x10,
  641. CeEvalFlags_IgnoreConstEncodeFailure = 0x20,
  642. CeEvalFlags_DbgCall = 0x40
  643. };
  644. #define BF_CE_DEFAULT_STACK_SIZE 4*1024*1024
  645. #define BF_CE_DEFAULT_HEAP_SIZE 128*1024
  646. #define BF_CE_INITIAL_MEMORY BF_CE_DEFAULT_STACK_SIZE + BF_CE_DEFAULT_HEAP_SIZE
  647. #define BF_CE_MAX_MEMORY 0x7FFFFFFF
  648. #define BF_CE_MAX_CARRYOVER_MEMORY BF_CE_DEFAULT_STACK_SIZE * 2
  649. #define BF_CE_MAX_CARRYOVER_HEAP 1024*1024
  650. enum CeOperandInfoKind
  651. {
  652. CEOI_None,
  653. CEOI_None8 = CEOI_None,
  654. CEOI_None16 = CEOI_None,
  655. CEOI_None32 = CEOI_None,
  656. CEOI_None64 = CEOI_None,
  657. CEOI_NoneF32 = CEOI_None,
  658. CEOI_NoneF64 = CEOI_None,
  659. CEOI_FrameRef,
  660. CEOI_FrameRef8,
  661. CEOI_FrameRef16,
  662. CEOI_FrameRef32,
  663. CEOI_FrameRef64,
  664. CEOI_FrameRefF32,
  665. CEOI_FrameRefF64,
  666. CEOI_IMM8,
  667. CEOI_IMM16,
  668. CEOI_IMM32,
  669. CEOI_IMM64,
  670. CEOI_IMMF32,
  671. CEOI_IMMF64,
  672. CEOI_IMM_VAR,
  673. CEOI_JMPREL
  674. };
  675. enum CeSizeClass
  676. {
  677. CeSizeClass_8,
  678. CeSizeClass_16,
  679. CeSizeClass_32,
  680. CeSizeClass_64,
  681. CeSizeClass_X,
  682. };
  683. class CeDumpContext
  684. {
  685. public:
  686. Dictionary<int, CeDbgVariable*> mVarMap;
  687. CeFunction* mCeFunction;
  688. String mStr;
  689. uint8* mStart;
  690. uint8* mPtr;
  691. uint8* mEnd;
  692. int mJmp;
  693. public:
  694. CeDumpContext()
  695. {
  696. mJmp = -1;
  697. }
  698. void DumpOperandInfo(CeOperandInfoKind operandInfoKind);
  699. void Next();
  700. void Dump();
  701. };
  702. struct CePhiOutgoing
  703. {
  704. BeValue* mPhiValue;
  705. BePhiInst* mPhiInst;
  706. int mPhiBlockIdx;
  707. };
  708. class CeBlock
  709. {
  710. public:
  711. int mEmitOfs;
  712. Array<CePhiOutgoing> mPhiOutgoing;
  713. public:
  714. CeBlock()
  715. {
  716. mEmitOfs = -1;
  717. }
  718. };
  719. class CeJumpEntry
  720. {
  721. public:
  722. int mEmitPos;
  723. int mBlockIdx;
  724. };
  725. struct CeDbgInlineLookup
  726. {
  727. BeDbgFile* mDbgFile;
  728. int mInlineAtIdx;
  729. CeDbgInlineLookup(BeDbgFile* dbgFile, int inlineAtIdx)
  730. {
  731. mDbgFile = dbgFile;
  732. mInlineAtIdx = inlineAtIdx;
  733. }
  734. CeDbgInlineLookup()
  735. {
  736. mDbgFile = NULL;
  737. mInlineAtIdx = -1;
  738. }
  739. bool operator==(const CeDbgInlineLookup& second) const
  740. {
  741. return (mDbgFile == second.mDbgFile) && (mDbgFile == second.mDbgFile);
  742. }
  743. };
  744. class CeBuilder
  745. {
  746. public:
  747. CeBuilder* mParentBuilder;
  748. CeMachine* mCeMachine;
  749. CeFunction* mCeFunction;
  750. BeFunction* mBeFunction;
  751. CeOperand mReturnVal;
  752. BeType* mIntPtrType;
  753. int mPtrSize;
  754. int mRecursiveDepth;
  755. String mError;
  756. BeDbgLoc* mCurDbgLoc;
  757. Array<CeBlock> mBlocks;
  758. Array<CeJumpEntry> mJumpTable;
  759. Dictionary<BeValue*, CeOperand> mValueToOperand;
  760. int mFrameSize;
  761. Dictionary<BeDbgLoc*, int> mDbgInlineMap;
  762. Dictionary<CeDbgInlineLookup, int> mDbgScopeMap;
  763. Dictionary<CeDbgMethodRef, int> mDbgMethodRefMap;
  764. Dictionary<BeFunction*, int> mFunctionMap;
  765. Dictionary<int, int> mStringMap;
  766. Dictionary<BeConstant*, int> mConstDataMap;
  767. Dictionary<BeFunction*, int> mInnerFunctionMap;
  768. Dictionary<BeGlobalVariable*, int> mStaticFieldMap;
  769. Dictionary<String, BfFieldInstance*> mStaticFieldInstanceMap;
  770. Dictionary<BeValue*, int> mDbgVariableMap;
  771. public:
  772. CeBuilder()
  773. {
  774. mParentBuilder = NULL;
  775. mPtrSize = 0;
  776. mRecursiveDepth = -1;
  777. mCeFunction = NULL;
  778. mBeFunction = NULL;
  779. mCeMachine = NULL;
  780. mCurDbgLoc = NULL;
  781. mFrameSize = 0;
  782. }
  783. void Fail(const StringImpl& error);
  784. CeOperand FrameAlloc(BeType* type);
  785. CeOperand EmitConst(int64 val, int size);
  786. CeErrorKind EmitConst(Array<uint8>& arr, BeConstant* constant);
  787. CeOperand GetOperand(BeValue* value, bool allowAlloca = false, bool allowImmediate = false);
  788. CeSizeClass GetSizeClass(int size);
  789. int DbgCreateMethodRef(BfMethodInstance* methodInstance, const StringImpl& nameMod);
  790. int GetCallTableIdx(BeFunction* beFunction, CeOperand* outOperand);
  791. int GetCodePos();
  792. void HandleParams();
  793. void Emit(uint8 val);
  794. void Emit(CeOp val);
  795. void EmitSizedOp(CeOp val, int size);
  796. void Emit(int32 val);
  797. void Emit(int64 val);
  798. void Emit(bool val);
  799. void Emit(void* ptr, int size);
  800. void EmitZeroes(int size);
  801. void EmitJump(CeOp op, const CeOperand& block);
  802. void EmitBinarySwitchSection(BeSwitchInst* switchInst, int startIdx, int endIdx);
  803. CeOperand EmitLoad(CeOperand mcPtr, int loadRefCount = 1);
  804. CeOperand EmitNumericCast(const CeOperand& ceValue, BeType* toType, bool valSigned, bool toSigned);
  805. void EmitFrameOffset(const CeOperand& val);
  806. void FlushPhi(CeBlock* ceBlock, int targetBlockIdx);
  807. void EmitBinaryOp(CeOp iOp, CeOp fOp, const CeOperand& lhs, const CeOperand& rhs, CeOperand& result);
  808. void EmitUnaryOp(CeOp iOp, CeOp fOp, const CeOperand& val, CeOperand& result);
  809. void EmitSizedOp(CeOp op, const CeOperand& operand, CeOperand* result, bool allowNonStdSize);
  810. void ProcessMethod(BfMethodInstance* methodInstance, BfMethodInstance* dupMethodInstance, bool forceIRWrites);
  811. void Build();
  812. };
  813. class CeFrame
  814. {
  815. public:
  816. CeFunction* mFunction;
  817. addr_ce mStackAddr;
  818. addr_ce mFrameAddr;
  819. uint8* mInstPtr;
  820. BfType* mReturnType;
  821. public:
  822. CeFrame()
  823. {
  824. mFunction = NULL;
  825. mStackAddr = 0;
  826. mFrameAddr = 0;
  827. mInstPtr = NULL;
  828. mReturnType = NULL;
  829. }
  830. int GetInstIdx()
  831. {
  832. return (int)(mInstPtr - &mFunction->mCode[0] - 2);
  833. }
  834. };
  835. class CeStaticFieldInfo
  836. {
  837. public:
  838. addr_ce mAddr;
  839. public:
  840. CeStaticFieldInfo()
  841. {
  842. mAddr = 0;
  843. }
  844. };
  845. class CeAppendAllocInfo
  846. {
  847. public:
  848. BfModule* mModule;
  849. BfIRValue mAllocValue;
  850. BfIRValue mAppendSizeValue;
  851. };
  852. class CeRebuildKey
  853. {
  854. public:
  855. enum Kind
  856. {
  857. Kind_None,
  858. Kind_File,
  859. Kind_Directory,
  860. Kind_TypeDeclListHash,
  861. };
  862. public:
  863. Kind mKind;
  864. String mString;
  865. int mInt;
  866. CeRebuildKey()
  867. {
  868. mKind = Kind_None;
  869. mInt = 0;
  870. }
  871. bool operator==(const CeRebuildKey& other) const
  872. {
  873. return (mKind == other.mKind) && (mString == other.mString) && (mInt == other.mInt);
  874. }
  875. };
  876. class CeRebuildValue
  877. {
  878. public:
  879. union
  880. {
  881. uint64 mInt;
  882. };
  883. };
  884. class CeEmitContext
  885. {
  886. public:
  887. BfType* mType;
  888. BfMethodInstance* mMethodInstance;
  889. Array<int32> mInterfaces;
  890. String mEmitData;
  891. String mExitEmitData;
  892. int32 mAlign;
  893. bool mFailed;
  894. CeEmitContext()
  895. {
  896. mType = NULL;
  897. mMethodInstance = NULL;
  898. mFailed = false;
  899. mAlign = -1;
  900. }
  901. bool HasEmissions()
  902. {
  903. return !mEmitData.IsEmpty() || !mInterfaces.IsEmpty() || (mAlign != -1);
  904. }
  905. };
  906. enum BfCeTypeEmitSourceKind : int8
  907. {
  908. BfCeTypeEmitSourceKind_Unknown,
  909. BfCeTypeEmitSourceKind_Type,
  910. BfCeTypeEmitSourceKind_Method
  911. };
  912. class BfCeTypeEmitSource
  913. {
  914. public:
  915. BfCeTypeEmitSourceKind mKind;
  916. int mSrcStart;
  917. int mSrcEnd;
  918. public:
  919. BfCeTypeEmitSource()
  920. {
  921. mKind = BfCeTypeEmitSourceKind_Unknown;
  922. mSrcStart = -1;
  923. mSrcEnd = -1;
  924. }
  925. };
  926. class BfCeTypeEmitEntry
  927. {
  928. public:
  929. String mEmitData;
  930. };
  931. class BfCeTypeInfo
  932. {
  933. public:
  934. Dictionary<int, BfCeTypeEmitEntry> mOnCompileMap;
  935. Dictionary<int, BfCeTypeEmitEntry> mTypeIFaceMap;
  936. Dictionary<int64, BfCeTypeEmitSource> mEmitSourceMap; // key is (extension<<32)|charId
  937. Array<int> mPendingInterfaces;
  938. Dictionary<CeRebuildKey, CeRebuildValue> mRebuildMap;
  939. Val128 mHash;
  940. bool mFastFinished;
  941. bool mFailed;
  942. bool mMayHaveUniqueEmitLocations;
  943. int32 mAlign;
  944. BfCeTypeInfo* mNext;
  945. public:
  946. BfCeTypeInfo()
  947. {
  948. mFastFinished = false;
  949. mFailed = false;
  950. mMayHaveUniqueEmitLocations = false;
  951. mAlign = -1;
  952. mNext = NULL;
  953. }
  954. };
  955. class CeCallSource
  956. {
  957. public:
  958. enum Kind
  959. {
  960. Kind_Unknown,
  961. Kind_TypeInit,
  962. Kind_TypeDone,
  963. Kind_FieldInit,
  964. Kind_MethodInit
  965. };
  966. public:
  967. Kind mKind;
  968. BfAstNode* mRefNode;
  969. BfFieldInstance* mFieldInstance;
  970. BfType* mOrigCalleeType;
  971. public:
  972. CeCallSource(BfAstNode* refNode)
  973. {
  974. mKind = Kind_Unknown;
  975. mRefNode = refNode;
  976. mFieldInstance = NULL;
  977. mOrigCalleeType = NULL;
  978. }
  979. CeCallSource()
  980. {
  981. mKind = Kind_Unknown;
  982. mRefNode = NULL;
  983. mFieldInstance = NULL;
  984. mOrigCalleeType = NULL;
  985. }
  986. };
  987. class CeTypeDeclState
  988. {
  989. public:
  990. Dictionary<int, addr_ce> mReflectDeclMap;
  991. HashSet<BfTypeDef*> mIteratedTypeDefs;
  992. bool mCheckedAllTypeDefs;
  993. public:
  994. CeTypeDeclState()
  995. {
  996. mCheckedAllTypeDefs = false;
  997. }
  998. };
  999. class CeContext
  1000. {
  1001. public:
  1002. CeMachine* mCeMachine;
  1003. CeContext* mPrevContext;
  1004. int mReflectTypeIdOffset;
  1005. int mExecuteId;
  1006. CeEvalFlags mCurEvalFlags;
  1007. int mRecursiveDepth;
  1008. // These are only valid for the current execution
  1009. ContiguousHeap* mHeap;
  1010. Array<CeFrame> mCallStack;
  1011. Array<uint8> mMemory;
  1012. int mStackSize;
  1013. Dictionary<int, addr_ce> mStringMap;
  1014. Dictionary<int, addr_ce> mReflectMap;
  1015. CeTypeDeclState* mTypeDeclState;
  1016. Dictionary<Val128, addr_ce> mConstDataMap;
  1017. HashSet<int> mStaticCtorExecSet;
  1018. Dictionary<String, CeStaticFieldInfo> mStaticFieldMap;
  1019. Dictionary<int64, CeStaticFieldInfo> mStaticFieldIdMap;
  1020. Dictionary<int, CeInternalData*> mInternalDataMap;
  1021. int mCurHandleId;
  1022. BfMethodInstance* mCallerMethodInstance;
  1023. BfTypeInstance* mCallerTypeInstance;
  1024. BfTypeDef* mCallerActiveTypeDef;
  1025. BfMethodInstance* mCurMethodInstance;
  1026. BfType* mCurExpectingType;
  1027. CeCallSource* mCurCallSource;
  1028. BfModule* mCurModule;
  1029. CeFrame* mCurFrame;
  1030. CeEmitContext* mCurEmitContext;
  1031. String mWorkingDir;
  1032. public:
  1033. CeContext();
  1034. ~CeContext();
  1035. BfError* Fail(const StringImpl& error);
  1036. BfError* Fail(const CeFrame& curFrame, const StringImpl& error);
  1037. void CalcWorkingDir();
  1038. void FixRelativePath(StringImpl& path);
  1039. bool AddRebuild(const CeRebuildKey& key, const CeRebuildValue& value);
  1040. void AddTypeSigRebuild(BfType* type);
  1041. void AddFileRebuild(const StringImpl& filePath);
  1042. uint8* CeMalloc(int size);
  1043. uint8* CeMallocZero(int size);
  1044. bool CeFree(addr_ce addr);
  1045. addr_ce CeAllocArray(BfArrayType* arrayType, int count, addr_ce& elemsAddr);
  1046. addr_ce GetReflectTypeDecl(int typeId);
  1047. addr_ce GetReflectType(int typeId);
  1048. addr_ce GetReflectType(const String& typeName, bool useDeclaration);
  1049. int GetTypeIdFromType(addr_ce typeAddr);
  1050. addr_ce GetReflectSpecializedType(addr_ce unspecializedType, addr_ce typeArgsSpanAddr);
  1051. addr_ce GetString(int stringId);
  1052. addr_ce GetString(const StringImpl& str);
  1053. addr_ce GetConstantData(BeConstant* constant);
  1054. BfType* GetBfType(int typeId);
  1055. BfType* GetBfType(BfIRType irType);
  1056. void PrepareConstStructEntry(CeConstStructData& constStructData);
  1057. bool CheckMemory(addr_ce addr, int32 size);
  1058. uint8* GetMemoryPtr(addr_ce addr, int32 size);
  1059. bool GetStringFromAddr(addr_ce strInstAddr, StringImpl& str);
  1060. bool GetStringFromStringView(addr_ce addr, StringImpl& str);
  1061. bool GetCustomAttribute(BfModule* module, BfIRConstHolder* constHolder, BfCustomAttributes* customAttributes, int attributeIdx, addr_ce resultAddr);
  1062. BfType* GetCustomAttributeType(BfCustomAttributes* customAttributes, int attributeIdx);
  1063. bool WriteConstant(BfModule* module, addr_ce addr, BfConstant* constant, BfType* type, bool isParams = false);
  1064. BfIRValue CreateConstant(BfModule* module, uint8* ptr, BfType* type, BfType** outType = NULL);
  1065. BfIRValue CreateAttribute(BfAstNode* targetSrc, BfModule* module, BfIRConstHolder* constHolder, BfCustomAttribute* customAttribute, addr_ce ceAttrAddr = 0);
  1066. bool Execute(CeFunction* startFunction, uint8* startStackPtr, uint8* startFramePtr, BfType*& returnType, BfType*& castReturnType);
  1067. BfTypedValue Call(CeCallSource callSource, BfModule* module, BfMethodInstance* methodInstance, const BfSizedArray<BfIRValue>& args, CeEvalFlags flags, BfType* expectingType);
  1068. };
  1069. struct CeTypeInfo
  1070. {
  1071. Array<BfMethodInstance*> mMethodInstances;
  1072. int mRevision;
  1073. };
  1074. class CeStepState
  1075. {
  1076. public:
  1077. enum Kind
  1078. {
  1079. Kind_None,
  1080. Kind_StepOver,
  1081. Kind_StepOver_Asm,
  1082. Kind_StepInfo,
  1083. Kind_StepInfo_Asm,
  1084. Kind_StepOut,
  1085. Kind_StepOut_Asm,
  1086. Kind_Jmp,
  1087. Kind_Evaluate
  1088. };
  1089. Kind mKind;
  1090. int mNextInstIdx;
  1091. int mStartDepth;
  1092. public:
  1093. CeStepState()
  1094. {
  1095. mKind = Kind_None;
  1096. mNextInstIdx = -1;
  1097. mStartDepth = 0;
  1098. }
  1099. };
  1100. class CeMachine
  1101. {
  1102. public:
  1103. Dictionary<BfMethodInstance*, CeFunctionInfo*> mFunctions;
  1104. Dictionary<String, CeFunctionInfo*> mNamedFunctionMap;
  1105. Dictionary<int, CeFunction*> mFunctionIdMap; // Only used for 32-bit and debugging
  1106. Dictionary<BfType*, CeTypeInfo> mTypeInfoMap;
  1107. HashSet<BfMethodInstance*> mMethodInstanceSet;
  1108. HashSet<BfFieldInstance*> mFieldInstanceSet;
  1109. Array<CeContext*> mContextList;
  1110. BfCompiler* mCompiler;
  1111. BfModule* mCeModule;
  1112. int mRevision;
  1113. int mMethodBindRevision;
  1114. int mRevisionExecuteTime;
  1115. int mCurFunctionId;
  1116. int mExecuteId;
  1117. int mCurRecursiveDepth;
  1118. CeAppendAllocInfo* mAppendAllocInfo;
  1119. CeContext* mCurContext;
  1120. CeEmitContext* mCurEmitContext;
  1121. CeCallSource* mCurCallSource;
  1122. CeBuilder* mCurBuilder;
  1123. CeFunction* mPreparingFunction;
  1124. BfParser* mTempParser;
  1125. BfReducer* mTempReducer;
  1126. BfPassInstance* mTempPassInstance;
  1127. CritSect mCritSect;
  1128. SyncEvent mDebugEvent;
  1129. CeStepState mStepState;
  1130. CeDebugger* mDebugger;
  1131. bool mDbgPaused;
  1132. bool mSpecialCheck;
  1133. bool mDbgWantBreak;
  1134. String mFailString;
  1135. public:
  1136. CeMachine(BfCompiler* compiler);
  1137. ~CeMachine();
  1138. void Fail(const StringImpl& error);
  1139. bool HasFailed();
  1140. void Init();
  1141. BeContext* GetBeContext();
  1142. BeModule* GetBeModule();
  1143. int GetInstSize(CeFunction* ceFunction, int instIdx);
  1144. void DerefMethodInfo(CeFunctionInfo* ceFunctionInfo);
  1145. void RemoveFunc(CeFunction* ceFunction);
  1146. void RemoveMethod(BfMethodInstance* methodInstance);
  1147. void CreateFunction(BfMethodInstance* methodInstance, CeFunction* ceFunction);
  1148. CeErrorKind WriteConstant(CeConstStructData& data, BeConstant* constVal, CeContext* ceContext, CeBuilder* ceBuilder);
  1149. void CheckFunctionKind(CeFunction* ceFunction);
  1150. void PrepareFunction(CeFunction* methodInstance, CeBuilder* parentBuilder);
  1151. void MapFunctionId(CeFunction* ceFunction);
  1152. void CheckFunctions();
  1153. CeFunction* GetFunction(BfMethodInstance* methodInstance, BfIRValue func, bool& added);
  1154. CeFunction* GetPreparedFunction(BfMethodInstance* methodInstance);
  1155. CeTypeInfo* GetTypeInfo(BfType* type);
  1156. BfMethodInstance* GetMethodInstance(int64 methodHandle);
  1157. BfFieldInstance* GetFieldInstance(int64 fieldHandle);
  1158. public:
  1159. void CompileStarted();
  1160. void CompileDone();
  1161. CeFunction* QueueMethod(BfMethodInstance* methodInstance, BfIRValue func);
  1162. void QueueMethod(BfModuleMethodInstance moduleMethodInstance);
  1163. void QueueStaticField(BfFieldInstance* fieldInstance, const StringImpl& mangledFieldName);
  1164. void ClearTypeData(BfTypeInstance* typeInstance);
  1165. void SetAppendAllocInfo(BfModule* module, BfIRValue allocValue, BfIRValue appendSizeValue);
  1166. void ClearAppendAllocInfo();
  1167. CeContext* AllocContext();
  1168. void ReleaseContext(CeContext* context);
  1169. BfTypedValue Call(CeCallSource callSource, BfModule* module, BfMethodInstance* methodInstance, const BfSizedArray<BfIRValue>& args, CeEvalFlags flags, BfType* expectingType);
  1170. BfError* FailCurrent(BfModule* srcModule, const StringImpl& error, BfAstNode* refNode);
  1171. void FailCurrentMoreInfo(const StringImpl& error, BfAstNode* refNode);
  1172. };
  1173. NS_BF_END
  1174. namespace std
  1175. {
  1176. template <>
  1177. struct hash<Beefy::CeRebuildKey>
  1178. {
  1179. size_t operator()(const Beefy::CeRebuildKey& key) const
  1180. {
  1181. return BeefHash<Beefy::String>()(key.mString) ^ (size_t)key.mKind;
  1182. }
  1183. };
  1184. template <>
  1185. struct hash<Beefy::CeDbgInlineLookup>
  1186. {
  1187. size_t operator()(const Beefy::CeDbgInlineLookup& key) const
  1188. {
  1189. return (intptr)key.mDbgFile ^ (intptr)key.mInlineAtIdx;
  1190. }
  1191. };
  1192. template <>
  1193. struct hash<Beefy::CeDbgMethodRef>
  1194. {
  1195. size_t operator()(const Beefy::CeDbgMethodRef& key) const
  1196. {
  1197. return BeefHash<Beefy::BfMethodRef>()(key.mMethodRef) ^ BeefHash<Beefy::String>()(key.mNameMod);
  1198. }
  1199. };
  1200. }