/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . wasm . ir 2 wasm Ċ Ċ import Ġorg . jetbrains . kotlin . backend . wasm . W asm Backend Context Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Value Parameter Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Loop Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Value Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Value Symbol Ċ import Ġorg . jetbrains . kotlin . wasm . ir .* Ċ Ċ class ĠW asm Function Code gen Context Impl ( ĊĠĠĠ Ġoverride Ġval Ġir Function : ĠIr Function , ĊĠĠĠ Ġprivate Ġval Ġwasm Function : ĠW asm Function . Defined , ĊĠĠĠ Ġoverride Ġval Ġbackend Context : ĠW asm Backend Context , ĊĠĠĠ Ġprivate Ġval Ġreferencing : ĠW asm Base Code gen Context Ċ ) Ġ: ĠW asm Base Code gen Context Ġby Ġreferencing , ĊĠĠĠ ĠW asm Function Code gen Context Ġ{ ĊĠĠĠ Ġoverride Ġval Ġbody Gen : ĠW asm Expression Builder Ġ= ĊĠĠĠĠĠĠĠ ĠW asm Ir Expression Builder ( wasm Function . instructions ) ĊĊĠĠĠ Ġoverride Ġval Ġtag Idx : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġwasm Local s Ġ= ĠLinkedHashMap < Ir Value Symbol , ĠW asm Local >() ĊĠĠĠ Ġprivate Ġval Ġloop Levels Ġ= ĠLinkedHashMap < Pair < Ir Loop , ĠLoop Label Type >, ĠInt >() ĊĊĠĠĠ Ġoverride Ġfun Ġdefine Local ( ir Value Declaration : ĠIr Value Symbol ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( ir Value Declaration Ġ! in Ġwasm Local s ) Ġ{ Ġ" Re definition Ġof Ġlocal " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġir Value Declaration . owner ĊĠĠĠĠĠĠĠ Ġval Ġwasm Local Ġ= ĠW asm Local ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwasm Function . locals . size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġowner . name . asString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner Ġis ĠIr Value Parameter ) Ġtransform Value ParameterType ( owner ) Ġelse Ġtransform Type ( owner . type ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Parameter Ġ= Ġir Value Declaration Ġis ĠIr Value Parameter Symbol ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġwasm Local s [ ir Value Declaration ] Ġ= Ġwasm Local ĊĠĠĠĠĠĠĠ Ġwasm Function . locals Ġ+= Ġwasm Local ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreference Local ( ir Value Declaration : ĠIr Value Symbol ): ĠW asm Local Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwasm Local s . getValue ( ir Value Declaration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreference Local ( index : ĠInt ): ĠW asm Local Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwasm Function . locals [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdefine Loop Level ( ir Loop : ĠIr Loop , Ġlabel Type : ĠLoop Label Type , Ġlevel : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġloop Key Ġ= ĠPair ( ir Loop , Ġlabel Type ) ĊĠĠĠĠĠĠĠ Ġassert ( loop Key Ġ! in Ġloop Levels ) Ġ{ Ġ" Re definition Ġof Ġloop " Ġ} ĊĠĠĠĠĠĠĠ Ġloop Levels [ loop Key ] Ġ= Ġlevel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreference Loop Level ( ir Loop : ĠIr Loop , Ġlabel Type : ĠLoop Label Type ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloop Levels . getValue ( Pair ( ir Loop , Ġlabel Type )) ĊĠĠĠ Ġ} Ċ }