CeMachine.h 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360
  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_TypeDocumentation_ToString,
  396. CeFunctionKind_Namespace_ToString,
  397. CeFunctionKind_Type_GetCustomAttribute,
  398. CeFunctionKind_Field_GetCustomAttribute,
  399. CeFunctionKind_Method_GetCustomAttribute,
  400. CeFunctionKind_Type_GetCustomAttributeType,
  401. CeFunctionKind_Field_GetCustomAttributeType,
  402. CeFunctionKind_Method_GetCustomAttributeType,
  403. CeFunctionKind_GetMethodCount,
  404. CeFunctionKind_GetMethod,
  405. CeFunctionKind_Method_ToString,
  406. CeFunctionKind_Method_GetName,
  407. CeFunctionKind_Method_GetDocumentation,
  408. CeFunctionKind_Method_GetInfo,
  409. CeFunctionKind_Method_GetParamInfo,
  410. CeFunctionKind_Method_GetGenericArg,
  411. CeFunctionKind_Field_GetDocumentation,
  412. CeFunctionKind_Field_GetStatic,
  413. CeFunctionKind_SetReturnType,
  414. CeFunctionKind_Align,
  415. CeFunctionKind_EmitTypeBody,
  416. CeFunctionKind_EmitAddInterface,
  417. CeFunctionKind_EmitMethodEntry,
  418. CeFunctionKind_EmitMethodExit,
  419. CeFunctionKind_EmitMixin,
  420. CeFunctionKind_GetStringById,
  421. CeFunctionKind_BfpDirectory_Create,
  422. CeFunctionKind_BfpDirectory_Rename,
  423. CeFunctionKind_BfpDirectory_Delete,
  424. CeFunctionKind_BfpDirectory_GetCurrent,
  425. CeFunctionKind_BfpDirectory_SetCurrent,
  426. CeFunctionKind_BfpDirectory_Exists,
  427. CeFunctionKind_BfpDirectory_GetSysDirectory,
  428. CeFunctionKind_BfpFile_Close,
  429. CeFunctionKind_BfpFile_Create,
  430. CeFunctionKind_BfpFile_Flush,
  431. CeFunctionKind_BfpFile_GetFileSize,
  432. CeFunctionKind_BfpFile_Read,
  433. CeFunctionKind_BfpFile_Release,
  434. CeFunctionKind_BfpFile_Seek,
  435. CeFunctionKind_BfpFile_Truncate,
  436. CeFunctionKind_BfpFile_Write,
  437. CeFunctionKind_BfpFile_GetTime_LastWrite,
  438. CeFunctionKind_BfpFile_GetAttributes,
  439. CeFunctionKind_BfpFile_SetAttributes,
  440. CeFunctionKind_BfpFile_Copy,
  441. CeFunctionKind_BfpFile_Rename,
  442. CeFunctionKind_BfpFile_Delete,
  443. CeFunctionKind_BfpFile_Exists,
  444. CeFunctionKind_BfpFile_GetTempPath,
  445. CeFunctionKind_BfpFile_GetTempFileName,
  446. CeFunctionKind_BfpFile_GetFullPath,
  447. CeFunctionKind_BfpFile_GetActualPath,
  448. CeFunctionKind_BfpFindFileData_FindFirstFile,
  449. CeFunctionKind_BfpFindFileData_FindNextFile,
  450. CeFunctionKind_BfpFindFileData_GetFileName,
  451. CeFunctionKind_BfpFindFileData_GetTime_LastWrite,
  452. CeFunctionKind_BfpFindFileData_GetTime_Created,
  453. CeFunctionKind_BfpFindFileData_GetTime_Access,
  454. CeFunctionKind_BfpFindFileData_GetFileAttributes,
  455. CeFunctionKind_BfpFindFileData_GetFileSize,
  456. CeFunctionKind_BfpFindFileData_Release,
  457. CeFunctionKind_BfpSpawn_Create,
  458. CeFunctionKind_BfpSpawn_GetStdHandles,
  459. CeFunctionKind_BfpSpawn_Kill,
  460. CeFunctionKind_BfpSpawn_Release,
  461. CeFunctionKind_BfpSpawn_WaitFor,
  462. CeFunctionKind_BfpSystem_GetTimeStamp,
  463. CeFunctionKind_Sleep,
  464. CeFunctionKind_Char32_ToLower,
  465. CeFunctionKind_Char32_ToUpper,
  466. CeFunctionKind_Char32_IsLower,
  467. CeFunctionKind_Char32_IsUpper,
  468. CeFunctionKind_Char32_IsWhiteSpace_EX,
  469. CeFunctionKind_Char32_IsLetterOrDigit,
  470. CeFunctionKind_Char32_IsLetter,
  471. CeFunctionKind_Char32_IsNumber,
  472. CeFunctionKind_Double_Strtod,
  473. CeFunctionKind_Double_Ftoa,
  474. CeFunctionKind_Double_ToString,
  475. CeFunctionKind_Float_ToString,
  476. CeFunctionKind_Math_Abs,
  477. CeFunctionKind_Math_Acos,
  478. CeFunctionKind_Math_Asin,
  479. CeFunctionKind_Math_Atan,
  480. CeFunctionKind_Math_Atan2,
  481. CeFunctionKind_Math_Ceiling,
  482. CeFunctionKind_Math_Cos,
  483. CeFunctionKind_Math_Cosh,
  484. CeFunctionKind_Math_Exp,
  485. CeFunctionKind_Math_Floor,
  486. CeFunctionKind_Math_Log,
  487. CeFunctionKind_Math_Log10,
  488. CeFunctionKind_Math_Mod,
  489. CeFunctionKind_Math_Pow,
  490. CeFunctionKind_Math_Round,
  491. CeFunctionKind_Math_Sin,
  492. CeFunctionKind_Math_Sinh,
  493. CeFunctionKind_Math_Sqrt,
  494. CeFunctionKind_Math_Tan,
  495. CeFunctionKind_Math_Tanh,
  496. };
  497. class CeConstStructFixup
  498. {
  499. public:
  500. enum Kind
  501. {
  502. Kind_None,
  503. Kind_StringPtr,
  504. Kind_StringCharPtr,
  505. };
  506. public:
  507. Kind mKind;
  508. int mValue;
  509. int mOffset;
  510. };
  511. class CeConstStructData
  512. {
  513. public:
  514. Val128 mHash;
  515. Array<uint8> mData;
  516. Array<uint8> mFixedData;
  517. Array<CeConstStructFixup> mFixups;
  518. addr_ce mAddr;
  519. int mBindExecuteId;
  520. bool mQueueFixups;
  521. public:
  522. CeConstStructData()
  523. {
  524. mBindExecuteId = -1;
  525. mAddr = 0;
  526. mQueueFixups = false;
  527. }
  528. };
  529. class CeInnerFunctionInfo
  530. {
  531. public:
  532. String mName;
  533. BeFunction* mBeFunction;
  534. CeFunction* mOwner;
  535. };
  536. class CeStaticFieldEntry
  537. {
  538. public:
  539. String mName;
  540. int mTypeId;
  541. int mSize;
  542. addr_ce mAddr;
  543. int mBindExecuteId;
  544. public:
  545. CeStaticFieldEntry()
  546. {
  547. mTypeId = -1;
  548. mSize = 0;
  549. mAddr = 0;
  550. mBindExecuteId = -1;
  551. }
  552. };
  553. class CeDbgVariable
  554. {
  555. public:
  556. String mName;
  557. CeOperand mValue;
  558. BfType* mType;
  559. int mScope;
  560. bool mIsConst;
  561. int mStartCodePos;
  562. int mEndCodePos;
  563. };
  564. class CeDbgFunctionInfo
  565. {
  566. public:
  567. Array<CeDbgVariable> mVariables;
  568. };
  569. class CeBreakpointBind
  570. {
  571. public:
  572. CeOp mPrevOpCode;
  573. CeBreakpoint* mBreakpoint;
  574. };
  575. class CeFunction
  576. {
  577. public:
  578. enum InitializeState
  579. {
  580. InitializeState_None,
  581. InitializeState_Initializing,
  582. InitializeState_Initializing_ReEntry,
  583. InitializeState_Initialized
  584. };
  585. public:
  586. CeMachine* mCeMachine;
  587. CeFunctionInfo* mCeFunctionInfo;
  588. CeInnerFunctionInfo* mCeInnerFunctionInfo;
  589. BfMethodInstance* mMethodInstance;
  590. CeFunctionKind mFunctionKind;
  591. InitializeState mInitializeState;
  592. bool mFailed;
  593. bool mIsVarReturn;
  594. Array<uint8> mCode;
  595. Array<CeDbgScope> mDbgScopes;
  596. Array<CeDbgInlineEntry> mDbgInlineTable;
  597. Array<CeDbgMethodRef> mDbgMethodRefTable;
  598. Array<CeEmitEntry> mEmitTable;
  599. Array<CeCallEntry> mCallTable;
  600. Array<CeStringEntry> mStringTable;
  601. Array<CeConstStructData> mConstStructTable;
  602. Array<CeStaticFieldEntry> mStaticFieldTable;
  603. Array<BfType*> mTypeTable;
  604. Array<CeFunction*> mInnerFunctions;
  605. Dictionary<int, CeBreakpointBind> mBreakpoints;
  606. String mGenError;
  607. int mFrameSize;
  608. int mMaxReturnSize;
  609. int mId;
  610. int mBreakpointVersion;
  611. CeDbgFunctionInfo* mDbgInfo;
  612. public:
  613. CeFunction()
  614. {
  615. mCeMachine = NULL;
  616. mCeFunctionInfo = NULL;
  617. mCeInnerFunctionInfo = NULL;
  618. mFunctionKind = CeFunctionKind_NotSet;
  619. mInitializeState = InitializeState_None;
  620. mMethodInstance = NULL;
  621. mFailed = false;
  622. mIsVarReturn = false;
  623. mFrameSize = 0;
  624. mMaxReturnSize = 0;
  625. mBreakpointVersion = 0;
  626. mId = -1;
  627. mDbgInfo = NULL;
  628. }
  629. ~CeFunction();
  630. BfTypeInstance* GetOwner();
  631. void Print();
  632. void UnbindBreakpoints();
  633. CeEmitEntry* FindEmitEntry(int loc, int* entryIdx = NULL);
  634. int SafeGetId();
  635. };
  636. enum CeEvalFlags
  637. {
  638. CeEvalFlags_None = 0,
  639. CeEvalFlags_Cascade = 1,
  640. CeEvalFlags_PersistantError = 2,
  641. CeEvalFlags_DeferIfNotOnlyError = 4,
  642. CeEvalFlags_NoRebuild = 8,
  643. CeEvalFlags_ForceReturnThis = 0x10,
  644. CeEvalFlags_IgnoreConstEncodeFailure = 0x20,
  645. CeEvalFlags_DbgCall = 0x40
  646. };
  647. #define BF_CE_DEFAULT_STACK_SIZE 4*1024*1024
  648. #define BF_CE_DEFAULT_HEAP_SIZE 128*1024
  649. #define BF_CE_INITIAL_MEMORY BF_CE_DEFAULT_STACK_SIZE + BF_CE_DEFAULT_HEAP_SIZE
  650. #define BF_CE_MAX_MEMORY 0x7FFFFFFF
  651. #define BF_CE_MAX_CARRYOVER_MEMORY BF_CE_DEFAULT_STACK_SIZE * 2
  652. #define BF_CE_MAX_CARRYOVER_HEAP 1024*1024
  653. enum CeOperandInfoKind
  654. {
  655. CEOI_None,
  656. CEOI_None8 = CEOI_None,
  657. CEOI_None16 = CEOI_None,
  658. CEOI_None32 = CEOI_None,
  659. CEOI_None64 = CEOI_None,
  660. CEOI_NoneF32 = CEOI_None,
  661. CEOI_NoneF64 = CEOI_None,
  662. CEOI_FrameRef,
  663. CEOI_FrameRef8,
  664. CEOI_FrameRef16,
  665. CEOI_FrameRef32,
  666. CEOI_FrameRef64,
  667. CEOI_FrameRefF32,
  668. CEOI_FrameRefF64,
  669. CEOI_IMM8,
  670. CEOI_IMM16,
  671. CEOI_IMM32,
  672. CEOI_IMM64,
  673. CEOI_IMMF32,
  674. CEOI_IMMF64,
  675. CEOI_IMM_VAR,
  676. CEOI_JMPREL
  677. };
  678. enum CeSizeClass
  679. {
  680. CeSizeClass_8,
  681. CeSizeClass_16,
  682. CeSizeClass_32,
  683. CeSizeClass_64,
  684. CeSizeClass_X,
  685. };
  686. class CeDumpContext
  687. {
  688. public:
  689. Dictionary<int, CeDbgVariable*> mVarMap;
  690. CeFunction* mCeFunction;
  691. String mStr;
  692. uint8* mStart;
  693. uint8* mPtr;
  694. uint8* mEnd;
  695. int mJmp;
  696. public:
  697. CeDumpContext()
  698. {
  699. mJmp = -1;
  700. }
  701. void DumpOperandInfo(CeOperandInfoKind operandInfoKind);
  702. void Next();
  703. void Dump();
  704. };
  705. struct CePhiOutgoing
  706. {
  707. BeValue* mPhiValue;
  708. BePhiInst* mPhiInst;
  709. int mPhiBlockIdx;
  710. };
  711. class CeBlock
  712. {
  713. public:
  714. int mEmitOfs;
  715. Array<CePhiOutgoing> mPhiOutgoing;
  716. public:
  717. CeBlock()
  718. {
  719. mEmitOfs = -1;
  720. }
  721. };
  722. class CeJumpEntry
  723. {
  724. public:
  725. int mEmitPos;
  726. int mBlockIdx;
  727. };
  728. struct CeDbgInlineLookup
  729. {
  730. BeDbgFile* mDbgFile;
  731. int mInlineAtIdx;
  732. CeDbgInlineLookup(BeDbgFile* dbgFile, int inlineAtIdx)
  733. {
  734. mDbgFile = dbgFile;
  735. mInlineAtIdx = inlineAtIdx;
  736. }
  737. CeDbgInlineLookup()
  738. {
  739. mDbgFile = NULL;
  740. mInlineAtIdx = -1;
  741. }
  742. bool operator==(const CeDbgInlineLookup& second) const
  743. {
  744. return (mDbgFile == second.mDbgFile) && (mDbgFile == second.mDbgFile);
  745. }
  746. };
  747. class CeBuilder
  748. {
  749. public:
  750. CeBuilder* mParentBuilder;
  751. CeMachine* mCeMachine;
  752. CeFunction* mCeFunction;
  753. BeFunction* mBeFunction;
  754. CeOperand mReturnVal;
  755. BeType* mIntPtrType;
  756. int mPtrSize;
  757. int mRecursiveDepth;
  758. String mError;
  759. BeDbgLoc* mCurDbgLoc;
  760. Array<CeBlock> mBlocks;
  761. Array<CeJumpEntry> mJumpTable;
  762. Dictionary<BeValue*, CeOperand> mValueToOperand;
  763. int mFrameSize;
  764. Dictionary<BeDbgLoc*, int> mDbgInlineMap;
  765. Dictionary<CeDbgInlineLookup, int> mDbgScopeMap;
  766. Dictionary<CeDbgMethodRef, int> mDbgMethodRefMap;
  767. Dictionary<BeFunction*, int> mFunctionMap;
  768. Dictionary<int, int> mStringMap;
  769. Dictionary<BeConstant*, int> mConstDataMap;
  770. Dictionary<BeFunction*, int> mInnerFunctionMap;
  771. Dictionary<BeGlobalVariable*, int> mStaticFieldMap;
  772. Dictionary<String, BfFieldInstance*> mStaticFieldInstanceMap;
  773. Dictionary<BeValue*, int> mDbgVariableMap;
  774. public:
  775. CeBuilder()
  776. {
  777. mParentBuilder = NULL;
  778. mPtrSize = 0;
  779. mRecursiveDepth = -1;
  780. mCeFunction = NULL;
  781. mBeFunction = NULL;
  782. mCeMachine = NULL;
  783. mCurDbgLoc = NULL;
  784. mFrameSize = 0;
  785. }
  786. void Fail(const StringImpl& error);
  787. CeOperand FrameAlloc(BeType* type);
  788. CeOperand EmitConst(int64 val, int size);
  789. CeErrorKind EmitConst(Array<uint8>& arr, BeConstant* constant);
  790. CeOperand GetOperand(BeValue* value, bool allowAlloca = false, bool allowImmediate = false);
  791. CeSizeClass GetSizeClass(int size);
  792. int DbgCreateMethodRef(BfMethodInstance* methodInstance, const StringImpl& nameMod);
  793. int GetCallTableIdx(BeFunction* beFunction, CeOperand* outOperand);
  794. int GetCodePos();
  795. void HandleParams();
  796. void Emit(uint8 val);
  797. void Emit(CeOp val);
  798. void EmitSizedOp(CeOp val, int size);
  799. void Emit(int32 val);
  800. void Emit(int64 val);
  801. void Emit(bool val);
  802. void Emit(void* ptr, int size);
  803. void EmitZeroes(int size);
  804. void EmitJump(CeOp op, const CeOperand& block);
  805. void EmitBinarySwitchSection(BeSwitchInst* switchInst, int startIdx, int endIdx);
  806. CeOperand EmitLoad(CeOperand mcPtr, int loadRefCount = 1);
  807. CeOperand EmitNumericCast(const CeOperand& ceValue, BeType* toType, bool valSigned, bool toSigned);
  808. void EmitFrameOffset(const CeOperand& val);
  809. void FlushPhi(CeBlock* ceBlock, int targetBlockIdx);
  810. void EmitBinaryOp(CeOp iOp, CeOp fOp, const CeOperand& lhs, const CeOperand& rhs, CeOperand& result);
  811. void EmitUnaryOp(CeOp iOp, CeOp fOp, const CeOperand& val, CeOperand& result);
  812. void EmitSizedOp(CeOp op, const CeOperand& operand, CeOperand* result, bool allowNonStdSize);
  813. void ProcessMethod(BfMethodInstance* methodInstance, BfMethodInstance* dupMethodInstance, bool forceIRWrites);
  814. void Build();
  815. };
  816. class CeFrame
  817. {
  818. public:
  819. CeFunction* mFunction;
  820. addr_ce mStackAddr;
  821. addr_ce mFrameAddr;
  822. uint8* mInstPtr;
  823. BfType* mReturnType;
  824. public:
  825. CeFrame()
  826. {
  827. mFunction = NULL;
  828. mStackAddr = 0;
  829. mFrameAddr = 0;
  830. mInstPtr = NULL;
  831. mReturnType = NULL;
  832. }
  833. int GetInstIdx()
  834. {
  835. return (int)(mInstPtr - &mFunction->mCode[0] - 2);
  836. }
  837. };
  838. class CeStaticFieldInfo
  839. {
  840. public:
  841. addr_ce mAddr;
  842. public:
  843. CeStaticFieldInfo()
  844. {
  845. mAddr = 0;
  846. }
  847. };
  848. class CeAppendAllocInfo
  849. {
  850. public:
  851. BfModule* mModule;
  852. BfIRValue mAllocValue;
  853. BfIRValue mAppendSizeValue;
  854. };
  855. class CeRebuildKey
  856. {
  857. public:
  858. enum Kind
  859. {
  860. Kind_None,
  861. Kind_File,
  862. Kind_Directory,
  863. Kind_TypeDeclListHash,
  864. };
  865. public:
  866. Kind mKind;
  867. String mString;
  868. int mInt;
  869. CeRebuildKey()
  870. {
  871. mKind = Kind_None;
  872. mInt = 0;
  873. }
  874. bool operator==(const CeRebuildKey& other) const
  875. {
  876. return (mKind == other.mKind) && (mString == other.mString) && (mInt == other.mInt);
  877. }
  878. };
  879. class CeRebuildValue
  880. {
  881. public:
  882. union
  883. {
  884. uint64 mInt;
  885. };
  886. };
  887. class CeEmitContext
  888. {
  889. public:
  890. BfType* mType;
  891. BfMethodInstance* mMethodInstance;
  892. Array<int32> mInterfaces;
  893. String mEmitData;
  894. String mExitEmitData;
  895. int32 mAlign;
  896. bool mFailed;
  897. CeEmitContext()
  898. {
  899. mType = NULL;
  900. mMethodInstance = NULL;
  901. mFailed = false;
  902. mAlign = -1;
  903. }
  904. bool HasEmissions()
  905. {
  906. return !mEmitData.IsEmpty() || !mInterfaces.IsEmpty() || (mAlign != -1);
  907. }
  908. };
  909. enum BfCeTypeEmitSourceKind : int8
  910. {
  911. BfCeTypeEmitSourceKind_Unknown,
  912. BfCeTypeEmitSourceKind_Type,
  913. BfCeTypeEmitSourceKind_Method
  914. };
  915. class BfCeTypeEmitSource
  916. {
  917. public:
  918. BfCeTypeEmitSourceKind mKind;
  919. int mSrcStart;
  920. int mSrcEnd;
  921. public:
  922. BfCeTypeEmitSource()
  923. {
  924. mKind = BfCeTypeEmitSourceKind_Unknown;
  925. mSrcStart = -1;
  926. mSrcEnd = -1;
  927. }
  928. };
  929. class BfCeTypeEmitEntry
  930. {
  931. public:
  932. String mEmitData;
  933. };
  934. class BfCeTypeInfo
  935. {
  936. public:
  937. Dictionary<int, BfCeTypeEmitEntry> mOnCompileMap;
  938. Dictionary<int, BfCeTypeEmitEntry> mTypeIFaceMap;
  939. Dictionary<int64, BfCeTypeEmitSource> mEmitSourceMap; // key is (extension<<32)|charId
  940. Array<int> mPendingInterfaces;
  941. Dictionary<CeRebuildKey, CeRebuildValue> mRebuildMap;
  942. Val128 mHash;
  943. bool mFastFinished;
  944. bool mFailed;
  945. bool mMayHaveUniqueEmitLocations;
  946. int32 mAlign;
  947. BfCeTypeInfo* mNext;
  948. public:
  949. BfCeTypeInfo()
  950. {
  951. mFastFinished = false;
  952. mFailed = false;
  953. mMayHaveUniqueEmitLocations = false;
  954. mAlign = -1;
  955. mNext = NULL;
  956. }
  957. };
  958. class CeCallSource
  959. {
  960. public:
  961. enum Kind
  962. {
  963. Kind_Unknown,
  964. Kind_TypeInit,
  965. Kind_TypeDone,
  966. Kind_FieldInit,
  967. Kind_MethodInit
  968. };
  969. public:
  970. Kind mKind;
  971. BfAstNode* mRefNode;
  972. BfFieldInstance* mFieldInstance;
  973. BfType* mOrigCalleeType;
  974. public:
  975. CeCallSource(BfAstNode* refNode)
  976. {
  977. mKind = Kind_Unknown;
  978. mRefNode = refNode;
  979. mFieldInstance = NULL;
  980. mOrigCalleeType = NULL;
  981. }
  982. CeCallSource()
  983. {
  984. mKind = Kind_Unknown;
  985. mRefNode = NULL;
  986. mFieldInstance = NULL;
  987. mOrigCalleeType = NULL;
  988. }
  989. };
  990. class CeTypeDeclState
  991. {
  992. public:
  993. Dictionary<int, addr_ce> mReflectDeclMap;
  994. HashSet<BfTypeDef*> mIteratedTypeDefs;
  995. bool mCheckedAllTypeDefs;
  996. public:
  997. CeTypeDeclState()
  998. {
  999. mCheckedAllTypeDefs = false;
  1000. }
  1001. };
  1002. class CeContext
  1003. {
  1004. public:
  1005. CeMachine* mCeMachine;
  1006. CeContext* mPrevContext;
  1007. int mReflectTypeIdOffset;
  1008. int mExecuteId;
  1009. CeEvalFlags mCurEvalFlags;
  1010. int mRecursiveDepth;
  1011. // These are only valid for the current execution
  1012. ContiguousHeap* mHeap;
  1013. Array<CeFrame> mCallStack;
  1014. Array<uint8> mMemory;
  1015. int mStackSize;
  1016. Dictionary<int, addr_ce> mStringMap;
  1017. Dictionary<int, addr_ce> mReflectMap;
  1018. CeTypeDeclState* mTypeDeclState;
  1019. Dictionary<Val128, addr_ce> mConstDataMap;
  1020. HashSet<int> mStaticCtorExecSet;
  1021. Dictionary<String, CeStaticFieldInfo> mStaticFieldMap;
  1022. Dictionary<int64, CeStaticFieldInfo> mStaticFieldIdMap;
  1023. Dictionary<int, CeInternalData*> mInternalDataMap;
  1024. int mCurHandleId;
  1025. BfMethodInstance* mCallerMethodInstance;
  1026. BfTypeInstance* mCallerTypeInstance;
  1027. BfTypeDef* mCallerActiveTypeDef;
  1028. BfMethodInstance* mCurMethodInstance;
  1029. BfType* mCurExpectingType;
  1030. CeCallSource* mCurCallSource;
  1031. BfModule* mCurModule;
  1032. CeFrame* mCurFrame;
  1033. CeEmitContext* mCurEmitContext;
  1034. String mWorkingDir;
  1035. public:
  1036. CeContext();
  1037. ~CeContext();
  1038. BfError* Fail(const StringImpl& error);
  1039. BfError* Fail(const CeFrame& curFrame, const StringImpl& error);
  1040. void CalcWorkingDir();
  1041. void FixRelativePath(StringImpl& path);
  1042. bool AddRebuild(const CeRebuildKey& key, const CeRebuildValue& value);
  1043. void AddTypeSigRebuild(BfType* type);
  1044. void AddFileRebuild(const StringImpl& filePath);
  1045. uint8* CeMalloc(int size);
  1046. uint8* CeMallocZero(int size);
  1047. bool CeFree(addr_ce addr);
  1048. addr_ce CeAllocArray(BfArrayType* arrayType, int count, addr_ce& elemsAddr);
  1049. addr_ce GetReflectTypeDecl(int typeId);
  1050. addr_ce GetReflectType(int typeId);
  1051. addr_ce GetReflectType(const String& typeName, bool useDeclaration);
  1052. int GetTypeIdFromType(addr_ce typeAddr);
  1053. addr_ce GetReflectSpecializedType(addr_ce unspecializedType, addr_ce typeArgsSpanAddr);
  1054. addr_ce GetString(int stringId);
  1055. addr_ce GetString(const StringImpl& str);
  1056. addr_ce GetConstantData(BeConstant* constant);
  1057. BfType* GetBfType(int typeId);
  1058. BfType* GetBfType(BfIRType irType);
  1059. void PrepareConstStructEntry(CeConstStructData& constStructData);
  1060. bool CheckMemory(addr_ce addr, int32 size);
  1061. uint8* GetMemoryPtr(addr_ce addr, int32 size);
  1062. bool GetStringFromAddr(addr_ce strInstAddr, StringImpl& str);
  1063. bool GetStringFromStringView(addr_ce addr, StringImpl& str);
  1064. bool GetCustomAttribute(BfModule* module, BfIRConstHolder* constHolder, BfCustomAttributes* customAttributes, int attributeIdx, addr_ce resultAddr);
  1065. BfType* GetCustomAttributeType(BfCustomAttributes* customAttributes, int attributeIdx);
  1066. bool WriteConstant(BfModule* module, addr_ce addr, BfConstant* constant, BfType* type, bool isParams = false);
  1067. BfIRValue CreateConstant(BfModule* module, uint8* ptr, BfType* type, BfType** outType = NULL);
  1068. BfIRValue CreateAttribute(BfAstNode* targetSrc, BfModule* module, BfIRConstHolder* constHolder, BfCustomAttribute* customAttribute, addr_ce ceAttrAddr = 0);
  1069. bool Execute(CeFunction* startFunction, uint8* startStackPtr, uint8* startFramePtr, BfType*& returnType, BfType*& castReturnType);
  1070. BfTypedValue Call(CeCallSource callSource, BfModule* module, BfMethodInstance* methodInstance, const BfSizedArray<BfIRValue>& args, CeEvalFlags flags, BfType* expectingType);
  1071. };
  1072. struct CeTypeInfo
  1073. {
  1074. Array<BfMethodInstance*> mMethodInstances;
  1075. int mRevision;
  1076. };
  1077. class CeStepState
  1078. {
  1079. public:
  1080. enum Kind
  1081. {
  1082. Kind_None,
  1083. Kind_StepOver,
  1084. Kind_StepOver_Asm,
  1085. Kind_StepInfo,
  1086. Kind_StepInfo_Asm,
  1087. Kind_StepOut,
  1088. Kind_StepOut_Asm,
  1089. Kind_Jmp,
  1090. Kind_Evaluate
  1091. };
  1092. Kind mKind;
  1093. int mNextInstIdx;
  1094. int mStartDepth;
  1095. public:
  1096. CeStepState()
  1097. {
  1098. mKind = Kind_None;
  1099. mNextInstIdx = -1;
  1100. mStartDepth = 0;
  1101. }
  1102. };
  1103. class CeMachine
  1104. {
  1105. public:
  1106. Dictionary<BfMethodInstance*, CeFunctionInfo*> mFunctions;
  1107. Dictionary<String, CeFunctionInfo*> mNamedFunctionMap;
  1108. Dictionary<int, CeFunction*> mFunctionIdMap; // Only used for 32-bit and debugging
  1109. Dictionary<BfType*, CeTypeInfo> mTypeInfoMap;
  1110. HashSet<BfMethodInstance*> mMethodInstanceSet;
  1111. HashSet<BfFieldInstance*> mFieldInstanceSet;
  1112. Array<CeContext*> mContextList;
  1113. BfCompiler* mCompiler;
  1114. BfModule* mCeModule;
  1115. int mRevision;
  1116. int mMethodBindRevision;
  1117. int mRevisionExecuteTime;
  1118. int mCurFunctionId;
  1119. int mExecuteId;
  1120. int mCurRecursiveDepth;
  1121. CeAppendAllocInfo* mAppendAllocInfo;
  1122. CeContext* mCurContext;
  1123. CeEmitContext* mCurEmitContext;
  1124. CeCallSource* mCurCallSource;
  1125. CeBuilder* mCurBuilder;
  1126. CeFunction* mPreparingFunction;
  1127. BfParser* mTempParser;
  1128. BfReducer* mTempReducer;
  1129. BfPassInstance* mTempPassInstance;
  1130. CritSect mCritSect;
  1131. SyncEvent mDebugEvent;
  1132. CeStepState mStepState;
  1133. CeDebugger* mDebugger;
  1134. bool mDbgPaused;
  1135. bool mSpecialCheck;
  1136. bool mDbgWantBreak;
  1137. String mFailString;
  1138. public:
  1139. CeMachine(BfCompiler* compiler);
  1140. ~CeMachine();
  1141. void Fail(const StringImpl& error);
  1142. bool HasFailed();
  1143. void Init();
  1144. BeContext* GetBeContext();
  1145. BeModule* GetBeModule();
  1146. int GetInstSize(CeFunction* ceFunction, int instIdx);
  1147. void DerefMethodInfo(CeFunctionInfo* ceFunctionInfo);
  1148. void RemoveFunc(CeFunction* ceFunction);
  1149. void RemoveMethod(BfMethodInstance* methodInstance);
  1150. void CreateFunction(BfMethodInstance* methodInstance, CeFunction* ceFunction);
  1151. CeErrorKind WriteConstant(CeConstStructData& data, BeConstant* constVal, CeContext* ceContext, CeBuilder* ceBuilder);
  1152. void CheckFunctionKind(CeFunction* ceFunction);
  1153. void PrepareFunction(CeFunction* methodInstance, CeBuilder* parentBuilder);
  1154. void MapFunctionId(CeFunction* ceFunction);
  1155. void CheckFunctions();
  1156. CeFunction* GetFunction(BfMethodInstance* methodInstance, BfIRValue func, bool& added);
  1157. CeFunction* GetPreparedFunction(BfMethodInstance* methodInstance);
  1158. CeTypeInfo* GetTypeInfo(BfType* type);
  1159. BfMethodInstance* GetMethodInstance(int64 methodHandle);
  1160. BfFieldInstance* GetFieldInstance(int64 fieldHandle);
  1161. public:
  1162. void CompileStarted();
  1163. void CompileDone();
  1164. CeFunction* QueueMethod(BfMethodInstance* methodInstance, BfIRValue func);
  1165. void QueueMethod(BfModuleMethodInstance moduleMethodInstance);
  1166. void QueueStaticField(BfFieldInstance* fieldInstance, const StringImpl& mangledFieldName);
  1167. void ClearTypeData(BfTypeInstance* typeInstance);
  1168. void SetAppendAllocInfo(BfModule* module, BfIRValue allocValue, BfIRValue appendSizeValue);
  1169. void ClearAppendAllocInfo();
  1170. CeContext* AllocContext();
  1171. void ReleaseContext(CeContext* context);
  1172. BfTypedValue Call(CeCallSource callSource, BfModule* module, BfMethodInstance* methodInstance, const BfSizedArray<BfIRValue>& args, CeEvalFlags flags, BfType* expectingType);
  1173. BfError* FailCurrent(BfModule* srcModule, const StringImpl& error, BfAstNode* refNode);
  1174. void FailCurrentMoreInfo(const StringImpl& error, BfAstNode* refNode);
  1175. };
  1176. NS_BF_END
  1177. namespace std
  1178. {
  1179. template <>
  1180. struct hash<Beefy::CeRebuildKey>
  1181. {
  1182. size_t operator()(const Beefy::CeRebuildKey& key) const
  1183. {
  1184. return BeefHash<Beefy::String>()(key.mString) ^ (size_t)key.mKind;
  1185. }
  1186. };
  1187. template <>
  1188. struct hash<Beefy::CeDbgInlineLookup>
  1189. {
  1190. size_t operator()(const Beefy::CeDbgInlineLookup& key) const
  1191. {
  1192. return (intptr)key.mDbgFile ^ (intptr)key.mInlineAtIdx;
  1193. }
  1194. };
  1195. template <>
  1196. struct hash<Beefy::CeDbgMethodRef>
  1197. {
  1198. size_t operator()(const Beefy::CeDbgMethodRef& key) const
  1199. {
  1200. return BeefHash<Beefy::BfMethodRef>()(key.mMethodRef) ^ BeefHash<Beefy::String>()(key.mNameMod);
  1201. }
  1202. };
  1203. }