BeIRCodeGen.cpp 91 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632
  1. #include "BeIRCodeGen.h"
  2. #include "../Compiler/BfIRCodeGen.h"
  3. #include "BeDbgModule.h"
  4. #include "BeefySysLib/util/BeefPerf.h"
  5. #include "BeefySysLib/util/AllocDebug.h"
  6. #include "BeefySysLib/util/Hash.h"
  7. #ifdef _DEBUG
  8. #define BE_EXTRA_CHECKS
  9. #endif
  10. USING_NS_BF;
  11. //#define CODEGEN_TRACK
  12. #ifdef CODEGEN_TRACK
  13. #include "../Compiler/MemReporter.h"
  14. MemReporter gBEMemReporter;
  15. CritSect gBEMemReporterCritSect;
  16. int gBEMemReporterSize = 0;
  17. #define BE_MEM_START \
  18. int startPos = mStream->GetReadPos();
  19. #define BE_MEM_END(name) \
  20. gBEMemReporter.Add(name, mStream->GetReadPos() - startPos);
  21. static const char* gIRCmdNames[] =
  22. {
  23. "Module_Start",
  24. "Module_SetTargetTriple",
  25. "Module_AddModuleFlag",
  26. "WriteIR",
  27. "SetType",
  28. "SetInstType",
  29. "PrimitiveType",
  30. "CreateStruct",
  31. "StructSetBody",
  32. "Type",
  33. "TypeInst",
  34. "TypeInstPtr",
  35. "GetType",
  36. "GetPointerToFuncType",
  37. "GetPointerToType",
  38. "GetSizedArrayType",
  39. "CreateConstStruct",
  40. "CreateConstStructZero",
  41. "CreateConstArray",
  42. "CreateConstString",
  43. "SetName",
  44. "CreateUndefValue",
  45. "NumericCast",
  46. "CmpEQ",
  47. "CmpNE",
  48. "CmpSLT",
  49. "CmpULT",
  50. "CmpSLE",
  51. "CmpULE",
  52. "CmpSGT",
  53. "CmpUGT",
  54. "CmpSGE",
  55. "CmpUGE",
  56. "Add",
  57. "Sub",
  58. "Mul",
  59. "SDiv",
  60. "UDiv",
  61. "SRem",
  62. "URem",
  63. "And",
  64. "Or",
  65. "Xor",
  66. "Shl",
  67. "AShr",
  68. "LShr",
  69. "Neg",
  70. "Not",
  71. "BitCast",
  72. "PtrToInt",
  73. "IntToPtr",
  74. "InboundsGEP1_32",
  75. "InboundsGEP2_32",
  76. "InBoundsGEP1",
  77. "InBoundsGEP2",
  78. "IsNull",
  79. "IsNotNull",
  80. "ExtractValue",
  81. "InsertValue",
  82. "Alloca",
  83. "AllocaArray",
  84. "SetAllocaAlignment",
  85. "SetAllocaNoChkStkHint",
  86. "SetAllocaForceMem",
  87. "LifetimeStart",
  88. "LifetimeEnd",
  89. "LifetimeExtend",
  90. "ValueScopeStart",
  91. "ValueScopeRetain",
  92. "ValueScopeSoftEnd",
  93. "ValueScopeHardEnd",
  94. "Load",
  95. "AlignedLoad",
  96. "Store",
  97. "AlignedStore",
  98. "MemSet",
  99. "Fence",
  100. "StackSave",
  101. "StackRestore",
  102. "GlobalVariable",
  103. "GlobalVar_SetUnnamedAddr",
  104. "GlobalVar_SetInitializer",
  105. "GlobalVar_SetAlignment",
  106. "GlobalStringPtr",
  107. "CreateBlock",
  108. "MaybeChainNewBlock",
  109. "AddBlock",
  110. "DropBlocks",
  111. "MergeBlockDown",
  112. "SetInsertPoint",
  113. "SetInsertPointAtStart",
  114. "EraseFromParent",
  115. "DeleteBlock",
  116. "EraseInstFromParent",
  117. "CreateBr",
  118. "CreateBr_NoCollapse",
  119. "CreateCondBr",
  120. "MoveBlockToEnd",
  121. "CreateSwitch",
  122. "AddSwitchCase",
  123. "SetSwitchDefaultDest",
  124. "CreatePhi",
  125. "AddPhiIncoming",
  126. "GetIntrinsic",
  127. "CreateFunctionType",
  128. "CreateFunction",
  129. "EnsureFunctionPatchable",
  130. "RemapBindFunction",
  131. "SetActiveFunction",
  132. "CreateCall",
  133. "SetCallCallingConv",
  134. "SetFuncCallingConv",
  135. "SetTailCall",
  136. "SetCallAttribute",
  137. "CreateRet",
  138. "CreateRetVoid",
  139. "CreateUnreachable",
  140. "Call_AddAttribute",
  141. "Call_AddAttribute1",
  142. "Func_AddAttribute",
  143. "Func_AddAttribute1",
  144. "Func_SetParamName",
  145. "Func_DeleteBody",
  146. "Func_EraseFromParent",
  147. "Func_SetLinkage",
  148. "SaveDebugLocation",
  149. "RestoreDebugLocation",
  150. "ClearDebugLocation",
  151. "ClearDebugLocationInst",
  152. "UpdateDebugLocation",
  153. "SetCurrentDebugLocation",
  154. "Nop",
  155. "EnsureInstructionAt",
  156. "StatementStart",
  157. "ObjectAccessCheck",
  158. "DbgInit",
  159. "DbgFinalize",
  160. "DbgCreateCompileUnit",
  161. "DbgCreateFile",
  162. "ConstValueI64",
  163. "DbgGetCurrentLocation",
  164. "DbgSetType",
  165. "DbgSetInstType",
  166. "DbgGetType",
  167. "DbgGetTypeInst",
  168. "DbgTrackDITypes",
  169. "DbgCreateNamespace",
  170. "DbgCreateImportedModule",
  171. "DbgCreateBasicType",
  172. "DbgCreateStructType",
  173. "DbgCreateEnumerationType",
  174. "DbgCreatePointerType",
  175. "DbgCreateReferenceType",
  176. "DbgCreateConstType",
  177. "DbgCreateArtificialType",
  178. "DbgCreateArrayType",
  179. "DbgCreateReplaceableCompositeType",
  180. "DbgCreateForwardDecl",
  181. "DbgCreateSizedForwardDecl",
  182. "BeIRCmd_DbgSetTypeSize",
  183. "DbgReplaceAllUses",
  184. "DbgDeleteTemporary",
  185. "DbgMakePermanent",
  186. "CreateEnumerator",
  187. "DbgCreateMemberType",
  188. "DbgStaticCreateMemberType",
  189. "DbgCreateInheritance",
  190. "DbgCreateMethod",
  191. "DbgCreateFunction",
  192. "DbgCreateParameterVariable",
  193. "DbgCreateSubroutineType",
  194. "DbgCreateAutoVariable",
  195. "DbgInsertValueIntrinsic",
  196. "DbgInsertDeclare",
  197. "DbgLifetimeEnd",
  198. "DbgCreateGlobalVariable",
  199. "DbgCreateLexicalBlock",
  200. "DbgCreateLexicalBlockFile",
  201. "DbgCreateAnnotation"
  202. };
  203. BF_STATIC_ASSERT(BF_ARRAY_COUNT(gIRCmdNames) == BfIRCmd_COUNT);
  204. #else
  205. #define BE_MEM_START
  206. #define BE_MEM_END(name)
  207. #endif
  208. #pragma warning(disable:4146)
  209. #define CMD_PARAM(ty, name) ty name; Read(name);
  210. BeIRCodeGen::BeIRCodeGen()
  211. {
  212. mBfIRBuilder = NULL;
  213. mStream = NULL;
  214. mActiveFunction = NULL;
  215. mBeContext = NULL;
  216. mBeModule = NULL;
  217. mHasDebugLoc = false;
  218. mDebugging = false;
  219. mCmdCount = 0;
  220. }
  221. BeIRCodeGen::~BeIRCodeGen()
  222. {
  223. BF_ASSERT(mSavedDebugLocs.size() == 0);
  224. delete mBeModule;
  225. delete mBeContext;
  226. delete mStream;
  227. }
  228. void BeIRCodeGen::Hash(BeHashContext& hashCtx)
  229. {
  230. // if (mBeModule->mModuleName == "IDE_IDEApp")
  231. // {
  232. // hashCtx.mDbgViz = true;
  233. // NOP;
  234. // }
  235. hashCtx.Mixin(mPtrSize);
  236. hashCtx.Mixin(mIsOptimized);
  237. if (mBeModule != NULL)
  238. mBeModule->Hash(hashCtx);
  239. Array<BeStructType*> structHashList;
  240. for (auto beType : mBeContext->mTypes)
  241. {
  242. if (!beType->IsStruct())
  243. continue;
  244. auto beStructType = (BeStructType*)beType;
  245. if (beStructType->mHashId != -1)
  246. continue;
  247. structHashList.Add(beStructType);
  248. }
  249. structHashList.Sort([](BeStructType* lhs, BeStructType* rhs)
  250. {
  251. return lhs->mName < rhs->mName;
  252. });
  253. for (auto beStructType : structHashList)
  254. {
  255. beStructType->HashReference(hashCtx);
  256. }
  257. }
  258. bool BeIRCodeGen::IsModuleEmpty()
  259. {
  260. if (!mBeModule->mFunctions.IsEmpty())
  261. return false;
  262. if (!mBeModule->mGlobalVariables.IsEmpty())
  263. return false;
  264. return true;
  265. }
  266. void BeIRCodeGen::FatalError(const StringImpl& err)
  267. {
  268. String failStr = "Fatal Error in Module: ";
  269. if (mBeModule != NULL)
  270. failStr += mBeModule->mModuleName;
  271. failStr += "\n";
  272. if (mBeModule != NULL)
  273. {
  274. BeDumpContext dumpCtx;
  275. if (mActiveFunction != NULL)
  276. {
  277. failStr += "Function: ";
  278. failStr += mActiveFunction->mName;
  279. failStr += "\n";
  280. }
  281. if (mBeModule->mCurDbgLoc != NULL)
  282. {
  283. failStr += "DbgLoc: ";
  284. dumpCtx.ToString(failStr, mBeModule->mCurDbgLoc);
  285. failStr += "\n";
  286. }
  287. }
  288. failStr += err;
  289. BF_FATAL(failStr);
  290. }
  291. void BeIRCodeGen::NotImpl()
  292. {
  293. BF_FATAL("Not implemented");
  294. }
  295. BeType* BeIRCodeGen::GetBeType(BfTypeCode typeCode, bool& isSigned)
  296. {
  297. isSigned = false;
  298. BeTypeCode beTypeCode = BeTypeCode_None;
  299. switch (typeCode)
  300. {
  301. case BfTypeCode_None:
  302. beTypeCode = BeTypeCode_None;
  303. break;
  304. case BfTypeCode_NullPtr:
  305. beTypeCode = BeTypeCode_NullPtr;
  306. break;
  307. case BfTypeCode_Boolean:
  308. beTypeCode = BeTypeCode_Boolean;
  309. break;
  310. case BfTypeCode_Int8:
  311. isSigned = true;
  312. beTypeCode = BeTypeCode_Int8;
  313. break;
  314. case BfTypeCode_UInt8:
  315. case BfTypeCode_Char8:
  316. beTypeCode = BeTypeCode_Int8;
  317. break;
  318. case BfTypeCode_Int16:
  319. isSigned = true;
  320. beTypeCode = BeTypeCode_Int16;
  321. break;
  322. case BfTypeCode_Char16:
  323. case BfTypeCode_UInt16:
  324. beTypeCode = BeTypeCode_Int16;
  325. break;
  326. case BfTypeCode_Int32:
  327. isSigned = true;
  328. beTypeCode = BeTypeCode_Int32;
  329. break;
  330. case BfTypeCode_UInt32:
  331. case BfTypeCode_Char32:
  332. beTypeCode = BeTypeCode_Int32;
  333. break;
  334. case BfTypeCode_Int64:
  335. isSigned = true;
  336. beTypeCode = BeTypeCode_Int64;
  337. break;
  338. case BfTypeCode_UInt64:
  339. beTypeCode = BeTypeCode_Int64;
  340. break;
  341. case BfTypeCode_IntPtr:
  342. BF_FATAL("Illegal");
  343. /*isSigned = true;
  344. if (mModule->mSystem->mPtrSize == 4)
  345. return llvm::Type::getInt32Ty(*mLLVMContext);
  346. else
  347. return llvm::Type::getInt64Ty(*mLLVMContext);*/
  348. case BfTypeCode_UIntPtr:
  349. BF_FATAL("Illegal");
  350. /*if (mModule->mSystem->mPtrSize == 4)
  351. return llvm::Type::getInt32Ty(*mLLVMContext);
  352. else
  353. return llvm::Type::getInt64Ty(*mLLVMContext);*/
  354. case BfTypeCode_Float:
  355. isSigned = true;
  356. beTypeCode = BeTypeCode_Float;
  357. break;
  358. case BfTypeCode_Double:
  359. isSigned = true;
  360. beTypeCode = BeTypeCode_Double;
  361. break;
  362. }
  363. return mBeContext->GetPrimitiveType(beTypeCode);
  364. }
  365. BeIRTypeEntry& BeIRCodeGen::GetTypeEntry(int typeId)
  366. {
  367. BeIRTypeEntry& typeEntry = mTypes[typeId];
  368. if (typeEntry.mTypeId == -1)
  369. typeEntry.mTypeId = typeId;
  370. return typeEntry;
  371. }
  372. void BeIRCodeGen::FixValues(BeStructType* structType, CmdParamVec<BeValue*>& values)
  373. {
  374. if (values.size() >= structType->mMembers.size())
  375. return;
  376. int readIdx = values.size() - 1;
  377. values.resize(structType->mMembers.size());
  378. for (int i = (int)values.size() - 1; i >= 0; i--)
  379. {
  380. if (mBeContext->AreTypesEqual(values[readIdx]->GetType(), structType->mMembers[i].mType))
  381. {
  382. values[i] = values[readIdx];
  383. readIdx--;
  384. }
  385. else if (structType->mMembers[i].mType->IsSizedArray())
  386. {
  387. auto beConst = mBeModule->mAlloc.Alloc<BeConstant>();
  388. beConst->mType = structType->mMembers[i].mType;
  389. values[i] = beConst;
  390. }
  391. else
  392. {
  393. FatalError("Malformed structure values");
  394. }
  395. }
  396. }
  397. void BeIRCodeGen::Init(const BfSizedArray<uint8>& buffer)
  398. {
  399. BP_ZONE("BeIRCodeGen::Init");
  400. BF_ASSERT(mStream == NULL);
  401. mStream = new ChunkedDataBuffer();
  402. mStream->InitFlatRef(buffer.mVals, buffer.mSize);
  403. #ifdef CODEGEN_TRACK
  404. AutoCrit autoCrit(gBEMemReporterCritSect);
  405. AutoMemReporter autoMemReporter(&gBEMemReporter, "BeIRCodeGen");
  406. #endif
  407. //
  408. {
  409. BP_ZONE("BeIRCodeGen::ProcessBfIRData.HandleNextCmds");
  410. while (mStream->GetReadPos() < buffer.mSize)
  411. {
  412. if (mFailed)
  413. break;
  414. HandleNextCmd();
  415. }
  416. }
  417. BF_ASSERT((mFailed) || (mStream->GetReadPos() == buffer.mSize));
  418. }
  419. void BeIRCodeGen::Process()
  420. {
  421. BP_ZONE("BeIRCodeGen::process");
  422. //mDebugging |= ((mBeModule->mDbgModule != NULL) && (mBeModule->mDbgModule->mFileName == "ClassQ"));
  423. if (mDebugging)
  424. {
  425. String dbgStr;
  426. dbgStr = mBeModule->ToString();
  427. OutputDebugStr(dbgStr);
  428. }
  429. mBeModule->DoInlining();
  430. if (mDebugging)
  431. {
  432. String dbgStr = "-------------- AFTER INLINING --------------\n";
  433. dbgStr += mBeModule->ToString();
  434. OutputDebugStr(dbgStr);
  435. }
  436. }
  437. void BeIRCodeGen::ProcessBfIRData(const BfSizedArray<uint8>& buffer)
  438. {
  439. BP_ZONE("BeIRCodeGen::ProcessBfIRData");
  440. Init(buffer);
  441. Process();
  442. }
  443. BfTypeCode BeIRCodeGen::GetTypeCode(BeType * type, bool isSigned)
  444. {
  445. switch (type->mTypeCode)
  446. {
  447. case BeTypeCode_Int8:
  448. return (isSigned) ? BfTypeCode_Int8 : BfTypeCode_UInt8;
  449. case BeTypeCode_Int16:
  450. return (isSigned) ? BfTypeCode_Int16 : BfTypeCode_UInt16;
  451. case BeTypeCode_Int32:
  452. return (isSigned) ? BfTypeCode_Int32 : BfTypeCode_UInt32;
  453. case BeTypeCode_Int64:
  454. return (isSigned) ? BfTypeCode_Int64 : BfTypeCode_UInt64;
  455. case BeTypeCode_Float:
  456. return BfTypeCode_Float;
  457. case BeTypeCode_Double:
  458. return BfTypeCode_Double;
  459. default:
  460. return BfTypeCode_None;
  461. }
  462. }
  463. void BeIRCodeGen::SetResult(int id, BeValue* value)
  464. {
  465. BeIRCodeGenEntry entry;
  466. entry.mKind = BeIRCodeGenEntryKind_Value;
  467. entry.mBeValue = value;
  468. mResults.TryAdd(id, entry);
  469. }
  470. void BeIRCodeGen::SetResult(int id, BeType* type)
  471. {
  472. BeIRCodeGenEntry entry;
  473. entry.mKind = BeIRCodeGenEntryKind_Type;
  474. entry.mBeType = type;
  475. mResults.TryAdd(id, entry);
  476. }
  477. void BeIRCodeGen::SetResult(int id, BeBlock* value)
  478. {
  479. BeIRCodeGenEntry entry;
  480. entry.mKind = BeIRCodeGenEntryKind_Block;
  481. entry.mBeBlock = value;
  482. mResults.TryAdd(id, entry);
  483. }
  484. void BeIRCodeGen::SetResult(int id, BeMDNode* md)
  485. {
  486. BeIRCodeGenEntry entry;
  487. entry.mKind = BeIRCodeGenEntryKind_Metadata;
  488. entry.mBeMetadata = md;
  489. mResults.TryAdd(id, entry);
  490. }
  491. int64 BeIRCodeGen::ReadSLEB128()
  492. {
  493. int64 val = 0;
  494. int64 shift = 0;
  495. uint8 byteVal;
  496. do
  497. {
  498. byteVal = mStream->Read();
  499. val |= ((int64)(byteVal & 0x7f)) << shift;
  500. shift += 7;
  501. } while (byteVal >= 128);
  502. // Sign extend negative numbers.
  503. if ((byteVal & 0x40) && (shift < 64))
  504. val |= (-1ULL) << shift;
  505. return val;
  506. }
  507. void BeIRCodeGen::Read(StringImpl& str)
  508. {
  509. BE_MEM_START;
  510. int len = (int)ReadSLEB128();
  511. str.Append('?', len);
  512. mStream->Read((void*)str.c_str(), len);
  513. BE_MEM_END("String");
  514. }
  515. void BeIRCodeGen::Read(int& i)
  516. {
  517. BE_MEM_START;
  518. i = (int)ReadSLEB128();
  519. BE_MEM_END("int");
  520. }
  521. void BeIRCodeGen::Read(int64& i)
  522. {
  523. BE_MEM_START;
  524. i = ReadSLEB128();
  525. BE_MEM_END("int64");
  526. }
  527. void BeIRCodeGen::Read(Val128& i)
  528. {
  529. i.mLow = (uint64)ReadSLEB128();
  530. i.mHigh = (uint64)ReadSLEB128();
  531. }
  532. void BeIRCodeGen::Read(bool& val)
  533. {
  534. BE_MEM_START;
  535. val = mStream->Read() != 0;
  536. BE_MEM_END("bool");
  537. }
  538. void BeIRCodeGen::Read(int8& val)
  539. {
  540. val = mStream->Read();
  541. }
  542. void BeIRCodeGen::Read(BeIRTypeEntry*& type)
  543. {
  544. BE_MEM_START;
  545. int typeId = (int)ReadSLEB128();
  546. type = &GetTypeEntry(typeId);
  547. BE_MEM_END("BeIRTypeEntry");
  548. }
  549. void BeIRCodeGen::Read(BeType*& beType)
  550. {
  551. BE_MEM_START;
  552. BfIRType::TypeKind typeKind = (BfIRType::TypeKind)mStream->Read();
  553. if (typeKind == BfIRType::TypeKind::TypeKind_None)
  554. {
  555. beType = NULL;
  556. BE_MEM_END("BeType");
  557. return;
  558. }
  559. if (typeKind == BfIRType::TypeKind::TypeKind_Stream)
  560. {
  561. int streamId = (int)ReadSLEB128();
  562. if (streamId == -1)
  563. {
  564. beType = NULL;
  565. BE_MEM_END("BeType");
  566. return;
  567. }
  568. auto& result = mResults[streamId];
  569. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Type);
  570. beType = result.mBeType;
  571. BE_MEM_END("BeType");
  572. return;
  573. }
  574. if (typeKind == BfIRType::TypeKind::TypeKind_SizedArray)
  575. {
  576. CMD_PARAM(BeType*, elementType);
  577. CMD_PARAM(int, length);
  578. beType = mBeContext->CreateSizedArrayType(elementType, length);
  579. return;
  580. }
  581. int typeId = (int)ReadSLEB128();
  582. if (typeKind == BfIRType::TypeKind::TypeKind_TypeCode)
  583. {
  584. bool isSigned = false;
  585. beType = GetBeType((BfTypeCode)typeId, isSigned);
  586. return;
  587. }
  588. auto& typeEntry = GetTypeEntry(typeId);
  589. if (typeKind == BfIRType::TypeKind::TypeKind_TypeId)
  590. beType = typeEntry.mBeType;
  591. else if (typeKind == BfIRType::TypeKind::TypeKind_TypeInstId)
  592. beType = typeEntry.mInstBeType;
  593. else if (typeKind == BfIRType::TypeKind::TypeKind_TypeInstPtrId)
  594. beType = mBeContext->GetPointerTo(typeEntry.mInstBeType);
  595. BE_MEM_END("BeType");
  596. }
  597. void BeIRCodeGen::Read(BeFunctionType*& beType)
  598. {
  599. BE_MEM_START;
  600. int streamId = (int)ReadSLEB128();
  601. auto& result = mResults[streamId];
  602. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Type);
  603. beType = (BeFunctionType*)result.mBeType;
  604. BE_MEM_END("BeFunctionType");
  605. }
  606. void BeIRCodeGen::Read(BeValue*& beValue)
  607. {
  608. BE_MEM_START;
  609. BfIRParamType paramType = (BfIRParamType)mStream->Read();
  610. if (paramType == BfIRParamType_None)
  611. {
  612. beValue = NULL;
  613. BE_MEM_END("ParamType_None");
  614. }
  615. else if (paramType == BfIRParamType_Const)
  616. {
  617. BfTypeCode typeCode = (BfTypeCode)mStream->Read();
  618. BfConstType constType = (BfConstType)typeCode;
  619. if (constType == BfConstType_GlobalVar)
  620. {
  621. CMD_PARAM(int, streamId);
  622. if (streamId == -1)
  623. {
  624. int streamId = mCmdCount++;
  625. CMD_PARAM(BeType*, varType);
  626. CMD_PARAM(bool, isConstant);
  627. BfIRLinkageType linkageType = (BfIRLinkageType)mStream->Read();
  628. CMD_PARAM(BeConstant*, initializer);
  629. CMD_PARAM(String, name);
  630. CMD_PARAM(bool, isTLS);
  631. BF_ASSERT(varType != NULL);
  632. auto globalVariable = mBeModule->mGlobalVariables.Alloc();
  633. globalVariable->mModule = mBeModule;
  634. globalVariable->mType = varType;
  635. globalVariable->mIsConstant = isConstant;
  636. globalVariable->mLinkageType = linkageType;
  637. globalVariable->mInitializer = initializer;
  638. globalVariable->mName = name;
  639. globalVariable->mIsTLS = isTLS;
  640. globalVariable->mAlign = varType->mAlign;
  641. globalVariable->mUnnamedAddr = false;
  642. globalVariable->mStorageKind = BfIRStorageKind_Normal;
  643. if (initializer != NULL)
  644. BF_ASSERT(varType->mAlign > 0);
  645. SetResult(streamId, globalVariable);
  646. beValue = globalVariable;
  647. }
  648. else
  649. beValue = GetBeValue(streamId);
  650. beValue->mRefCount++;
  651. BE_MEM_END("ParamType_Const_GlobalVar");
  652. return;
  653. }
  654. else if ((constType == BfConstType_BitCast) || (constType == BfConstType_BitCastNull))
  655. {
  656. CMD_PARAM(BeConstant*, target);
  657. CMD_PARAM(BeType*, toType);
  658. auto castedVal = mBeModule->mAlloc.Alloc<BeCastConstant>();
  659. castedVal->mInt64 = target->mInt64;
  660. castedVal->mType = toType;
  661. castedVal->mTarget = target;
  662. BF_ASSERT(target->GetType() != NULL);
  663. BF_ASSERT(!target->GetType()->IsComposite());
  664. beValue = castedVal;
  665. BE_MEM_END("ParamType_Const_BitCast");
  666. return;
  667. }
  668. else if (constType == BfConstType_GEP32_2)
  669. {
  670. CMD_PARAM(BeConstant*, target);
  671. CMD_PARAM(int, idx0);
  672. CMD_PARAM(int, idx1);
  673. BF_ASSERT(target->GetType()->IsPointer());
  674. auto gepConstant = mBeModule->mAlloc.Alloc<BeGEPConstant>();
  675. gepConstant->mTarget = target;
  676. gepConstant->mIdx0 = idx0;
  677. gepConstant->mIdx1 = idx1;
  678. beValue = gepConstant;
  679. BE_MEM_END("ParamType_Const_GEP32_2");
  680. return;
  681. }
  682. else if (constType == BfConstType_ExtractValue)
  683. {
  684. CMD_PARAM(BeConstant*, target);
  685. CMD_PARAM(int, idx0);
  686. auto gepConstant = mBeModule->mAlloc.Alloc<BeExtractValueConstant>();
  687. gepConstant->mTarget = target;
  688. gepConstant->mIdx0 = idx0;
  689. beValue = gepConstant;
  690. BE_MEM_END("ParamType_Const_ExtractValue");
  691. return;
  692. }
  693. else if (constType == BfConstType_PtrToInt)
  694. {
  695. CMD_PARAM(BeConstant*, target);
  696. BfTypeCode toTypeCode = (BfTypeCode)mStream->Read();
  697. BF_ASSERT(target->GetType()->IsPointer());
  698. bool isSigned = false;
  699. BeType* toType = GetBeType(toTypeCode, isSigned);
  700. auto castedVal = mBeModule->mAlloc.Alloc<BeCastConstant>();
  701. castedVal->mInt64 = target->mInt64;
  702. castedVal->mType = toType;
  703. castedVal->mTarget = target;
  704. BF_ASSERT(target->GetType() != NULL);
  705. beValue = castedVal;
  706. BE_MEM_END("ParamType_Const_PtrToInt");
  707. return;
  708. }
  709. else if (constType == BfConstType_IntToPtr)
  710. {
  711. CMD_PARAM(BeConstant*, target);
  712. CMD_PARAM(BeType*, toType);
  713. auto castedVal = mBeModule->mAlloc.Alloc<BeCastConstant>();
  714. castedVal->mInt64 = target->mInt64;
  715. castedVal->mType = toType;
  716. castedVal->mTarget = target;
  717. BF_ASSERT(target->GetType() != NULL);
  718. BF_ASSERT(!target->GetType()->IsComposite());
  719. BF_ASSERT(toType->IsPointer());
  720. beValue = castedVal;
  721. BE_MEM_END("ParamType_Const_IntToPtr");
  722. return;
  723. }
  724. else if (constType == BfConstType_AggZero)
  725. {
  726. CMD_PARAM(BeType*, type);
  727. auto beConst = mBeModule->mAlloc.Alloc<BeConstant>();
  728. beConst->mType = type;
  729. beValue = beConst;
  730. BE_MEM_END("ParamType_Const_AggZero");
  731. return;
  732. }
  733. else if (constType == BfConstType_Agg)
  734. {
  735. CMD_PARAM(BeType*, type);
  736. CMD_PARAM(CmdParamVec<BeConstant*>, values);
  737. if (type->IsSizedArray())
  738. {
  739. auto arrayType = (BeSizedArrayType*)type;
  740. int fillCount = (int)(arrayType->mLength - values.size());
  741. if (fillCount > 0)
  742. {
  743. auto lastValue = values.back();
  744. for (int i = 0; i < fillCount; i++)
  745. values.push_back(lastValue);
  746. }
  747. }
  748. else if (type->IsVector())
  749. {
  750. auto vecType = (BeVectorType*)type;
  751. int fillCount = (int)(vecType->mLength - values.size());
  752. if (fillCount > 0)
  753. {
  754. auto lastValue = values.back();
  755. for (int i = 0; i < fillCount; i++)
  756. values.push_back(lastValue);
  757. }
  758. }
  759. else
  760. {
  761. BF_ASSERT(type->IsStruct());
  762. }
  763. auto constStruct = mBeModule->mOwnedValues.Alloc<BeStructConstant>();
  764. constStruct->mType = type;
  765. for (int i = 0; i < (int)values.size(); i++)
  766. {
  767. auto val = values[i];
  768. BeConstant* constant = BeValueDynCast<BeConstant>(val);
  769. if (type->IsSizedArray())
  770. {
  771. auto arrayType = (BeSizedArrayType*)type;
  772. auto memberType = constant->GetType();
  773. if (memberType != arrayType->mElementType)
  774. Fail("ConstAgg array member type mismatch");
  775. }
  776. else if (type->IsVector())
  777. {
  778. auto vecType = (BeVectorType*)type;
  779. auto memberType = constant->GetType();
  780. if (memberType != vecType->mElementType)
  781. Fail("ConstAgg vector member type mismatch");
  782. }
  783. else
  784. {
  785. BF_ASSERT(type->IsStruct());
  786. auto structType = (BeStructType*)type;
  787. auto valType = constant->GetType();
  788. if (structType->mIsOpaque)
  789. {
  790. Fail("ConstAgg with opaque struct");
  791. }
  792. else if (valType != structType->mMembers[i].mType)
  793. {
  794. if (valType->IsSizedArray())
  795. {
  796. auto valSizedType = (BeSizedArrayType*)valType;
  797. if (valSizedType->mSize == 0)
  798. {
  799. constant->mType = structType->mMembers[i].mType;
  800. constStruct->mMemberValues.Add(constant);
  801. continue;
  802. }
  803. }
  804. Fail("ConstAgg struct member type mismatch");
  805. }
  806. }
  807. constStruct->mMemberValues.Add(constant);
  808. }
  809. beValue = constStruct;
  810. BE_MEM_END("ParamType_Const_Array");
  811. return;
  812. }
  813. else if (constType == BfConstType_ArrayZero8)
  814. {
  815. CMD_PARAM(int, count);
  816. auto beType = mBeContext->CreateSizedArrayType(mBeContext->GetPrimitiveType(BeTypeCode_Int8), count);
  817. auto beConst = mBeModule->mAlloc.Alloc<BeConstant>();
  818. beConst->mType = beType;
  819. beValue = beConst;
  820. return;
  821. }
  822. else if (constType == BfConstType_Undef)
  823. {
  824. CMD_PARAM(BeType*, type);
  825. auto constUndef = mBeModule->mOwnedValues.Alloc<BeUndefConstant>();
  826. constUndef->mType = type;
  827. beValue = constUndef;
  828. return;
  829. }
  830. else if (constType == BfConstType_TypeOf)
  831. {
  832. CMD_PARAM(BeType*, type);
  833. beValue = mReflectDataMap[type];
  834. BF_ASSERT(beValue != NULL);
  835. return;
  836. }
  837. else if (constType == BfConstType_TypeOf_WithData)
  838. {
  839. CMD_PARAM(BeType*, type);
  840. CMD_PARAM(BeValue*, value);
  841. mReflectDataMap[type] = value;
  842. beValue = value;
  843. return;
  844. }
  845. bool isSigned = false;
  846. BeType* llvmConstType = GetBeType(typeCode, isSigned);
  847. if (typeCode == BfTypeCode_Float)
  848. {
  849. float f;
  850. mStream->Read(&f, sizeof(float));
  851. beValue = mBeModule->GetConstant(llvmConstType, f);
  852. BE_MEM_END("ParamType_Single");
  853. }
  854. else if (typeCode == BfTypeCode_Double)
  855. {
  856. double d;
  857. mStream->Read(&d, sizeof(double));
  858. beValue = mBeModule->GetConstant(llvmConstType, d);
  859. BE_MEM_END("ParamType_Const_Double");
  860. }
  861. else if (typeCode == BfTypeCode_Boolean)
  862. {
  863. CMD_PARAM(bool, boolVal);
  864. beValue = mBeModule->GetConstant(llvmConstType, boolVal);
  865. BE_MEM_END("ParamType_Const_Boolean");
  866. }
  867. else if (typeCode == BfTypeCode_None)
  868. {
  869. beValue = NULL;
  870. BE_MEM_END("ParamType_Const_None");
  871. }
  872. else if (typeCode == BfTypeCode_NullPtr)
  873. {
  874. CMD_PARAM(BeType*, nullType);
  875. beValue = mBeModule->GetConstantNull((BePointerType*)nullType);
  876. BE_MEM_END("ParamType_Const_NullPtr");
  877. }
  878. else if (BfIRBuilder::IsInt(typeCode))
  879. {
  880. int64 intVal = ReadSLEB128();
  881. auto constVal = mBeModule->GetConstant(llvmConstType, intVal);
  882. beValue = constVal;
  883. BE_MEM_END("ParamType_Const_Int");
  884. }
  885. else
  886. {
  887. BF_FATAL("Unhandled");
  888. }
  889. }
  890. else if (paramType == BfIRParamType_Arg)
  891. {
  892. int argIdx = mStream->Read();
  893. beValue = mBeModule->GetArgument(argIdx);
  894. BE_MEM_END("ParamType_Arg");
  895. }
  896. else if (paramType == BfIRParamType_StreamId_Abs8)
  897. {
  898. int cmdId = mStream->Read();
  899. auto& result = mResults[cmdId];
  900. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Value);
  901. beValue = result.mBeValue;
  902. BE_MEM_END("ParamType_StreamId");
  903. }
  904. else if (paramType == BfIRParamType_StreamId_Rel)
  905. {
  906. int cmdId = mCmdCount - (int)ReadSLEB128();
  907. auto& result = mResults[cmdId];
  908. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Value);
  909. beValue = result.mBeValue;
  910. BE_MEM_END("ParamType_StreamId");
  911. }
  912. else
  913. {
  914. int cmdId = mCmdCount - (paramType - BfIRParamType_StreamId_Back1) - 1;
  915. auto& result = mResults[cmdId];
  916. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Value);
  917. beValue = result.mBeValue;
  918. BE_MEM_END("ParamType_StreamId");
  919. }
  920. if (beValue != NULL)
  921. beValue->mRefCount++;
  922. }
  923. void BeIRCodeGen::Read(BeConstant*& llvmConstant)
  924. {
  925. BE_MEM_START;
  926. BeValue* value;
  927. Read(value);
  928. if (value == NULL)
  929. {
  930. llvmConstant = NULL;
  931. }
  932. else
  933. {
  934. BF_ASSERT(BeValueDynCast<BeConstant>(value));
  935. llvmConstant = (BeConstant*)value;
  936. }
  937. BE_MEM_END("BeConstant");
  938. }
  939. void BeIRCodeGen::Read(BeFunction*& beFunc)
  940. {
  941. BE_MEM_START;
  942. int streamId = (int)ReadSLEB128();
  943. if (streamId == -1)
  944. {
  945. beFunc = NULL;
  946. return;
  947. }
  948. auto& result = mResults[streamId];
  949. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Value);
  950. BF_ASSERT(BeValueDynCast<BeFunction>(result.mBeValue));
  951. beFunc = (BeFunction*)result.mBeValue;
  952. BE_MEM_END("BeFunction");
  953. beFunc->mRefCount++;
  954. }
  955. void BeIRCodeGen::Read(BeBlock*& beBlock)
  956. {
  957. BE_MEM_START;
  958. int streamId = (int)ReadSLEB128();
  959. auto& result = mResults[streamId];
  960. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Block);
  961. beBlock = (BeBlock*)result.mBeType;
  962. BE_MEM_END("BeBlock");
  963. beBlock->mRefCount++;
  964. }
  965. void BeIRCodeGen::Read(BeMDNode*& llvmMD)
  966. {
  967. BE_MEM_START;
  968. int streamId = (int)ReadSLEB128();
  969. if (streamId == -1)
  970. {
  971. llvmMD = NULL;
  972. return;
  973. }
  974. auto& result = mResults[streamId];
  975. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Metadata);
  976. llvmMD = result.mBeMetadata;
  977. BE_MEM_END("BeMDNode");
  978. llvmMD->mRefCount++;
  979. }
  980. void BeIRCodeGen::HandleNextCmd()
  981. {
  982. int curId = mCmdCount;
  983. BfIRCmd cmd = (BfIRCmd)mStream->Read();
  984. mCmdCount++;
  985. #ifdef CODEGEN_TRACK
  986. gBEMemReporter.BeginSection(gIRCmdNames[cmd]);
  987. gBEMemReporter.Add(1);
  988. #endif
  989. switch (cmd)
  990. {
  991. case BfIRCmd_Module_Start:
  992. {
  993. CMD_PARAM(String, moduleName);
  994. CMD_PARAM(int, ptrSize);
  995. CMD_PARAM(bool, isOptimized);
  996. BF_ASSERT(mBeModule == NULL);
  997. mPtrSize = ptrSize;
  998. mIsOptimized = isOptimized;
  999. mBeContext = new BeContext();
  1000. mBeModule = new BeModule(moduleName, mBeContext);
  1001. mBeModule->mBeIRCodeGen = this;
  1002. mBeContext->mPointerSize = ptrSize;
  1003. for (auto constInt : mConfigConsts)
  1004. {
  1005. auto constVal = mBeModule->mAlloc.Alloc<BeConstant>();
  1006. constVal->mType = mBeContext->GetPrimitiveType(BeTypeCode_Int32);
  1007. constVal->mInt64 = constInt;
  1008. mBeModule->mConfigConsts32.Add(constVal);
  1009. constVal = mBeModule->mAlloc.Alloc<BeConstant>();
  1010. constVal->mType = mBeContext->GetPrimitiveType(BeTypeCode_Int64);
  1011. constVal->mInt64 = constInt;
  1012. mBeModule->mConfigConsts64.Add(constVal);
  1013. }
  1014. }
  1015. break;
  1016. case BfIRCmd_Module_SetTargetTriple:
  1017. {
  1018. CMD_PARAM(String, targetTriple);
  1019. mBeModule->mTargetTriple = targetTriple;
  1020. }
  1021. break;
  1022. case BfIRCmd_Module_AddModuleFlag:
  1023. {
  1024. CMD_PARAM(String, flag);
  1025. CMD_PARAM(int, val);
  1026. //mBeModule->addModuleFlag(BeModule::Warning, flag, val);
  1027. }
  1028. break;
  1029. case BfIRCmd_WriteIR:
  1030. {
  1031. /*CMD_PARAM(String, fileName);
  1032. std::error_code ec;
  1033. Beraw_fd_ostream outStream(fileName.c_str(), ec, Besys::fs::OpenFlags::F_Text);
  1034. if (ec)
  1035. {
  1036. Fail("Failed writing IR '" + fileName + "': " + ec.message());
  1037. }
  1038. else
  1039. mBeModule->print(outStream, NULL);*/
  1040. }
  1041. break;
  1042. case BfIRCmd_SetType:
  1043. {
  1044. CMD_PARAM(int, typeId);
  1045. CMD_PARAM(BeType*, type);
  1046. auto& typeEntry = GetTypeEntry(typeId);
  1047. typeEntry.mBeType = type;
  1048. if (typeEntry.mInstBeType == NULL)
  1049. typeEntry.mInstBeType = type;
  1050. }
  1051. break;
  1052. case BfIRCmd_SetInstType:
  1053. {
  1054. CMD_PARAM(int, typeId);
  1055. CMD_PARAM(BeType*, type);
  1056. GetTypeEntry(typeId).mInstBeType = type;
  1057. }
  1058. break;
  1059. case BfIRCmd_PrimitiveType:
  1060. {
  1061. BfTypeCode typeCode = (BfTypeCode)mStream->Read();
  1062. bool isSigned = false;
  1063. SetResult(curId, GetBeType(typeCode, isSigned));
  1064. }
  1065. break;
  1066. case BfIRCmd_CreateStruct:
  1067. {
  1068. CMD_PARAM(String, typeName);
  1069. SetResult(curId, mBeContext->CreateStruct(typeName));
  1070. }
  1071. break;
  1072. case BfIRCmd_CreateAnonymousStruct:
  1073. {
  1074. CMD_PARAM(CmdParamVec<BeType*>, members);
  1075. BeStructType* structType = mBeContext->CreateStruct(members);
  1076. SetResult(curId, structType);
  1077. }
  1078. break;
  1079. case BfIRCmd_StructSetBody:
  1080. {
  1081. CMD_PARAM(BeType*, type);
  1082. CMD_PARAM(CmdParamVec<BeType*>, members);
  1083. CMD_PARAM(int, instSize);
  1084. CMD_PARAM(int, instAlign);
  1085. CMD_PARAM(bool, isPacked);
  1086. BF_ASSERT(type->mTypeCode == BeTypeCode_Struct);
  1087. auto structType = (BeStructType*)type;
  1088. mBeContext->SetStructBody(structType, members, isPacked);
  1089. structType->mSize = instSize;
  1090. structType->mAlign = instAlign;
  1091. }
  1092. break;
  1093. case BfIRCmd_Type:
  1094. {
  1095. CMD_PARAM(BeIRTypeEntry*, typeEntry);
  1096. auto type = typeEntry->mBeType;
  1097. SetResult(curId, type);
  1098. }
  1099. break;
  1100. case BfIRCmd_TypeInst:
  1101. {
  1102. CMD_PARAM(BeIRTypeEntry*, typeEntry);
  1103. SetResult(curId, typeEntry->mInstBeType);
  1104. }
  1105. break;
  1106. case BfIRCmd_TypeInstPtr:
  1107. {
  1108. CMD_PARAM(BeIRTypeEntry*, typeEntry);
  1109. SetResult(curId, mBeContext->GetPointerTo(typeEntry->mInstBeType));
  1110. }
  1111. break;
  1112. case BfIRCmd_GetType:
  1113. {
  1114. CMD_PARAM(BeValue*, value);
  1115. auto type = value->GetType();
  1116. SetResult(curId, type);
  1117. }
  1118. break;
  1119. case BfIRCmd_GetPointerToFuncType:
  1120. {
  1121. CMD_PARAM(BeFunctionType*, funcType);
  1122. SetResult(curId, mBeContext->GetPointerTo(funcType));
  1123. }
  1124. break;
  1125. case BfIRCmd_GetPointerToType:
  1126. {
  1127. CMD_PARAM(BeType*, type);
  1128. SetResult(curId, mBeContext->GetPointerTo(type));
  1129. }
  1130. break;
  1131. case BfIRCmd_GetSizedArrayType:
  1132. {
  1133. CMD_PARAM(BeType*, elementType);
  1134. CMD_PARAM(int, length);
  1135. SetResult(curId, mBeContext->CreateSizedArrayType(elementType, length));
  1136. }
  1137. break;
  1138. case BfIRCmd_GetVectorType:
  1139. {
  1140. CMD_PARAM(BeType*, elementType);
  1141. CMD_PARAM(int, length);
  1142. SetResult(curId, mBeContext->CreateVectorType(elementType, length));
  1143. }
  1144. break;
  1145. case BfIRCmd_CreateConstAgg:
  1146. {
  1147. CMD_PARAM(BeType*, type);
  1148. CMD_PARAM(CmdParamVec<BeValue*>, values);
  1149. auto constStruct = mBeModule->mOwnedValues.Alloc<BeStructConstant>();
  1150. constStruct->mType = type;
  1151. if (type->IsStruct())
  1152. {
  1153. FixValues((BeStructType*)type, values);
  1154. BF_ASSERT(((BeStructType*)type)->mMembers.size() == values.size());
  1155. for (int i = 0; i < (int)values.size(); i++)
  1156. {
  1157. auto val = values[i];
  1158. BF_ASSERT(mBeContext->AreTypesEqual(((BeStructType*)type)->mMembers[i].mType, val->GetType()));
  1159. constStruct->mMemberValues.push_back(BeValueDynCast<BeConstant>(val));
  1160. }
  1161. }
  1162. else
  1163. {
  1164. BF_ASSERT(type->IsSizedArray());
  1165. auto arrayType = (BeSizedArrayType*)type;
  1166. int fillCount = (int)(arrayType->mLength - values.size());
  1167. if (fillCount > 0)
  1168. {
  1169. auto lastValue = values.back();
  1170. for (int i = 0; i < fillCount; i++)
  1171. values.push_back(lastValue);
  1172. }
  1173. BF_ASSERT(arrayType->mLength == values.size());
  1174. for (int i = 0; i < (int)values.size(); i++)
  1175. {
  1176. auto val = values[i];
  1177. BF_ASSERT(mBeContext->AreTypesEqual(((BeSizedArrayType*)type)->mElementType, val->GetType()));
  1178. constStruct->mMemberValues.push_back(BeValueDynCast<BeConstant>(val));
  1179. }
  1180. }
  1181. SetResult(curId, constStruct);
  1182. }
  1183. break;
  1184. case BfIRCmd_CreateConstStructZero:
  1185. {
  1186. CMD_PARAM(BeType*, type);
  1187. auto beConst = mBeModule->mAlloc.Alloc<BeConstant>();
  1188. beConst->mType = type;
  1189. SetResult(curId, beConst);
  1190. }
  1191. break;
  1192. case BfIRCmd_CreateConstString:
  1193. {
  1194. CMD_PARAM(String, str);
  1195. auto constStruct = mBeModule->mOwnedValues.Alloc<BeStringConstant>();
  1196. constStruct->mString = str;
  1197. auto charType = mBeContext->GetPrimitiveType(BeTypeCode_Int8);
  1198. constStruct->mType = mBeContext->CreateSizedArrayType(charType, str.length() + 1);
  1199. SetResult(curId, constStruct);
  1200. }
  1201. break;
  1202. case BfIRCmd_ConfigConst:
  1203. {
  1204. CMD_PARAM(int, constIdx);
  1205. BfTypeCode typeCode = (BfTypeCode)mStream->Read();
  1206. if (typeCode == BfTypeCode_IntPtr)
  1207. typeCode = (mPtrSize == 4) ? BfTypeCode_Int32 : BfTypeCode_Int64;
  1208. BeConstant* constVal = (typeCode == BfTypeCode_Int32) ?
  1209. mBeModule->mConfigConsts32[constIdx] :
  1210. mBeModule->mConfigConsts64[constIdx];
  1211. SetResult(curId, constVal);
  1212. }
  1213. break;
  1214. case BfIRCmd_SetName:
  1215. {
  1216. CMD_PARAM(BeValue*, val);
  1217. CMD_PARAM(String, name);
  1218. val->SetName(name);
  1219. }
  1220. break;
  1221. case BfIRCmd_CreateUndefValue:
  1222. {
  1223. CMD_PARAM(BeType*, type);
  1224. SetResult(curId, mBeModule->CreateUndefValue(type));
  1225. }
  1226. break;
  1227. case BfIRCmd_NumericCast:
  1228. {
  1229. CMD_PARAM(BeValue*, val);
  1230. CMD_PARAM(bool, valIsSigned);
  1231. BfTypeCode typeCode = (BfTypeCode)mStream->Read();
  1232. auto valType = val->GetType();
  1233. if ((!valType->IsIntable()) && (!valType->IsFloat()))
  1234. {
  1235. Fail("Invalid NumericCast target");
  1236. }
  1237. BfTypeCode valTypeCode = GetTypeCode(valType, valIsSigned);
  1238. if (auto srcCastConstant = BeValueDynCast<BeCastConstant>(val))
  1239. {
  1240. BeType* toType = GetBeType(typeCode, valIsSigned);
  1241. auto castedVal = mBeModule->mAlloc.Alloc<BeCastConstant>();
  1242. castedVal->mInt64 = srcCastConstant->mInt64;
  1243. castedVal->mType = toType;
  1244. castedVal->mTarget = srcCastConstant->mTarget;
  1245. SetResult(curId, castedVal);
  1246. break;
  1247. }
  1248. bool toSigned = false;
  1249. auto toBeType = GetBeType(typeCode, toSigned);
  1250. BeValue* retVal = mBeModule->CreateNumericCast(val, toBeType, valIsSigned, toSigned);
  1251. SetResult(curId, retVal);
  1252. }
  1253. break;
  1254. case BfIRCmd_CmpEQ:
  1255. {
  1256. CMD_PARAM(BeValue*, lhs);
  1257. CMD_PARAM(BeValue*, rhs);
  1258. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_EQ, lhs, rhs));
  1259. }
  1260. break;
  1261. case BfIRCmd_CmpNE:
  1262. {
  1263. CMD_PARAM(BeValue*, lhs);
  1264. CMD_PARAM(BeValue*, rhs);
  1265. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_NE, lhs, rhs));
  1266. }
  1267. break;
  1268. case BfIRCmd_CmpSLT:
  1269. {
  1270. CMD_PARAM(BeValue*, lhs);
  1271. CMD_PARAM(BeValue*, rhs);
  1272. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_SLT, lhs, rhs));
  1273. }
  1274. break;
  1275. case BfIRCmd_CmpULT:
  1276. {
  1277. CMD_PARAM(BeValue*, lhs);
  1278. CMD_PARAM(BeValue*, rhs);
  1279. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_ULT, lhs, rhs));
  1280. }
  1281. break;
  1282. case BfIRCmd_CmpSLE:
  1283. {
  1284. CMD_PARAM(BeValue*, lhs);
  1285. CMD_PARAM(BeValue*, rhs);
  1286. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_SLE, lhs, rhs));
  1287. }
  1288. break;
  1289. case BfIRCmd_CmpULE:
  1290. {
  1291. CMD_PARAM(BeValue*, lhs);
  1292. CMD_PARAM(BeValue*, rhs);
  1293. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_ULE, lhs, rhs));
  1294. }
  1295. break;
  1296. case BfIRCmd_CmpSGT:
  1297. {
  1298. CMD_PARAM(BeValue*, lhs);
  1299. CMD_PARAM(BeValue*, rhs);
  1300. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_SGT, lhs, rhs));
  1301. }
  1302. break;
  1303. case BfIRCmd_CmpUGT:
  1304. {
  1305. CMD_PARAM(BeValue*, lhs);
  1306. CMD_PARAM(BeValue*, rhs);
  1307. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_UGT, lhs, rhs));
  1308. }
  1309. break;
  1310. case BfIRCmd_CmpSGE:
  1311. {
  1312. CMD_PARAM(BeValue*, lhs);
  1313. CMD_PARAM(BeValue*, rhs);
  1314. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_SGE, lhs, rhs));
  1315. }
  1316. break;
  1317. case BfIRCmd_CmpUGE:
  1318. {
  1319. CMD_PARAM(BeValue*, lhs);
  1320. CMD_PARAM(BeValue*, rhs);
  1321. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_UGE, lhs, rhs));
  1322. }
  1323. break;
  1324. case BfIRCmd_Add:
  1325. {
  1326. CMD_PARAM(BeValue*, lhs);
  1327. CMD_PARAM(BeValue*, rhs);
  1328. CMD_PARAM(int8, overflowCheckKind);
  1329. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_Add, lhs, rhs, (BfOverflowCheckKind)overflowCheckKind));
  1330. }
  1331. break;
  1332. case BfIRCmd_Sub:
  1333. {
  1334. CMD_PARAM(BeValue*, lhs);
  1335. CMD_PARAM(BeValue*, rhs);
  1336. CMD_PARAM(int8, overflowCheckKind);
  1337. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_Subtract, lhs, rhs, (BfOverflowCheckKind)overflowCheckKind));
  1338. }
  1339. break;
  1340. case BfIRCmd_Mul:
  1341. {
  1342. CMD_PARAM(BeValue*, lhs);
  1343. CMD_PARAM(BeValue*, rhs);
  1344. CMD_PARAM(int8, overflowCheckKind);
  1345. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_Multiply, lhs, rhs, (BfOverflowCheckKind)overflowCheckKind));
  1346. }
  1347. break;
  1348. case BfIRCmd_SDiv:
  1349. {
  1350. CMD_PARAM(BeValue*, lhs);
  1351. CMD_PARAM(BeValue*, rhs);
  1352. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_SDivide, lhs, rhs));
  1353. }
  1354. break;
  1355. case BfIRCmd_UDiv:
  1356. {
  1357. CMD_PARAM(BeValue*, lhs);
  1358. CMD_PARAM(BeValue*, rhs);
  1359. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_UDivide, lhs, rhs));
  1360. }
  1361. break;
  1362. case BfIRCmd_SRem:
  1363. {
  1364. CMD_PARAM(BeValue*, lhs);
  1365. CMD_PARAM(BeValue*, rhs);
  1366. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_SModulus, lhs, rhs));
  1367. }
  1368. break;
  1369. case BfIRCmd_URem:
  1370. {
  1371. CMD_PARAM(BeValue*, lhs);
  1372. CMD_PARAM(BeValue*, rhs);
  1373. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_UModulus, lhs, rhs));
  1374. }
  1375. break;
  1376. case BfIRCmd_And:
  1377. {
  1378. CMD_PARAM(BeValue*, lhs);
  1379. CMD_PARAM(BeValue*, rhs);
  1380. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_BitwiseAnd, lhs, rhs));
  1381. }
  1382. break;
  1383. case BfIRCmd_Or:
  1384. {
  1385. CMD_PARAM(BeValue*, lhs);
  1386. CMD_PARAM(BeValue*, rhs);
  1387. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_BitwiseOr, lhs, rhs));
  1388. }
  1389. break;
  1390. case BfIRCmd_Xor:
  1391. {
  1392. CMD_PARAM(BeValue*, lhs);
  1393. CMD_PARAM(BeValue*, rhs);
  1394. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_ExclusiveOr, lhs, rhs));
  1395. }
  1396. break;
  1397. case BfIRCmd_Shl:
  1398. {
  1399. CMD_PARAM(BeValue*, lhs);
  1400. CMD_PARAM(BeValue*, rhs);
  1401. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_LeftShift, lhs, rhs));
  1402. }
  1403. break;
  1404. case BfIRCmd_AShr:
  1405. {
  1406. CMD_PARAM(BeValue*, lhs);
  1407. CMD_PARAM(BeValue*, rhs);
  1408. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_ARightShift, lhs, rhs));
  1409. }
  1410. break;
  1411. case BfIRCmd_LShr:
  1412. {
  1413. CMD_PARAM(BeValue*, lhs);
  1414. CMD_PARAM(BeValue*, rhs);
  1415. SetResult(curId, mBeModule->CreateBinaryOp(BeBinaryOpKind_RightShift, lhs, rhs));
  1416. }
  1417. break;
  1418. case BfIRCmd_Neg:
  1419. {
  1420. CMD_PARAM(BeValue*, val);
  1421. auto negInst = mBeModule->AllocInst<BeNegInst>();
  1422. negInst->mValue = val;
  1423. SetResult(curId, negInst);
  1424. }
  1425. break;
  1426. case BfIRCmd_Not:
  1427. {
  1428. CMD_PARAM(BeValue*, val);
  1429. auto negInst = mBeModule->AllocInst<BeNotInst>();
  1430. negInst->mValue = val;
  1431. SetResult(curId, negInst);
  1432. }
  1433. break;
  1434. case BfIRCmd_BitCast:
  1435. {
  1436. CMD_PARAM(BeValue*, val);
  1437. CMD_PARAM(BeType*, toType);
  1438. if (auto funcVal = BeValueDynCast<BeFunction>(val))
  1439. {
  1440. auto beConst = mBeModule->mAlloc.Alloc<BeConstant>();
  1441. beConst->mTarget = funcVal;
  1442. BF_ASSERT(funcVal->mType != NULL);
  1443. beConst->mType = toType;
  1444. SetResult(curId, beConst);
  1445. break;
  1446. }
  1447. SetResult(curId, mBeModule->CreateBitCast(val, toType));
  1448. }
  1449. break;
  1450. case BfIRCmd_PtrToInt:
  1451. {
  1452. CMD_PARAM(BeValue*, val);
  1453. auto typeCode = (BfTypeCode)mStream->Read();
  1454. bool isSigned = false;
  1455. auto beType = GetBeType(typeCode, isSigned);
  1456. BF_ASSERT(beType != NULL);
  1457. auto numericCastInst = mBeModule->AllocInst<BeNumericCastInst>();
  1458. numericCastInst->mValue = val;
  1459. numericCastInst->mValSigned = false;
  1460. numericCastInst->mToType = beType;
  1461. numericCastInst->mToSigned = isSigned;
  1462. SetResult(curId, numericCastInst);
  1463. }
  1464. break;
  1465. case BfIRCmd_IntToPtr:
  1466. {
  1467. CMD_PARAM(BeValue*, val);
  1468. CMD_PARAM(BeType*, toType);
  1469. auto bitcastInst = mBeModule->AllocInst<BeBitCastInst>();
  1470. bitcastInst->mValue = val;
  1471. bitcastInst->mToType = toType;
  1472. SetResult(curId, bitcastInst);
  1473. }
  1474. break;
  1475. case BfIRCmd_InboundsGEP1_32:
  1476. {
  1477. CMD_PARAM(BeValue*, val);
  1478. CMD_PARAM(int, idx0);
  1479. BF_ASSERT(val->GetType()->IsPointer());
  1480. BeType* int32Type = mBeContext->GetPrimitiveType(BeTypeCode_Int32);
  1481. SetResult(curId, mBeModule->CreateGEP(val, mBeModule->GetConstant(int32Type, (int64)idx0), NULL));
  1482. }
  1483. break;
  1484. case BfIRCmd_InboundsGEP2_32:
  1485. {
  1486. CMD_PARAM(BeValue*, val);
  1487. CMD_PARAM(int, idx0);
  1488. CMD_PARAM(int, idx1);
  1489. BF_ASSERT(val->GetType()->IsPointer());
  1490. BeType* int32Type = mBeContext->GetPrimitiveType(BeTypeCode_Int32);
  1491. SetResult(curId, mBeModule->CreateGEP(val, mBeModule->GetConstant(int32Type, (int64)idx0), mBeModule->GetConstant(int32Type, (int64)idx1)));
  1492. }
  1493. break;
  1494. case BfIRCmd_InBoundsGEP1:
  1495. {
  1496. CMD_PARAM(BeValue*, val);
  1497. CMD_PARAM(BeValue*, idx0);
  1498. BF_ASSERT(val->GetType()->IsPointer());
  1499. SetResult(curId, mBeModule->CreateGEP(val, idx0, NULL));
  1500. }
  1501. break;
  1502. case BfIRCmd_InBoundsGEP2:
  1503. {
  1504. CMD_PARAM(BeValue*, val);
  1505. CMD_PARAM(BeValue*, idx0);
  1506. CMD_PARAM(BeValue*, idx1);
  1507. BF_ASSERT(val->GetType()->IsPointer());
  1508. SetResult(curId, mBeModule->CreateGEP(val, idx0, idx1));
  1509. }
  1510. break;
  1511. case BfIRCmd_IsNull:
  1512. {
  1513. CMD_PARAM(BeValue*, val);
  1514. BF_ASSERT(val->GetType()->IsPointer());
  1515. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_EQ, val, mBeModule->GetConstantNull((BePointerType*)val->GetType())));
  1516. }
  1517. break;
  1518. case BfIRCmd_IsNotNull:
  1519. {
  1520. CMD_PARAM(BeValue*, val);
  1521. BF_ASSERT(val->GetType()->IsPointer());
  1522. SetResult(curId, mBeModule->CreateCmp(BeCmpKind_NE, val, mBeModule->GetConstantNull((BePointerType*)val->GetType())));
  1523. }
  1524. break;
  1525. case BfIRCmd_ExtractValue:
  1526. {
  1527. CMD_PARAM(BeValue*, val);
  1528. CMD_PARAM(int, idx);
  1529. BF_ASSERT(val->GetType()->IsComposite());
  1530. auto extractValueInst = mBeModule->AllocInst<BeExtractValueInst>();
  1531. extractValueInst->mAggVal = val;
  1532. extractValueInst->mIdx = idx;
  1533. SetResult(curId, extractValueInst);
  1534. }
  1535. break;
  1536. case BfIRCmd_InsertValue:
  1537. {
  1538. CMD_PARAM(BeValue*, agg);
  1539. CMD_PARAM(BeValue*, val);
  1540. CMD_PARAM(int, idx);
  1541. auto insertValueInst = mBeModule->AllocInst<BeInsertValueInst>();
  1542. insertValueInst->mAggVal = agg;
  1543. insertValueInst->mMemberVal = val;
  1544. insertValueInst->mIdx = idx;
  1545. SetResult(curId, insertValueInst);
  1546. }
  1547. break;
  1548. case BfIRCmd_Alloca:
  1549. {
  1550. CMD_PARAM(BeType*, type);
  1551. if (type->IsStruct())
  1552. {
  1553. BF_ASSERT(!((BeStructType*)type)->mIsOpaque);
  1554. }
  1555. auto allocaInst = mBeModule->CreateAlloca(type);
  1556. allocaInst->mAlign = type->mAlign;
  1557. SetResult(curId, allocaInst);
  1558. }
  1559. break;
  1560. case BfIRCmd_AllocaArray:
  1561. {
  1562. CMD_PARAM(BeType*, type);
  1563. CMD_PARAM(BeValue*, arraySize);
  1564. if (auto constant = BeValueDynCast<BeConstant>(arraySize))
  1565. {
  1566. //BF_ASSERT(constant->mInt64 >= 0);
  1567. }
  1568. auto allocaInst = mBeModule->AllocInst<BeAllocaInst>();
  1569. allocaInst->mType = type;
  1570. allocaInst->mAlign = type->mAlign;
  1571. allocaInst->mArraySize = arraySize;
  1572. SetResult(curId, allocaInst);
  1573. }
  1574. break;
  1575. case BfIRCmd_SetAllocaAlignment:
  1576. {
  1577. CMD_PARAM(BeValue*, val);
  1578. CMD_PARAM(int, alignment);
  1579. auto inst = BeValueDynCast<BeAllocaInst>(val);
  1580. inst->mAlign = alignment;
  1581. //TODO: Implement
  1582. /*inst->setAlignment(alignment);*/
  1583. }
  1584. break;
  1585. case BfIRCmd_AliasValue:
  1586. {
  1587. CMD_PARAM(BeValue*, val);
  1588. auto inst = mBeModule->AllocInst<BeAliasValueInst>();
  1589. inst->mPtr = val;
  1590. SetResult(curId, inst);
  1591. }
  1592. break;
  1593. case BfIRCmd_LifetimeStart:
  1594. {
  1595. CMD_PARAM(BeValue*, val);
  1596. auto inst = mBeModule->AllocInst<BeLifetimeStartInst>();
  1597. inst->mPtr = val;
  1598. SetResult(curId, inst);
  1599. }
  1600. break;
  1601. case BfIRCmd_LifetimeEnd:
  1602. {
  1603. CMD_PARAM(BeValue*, val);
  1604. #ifdef _DEBUG
  1605. val->mLifetimeEnded = true;
  1606. #endif
  1607. auto inst = mBeModule->AllocInst<BeLifetimeEndInst>();
  1608. inst->mPtr = val;
  1609. SetResult(curId, inst);
  1610. }
  1611. break;
  1612. case BfIRCmd_LifetimeExtend:
  1613. {
  1614. CMD_PARAM(BeValue*, val);
  1615. auto inst = mBeModule->AllocInst<BeLifetimeExtendInst>();
  1616. inst->mPtr = val;
  1617. SetResult(curId, inst);
  1618. }
  1619. break;
  1620. case BfIRCmd_ValueScopeStart:
  1621. {
  1622. auto inst = mBeModule->AllocInst<BeValueScopeStartInst>();
  1623. SetResult(curId, inst);
  1624. }
  1625. break;
  1626. case BfIRCmd_ValueScopeRetain:
  1627. {
  1628. CMD_PARAM(BeValue*, val);
  1629. auto inst = mBeModule->AllocInst<BeValueScopeRetainInst>();
  1630. inst->mValue = val;
  1631. }
  1632. break;
  1633. case BfIRCmd_ValueScopeSoftEnd:
  1634. {
  1635. CMD_PARAM(BeValue*, val);
  1636. auto inst = mBeModule->AllocInst<BeValueScopeEndInst>();
  1637. inst->mScopeStart = (BeValueScopeStartInst*)val;
  1638. inst->mIsSoft = true;
  1639. //TODO: Is this always correct? This keeps there from being nops inserted on block opens ( { )
  1640. inst->mDbgLoc = NULL;
  1641. }
  1642. break;
  1643. case BfIRCmd_ValueScopeHardEnd:
  1644. {
  1645. CMD_PARAM(BeValue*, val);
  1646. auto inst = mBeModule->AllocInst<BeValueScopeEndInst>();
  1647. inst->mScopeStart = (BeValueScopeStartInst*)val;
  1648. inst->mIsSoft = false;
  1649. //TODO: Is this always correct? This keeps there from being nops inserted on block opens ( { )
  1650. inst->mDbgLoc = NULL;
  1651. }
  1652. break;
  1653. case BfIRCmd_SetAllocaNoChkStkHint:
  1654. {
  1655. CMD_PARAM(BeValue*, val);
  1656. auto inst = BeValueDynCast<BeAllocaInst>(val);
  1657. inst->mNoChkStk = true;
  1658. }
  1659. break;
  1660. case BfIRCmd_SetAllocaForceMem:
  1661. {
  1662. CMD_PARAM(BeValue*, val);
  1663. auto inst = BeValueDynCast<BeAllocaInst>(val);
  1664. inst->mForceMem = true;
  1665. }
  1666. break;
  1667. case BfIRCmd_Load:
  1668. {
  1669. CMD_PARAM(BeValue*, val);
  1670. #ifdef _DEBUG
  1671. auto ptrType = val->GetType();
  1672. BF_ASSERT(ptrType->IsPointer());
  1673. // We call via a function pointer so there's never a reason to allow loading of a funcPtr
  1674. BF_ASSERT(((BePointerType*)ptrType)->mElementType->mTypeCode != BeTypeCode_Function);
  1675. // Disallow loading from a NULL constant
  1676. if (val->GetTypeId() == BeConstant::TypeId)
  1677. {
  1678. if (auto constant = BeValueDynCast<BeConstant>(val))
  1679. {
  1680. BF_ASSERT(constant->mTarget != NULL);
  1681. }
  1682. }
  1683. #endif
  1684. CMD_PARAM(bool, isVolatile);
  1685. SetResult(curId, mBeModule->CreateLoad(val, isVolatile));
  1686. }
  1687. break;
  1688. case BfIRCmd_AlignedLoad:
  1689. {
  1690. CMD_PARAM(BeValue*, val);
  1691. CMD_PARAM(int, alignment);
  1692. CMD_PARAM(bool, isVolatile);
  1693. #ifdef _DEBUG
  1694. // Disallow loading from a NULL constant
  1695. if (val->GetTypeId() == BeConstant::TypeId)
  1696. {
  1697. if (auto constant = BeValueDynCast<BeConstant>(val))
  1698. {
  1699. BF_ASSERT(constant->mTarget != NULL);
  1700. }
  1701. }
  1702. auto ptrType = val->GetType();
  1703. BF_ASSERT(ptrType->IsPointer());
  1704. #endif
  1705. SetResult(curId, mBeModule->CreateAlignedLoad(val, alignment, isVolatile));
  1706. }
  1707. break;
  1708. case BfIRCmd_Store:
  1709. {
  1710. CMD_PARAM(BeValue*, val);
  1711. CMD_PARAM(BeValue*, ptr);
  1712. #ifdef _DEBUG
  1713. auto ptrType = ptr->GetType();
  1714. auto valType = val->GetType();
  1715. if ((!ptrType->IsPointer()) || (!mBeContext->AreTypesEqual(((BePointerType*)ptrType)->mElementType, valType)))
  1716. {
  1717. String errStr;
  1718. errStr += "BfIRCmd_Store Match Failure:\n";
  1719. BeDumpContext dumpCtx;
  1720. errStr += "Val: ";
  1721. dumpCtx.ToString(errStr, val);
  1722. errStr += "\nPtr: ";
  1723. dumpCtx.ToString(errStr, ptr);
  1724. FatalError(errStr);
  1725. }
  1726. #endif
  1727. CMD_PARAM(bool, isVolatile);
  1728. SetResult(curId, mBeModule->CreateStore(val, ptr, isVolatile));
  1729. }
  1730. break;
  1731. case BfIRCmd_AlignedStore:
  1732. {
  1733. CMD_PARAM(BeValue*, val);
  1734. CMD_PARAM(BeValue*, ptr);
  1735. CMD_PARAM(int, alignment);
  1736. CMD_PARAM(bool, isVolatile);
  1737. #ifdef _DEBUG
  1738. auto ptrType = ptr->GetType();
  1739. auto valType = val->GetType();
  1740. if ((!ptrType->IsPointer()) || (!mBeContext->AreTypesEqual(((BePointerType*)ptrType)->mElementType, valType)))
  1741. {
  1742. String errStr;
  1743. errStr += "BfIRCmd_Store Match Failure:\n";
  1744. BeDumpContext dumpCtx;
  1745. errStr += "Val: ";
  1746. dumpCtx.ToString(errStr, val);
  1747. errStr += "\nPtr: ";
  1748. dumpCtx.ToString(errStr, ptr);
  1749. FatalError(errStr);
  1750. }
  1751. #endif
  1752. SetResult(curId, mBeModule->CreateAlignedStore(val, ptr, alignment, isVolatile));
  1753. }
  1754. break;
  1755. case BfIRCmd_MemSet:
  1756. {
  1757. auto inst = mBeModule->AllocInst<BeMemSetInst>();
  1758. Read(inst->mAddr);
  1759. Read(inst->mVal);
  1760. Read(inst->mSize);
  1761. Read(inst->mAlignment);
  1762. SetResult(curId, inst);
  1763. }
  1764. break;
  1765. case BfIRCmd_Fence:
  1766. {
  1767. BfIRFenceType fenceType = (BfIRFenceType)mStream->Read();
  1768. mBeModule->AllocInst<BeFenceInst>();
  1769. }
  1770. break;
  1771. case BfIRCmd_StackSave:
  1772. {
  1773. SetResult(curId, mBeModule->AllocInst<BeStackSaveInst>());
  1774. }
  1775. break;
  1776. case BfIRCmd_StackRestore:
  1777. {
  1778. CMD_PARAM(BeValue*, stackVal);
  1779. auto stackRestoreInst = mBeModule->AllocInst<BeStackRestoreInst>();
  1780. stackRestoreInst->mStackVal = stackVal;
  1781. SetResult(curId, stackRestoreInst);
  1782. }
  1783. break;
  1784. case BfIRCmd_GlobalVariable:
  1785. {
  1786. CMD_PARAM(BeType*, varType);
  1787. CMD_PARAM(bool, isConstant);
  1788. BfIRLinkageType linkageType = (BfIRLinkageType)mStream->Read();
  1789. CMD_PARAM(StringT<256>, name);
  1790. CMD_PARAM(bool, isTLS);
  1791. CMD_PARAM(BeConstant*, initializer);
  1792. BF_ASSERT(varType != NULL);
  1793. auto globalVariable = mBeModule->mGlobalVariables.Alloc();
  1794. globalVariable->mModule = mBeModule;
  1795. globalVariable->mType = varType;
  1796. globalVariable->mIsConstant = isConstant;
  1797. globalVariable->mLinkageType = linkageType;
  1798. globalVariable->mInitializer = initializer;
  1799. globalVariable->mName = name;
  1800. globalVariable->mIsTLS = isTLS;
  1801. globalVariable->mUnnamedAddr = false;
  1802. globalVariable->mStorageKind = BfIRStorageKind_Normal;
  1803. if (initializer != NULL)
  1804. {
  1805. globalVariable->mAlign = varType->mAlign;
  1806. BF_ASSERT(varType->mAlign > 0);
  1807. BF_ASSERT(mBeContext->AreTypesEqual(varType, initializer->GetType()));
  1808. }
  1809. else
  1810. globalVariable->mAlign = -1;
  1811. SetResult(curId, globalVariable);
  1812. }
  1813. break;
  1814. case BfIRCmd_GlobalVar_SetUnnamedAddr:
  1815. {
  1816. CMD_PARAM(BeValue*, val);
  1817. CMD_PARAM(bool, unnamedAddr);
  1818. BF_ASSERT(BeValueDynCast<BeGlobalVariable>(val) != NULL);
  1819. ((BeGlobalVariable*)val)->mUnnamedAddr = true;
  1820. }
  1821. break;
  1822. case BfIRCmd_GlobalVar_SetInitializer:
  1823. {
  1824. CMD_PARAM(BeValue*, val);
  1825. CMD_PARAM(BeConstant*, initializer);
  1826. BF_ASSERT(BeValueDynCast<BeGlobalVariable>(val) != NULL);
  1827. auto globalVariable = (BeGlobalVariable*)val;
  1828. globalVariable->mInitializer = initializer;
  1829. if (globalVariable->mInitializer != NULL)
  1830. {
  1831. globalVariable->mAlign = globalVariable->mType->mAlign;
  1832. BF_ASSERT(globalVariable->mAlign != -1);
  1833. }
  1834. }
  1835. break;
  1836. case BfIRCmd_GlobalVar_SetAlignment:
  1837. {
  1838. CMD_PARAM(BeValue*, val);
  1839. CMD_PARAM(int, alignment);
  1840. BF_ASSERT(BeValueDynCast<BeGlobalVariable>(val) != NULL);
  1841. auto globalVariable = (BeGlobalVariable*)val;
  1842. globalVariable->mAlign = alignment;
  1843. BF_ASSERT(alignment > 0);
  1844. if (globalVariable->mInitializer != NULL)
  1845. {
  1846. BF_ASSERT(globalVariable->mAlign != -1);
  1847. }
  1848. }
  1849. break;
  1850. case BfIRCmd_GlobalVar_SetStorageKind:
  1851. {
  1852. CMD_PARAM(BeValue*, val);
  1853. CMD_PARAM(int, storageKind);
  1854. BF_ASSERT(BeValueDynCast<BeGlobalVariable>(val) != NULL);
  1855. auto globalVariable = (BeGlobalVariable*)val;
  1856. globalVariable->mStorageKind = (BfIRStorageKind)storageKind;
  1857. }
  1858. break;
  1859. case BfIRCmd_GlobalStringPtr:
  1860. {
  1861. CMD_PARAM(String, str);
  1862. auto constStruct = mBeModule->mOwnedValues.Alloc<BeStringConstant>();
  1863. constStruct->mString = str;
  1864. auto charType = mBeContext->GetPrimitiveType(BeTypeCode_Int8);
  1865. constStruct->mType = mBeContext->CreateSizedArrayType(charType, str.length() + 1);
  1866. auto globalVariable = mBeModule->mGlobalVariables.Alloc();
  1867. globalVariable->mModule = mBeModule;
  1868. globalVariable->mType = constStruct->mType;
  1869. globalVariable->mIsConstant = true;
  1870. globalVariable->mLinkageType = BfIRLinkageType_Internal;
  1871. globalVariable->mInitializer = constStruct;
  1872. globalVariable->mName = StrFormat("__str%d", (int)mBeModule->mGlobalVariables.size() - 1);
  1873. globalVariable->mIsTLS = false;
  1874. globalVariable->mAlign = 1;
  1875. globalVariable->mUnnamedAddr = false;
  1876. auto castedVal = mBeModule->mAlloc.Alloc<BeCastConstant>();
  1877. castedVal->mType = mBeContext->GetPointerTo(charType);
  1878. castedVal->mTarget = globalVariable;
  1879. SetResult(curId, castedVal);
  1880. //SetResult(curId, globalVariable);
  1881. }
  1882. break;
  1883. case BfIRCmd_SetReflectTypeData:
  1884. {
  1885. CMD_PARAM(BeType*, type);
  1886. CMD_PARAM(BeValue*, value);
  1887. mReflectDataMap[type] = value;
  1888. }
  1889. break;
  1890. case BfIRCmd_CreateBlock:
  1891. {
  1892. CMD_PARAM(String, name);
  1893. CMD_PARAM(bool, addNow);
  1894. auto block = mBeModule->CreateBlock(name);
  1895. if (addNow)
  1896. mBeModule->AddBlock(mActiveFunction, block);
  1897. SetResult(curId, block);
  1898. }
  1899. break;
  1900. case BfIRCmd_MaybeChainNewBlock:
  1901. {
  1902. CMD_PARAM(String, name);
  1903. auto newBlock = mBeModule->GetInsertBlock();
  1904. if (!newBlock->IsEmpty())
  1905. {
  1906. auto bb = mBeModule->CreateBlock(name);
  1907. mBeModule->CreateBr(bb);
  1908. mBeModule->AddBlock(mActiveFunction, bb);
  1909. mBeModule->SetInsertPoint(bb);
  1910. newBlock = bb;
  1911. }
  1912. SetResult(curId, newBlock);
  1913. }
  1914. break;
  1915. case BfIRCmd_AddBlock:
  1916. {
  1917. CMD_PARAM(BeBlock*, block);
  1918. mBeModule->AddBlock(mActiveFunction, block);
  1919. }
  1920. break;
  1921. case BfIRCmd_DropBlocks:
  1922. {
  1923. CMD_PARAM(BeBlock*, startingBlock);
  1924. auto& basicBlockList = mActiveFunction->mBlocks;
  1925. int postExitBlockIdx = -1;
  1926. /*auto itr = basicBlockList.begin();
  1927. while (itr != basicBlockList.end())
  1928. {
  1929. auto block = *itr;
  1930. if (block == startingBlock)
  1931. {
  1932. basicBlockList.erase(itr, basicBlockList.end());
  1933. break;
  1934. }
  1935. ++itr;
  1936. }*/
  1937. for (int i = 0; i < (int)basicBlockList.size(); i++)
  1938. {
  1939. if (basicBlockList[i] == startingBlock)
  1940. {
  1941. basicBlockList.RemoveRange(i, basicBlockList.size() - i);
  1942. break;
  1943. }
  1944. }
  1945. }
  1946. break;
  1947. case BfIRCmd_MergeBlockDown:
  1948. {
  1949. CMD_PARAM(BeBlock*, fromBlock);
  1950. CMD_PARAM(BeBlock*, intoBlock);
  1951. for (auto inst : fromBlock->mInstructions)
  1952. inst->mParentBlock = intoBlock;
  1953. if (!fromBlock->mInstructions.IsEmpty())
  1954. intoBlock->mInstructions.Insert(0, &fromBlock->mInstructions[0], fromBlock->mInstructions.size());
  1955. mBeModule->RemoveBlock(mActiveFunction, fromBlock);
  1956. }
  1957. break;
  1958. case BfIRCmd_GetInsertBlock:
  1959. {
  1960. SetResult(curId, mBeModule->mActiveBlock);
  1961. }
  1962. break;
  1963. case BfIRCmd_SetInsertPoint:
  1964. {
  1965. CMD_PARAM(BeBlock*, block);
  1966. mBeModule->SetInsertPoint(block);
  1967. }
  1968. break;
  1969. case BfIRCmd_SetInsertPointAtStart:
  1970. {
  1971. CMD_PARAM(BeBlock*, block);
  1972. mBeModule->SetInsertPointAtStart(block);
  1973. }
  1974. break;
  1975. case BfIRCmd_EraseFromParent:
  1976. {
  1977. CMD_PARAM(BeBlock*, block);
  1978. mBeModule->RemoveBlock(mActiveFunction, block);
  1979. }
  1980. break;
  1981. case BfIRCmd_DeleteBlock:
  1982. {
  1983. CMD_PARAM(BeBlock*, block);
  1984. }
  1985. break;
  1986. case BfIRCmd_EraseInstFromParent:
  1987. {
  1988. CMD_PARAM(BeValue*, instVal);
  1989. BeInst* inst = (BeInst*)instVal;
  1990. bool wasRemoved = inst->mParentBlock->mInstructions.Remove(inst);
  1991. BF_ASSERT(wasRemoved);
  1992. #ifdef _DEBUG
  1993. inst->mWasRemoved = true;
  1994. #endif
  1995. }
  1996. break;
  1997. case BfIRCmd_CreateBr:
  1998. {
  1999. CMD_PARAM(BeBlock*, block);
  2000. mBeModule->CreateBr(block);
  2001. }
  2002. break;
  2003. case BfIRCmd_CreateBr_Fake:
  2004. {
  2005. CMD_PARAM(BeBlock*, block);
  2006. auto inst = mBeModule->CreateBr(block);
  2007. inst->mIsFake = true;
  2008. }
  2009. break;
  2010. case BfIRCmd_CreateBr_NoCollapse:
  2011. {
  2012. CMD_PARAM(BeBlock*, block);
  2013. auto inst = mBeModule->CreateBr(block);
  2014. inst->mNoCollapse = true;
  2015. }
  2016. break;
  2017. case BfIRCmd_CreateCondBr:
  2018. {
  2019. CMD_PARAM(BeValue*, condVal);
  2020. CMD_PARAM(BeBlock*, trueBlock);
  2021. CMD_PARAM(BeBlock*, falseBlock);
  2022. mBeModule->CreateCondBr(condVal, trueBlock, falseBlock);
  2023. }
  2024. break;
  2025. case BfIRCmd_MoveBlockToEnd:
  2026. {
  2027. CMD_PARAM(BeBlock*, block);
  2028. mBeModule->RemoveBlock(mActiveFunction, block);
  2029. mBeModule->AddBlock(mActiveFunction, block);
  2030. }
  2031. break;
  2032. case BfIRCmd_CreateSwitch:
  2033. {
  2034. CMD_PARAM(BeValue*, val);
  2035. CMD_PARAM(BeBlock*, dest);
  2036. CMD_PARAM(int, numCases);
  2037. auto switchInst = mBeModule->AllocInstOwned<BeSwitchInst>();
  2038. switchInst->mValue = val;
  2039. switchInst->mDefaultBlock = dest;
  2040. switchInst->mCases.Reserve(numCases);
  2041. SetResult(curId, switchInst);
  2042. }
  2043. break;
  2044. case BfIRCmd_AddSwitchCase:
  2045. {
  2046. CMD_PARAM(BeValue*, switchVal);
  2047. CMD_PARAM(BeValue*, caseVal);
  2048. CMD_PARAM(BeBlock*, caseBlock);
  2049. BeSwitchCase switchCase;
  2050. switchCase.mValue = (BeConstant*)caseVal;
  2051. switchCase.mBlock = caseBlock;
  2052. ((BeSwitchInst*)switchVal)->mCases.push_back(switchCase);
  2053. }
  2054. break;
  2055. case BfIRCmd_SetSwitchDefaultDest:
  2056. {
  2057. CMD_PARAM(BeValue*, switchVal);
  2058. CMD_PARAM(BeBlock*, caseBlock);
  2059. ((BeSwitchInst*)switchVal)->mDefaultBlock = caseBlock;
  2060. }
  2061. break;
  2062. case BfIRCmd_CreatePhi:
  2063. {
  2064. CMD_PARAM(BeType*, type);
  2065. CMD_PARAM(int, incomingCount);
  2066. auto phiInst = mBeModule->AllocInstOwned<BePhiInst>();
  2067. phiInst->mType = type;
  2068. SetResult(curId, phiInst);
  2069. }
  2070. break;
  2071. case BfIRCmd_AddPhiIncoming:
  2072. {
  2073. CMD_PARAM(BeValue*, phiValue);
  2074. CMD_PARAM(BeValue*, value);
  2075. CMD_PARAM(BeBlock*, comingFrom);
  2076. BF_ASSERT(phiValue->GetType() == value->GetType());
  2077. auto phiIncoming = mBeModule->mAlloc.Alloc<BePhiIncoming>();
  2078. phiIncoming->mBlock = comingFrom;
  2079. phiIncoming->mValue = value;
  2080. ((BePhiInst*)phiValue)->mIncoming.push_back(phiIncoming);
  2081. }
  2082. break;
  2083. case BfIRCmd_GetIntrinsic:
  2084. {
  2085. CMD_PARAM(String, intrinName);
  2086. CMD_PARAM(int, intrinId);
  2087. CMD_PARAM(BeType*, returnType);
  2088. CMD_PARAM(CmdParamVec<BeType*>, paramTypes);
  2089. auto intrin = mBeModule->mAlloc.Alloc<BeIntrinsic>();
  2090. intrin->mName = intrinName;
  2091. intrin->mKind = (BfIRIntrinsic)intrinId;
  2092. intrin->mReturnType = returnType;
  2093. SetResult(curId, intrin);
  2094. }
  2095. break;
  2096. case BfIRCmd_CreateFunctionType:
  2097. {
  2098. CMD_PARAM(BeType*, resultType);
  2099. CMD_PARAM(CmdParamVec<BeType*>, paramTypes);
  2100. CMD_PARAM(bool, isVarArg);
  2101. auto functionType = mBeContext->CreateFunctionType(resultType, paramTypes, isVarArg);
  2102. SetResult(curId, functionType);
  2103. }
  2104. break;
  2105. case BfIRCmd_CreateFunction:
  2106. {
  2107. CMD_PARAM(BeFunctionType*, type);
  2108. BfIRLinkageType linkageType = (BfIRLinkageType)mStream->Read();
  2109. CMD_PARAM(String, name);
  2110. SetResult(curId, mBeModule->CreateFunction(type, linkageType, name));
  2111. }
  2112. break;
  2113. case BfIRCmd_EnsureFunctionPatchable:
  2114. {
  2115. }
  2116. break;
  2117. case BfIRCmd_RemapBindFunction:
  2118. {
  2119. CMD_PARAM(BeValue*, func);
  2120. // We need to store this value to a data segment so we get a symbol we can remap during hot swap
  2121. // We actually do this to ensure that we don't bind to the NEW method but rather the old one- so
  2122. // delegate equality checks still work
  2123. BeFunction* beFunc = BeValueDynCast<BeFunction>(func);
  2124. if (beFunc != NULL)
  2125. {
  2126. if (beFunc->mRemapBindVar == NULL)
  2127. {
  2128. auto globalVariable = mBeModule->mGlobalVariables.Alloc();
  2129. globalVariable->mModule = mBeModule;
  2130. globalVariable->mType = beFunc->mType;
  2131. globalVariable->mIsConstant = true;
  2132. globalVariable->mLinkageType = BfIRLinkageType_External;
  2133. globalVariable->mInitializer = beFunc;
  2134. globalVariable->mName = StrFormat("bf_hs_preserve@%s_%s", beFunc->mName.c_str(), mBeModule->mModuleName.c_str());
  2135. globalVariable->mIsTLS = false;
  2136. globalVariable->mAlign = 8;
  2137. globalVariable->mUnnamedAddr = false;
  2138. beFunc->mRemapBindVar = globalVariable;
  2139. /*if (mBeModule->mDbgModule != NULL)
  2140. {
  2141. auto dbgGlobalVariable = mBeModule->mDbgModule->mGlobalVariables.Alloc();
  2142. dbgGlobalVariable->mContext = mBeContext;
  2143. dbgGlobalVariable->mName = name;
  2144. dbgGlobalVariable->mLinkageName = globalVariable->mName;
  2145. dbgGlobalVariable->mFile = (BeDbgFile*)file;
  2146. dbgGlobalVariable->mLineNum = lineNum;
  2147. dbgGlobalVariable->mType = (BeDbgType*)type;
  2148. dbgGlobalVariable->mIsLocalToUnit = isLocalToUnit;
  2149. dbgGlobalVariable->mValue = val;
  2150. dbgGlobalVariable->mDecl = decl;
  2151. }*/
  2152. }
  2153. SetResult(curId, mBeModule->CreateLoad(beFunc->mRemapBindVar, false));
  2154. }
  2155. else
  2156. SetResult(curId, func);
  2157. }
  2158. break;
  2159. case BfIRCmd_SetActiveFunction:
  2160. {
  2161. CMD_PARAM(BeFunction*, func);
  2162. mActiveFunction = func;
  2163. mBeModule->mActiveFunction = func;
  2164. }
  2165. break;
  2166. case BfIRCmd_CreateCall:
  2167. {
  2168. CMD_PARAM(BeValue*, func);
  2169. CMD_PARAM(CmdParamVec<BeValue*>, args);
  2170. #ifdef BE_EXTRA_CHECKS
  2171. auto funcPtrType = func->GetType();
  2172. if (funcPtrType != NULL)
  2173. {
  2174. BF_ASSERT(funcPtrType->IsPointer());
  2175. auto funcType = (BeFunctionType*)((BePointerType*)funcPtrType)->mElementType;
  2176. BF_ASSERT(funcType->mTypeCode == BeTypeCode_Function);
  2177. bool argsMatched = true;
  2178. if (!funcType->mIsVarArg)
  2179. {
  2180. if (funcType->mParams.size() != args.size())
  2181. {
  2182. argsMatched = false;
  2183. }
  2184. else
  2185. {
  2186. int argIdx = 0;
  2187. for (int argIdx = 0; argIdx < (int)args.size(); argIdx++)
  2188. {
  2189. if (args[argIdx] == NULL)
  2190. argsMatched = false;
  2191. else if (funcType->mParams[argIdx].mType != args[argIdx]->GetType())
  2192. argsMatched = false;
  2193. }
  2194. }
  2195. }
  2196. if (!argsMatched)
  2197. {
  2198. String errStr;
  2199. errStr += "BfIRCmd_CreateCall Match Failure:\n";
  2200. BeDumpContext dumpCtx;
  2201. dumpCtx.ToString(errStr, func);
  2202. errStr += "\n";
  2203. dumpCtx.ToString(errStr, funcType);
  2204. errStr += "\n";
  2205. for (int argIdx = 0; argIdx < (int)args.size(); argIdx++)
  2206. {
  2207. errStr += StrFormat("ARG #%d: ", argIdx);
  2208. dumpCtx.ToString(errStr, args[argIdx]);
  2209. errStr += "\n";
  2210. }
  2211. FatalError(errStr);
  2212. }
  2213. }
  2214. else
  2215. {
  2216. BF_ASSERT(func->GetTypeId() == BeIntrinsic::TypeId);
  2217. }
  2218. #endif
  2219. SetResult(curId, mBeModule->CreateCall(func, args));
  2220. }
  2221. break;
  2222. case BfIRCmd_SetCallCallingConv:
  2223. {
  2224. CMD_PARAM(BeValue*, callInst);
  2225. BfIRCallingConv callingConv = (BfIRCallingConv)mStream->Read();
  2226. ((BeCallInst*)callInst)->mCallingConv = callingConv;
  2227. }
  2228. break;
  2229. case BfIRCmd_SetFuncCallingConv:
  2230. {
  2231. CMD_PARAM(BeFunction*, func);
  2232. BfIRCallingConv callingConv = (BfIRCallingConv)mStream->Read();
  2233. func->mCallingConv = callingConv;
  2234. }
  2235. break;
  2236. case BfIRCmd_SetTailCall:
  2237. {
  2238. CMD_PARAM(BeValue*, callInstVal);
  2239. BeCallInst* callInst = (BeCallInst*)callInstVal;
  2240. callInst->mTailCall = true;
  2241. }
  2242. break;
  2243. case BfIRCmd_SetCallAttribute:
  2244. {
  2245. CMD_PARAM(BeValue*, callInstVal);
  2246. CMD_PARAM(int, paramIdx);
  2247. BfIRAttribute attribute = (BfIRAttribute)mStream->Read();
  2248. BeCallInst* callInst = (BeCallInst*)callInstVal;
  2249. if (attribute == BfIRAttribute_NoReturn)
  2250. callInst->mNoReturn = true;
  2251. }
  2252. break;
  2253. case BfIRCmd_CreateRet:
  2254. {
  2255. CMD_PARAM(BeValue*, val);
  2256. #ifdef BE_EXTRA_CHECKS
  2257. auto retType = val->GetType();
  2258. auto funcType = mActiveFunction->GetFuncType();
  2259. BF_ASSERT(retType == funcType->mReturnType);
  2260. #endif
  2261. SetResult(curId, mBeModule->CreateRet(val));
  2262. }
  2263. break;
  2264. case BfIRCmd_CreateSetRet:
  2265. {
  2266. CMD_PARAM(BeValue*, val);
  2267. CMD_PARAM(int, returnTypeId);
  2268. SetResult(curId, mBeModule->CreateSetRet(val, returnTypeId));
  2269. }
  2270. break;
  2271. case BfIRCmd_CreateRetVoid:
  2272. {
  2273. mBeModule->CreateRetVoid();
  2274. }
  2275. break;
  2276. case BfIRCmd_CreateUnreachable:
  2277. {
  2278. mBeModule->AllocInst<BeUnreachableInst>();
  2279. }
  2280. break;
  2281. case BfIRCmd_Call_AddAttribute:
  2282. {
  2283. CMD_PARAM(BeValue*, callInstVal);
  2284. CMD_PARAM(int, argIdx);
  2285. BfIRAttribute attribute = (BfIRAttribute)mStream->Read();
  2286. BeCallInst* callInst = (BeCallInst*)callInstVal;
  2287. if (argIdx > 0)
  2288. {
  2289. if (attribute == BfIRAttribute_StructRet)
  2290. {
  2291. auto valType = callInst->mArgs[argIdx - 1].mValue->GetType();
  2292. BF_ASSERT(valType->IsPointer());
  2293. callInst->mArgs[argIdx - 1].mStructRet = true;
  2294. }
  2295. else if (attribute == BfIRAttribute_ZExt)
  2296. callInst->mArgs[argIdx - 1].mZExt = true;
  2297. else if (attribute == BfIRAttribute_NoAlias)
  2298. callInst->mArgs[argIdx - 1].mNoAlias = true;
  2299. else if (attribute == BfIRAttribute_NoCapture)
  2300. callInst->mArgs[argIdx - 1].mNoCapture = true;
  2301. else if (attribute == BfIRAttribute_ByVal)
  2302. {
  2303. }
  2304. else
  2305. BF_FATAL("Unhandled");
  2306. }
  2307. else
  2308. {
  2309. if (attribute == BfIRAttribute_NoReturn)
  2310. callInst->mNoReturn = true;
  2311. else
  2312. BF_FATAL("Unhandled");
  2313. }
  2314. }
  2315. break;
  2316. case BfIRCmd_Call_AddAttribute1:
  2317. {
  2318. CMD_PARAM(BeValue*, inst);
  2319. CMD_PARAM(int, argIdx);
  2320. BfIRAttribute attribute = (BfIRAttribute)mStream->Read();
  2321. CMD_PARAM(int, arg);
  2322. BeCallInst* callInst = BeValueDynCast<BeCallInst>(inst);
  2323. if (callInst != NULL)
  2324. {
  2325. if (argIdx > 0)
  2326. {
  2327. if (attribute == BfIRAttribute_Dereferencable)
  2328. {
  2329. callInst->mArgs[argIdx - 1].mDereferenceableSize = arg;
  2330. if (auto func = BeValueDynCast<BeFunction>(callInst->mFunc))
  2331. {
  2332. BF_ASSERT(func->mParams[argIdx - 1].mDereferenceableSize == arg);
  2333. }
  2334. }
  2335. else if (attribute == BfIRAttribute_ByVal)
  2336. {
  2337. callInst->mArgs[argIdx - 1].mByRefSize = arg;
  2338. if (auto func = BeValueDynCast<BeFunction>(callInst->mFunc))
  2339. {
  2340. BF_ASSERT((func->mParams[argIdx - 1].mByValSize == arg) || (func->mParams[argIdx - 1].mByValSize == -1));
  2341. }
  2342. }
  2343. else
  2344. BF_FATAL("Unhandled");
  2345. }
  2346. else
  2347. {
  2348. BF_FATAL("Unhandled");
  2349. }
  2350. }
  2351. }
  2352. break;
  2353. case BfIRCmd_Func_AddAttribute:
  2354. {
  2355. CMD_PARAM(BeFunction*, func);
  2356. CMD_PARAM(int, argIdx);
  2357. BfIRAttribute attribute = (BfIRAttribute)mStream->Read();
  2358. if (argIdx > 0)
  2359. {
  2360. if (attribute == BfIRAttribute_StructRet)
  2361. func->mParams[argIdx - 1].mStructRet = true;
  2362. else if (attribute == BfIRAttribute_NoAlias)
  2363. func->mParams[argIdx - 1].mNoAlias = true;
  2364. else if (attribute == BfIRAttribute_NoCapture)
  2365. func->mParams[argIdx - 1].mNoCapture = true;
  2366. else if (attribute == BfIRAttribute_ZExt)
  2367. func->mParams[argIdx - 1].mZExt = true;
  2368. else
  2369. BF_FATAL("Unhandled");
  2370. }
  2371. else
  2372. {
  2373. if (attribute == BfIRAttribute_VarRet)
  2374. func->mIsVarReturn = true;
  2375. else if (attribute == BFIRAttribute_AlwaysInline)
  2376. func->mAlwaysInline = true;
  2377. else if (attribute == BFIRAttribute_NoUnwind)
  2378. func->mNoUnwind = true;
  2379. else if (attribute == BFIRAttribute_UWTable)
  2380. func->mUWTable = true;
  2381. else if (attribute == BfIRAttribute_NoReturn)
  2382. func->mNoReturn = true;
  2383. else if (attribute == BFIRAttribute_NoFramePointerElim)
  2384. func->mNoFramePointerElim = true;
  2385. else if (attribute == BFIRAttribute_DllExport)
  2386. func->mIsDLLExport = true;
  2387. else if (attribute == BFIRAttribute_DllImport)
  2388. func->mIsDLLImport = true;
  2389. else if (attribute == BFIRAttribute_NoRecurse)
  2390. {
  2391. }
  2392. else if (attribute == BFIRAttribute_Constructor)
  2393. {
  2394. }
  2395. else if (attribute == BFIRAttribute_Destructor)
  2396. {
  2397. }
  2398. else
  2399. BF_FATAL("Unhandled");
  2400. }
  2401. }
  2402. break;
  2403. case BfIRCmd_Func_AddAttribute1:
  2404. {
  2405. CMD_PARAM(BeFunction*, func);
  2406. CMD_PARAM(int, argIdx);
  2407. BfIRAttribute attribute = (BfIRAttribute)mStream->Read();
  2408. CMD_PARAM(int, arg);
  2409. // This is for adding things like Dereferencable, which we don't use
  2410. if (argIdx > 0)
  2411. {
  2412. if (attribute == BfIRAttribute_Dereferencable)
  2413. func->mParams[argIdx - 1].mDereferenceableSize = arg;
  2414. else if (attribute == BfIRAttribute_ByVal)
  2415. func->mParams[argIdx - 1].mByValSize = arg;
  2416. else
  2417. BF_FATAL("Unhandled");
  2418. }
  2419. else
  2420. BF_FATAL("Unhandled");
  2421. }
  2422. break;
  2423. case BfIRCmd_Func_SetParamName:
  2424. {
  2425. CMD_PARAM(BeFunction*, func);
  2426. CMD_PARAM(int, argIdx);
  2427. CMD_PARAM(String, name);
  2428. if (argIdx > 0)
  2429. func->mParams[argIdx - 1].mName = name;
  2430. }
  2431. break;
  2432. case BfIRCmd_Func_DeleteBody:
  2433. {
  2434. CMD_PARAM(BeFunction*, func);
  2435. func->mBlocks.Clear();
  2436. }
  2437. break;
  2438. case BfIRCmd_Func_SafeRename:
  2439. {
  2440. CMD_PARAM(BeFunction*, func);
  2441. func->mName += StrFormat("__RENAME%d", curId);
  2442. }
  2443. break;
  2444. case BfIRCmd_Func_SetLinkage:
  2445. {
  2446. CMD_PARAM(BeFunction*, func);
  2447. BfIRLinkageType linkageType = (BfIRLinkageType)mStream->Read();
  2448. func->mLinkageType = linkageType;
  2449. }
  2450. break;
  2451. case BfIRCmd_SaveDebugLocation:
  2452. {
  2453. mSavedDebugLocs.push_back(mBeModule->GetCurrentDebugLocation());
  2454. }
  2455. break;
  2456. case BfIRCmd_RestoreDebugLocation:
  2457. {
  2458. mBeModule->SetCurrentDebugLocation(mSavedDebugLocs[mSavedDebugLocs.size() - 1]);
  2459. mSavedDebugLocs.pop_back();
  2460. }
  2461. break;
  2462. case BfIRCmd_DupDebugLocation:
  2463. {
  2464. mBeModule->DupCurrentDebugLocation();
  2465. }
  2466. break;
  2467. case BfIRCmd_ClearDebugLocation:
  2468. {
  2469. mBeModule->SetCurrentDebugLocation(NULL);
  2470. }
  2471. break;
  2472. case BfIRCmd_ClearDebugLocationInst:
  2473. {
  2474. CMD_PARAM(BeValue*, instValue);
  2475. auto inst = (BeInst*)instValue;
  2476. inst->mDbgLoc = NULL;
  2477. }
  2478. break;
  2479. case BfIRCmd_ClearDebugLocationInstLast:
  2480. {
  2481. if ((mBeModule->mActiveBlock != NULL) && (!mBeModule->mActiveBlock->mInstructions.IsEmpty()))
  2482. {
  2483. auto inst = mBeModule->mActiveBlock->mInstructions.back();
  2484. inst->mDbgLoc = NULL;
  2485. }
  2486. }
  2487. break;
  2488. case BfIRCmd_UpdateDebugLocation:
  2489. {
  2490. CMD_PARAM(BeValue*, instValue);
  2491. auto inst = (BeInst*)instValue;
  2492. inst->mDbgLoc = mBeModule->mCurDbgLoc;
  2493. }
  2494. break;
  2495. case BfIRCmd_SetCurrentDebugLocation:
  2496. {
  2497. CMD_PARAM(int, line);
  2498. CMD_PARAM(int, column);
  2499. CMD_PARAM(BeMDNode*, diScope);
  2500. CMD_PARAM(BeMDNode*, diInlinedAt);
  2501. mBeModule->SetCurrentDebugLocation(line - 1, column - 1, diScope, (BeDbgLoc*)diInlinedAt);
  2502. }
  2503. break;
  2504. case BfIRCmd_Nop:
  2505. {
  2506. mBeModule->CreateNop();
  2507. }
  2508. break;
  2509. case BfIRCmd_EnsureInstructionAt:
  2510. {
  2511. mBeModule->AllocInst<BeEnsureInstructionAtInst>();
  2512. }
  2513. break;
  2514. case BfIRCmd_StatementStart:
  2515. {
  2516. }
  2517. break;
  2518. case BfIRCmd_ObjectAccessCheck:
  2519. {
  2520. CMD_PARAM(BeValue*, val);
  2521. CMD_PARAM(bool, useAsm);
  2522. auto inst = mBeModule->AllocInst<BeObjectAccessCheckInst>();
  2523. inst->mValue = val;
  2524. SetResult(curId, mBeModule->GetInsertBlock());
  2525. }
  2526. break;
  2527. case BfIRCmd_Comptime_Error:
  2528. {
  2529. CMD_PARAM(int32, error);
  2530. auto inst = mBeModule->AllocInst<BeComptimeError>();
  2531. inst->mError = error;
  2532. SetResult(curId, inst);
  2533. }
  2534. break;
  2535. case BfIRCmd_Comptime_GetBfType:
  2536. {
  2537. CMD_PARAM(int32, typeId);
  2538. CMD_PARAM(BeType*, resultType);
  2539. auto inst = mBeModule->AllocInst<BeComptimeGetType>();
  2540. inst->mTypeId = typeId;
  2541. inst->mResultType = resultType;
  2542. SetResult(curId, inst);
  2543. }
  2544. break;
  2545. case BfIRCmd_Comptime_GetReflectType:
  2546. {
  2547. CMD_PARAM(int32, typeId);
  2548. CMD_PARAM(BeType*, resultType);
  2549. auto inst = mBeModule->AllocInst<BeComptimeGetReflectType>();
  2550. inst->mTypeId = typeId;
  2551. inst->mResultType = resultType;
  2552. SetResult(curId, inst);
  2553. }
  2554. break;
  2555. case BfIRCmd_Comptime_DynamicCastCheck:
  2556. {
  2557. CMD_PARAM(BeValue*, value);
  2558. CMD_PARAM(int32, typeId);
  2559. CMD_PARAM(BeType*, resultType);
  2560. auto inst = mBeModule->AllocInst<BeComptimeDynamicCastCheck>();
  2561. inst->mValue = value;
  2562. inst->mTypeId = typeId;
  2563. inst->mResultType = resultType;
  2564. SetResult(curId, inst);
  2565. }
  2566. break;
  2567. case BfIRCmd_Comptime_GetVirtualFunc:
  2568. {
  2569. CMD_PARAM(BeValue*, value);
  2570. CMD_PARAM(int32, virtualTableIdx);
  2571. CMD_PARAM(BeType*, resultType);
  2572. auto inst = mBeModule->AllocInst<BeComptimeGetVirtualFunc>();
  2573. inst->mValue = value;
  2574. inst->mVirtualTableIdx = virtualTableIdx;
  2575. inst->mResultType = resultType;
  2576. SetResult(curId, inst);
  2577. }
  2578. break;
  2579. case BfIRCmd_Comptime_GetInterfaceFunc:
  2580. {
  2581. CMD_PARAM(BeValue*, value);
  2582. CMD_PARAM(int32, ifaceTypeId);
  2583. CMD_PARAM(int32, methodIdx);
  2584. CMD_PARAM(BeType*, resultType);
  2585. auto inst = mBeModule->AllocInst<BeComptimeGetInterfaceFunc>();
  2586. inst->mValue = value;
  2587. inst->mIFaceTypeId = ifaceTypeId;
  2588. inst->mMethodIdx = methodIdx;
  2589. inst->mResultType = resultType;
  2590. SetResult(curId, inst);
  2591. }
  2592. break;
  2593. case BfIRCmd_DbgInit:
  2594. {
  2595. /*mDIBuilder = new BeDIBuilder(*mBeModule); */
  2596. mBeModule->mDbgModule = new BeDbgModule();
  2597. mBeModule->mDbgModule->mBeModule = mBeModule;
  2598. }
  2599. break;
  2600. case BfIRCmd_DbgFinalize:
  2601. {
  2602. /*for (auto typeEntryPair : mTypes)
  2603. {
  2604. auto& typeEntry = typeEntryPair.second;
  2605. if (typeEntry.mInstDIType != NULL)
  2606. typeEntry.mInstDIType->resolveCycles();
  2607. }
  2608. mDIBuilder->finalize();*/
  2609. }
  2610. break;
  2611. case BfIRCmd_DbgCreateCompileUnit:
  2612. {
  2613. CMD_PARAM(int, lang);
  2614. CMD_PARAM(String, fileName);
  2615. CMD_PARAM(String, directory);
  2616. CMD_PARAM(String, producer);
  2617. CMD_PARAM(bool, isOptimized);
  2618. CMD_PARAM(String, flags);
  2619. CMD_PARAM(int, runtimeVer);
  2620. CMD_PARAM(bool, linesOnly);
  2621. mBeModule->mDbgModule->mFileName = fileName;
  2622. mBeModule->mDbgModule->mDirectory = directory;
  2623. mBeModule->mDbgModule->mProducer = producer;
  2624. //mDebugging = fileName == "TestToots";
  2625. SetResult(curId, mBeModule->mDbgModule);
  2626. }
  2627. break;
  2628. case BfIRCmd_DbgCreateFile:
  2629. {
  2630. CMD_PARAM(String, fileName);
  2631. CMD_PARAM(String, directory);
  2632. CMD_PARAM(Val128, md5Hash);
  2633. auto dbgFile = mBeModule->mDbgModule->mFiles.Alloc();
  2634. dbgFile->mFileName = fileName;
  2635. dbgFile->mDirectory = directory;
  2636. dbgFile->mMD5Hash = md5Hash;
  2637. dbgFile->mIdx = (int)mBeModule->mDbgModule->mFiles.size() - 1;
  2638. SetResult(curId, dbgFile);
  2639. }
  2640. break;
  2641. case BfIRCmd_DbgGetCurrentLocation:
  2642. {
  2643. SetResult(curId, mBeModule->mCurDbgLoc);
  2644. }
  2645. break;
  2646. case BfIRCmd_DbgSetType:
  2647. {
  2648. CMD_PARAM(int, typeId);
  2649. CMD_PARAM(BeMDNode*, type);
  2650. auto& typeEntry = GetTypeEntry(typeId);
  2651. typeEntry.mDIType = (BeDbgType*)type;
  2652. if (typeEntry.mInstDIType == NULL)
  2653. typeEntry.mInstDIType = (BeDbgType*)type;
  2654. }
  2655. break;
  2656. case BfIRCmd_DbgSetInstType:
  2657. {
  2658. CMD_PARAM(int, typeId);
  2659. CMD_PARAM(BeMDNode*, type);
  2660. GetTypeEntry(typeId).mInstDIType = (BeDbgType*)type;
  2661. }
  2662. break;
  2663. case BfIRCmd_DbgGetType:
  2664. {
  2665. CMD_PARAM(int, typeId);
  2666. SetResult(curId, GetTypeEntry(typeId).mDIType);
  2667. }
  2668. break;
  2669. case BfIRCmd_DbgGetTypeInst:
  2670. {
  2671. CMD_PARAM(int, typeId);
  2672. SetResult(curId, GetTypeEntry(typeId).mInstDIType);
  2673. }
  2674. break;
  2675. case BfIRCmd_DbgTrackDITypes:
  2676. {
  2677. CMD_PARAM(int, typeId);
  2678. auto& typeEntry = GetTypeEntry(typeId);
  2679. /*if (typeEntry.mDIType != NULL)
  2680. BeMetadataTracking::track(*(BeMetadata**)&typeEntry.mDIType);
  2681. if (typeEntry.mInstDIType != NULL)
  2682. BeMetadataTracking::track(*(BeMetadata**)&typeEntry.mInstDIType);*/
  2683. //NotImpl();
  2684. }
  2685. break;
  2686. case BfIRCmd_DbgCreateNamespace:
  2687. {
  2688. CMD_PARAM(BeMDNode*, scope);
  2689. CMD_PARAM(String, name);
  2690. CMD_PARAM(BeMDNode*, file);
  2691. CMD_PARAM(int, lineNum);
  2692. auto dbgNamespace = mBeModule->mOwnedValues.Alloc<BeDbgNamespace>();
  2693. dbgNamespace->mScope = scope;
  2694. dbgNamespace->mName = name;
  2695. SetResult(curId, dbgNamespace);
  2696. }
  2697. break;
  2698. case BfIRCmd_DbgCreateImportedModule:
  2699. {
  2700. CMD_PARAM(BeMDNode*, context);
  2701. CMD_PARAM(BeMDNode*, namespaceNode);
  2702. CMD_PARAM(int, lineNum);
  2703. /*SetResult(curId, mDIBuilder->createImportedModule((BeDIScope*)context, (BeDINamespace*)namespaceNode, lineNum));*/
  2704. //NotImpl();
  2705. }
  2706. break;
  2707. case BfIRCmd_DbgCreateBasicType:
  2708. {
  2709. CMD_PARAM(String, name);
  2710. CMD_PARAM(int64, sizeInBits);
  2711. CMD_PARAM(int64, alignInBits);
  2712. CMD_PARAM(int, encoding);
  2713. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgBasicType>();
  2714. dbgType->mName = name;
  2715. dbgType->mSize = (int)(sizeInBits / 8);
  2716. dbgType->mAlign = (int)(alignInBits / 8);
  2717. dbgType->mEncoding = encoding;
  2718. SetResult(curId, dbgType);
  2719. }
  2720. break;
  2721. case BfIRCmd_DbgCreateStructType:
  2722. {
  2723. CMD_PARAM(BeMDNode*, context);
  2724. CMD_PARAM(String, name);
  2725. CMD_PARAM(BeMDNode*, file);
  2726. CMD_PARAM(int, lineNum);
  2727. CMD_PARAM(int64, sizeInBits);
  2728. CMD_PARAM(int64, alignInBits);
  2729. CMD_PARAM(int, flags);
  2730. CMD_PARAM(BeMDNode*, derivedFrom);
  2731. CMD_PARAM(CmdParamVec<BeMDNode*>, members);
  2732. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgStructType>();
  2733. dbgType->mScope = context;
  2734. dbgType->mName = name;
  2735. dbgType->mSize = (int)(sizeInBits / 8);
  2736. dbgType->mAlign = (int)(alignInBits / 8);
  2737. dbgType->mDerivedFrom = (BeDbgType*)derivedFrom;
  2738. dbgType->mDefFile = (BeDbgFile*)file;
  2739. dbgType->mDefLine = lineNum - 1;
  2740. dbgType->mIsFullyDefined = true;
  2741. dbgType->SetMembers(members);
  2742. SetResult(curId, dbgType);
  2743. }
  2744. break;
  2745. case BfIRCmd_DbgCreateEnumerationType:
  2746. {
  2747. CMD_PARAM(BeMDNode*, context);
  2748. CMD_PARAM(String, name);
  2749. CMD_PARAM(BeMDNode*, file);
  2750. CMD_PARAM(int, lineNum);
  2751. CMD_PARAM(int64, sizeInBits);
  2752. CMD_PARAM(int64, alignInBits);
  2753. CMD_PARAM(CmdParamVec<BeMDNode*>, members);
  2754. CMD_PARAM(BeMDNode*, underlyingType);
  2755. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgEnumType>();
  2756. dbgType->mScope = context;
  2757. dbgType->mName = name;
  2758. dbgType->mSize = (int)(sizeInBits / 8);
  2759. dbgType->mAlign = (int)(alignInBits / 8);
  2760. dbgType->mIsFullyDefined = true;
  2761. dbgType->mElementType = (BeDbgType*)underlyingType;
  2762. for (auto member : members)
  2763. {
  2764. if (auto enumMember = BeValueDynCast<BeDbgEnumMember>(member))
  2765. {
  2766. dbgType->mMembers.push_back(enumMember);
  2767. }
  2768. else
  2769. NotImpl();
  2770. }
  2771. //dbgType->mDefFile = (BeDbgFile*)file;
  2772. //dbgType->mDefLine = line - 1;
  2773. SetResult(curId, dbgType);
  2774. }
  2775. break;
  2776. case BfIRCmd_DbgCreatePointerType:
  2777. {
  2778. CMD_PARAM(BeMDNode*, elementTypeNode);
  2779. BeDbgType* elementType = (BeDbgType*)elementTypeNode;
  2780. BeDbgType* useType = elementType->FindDerivedType(BeDbgPointerType::TypeId);
  2781. if (useType == NULL)
  2782. {
  2783. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgPointerType>();
  2784. dbgType->mElement = elementType;
  2785. dbgType->mSize = mPtrSize;
  2786. dbgType->mAlign = mPtrSize;
  2787. elementType->mDerivedTypes.PushFront(dbgType, &mBeModule->mAlloc);
  2788. useType = dbgType;
  2789. }
  2790. SetResult(curId, useType);
  2791. }
  2792. break;
  2793. case BfIRCmd_DbgCreateReferenceType:
  2794. {
  2795. CMD_PARAM(BeMDNode*, elementTypeNode);
  2796. auto useType = mBeModule->mDbgModule->CreateReferenceType((BeDbgType*)elementTypeNode);
  2797. SetResult(curId, useType);
  2798. }
  2799. break;
  2800. case BfIRCmd_DbgCreateConstType:
  2801. {
  2802. CMD_PARAM(BeMDNode*, elementTypeNode);
  2803. BeDbgType* elementType = (BeDbgType*)elementTypeNode;
  2804. BeDbgType* useType = elementType->FindDerivedType(BeDbgConstType::TypeId);
  2805. if (useType == NULL)
  2806. {
  2807. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgConstType>();
  2808. dbgType->mElement = elementType;
  2809. elementType->mDerivedTypes.PushFront(dbgType, &mBeModule->mAlloc);
  2810. useType = dbgType;
  2811. }
  2812. SetResult(curId, useType);
  2813. }
  2814. break;
  2815. case BfIRCmd_DbgCreateArtificialType:
  2816. {
  2817. CMD_PARAM(BeMDNode*, diType);
  2818. //auto dbgType = mBeModule->mOwnedValues.Alloc<BeDbgArtificialType>();
  2819. //dbgType->mElement = (BeDbgType*)diType;
  2820. // Does the artificial thing do anything for us actually?
  2821. auto dbgType = diType;
  2822. SetResult(curId, dbgType);
  2823. }
  2824. break;
  2825. case BfIRCmd_DbgCreateArrayType:
  2826. {
  2827. CMD_PARAM(int64, sizeInBits);
  2828. CMD_PARAM(int64, alignInBits);
  2829. CMD_PARAM(BeMDNode*, elementType);
  2830. CMD_PARAM(int64, numElements);
  2831. auto dbgArray = mBeModule->mDbgModule->mTypes.Alloc<BeDbgArrayType>();
  2832. dbgArray->mSize = (int)(sizeInBits / 8);
  2833. dbgArray->mAlign = (int)(alignInBits / 8);
  2834. dbgArray->mElement = (BeDbgType*)elementType;
  2835. dbgArray->mNumElements = numElements;
  2836. SetResult(curId, dbgArray);
  2837. }
  2838. break;
  2839. case BfIRCmd_DbgCreateReplaceableCompositeType:
  2840. {
  2841. CMD_PARAM(int, tag);
  2842. CMD_PARAM(String, name);
  2843. CMD_PARAM(BeMDNode*, scope);
  2844. CMD_PARAM(BeMDNode*, file);
  2845. CMD_PARAM(int, line);
  2846. CMD_PARAM(int64, sizeInBits);
  2847. CMD_PARAM(int64, alignInBits);
  2848. CMD_PARAM(int, flags);
  2849. if (tag == llvm::dwarf::DW_TAG_structure_type)
  2850. {
  2851. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgStructType>();
  2852. dbgType->mScope = scope;
  2853. dbgType->mName = name;
  2854. dbgType->mSize = (int)(sizeInBits / 8);
  2855. dbgType->mAlign = (int)(alignInBits / 8);
  2856. dbgType->mDefFile = (BeDbgFile*)file;
  2857. dbgType->mDefLine = line - 1;
  2858. SetResult(curId, dbgType);
  2859. }
  2860. else if (tag == llvm::dwarf::DW_TAG_enumeration_type)
  2861. {
  2862. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgEnumType>();
  2863. dbgType->mScope = scope;
  2864. dbgType->mName = name;
  2865. dbgType->mSize = (int)(sizeInBits / 8);
  2866. dbgType->mAlign = (int)(alignInBits / 8);
  2867. //dbgType->mDefFile = (BeDbgFile*)file;
  2868. //dbgType->mDefLine = line - 1;
  2869. SetResult(curId, dbgType);
  2870. }
  2871. else
  2872. NotImpl();
  2873. }
  2874. break;
  2875. case BfIRCmd_DbgCreateForwardDecl:
  2876. {
  2877. CMD_PARAM(int, tag);
  2878. CMD_PARAM(String, name);
  2879. CMD_PARAM(BeMDNode*, scope);
  2880. CMD_PARAM(BeMDNode*, file);
  2881. CMD_PARAM(int, line);
  2882. if (tag == llvm::dwarf::DW_TAG_structure_type)
  2883. {
  2884. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgStructType>();
  2885. dbgType->mScope = scope;
  2886. dbgType->mName = name;
  2887. dbgType->mDefFile = (BeDbgFile*)file;
  2888. dbgType->mDefLine = line;
  2889. SetResult(curId, dbgType);
  2890. }
  2891. else if (tag == llvm::dwarf::DW_TAG_enumeration_type)
  2892. {
  2893. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgEnumType>();
  2894. dbgType->mScope = scope;
  2895. dbgType->mName = name;
  2896. SetResult(curId, dbgType);
  2897. }
  2898. else
  2899. NotImpl();
  2900. }
  2901. break;
  2902. case BfIRCmd_DbgCreateSizedForwardDecl:
  2903. {
  2904. CMD_PARAM(int, tag);
  2905. CMD_PARAM(String, name);
  2906. CMD_PARAM(BeMDNode*, scope);
  2907. CMD_PARAM(BeMDNode*, file);
  2908. CMD_PARAM(int, line);
  2909. CMD_PARAM(int64, sizeInBits);
  2910. CMD_PARAM(int64, alignInBits);
  2911. if (tag == llvm::dwarf::DW_TAG_structure_type)
  2912. {
  2913. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgStructType>();
  2914. dbgType->mDefFile = (BeDbgFile*)file;
  2915. dbgType->mDefLine = line;
  2916. dbgType->mScope = scope;
  2917. dbgType->mName = name;
  2918. dbgType->mSize = (int)(sizeInBits / 8);
  2919. dbgType->mAlign = (int)(alignInBits / 8);
  2920. SetResult(curId, dbgType);
  2921. }
  2922. else if (tag == llvm::dwarf::DW_TAG_enumeration_type)
  2923. {
  2924. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgEnumType>();
  2925. dbgType->mScope = scope;
  2926. dbgType->mName = name;
  2927. dbgType->mSize = (int)(sizeInBits / 8);
  2928. dbgType->mAlign = (int)(alignInBits / 8);
  2929. SetResult(curId, dbgType);
  2930. }
  2931. else
  2932. NotImpl();
  2933. }
  2934. break;
  2935. case BeIRCmd_DbgSetTypeSize:
  2936. {
  2937. CMD_PARAM(BeMDNode*, mdType);
  2938. CMD_PARAM(int64, sizeInBits);
  2939. CMD_PARAM(int64, alignInBits);
  2940. auto dbgType = (BeDbgType*)mdType;
  2941. dbgType->mSize = (int)(sizeInBits / 8);
  2942. dbgType->mAlign = (int)(alignInBits / 8);
  2943. }
  2944. break;
  2945. case BfIRCmd_DbgReplaceAllUses:
  2946. {
  2947. CMD_PARAM(BeMDNode*, diPrevNode);
  2948. CMD_PARAM(BeMDNode*, diNewNode);
  2949. /*diPrevNode->replaceAllUsesWith(diNewNode); */
  2950. NotImpl();
  2951. }
  2952. break;
  2953. case BfIRCmd_DbgDeleteTemporary:
  2954. {
  2955. CMD_PARAM(BeMDNode*, diNode);
  2956. /*BeMDNode::deleteTemporary(diNode);*/
  2957. NotImpl();
  2958. }
  2959. break;
  2960. case BfIRCmd_DbgMakePermanent:
  2961. {
  2962. CMD_PARAM(BeMDNode*, diNode);
  2963. CMD_PARAM(BeMDNode*, diBaseType);
  2964. CMD_PARAM(CmdParamVec<BeMDNode*>, members);
  2965. if (auto dbgType = BeValueDynCast<BeDbgStructType>(diNode))
  2966. {
  2967. dbgType->SetMembers(members);
  2968. }
  2969. else if (auto dbgType = BeValueDynCast<BeDbgEnumType>(diNode))
  2970. {
  2971. dbgType->mElementType = (BeDbgType*)diBaseType;
  2972. dbgType->SetMembers(members);
  2973. }
  2974. else
  2975. NotImpl();
  2976. SetResult(curId, diNode);
  2977. break;
  2978. }
  2979. case BfIRCmd_CreateEnumerator:
  2980. {
  2981. CMD_PARAM(String, name);
  2982. CMD_PARAM(int64, val);
  2983. auto enumValue = mBeModule->mOwnedValues.Alloc<BeDbgEnumMember>();
  2984. enumValue->mName = name;
  2985. enumValue->mValue = val;
  2986. SetResult(curId, enumValue);
  2987. }
  2988. break;
  2989. case BfIRCmd_DbgCreateMemberType:
  2990. {
  2991. CMD_PARAM(BeMDNode*, scope);
  2992. CMD_PARAM(String, name);
  2993. CMD_PARAM(BeMDNode*, file);
  2994. CMD_PARAM(int, lineNumber);
  2995. CMD_PARAM(int64, sizeInBits);
  2996. CMD_PARAM(int64, alignInBits);
  2997. CMD_PARAM(int64, offsetInBits);
  2998. CMD_PARAM(int, flags);
  2999. CMD_PARAM(BeMDNode*, type);
  3000. BF_ASSERT(type != NULL);
  3001. auto dbgMember = mBeModule->mOwnedValues.Alloc<BeDbgStructMember>();
  3002. dbgMember->mName = name;
  3003. dbgMember->mType = (BeDbgType*)type;
  3004. dbgMember->mOffset = (int)(offsetInBits / 8);
  3005. dbgMember->mFlags = flags;
  3006. SetResult(curId, dbgMember);
  3007. }
  3008. break;
  3009. case BfIRCmd_DbgStaticCreateMemberType:
  3010. {
  3011. CMD_PARAM(BeMDNode*, scope);
  3012. CMD_PARAM(String, name);
  3013. CMD_PARAM(BeMDNode*, file);
  3014. CMD_PARAM(int, lineNumber);
  3015. CMD_PARAM(BeMDNode*, type);
  3016. CMD_PARAM(int, flags);
  3017. CMD_PARAM(BeConstant*, val);
  3018. BF_ASSERT(type != NULL);
  3019. auto dbgMember = mBeModule->mOwnedValues.Alloc<BeDbgStructMember>();
  3020. dbgMember->mName = name;
  3021. dbgMember->mType = (BeDbgType*)type;
  3022. dbgMember->mOffset = -1;
  3023. dbgMember->mStaticValue = val;
  3024. dbgMember->mFlags = flags;
  3025. dbgMember->mIsStatic = true;
  3026. SetResult(curId, dbgMember);
  3027. }
  3028. break;
  3029. case BfIRCmd_DbgCreateInheritance:
  3030. {
  3031. CMD_PARAM(BeMDNode*, type);
  3032. CMD_PARAM(BeMDNode*, baseType);
  3033. CMD_PARAM(int64, baseOffset);
  3034. CMD_PARAM(int, flags);
  3035. auto dbgInheritance = mBeModule->mAlloc.Alloc<BeDbgInheritance>();
  3036. dbgInheritance->mBaseType = (BeDbgType*)baseType;
  3037. SetResult(curId, dbgInheritance);
  3038. }
  3039. break;
  3040. case BfIRCmd_DbgCreateMethod:
  3041. {
  3042. CMD_PARAM(BeMDNode*, context);
  3043. CMD_PARAM(String, name);
  3044. CMD_PARAM(String, linkageName);
  3045. CMD_PARAM(BeMDNode*, file);
  3046. CMD_PARAM(int, lineNum);
  3047. CMD_PARAM(BeMDNode*, type);
  3048. CMD_PARAM(bool, isLocalToUnit);
  3049. CMD_PARAM(bool, isDefinition);
  3050. CMD_PARAM(int, vk);
  3051. CMD_PARAM(int, vIndex);
  3052. CMD_PARAM(BeMDNode*, vTableHolder);
  3053. CMD_PARAM(int, flags);
  3054. CMD_PARAM(bool, isOptimized);
  3055. CMD_PARAM(BeValue*, fn);
  3056. CMD_PARAM(CmdParamVec<BeMDNode*>, genericArgs);
  3057. CMD_PARAM(CmdParamVec<BeConstant*>, genericConstValueArgs);
  3058. auto dbgFunc = mBeModule->mOwnedValues.Alloc<BeDbgFunction>();
  3059. dbgFunc->mScope = context;
  3060. dbgFunc->mFile = (BeDbgFile*)file;
  3061. dbgFunc->mLine = lineNum - 1;
  3062. dbgFunc->mType = (BeDbgFunctionType*)type;
  3063. dbgFunc->mName = name;
  3064. dbgFunc->mLinkageName = linkageName;
  3065. dbgFunc->mValue = (BeFunction*)fn;
  3066. dbgFunc->mIsLocalToUnit = isLocalToUnit;
  3067. dbgFunc->mVK = vk;
  3068. dbgFunc->mVIndex = vIndex;
  3069. dbgFunc->mIsStaticMethod = (flags & llvm::DINode::FlagStaticMember) != 0;
  3070. dbgFunc->mFlags = flags;
  3071. for (auto arg : genericArgs)
  3072. {
  3073. BF_ASSERT(arg != NULL);
  3074. dbgFunc->mGenericArgs.Add((BeDbgType*)arg);
  3075. }
  3076. for (auto genericConstValue : genericConstValueArgs)
  3077. dbgFunc->mGenericConstValueArgs.Add(genericConstValue);
  3078. if (dbgFunc->mValue != NULL)
  3079. dbgFunc->mValue->mDbgFunction = dbgFunc;
  3080. dbgFunc->mIdx = (int)mBeModule->mDbgModule->mFuncs.size();
  3081. mBeModule->mDbgModule->mFuncs.push_back(dbgFunc);
  3082. SetResult(curId, dbgFunc);
  3083. }
  3084. break;
  3085. case BfIRCmd_DbgCreateFunction:
  3086. {
  3087. CMD_PARAM(BeMDNode*, context);
  3088. CMD_PARAM(String, name);
  3089. CMD_PARAM(String, linkageName);
  3090. CMD_PARAM(BeMDNode*, file);
  3091. CMD_PARAM(int, lineNum);
  3092. CMD_PARAM(BeMDNode*, type);
  3093. CMD_PARAM(bool, isLocalToUnit);
  3094. CMD_PARAM(bool, isDefinition);
  3095. CMD_PARAM(int, scopeLine);
  3096. CMD_PARAM(int, flags);
  3097. CMD_PARAM(bool, isOptimized);
  3098. CMD_PARAM(BeValue*, fn);
  3099. auto dbgFunc = mBeModule->mOwnedValues.Alloc<BeDbgFunction>();
  3100. dbgFunc->mScope = context;
  3101. dbgFunc->mFile = (BeDbgFile*)file;
  3102. dbgFunc->mLine = lineNum - 1;
  3103. dbgFunc->mType = (BeDbgFunctionType*)type;
  3104. dbgFunc->mName = name;
  3105. dbgFunc->mLinkageName = linkageName;
  3106. dbgFunc->mValue = (BeFunction*)fn;
  3107. dbgFunc->mIsLocalToUnit = isLocalToUnit;
  3108. dbgFunc->mFlags = flags;
  3109. /*if (auto dbgStructType = BeValueDynCast<BeDbgStructType>(context))
  3110. {
  3111. // This will get added to the struct later
  3112. }
  3113. else
  3114. {
  3115. }*/
  3116. if (dbgFunc->mValue != NULL)
  3117. dbgFunc->mValue->mDbgFunction = dbgFunc;
  3118. dbgFunc->mIdx = (int)mBeModule->mDbgModule->mFuncs.size();
  3119. mBeModule->mDbgModule->mFuncs.push_back(dbgFunc);
  3120. SetResult(curId, dbgFunc);
  3121. }
  3122. break;
  3123. case BfIRCmd_DbgCreateParameterVariable:
  3124. {
  3125. CMD_PARAM(BeMDNode*, scope);
  3126. CMD_PARAM(String, name);
  3127. CMD_PARAM(int, argNo);
  3128. CMD_PARAM(BeMDNode*, file);
  3129. CMD_PARAM(int, lineNum);
  3130. CMD_PARAM(BeMDNode*, type);
  3131. CMD_PARAM(bool, alwaysPreserve);
  3132. CMD_PARAM(int, flags);
  3133. auto dbgFunc = (BeDbgFunction*)scope;
  3134. auto dbgVar = mBeModule->mOwnedValues.Alloc<BeDbgVariable>();
  3135. dbgVar->mName = name;
  3136. dbgVar->mType = (BeDbgType*)type;
  3137. dbgVar->mParamNum = argNo - 1;
  3138. int argIdx = argNo - 1;
  3139. //for (int i = ; i <= argNo - 1; i++)
  3140. while (argIdx >= (int)dbgFunc->mVariables.size())
  3141. dbgFunc->mVariables.push_back(NULL);
  3142. if (dbgFunc->mVariables[argIdx] == NULL)
  3143. dbgFunc->mVariables[argIdx] = dbgVar;
  3144. else
  3145. {
  3146. BF_ASSERT(dbgFunc->mVariables[argIdx]->mParamNum == -1);
  3147. dbgFunc->mVariables.Insert(argIdx, dbgVar);
  3148. }
  3149. //mActiveFunction->mDbgFunction->mVariables.push_back(dbgVar);
  3150. //dbgVar->mValue = mBeModule->GetArgument(argNo - 1);
  3151. SetResult(curId, dbgVar);
  3152. }
  3153. break;
  3154. case BfIRCmd_DbgCreateSubroutineType:
  3155. {
  3156. CMD_PARAM(CmdParamVec<BeMDNode*>, elements);
  3157. auto dbgFuncType = mBeModule->mOwnedValues.Alloc<BeDbgFunctionType>();
  3158. if (!elements.empty())
  3159. {
  3160. dbgFuncType->mReturnType = (BeDbgType*)elements[0];
  3161. for (int i = 1; i < (int)elements.size(); i++)
  3162. dbgFuncType->mParams.push_back((BeDbgType*)elements[i]);
  3163. }
  3164. SetResult(curId, dbgFuncType);
  3165. }
  3166. break;
  3167. case BfIRCmd_DbgCreateAutoVariable:
  3168. {
  3169. CMD_PARAM(BeMDNode*, scope);
  3170. CMD_PARAM(String, name);
  3171. CMD_PARAM(BeMDNode*, file);
  3172. CMD_PARAM(int, lineNo);
  3173. CMD_PARAM(BeMDNode*, type);
  3174. CMD_PARAM(int, initType);
  3175. auto dbgVar = mBeModule->mOwnedValues.Alloc<BeDbgVariable>();
  3176. dbgVar->mName = name;
  3177. dbgVar->mType = (BeDbgType*)type;
  3178. dbgVar->mScope = scope;
  3179. dbgVar->mInitType = (BfIRInitType)initType;
  3180. mActiveFunction->mDbgFunction->mVariables.push_back(dbgVar);
  3181. BF_ASSERT(name != "__CRASH_AUTOVARIABLE__");
  3182. SetResult(curId, dbgVar);
  3183. }
  3184. break;
  3185. case BfIRCmd_DbgInsertValueIntrinsic:
  3186. {
  3187. CMD_PARAM(BeValue*, val);
  3188. CMD_PARAM(BeMDNode*, varInfo);
  3189. auto dbgVar = BeValueDynCast<BeDbgVariable>(varInfo);
  3190. //dbgVar->mValue = val;
  3191. //dbgVar->mDeclDbgLoc = mBeModule->mCurDbgLoc;
  3192. if (val == NULL)
  3193. {
  3194. val = mBeModule->GetConstant(mBeContext->GetPrimitiveType(BeTypeCode_Int32), (int64)0);
  3195. }
  3196. auto inst = mBeModule->AllocInst<BeDbgDeclareInst>();
  3197. inst->mValue = val;
  3198. inst->mDbgVar = dbgVar;
  3199. inst->mIsValue = true;
  3200. SetResult(curId, inst);
  3201. }
  3202. break;
  3203. case BfIRCmd_DbgInsertDeclare:
  3204. {
  3205. CMD_PARAM(BeValue*, val);
  3206. CMD_PARAM(BeMDNode*, varInfo);
  3207. CMD_PARAM(BeValue*, insertBefore);
  3208. auto dbgVar = BeValueDynCast<BeDbgVariable>(varInfo);
  3209. //dbgVar->mValue = val;
  3210. //dbgVar->mDeclDbgLoc = mBeModule->mCurDbgLoc;
  3211. auto inst = mBeModule->mAlloc.Alloc<BeDbgDeclareInst>();
  3212. inst->mValue = val;
  3213. inst->mDbgVar = dbgVar;
  3214. inst->mIsValue = false;
  3215. if (insertBefore == NULL)
  3216. mBeModule->AddInst(inst);
  3217. else
  3218. NotImpl();
  3219. SetResult(curId, inst);
  3220. }
  3221. break;
  3222. case BfIRCmd_DbgLifetimeEnd:
  3223. {
  3224. CMD_PARAM(BeMDNode*, varInfo);
  3225. auto inst = mBeModule->AllocInst<BeLifetimeEndInst>();
  3226. inst->mPtr = varInfo;
  3227. }
  3228. break;
  3229. case BfIRCmd_DbgCreateGlobalVariable:
  3230. {
  3231. CMD_PARAM(BeMDNode*, context);
  3232. CMD_PARAM(String, name);
  3233. CMD_PARAM(String, linkageName);
  3234. CMD_PARAM(BeMDNode*, file);
  3235. CMD_PARAM(int, lineNum);
  3236. CMD_PARAM(BeMDNode*, type);
  3237. CMD_PARAM(bool, isLocalToUnit);
  3238. CMD_PARAM(BeConstant*, val);
  3239. CMD_PARAM(BeMDNode*, decl);
  3240. auto dbgGlobalVariable = mBeModule->mDbgModule->mGlobalVariables.Alloc();
  3241. dbgGlobalVariable->mContext = context;
  3242. dbgGlobalVariable->mName = name;
  3243. dbgGlobalVariable->mLinkageName = linkageName;
  3244. dbgGlobalVariable->mFile = (BeDbgFile*)file;
  3245. dbgGlobalVariable->mLineNum = lineNum;
  3246. dbgGlobalVariable->mType = (BeDbgType*)type;
  3247. dbgGlobalVariable->mIsLocalToUnit = isLocalToUnit;
  3248. dbgGlobalVariable->mValue = val;
  3249. dbgGlobalVariable->mDecl = decl;
  3250. SetResult(curId, dbgGlobalVariable);
  3251. }
  3252. break;
  3253. case BfIRCmd_DbgCreateLexicalBlock:
  3254. {
  3255. CMD_PARAM(BeMDNode*, scope);
  3256. CMD_PARAM(BeMDNode*, file);
  3257. CMD_PARAM(int, lineNum);
  3258. CMD_PARAM(int, col);
  3259. auto dbgLexicalBlock = mBeModule->mOwnedValues.Alloc<BeDbgLexicalBlock>();
  3260. BF_ASSERT(BeValueDynCast<BeDbgFile>(file) != NULL);
  3261. dbgLexicalBlock->mFile = (BeDbgFile*)file;
  3262. dbgLexicalBlock->mScope = scope;
  3263. dbgLexicalBlock->mId = mBeModule->mCurLexBlockId++;
  3264. SetResult(curId, dbgLexicalBlock);
  3265. }
  3266. break;
  3267. case BfIRCmd_DbgCreateAnnotation:
  3268. {
  3269. CMD_PARAM(BeMDNode*, scope);
  3270. CMD_PARAM(String, name);
  3271. CMD_PARAM(BeValue*, value);
  3272. if (auto dbgFunc = BeValueDynCast<BeDbgFunction>(scope))
  3273. {
  3274. auto beType = value->GetType();
  3275. BeDbgType** dbgTypePtr;
  3276. if (mOnDemandTypeMap.TryAdd(beType, NULL, &dbgTypePtr))
  3277. {
  3278. auto dbgType = mBeModule->mDbgModule->mTypes.Alloc<BeDbgBasicType>();
  3279. dbgType->mSize = beType->mSize;
  3280. dbgType->mAlign = beType->mAlign;
  3281. dbgType->mEncoding = llvm::dwarf::DW_ATE_signed;
  3282. *dbgTypePtr = dbgType;
  3283. }
  3284. auto dbgVar = mBeModule->mOwnedValues.Alloc<BeDbgVariable>();
  3285. dbgVar->mName = "#" + name;
  3286. dbgVar->mType = *dbgTypePtr;
  3287. dbgVar->mValue = value;
  3288. dbgVar->mScope = scope;
  3289. dbgFunc->mVariables.Add(dbgVar);
  3290. auto inst = mBeModule->AllocInst<BeDbgDeclareInst>();
  3291. inst->mValue = value;
  3292. inst->mDbgVar = dbgVar;
  3293. inst->mIsValue = true;
  3294. }
  3295. else
  3296. NotImpl();
  3297. }
  3298. break;
  3299. default:
  3300. BF_FATAL("Unhandled");
  3301. break;
  3302. }
  3303. #ifdef CODEGEN_TRACK
  3304. gBEMemReporter.EndSection();
  3305. gBEMemReporterSize += mStream->GetReadPos() - curId;
  3306. #endif
  3307. }
  3308. void BeIRCodeGen::SetConfigConst(int idx, int value)
  3309. {
  3310. BF_ASSERT(idx == (int)mConfigConsts.size());
  3311. mConfigConsts.Add(value);
  3312. }
  3313. BeValue* BeIRCodeGen::GetBeValue(int id)
  3314. {
  3315. auto& result = mResults[id];
  3316. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Value);
  3317. #ifdef BE_EXTRA_CHECKS
  3318. BF_ASSERT(!result.mBeValue->mLifetimeEnded);
  3319. BF_ASSERT(!result.mBeValue->mWasRemoved);
  3320. #endif
  3321. return result.mBeValue;
  3322. }
  3323. BeType* BeIRCodeGen::GetBeType(int id)
  3324. {
  3325. auto& result = mResults[id];
  3326. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Type);
  3327. return result.mBeType;
  3328. }
  3329. BeBlock* BeIRCodeGen::GetBeBlock(int id)
  3330. {
  3331. auto& result = mResults[id];
  3332. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Block);
  3333. return result.mBeBlock;
  3334. }
  3335. BeMDNode* BeIRCodeGen::GetBeMetadata(int id)
  3336. {
  3337. auto& result = mResults[id];
  3338. BF_ASSERT(result.mKind == BeIRCodeGenEntryKind_Metadata);
  3339. return result.mBeMetadata;
  3340. }
  3341. BeType* BeIRCodeGen::GetBeTypeById(int id)
  3342. {
  3343. return GetTypeEntry(id).mBeType;
  3344. }
  3345. BeState BeIRCodeGen::GetState()
  3346. {
  3347. BeState state;
  3348. state.mActiveFunction = mActiveFunction;
  3349. state.mSavedDebugLocs = mSavedDebugLocs;
  3350. state.mHasDebugLoc = mHasDebugLoc;
  3351. state.mActiveBlock = mBeModule->mActiveBlock;
  3352. state.mInsertPos = mBeModule->mInsertPos;
  3353. state.mCurDbgLoc = mBeModule->mCurDbgLoc;
  3354. state.mPrevDbgLocInline = mBeModule->mPrevDbgLocInline;
  3355. state.mLastDbgLoc = mBeModule->mLastDbgLoc;
  3356. return state;
  3357. }
  3358. void BeIRCodeGen::SetState(const BeState& state)
  3359. {
  3360. mActiveFunction = state.mActiveFunction;
  3361. mBeModule->mActiveFunction = mActiveFunction;
  3362. mSavedDebugLocs = state.mSavedDebugLocs;
  3363. mHasDebugLoc = state.mHasDebugLoc;
  3364. mBeModule->mActiveBlock = state.mActiveBlock;
  3365. mBeModule->mInsertPos = state.mInsertPos;
  3366. mBeModule->mCurDbgLoc = state.mCurDbgLoc;
  3367. mBeModule->mPrevDbgLocInline = state.mPrevDbgLocInline;
  3368. mBeModule->mLastDbgLoc = state.mLastDbgLoc;
  3369. }