From 64fb2ab1f8b6fb56429121d35a6aca68723da129 Mon Sep 17 00:00:00 2001 From: Edoardo Marangoni Date: Fri, 5 Apr 2024 16:47:57 +0200 Subject: [PATCH 1/3] fix(singlepass): large relocation offsets in cbz This patch allows large relocation offsets (>= 19bit, <= 26 bit, as prescribed by `dynasm`) in the code emitted for the `cbz` and `cbnz` instructions. --- lib/compiler-singlepass/src/emitter_arm64.rs | 30 +++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/compiler-singlepass/src/emitter_arm64.rs b/lib/compiler-singlepass/src/emitter_arm64.rs index aa7d7c90443..3ef97fd93fb 100644 --- a/lib/compiler-singlepass/src/emitter_arm64.rs +++ b/lib/compiler-singlepass/src/emitter_arm64.rs @@ -2575,17 +2575,28 @@ impl EmitterARM64 for Assembler { reg: Location, label: Label, ) -> Result<(), CompileError> { + let near_label: Label = self.get_label(); + let continue_label: Label = self.get_label(); + match (sz, reg) { (Size::S32, Location::GPR(reg)) => { let reg = reg.into_index() as u32; - dynasm!(self ; cbz W(reg), =>label); + + dynasm!(self ; cbz W(reg), => near_label); + dynasm!(self ; b => continue_label); } (Size::S64, Location::GPR(reg)) => { let reg = reg.into_index() as u32; - dynasm!(self ; cbz X(reg), =>label); + dynasm!(self ; cbz W(reg), => label); + dynasm!(self ; b => continue_label); } _ => codegen_error!("singlepass can't emit CBZ {:?} {:?} {:?}", sz, reg, label), } + self.emit_label(near_label)?; + dynasm!(self ; b => label ); + + self.emit_label(continue_label)?; + Ok(()) } fn emit_cbnz_label( @@ -2594,17 +2605,28 @@ impl EmitterARM64 for Assembler { reg: Location, label: Label, ) -> Result<(), CompileError> { + let near_label: Label = self.get_label(); + let continue_label: Label = self.get_label(); + match (sz, reg) { (Size::S32, Location::GPR(reg)) => { let reg = reg.into_index() as u32; - dynasm!(self ; cbnz W(reg), =>label); + dynasm!(self ; cbnz W(reg), => near_label); + dynasm!(self ; b => continue_label); } (Size::S64, Location::GPR(reg)) => { let reg = reg.into_index() as u32; - dynasm!(self ; cbnz X(reg), =>label); + dynasm!(self ; cbnz W(reg), => label); + dynasm!(self ; b => continue_label); } _ => codegen_error!("singlepass can't emit CBNZ {:?} {:?} {:?}", sz, reg, label), } + + self.emit_label(near_label)?; + dynasm!(self ; b => label ); + + self.emit_label(continue_label)?; + Ok(()) } fn emit_tbz_label( From 81322da774e71b67831ae91badf31c0f91011a0b Mon Sep 17 00:00:00 2001 From: Edoardo Marangoni Date: Fri, 5 Apr 2024 16:52:48 +0200 Subject: [PATCH 2/3] Add a test for issue 4519 --- .../compilers/data/4519_singlepass_panic.wasm | Bin 0 -> 254312 bytes tests/compilers/issues.rs | 17 +++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 tests/compilers/data/4519_singlepass_panic.wasm diff --git a/tests/compilers/data/4519_singlepass_panic.wasm b/tests/compilers/data/4519_singlepass_panic.wasm new file mode 100644 index 0000000000000000000000000000000000000000..96fb562dc6db1bc850266c499fc1fb2e895632ac GIT binary patch literal 254312 zcmeFa2Y^+_b;rH$y?r2?#U_c8&q=;7Ug0Kp+`FZRE#q!U?s1Bp<^_=?h# zS5M^|y>arIH|NH$d2@s6*16xo=s({F9n|qf#IK zu(}b%O?zt#`0t`WY0;{2p)?FWb6dW)2EMRG<3giSuCyZuH(GUDgW6ne)t}u4|EaAm z9jt0uYWB01r7pRar7HMDgO;_qQk&eD{`}KbRqzE>rCiHTSIuhxALit1UxM$+eLSCh zUJstHYFS&v!Q|`U6UjHim)w@z4%}Q45&7nBDZ9BwH4PdijHM=^baHa!ld2hv6-&3Y zXq;;Vkonp|X?lJJj2{F%5Y{HAikgPWw-;feV5KDc*-LJ&2da??>qPAi4+D^@D zJJ%W6pb^ZWy42>@WIFH_weT-|!!`K7H@EL3A3=KCTfg+@ch|lNK2@lF!@cmOO==tB zaEqDEi?vm_czIYOUc3gfAZqdQ^;tZ)xt3)@VbSywC+nWCYuy`uq5x}bu6rXW2OT(5 z1?vIy4NB+!D4~XxXbJxkJB+^kM_>B$$)(!b>Y0T*Yu|v}4Ldb&-Ld`MjT5I${=4=M ze$cq85v*5L?VD?x(D!xZZ@e4T6>8r^rruCm1r2uJ%->^Ae1d3D+H&igs;jE2t8$6P zCfLxmElUksG_Gz`YSz4UsSW(!Z^dSVE|Y=1RV|!0?r8O^(jC9Pzm&VL_Lf$#183G& z*B0UXt7qQ!22k9vd9Ho!8oXN8+R2O?JCyj(Hrqm<6Xr!y?Ix$$sd^Ef0z`1bn73RV>kNa zKiO6Mf0EmH%dX;|-ss!9+4+BVvv2VA+pCX(KmULKKlSZ@p*~RmzP0wYrf+-uJKp)O z+u!}3_rCA_A5i0U{rkaYANue|KB_jqvoaH9vt79!dG?5b%y_Tfuk!N z-QegBM-Mo9!qE$k-f;ARqc0r0iv4o^;okvp41{A49E0H)0>@A|hQTo$juE+$xly^% zxiPu1xpBGixd|{f5spc4Oon4hZfb5?ZhCG;Zf0&)Zgy@CjLn5(9vt)GcmR$Ca4dvl z5gd!*SOUjVIF`Y&9F7%mtc2r1I99>28jdw^JOsyDI39*$9USZ7*Z{{yI5xqt8ICP* zY=vVR9J`9!b35SQoyo^=?1p0x9DCt-1dd1H*aydBa6AsjemD-m@dO+P;Wz}xlW-h{ z;|Lr_;W!4zaX6lW<7qff!0`+mC*e2+$Fp!e2gmbpya2~(I9`O~3>;_ScnOYkaJ&r1 zD{!2L;{qHP;kX3HWjLF5EH2IAE{dNT}spMzoXXR(-=j7++=aqfW{QLv?1^I>fMft_~ zCHbZKW%=d#75SC<2lK1)tMhB}59Qb9AI`7Kug`DDZ_IC!@86u?lHZ!&mfxP=k>8o$ zmEWD;li!!lBU;eTD(3rzrr7%&tKq=F6J-s zN0;+g_@k@&Yy1(cc%dyk(?I`gS7O0B-WTcLZQN1_AY%qYw(%qq+-%qh$*%q#o+{K5l;1%-u$MTNzMC55GhWrgL16@`_B2MenT zs|#xi4;9uH9xkjatS@XR`(8zLWB%P(*mRR`F^pq#VapAh*Ve)|%-#DDj5CT5X7Pq@P0gqdC~Tr0GxZd={1x_xzr>WCx6td*qcA zD^Qf(BxW?D?<{qncCPBS0z|=pC*T&BuQALg4xKsIr-DUdWp(vSz#;*E zjk>)*#IN6%^KXxBYC%hXfM2^szP8MH+UK!BwyHeY9`G*dy0^z4ka@nvbn|7~qdcH| zd%%3qe7)%$`ntEr7QQvtd)+Sesi^$41xa+;O85B3IRn<%cGXQRF4 zp2nNQr}>98O>V~2X_jxa^4XRzH_WGk5cduX(Hs?3d?S?{YL-lo~Q&Q%mo0~^Zvg0GEmy~Imf=+&Y8 zs#@U*+i3UD>#=J0wdzza*A>9R_NsJY>R!0(OH9t=qOtVHs6DM=^_jlx7LE2=&lF*2 zDSeyQYp->jd2`OQ52v+P=sB^xy(&CS8SPbmekxl8>ul<@7o1H23)`#Gg(_xX%D7$A|emPpJgqMA7-M6hj}x7^UvJ38A}I-HSe@c5Nkh z&|p4j{^pz=*Wj%c%ISm=GV$`kL=?w*x-FW(R4*K3#$dapNKK*!%* zvx;vmk6-;3b+5RrMJxJr+2*Qw@TNA?%A2Zi#m!N;ocpv;dMhr*OL^~N$&as9CzrSg zKfCs)b^X{H{B#*?nMRG0ABww{{4C)oC)XC>pJrVq!+&q*!CI`EaP^ktU-CMCWj^}*aN_zc|b`D%Ec|NT|)n+}W@P41$QW>#b~ zUnDhjP~x5UnUlQpKF=g;aEovvOy4)h(%@OiD<(CQ#YBt7lL?=1hbzzR1j@h=k-?QG zGE4?$hzzbgiJuLUF}YZpK{6&8GA3CvxboaipbQMDRh_|=Cz2jvrLE(nVrex^eWEe- ziPqG)^4w0~)GrF}H@3C7eXSX1Z9b31`k#}Ju1SDwhQsZS`DUZAOu zH>N(`nmSjW+Xp@Bada;TPlDO@ zAwNUaw3v3{qGzQbDEWOUNr5LqRor=B)9U0FlNTau@e$~o?tzyiN8|XMFe?d;kdi)e3uG!8~QH##n2`l}BvgzQPb$ zE3Sefy=#RbvQ}JKYlUORT0yPWYD}@T#okwAiZ!DvU8|e5ubj1ldCFRiw$_R(kJ!L{ zg(0$5Tm?mX*9t>qt+=w*3dfAKf?BQB=(4pMU91^pI2dI)7zGb1u6Muv_qSsY+8sNp zSToYFFw(LxGR4C0Z!b6&Miy&EC=2kIZG^S}cO_?K#C%Jc3wr;nxcp+Rs@aOW-eYe z`e#&RuTx}2y<~2psK2GCe~Kb|c3wr;nxcp+Rs@YYgr?C?E5au+k|&S($%*UUBef@S zT}8F{90@!_A}5m>MpnwGNs%V zjQ*bxMK8CbByzE++(q))|06oc!Mgv`4kp9ixdqHhp^nYc0B`(v?Ly4l}(sOj#fU|W!>$1_$ylgap*Z!)n z_u3y`HmdQpzXsN8e|WjBZ7EOe4k*fLJ9%=0PuqFpv|XUncJcnE4d}F8z_Wx1T_Z!IMlQuj<0_W+ZhbFgZ40j{Wp^)1e)bv%44WR@3 zT1xtwN>X1A^=`7+f=waM?& zho>CyQ}n!-`V{_}ef(5uJWa6ojTSLqZbwA)wnX%fBLW*nL~unSun-YksZW*G&;)zk zXc4>Qc0@!kOGK|YBCyRw1Xo0hg^1uveX4YrCfHN$LTH+v)&zT2G(qoONnCz;ikBhFD*+W+hq1ku6!6yKG$<=s7hOfWY zaTWx(oh%4f z^;;0wyUS_z9aKBPpR4L%&Avm*>;qq^#~zj0bLE+RC6RP59bOj2Nbj3=?MUxM6+`4H zWY|gg!Yn)x1Pj~ARC~izd&^Y&6jSyy{ocF%*gRs2E03v4BE=L&dQI7pUQ-w%rl7@@ zDX_q%+8L(WS*F^hn6lm%=@o^2Dx$dZh^in_JYk~Ola=Vzgc+m>dXy`eqkdl@bk;%Y zthR=)wwAB9DZcFP_6oyx6=7U?gjEtL#xT-r%#QRb!w~5#XeZTKVBuvl)y6Q@#xm6= z#gyIMUQ^hvVu~w|sY)Wn6h?YY*^ypT7$T-%Qz=tmflXb5ziUcAG|{5*wQBQ4i)+=_ ze+QP;-(FGJry`0gkEjX~#SvU0vLn5x84QsV7o1-ABMtrh zgu32;sqy7%i|(>TcR7X5zA$*{u#1F_D-WF=>7~OEp@YV(o9wd%3Le6rvu^5KMK|T$cc@CvDqMM1KkVm1F+=)^D^H?*a`3J) zhRA(luIQyZSllC|>Lo+fOO~pa;;6!<7FAq%z`|5vhN$AolNhK9Lqruwd4s0u?w6<4GRHrF*$^}M0#c}vyvaa3WeiYl%=U}35- zLsW6)NeonlA)<;aQU#l9*kU}bKWC_V&QkSU997t=qKYdISePoz5LH}x5(8CXh^XR< zRKez2K&qZKR6T2{dNz(KY*kUkl?NsxU-UaYd?NbL}8irwmo6ELErC zsKQniRa|+%!c<{~sN%|#7^n(EL={)03O3g%QgzZ$b<$FGGL9;2RZ+#22P{k#W{4`T zJc)s-Fho>wMXF$PbzFkys%H#U&seISiK7ZzRa9~10Si-w8KR0SPhy}d3=vgakt*0+ zqe;~XL)8gO)rmN&uvJABS01o1RhS{Fxbh?hs=^Ra#TBW7&9#hFJ#DCZ+EVp&997t= zqKYdISePoz5LH}x5(8CXh^XRP5FOYyXR z%usdAQgtkjDr{9z#gzvvOciE`Dy}?RB=VBU~^3;RYwg~M=e!HsxU-U zaYd?Na~&sDhYeMSEmeo(sKQniRa|+%!c<{~sN%|#7^n(EL={)03N}}}Wq7W7(oprJ zrRvEzs<2f>6;~dxFjbf#s<`qb2CBjkQNA1sC~ zp8P;D{^fyIcQuARK7?-NfL<|p?N+atET5-q?6+=sU$^!A094BFp&Bc5lQ$3^ur}TS z1sF6t?+doLo293@!d|<#G3@QBG>!eQMMaBbZlY+vrD%T~MNcH5qKGS21a0;pP2=&5 zitKYw`^oS;7rmG+yLartQ)a7ThG&$T-6Ew0c* z>uL6T)a;8b8t<`YzbDS@ab;xoTzO`13-PWCEbrqq``v2xaCd9BHT&IhW{(Rhv**e) z`#|^573XO7yVUH#{Vr?vyW-3q7gT1?m1p*W?x8EXti-eDPBnXQztfui&N#Ej1(n%z z<(YlpNe{YWJk5TGnmxGRVawd4s0u?w6<4GR zdTcnU+GMEOWU1N|M-{fJsN%{47N!a_L={(_#6VRTBC5C|Rj|3{ld6q|s*RSajd4_A ztBNYFJYZp}Fhf*vrUSrV2Ae6<40b zKvftbs<)Vd2WhQV3$f5MhD#?7a%FArBiY4_hn`$6>+678b62EMe<{A;JRv zGoD!18Z2uqmbGzMaIuAjD<4bPx?qT~K>sWvmWK?Mhb)$d;;`Ui3kz5EW5Ez%f&SS{ zENcvwH5SX7I4ro>!oro0C9KCVL|CAI4iU?0gJreFvN{e6F1E06tga!Ji^J+YgJ!r5zXt6w)!V>tf0T)|Xxbm=sU5YV7 zF2!7V677qi_sJd%kxMaGbSZ}R98RiM8md-Ws#eBPg}o%IxblF7slp6V#g!*9P!)!V zDy~QsbpL!(wZc%f!cw&&jw)?L90%EQ8cA~@~W#A1lB zKzqJIEK3cRr54N5I4ro>!orn@C2(CZL|CAIx~;*J{1Ss@iN&%c4ht@}uyEyJ30xNp z5f3ga!I%F0m{!SQc3b3k{Zq7R$moEV$Uh!j*?5u*Wb&SfGFQ5z7LDWr4-AAPx&Iwy<#JVF_Fp3=tOS zpHsy0fWh*B#qvN3OW++mTx?Wid4bonoFwY8mi`6s^-Q~g{>;8xblF7slp6V#g!*9P!)!V zDy~QsY_3hDYL205j-_f&997t=qKYdISePoz5LH}x5(8CXh^XRb@!VFQxl_xP!6^4i^u1FPZuFIrqmZ55vrD|3jRoJSciYpITm@3Q= zRa|)z165&&sN#xL!R8vc7EkLl4OKHORWswL!d4YkTzSC4RAGjw;>wd4s0u?w6<4GR zHrFgtHN#Lf!%{UPjw)RB=VBU~^p}RZ|UBQ!Q0f zRB=VBU~?TMRTB+W6D?H}sxU-UaYd?Na}8dHr}goMs_~Yp@o`jPtBNYFJYZp} zFhf*vrUSrV2Ae6<40bKvftbs<vqsznoXoF?6#WFe$3-*$*aOGhMeEkMPgaz8O?|M8j zjxtzASuCUCu;5|~3s)YNz;(e8VS)acNGu}_mXQ|A$T%#x*uuh>a8*AR3=tOSpRL3)++Z1Qu?&yHf{QIITzOamdkjN_1^VYOu?#a< zhFL7b;;`Ui3kz2smcSmv5MhD-IY%r*4VIx6%g{J1xY)wNm4_v8T`)vgpntkf9Y+>Qb!xDBW#tgX>bLC02FM{6JZZSkI#az*)7}|3rsTypk8f>W= z97h%QlBnX!0~V$VGei|vp2R>^7$T~;B301+3rW==L)9Ql)u1@4uvJABS01o1RhS{F zxbh?hs=^Ra#TBW7&9$9W4K!2@v{Vg@qY7J9RB`123sZ#|qKYd|VxTGv5mj7~D%e~n zNYwyC)c{M?fHrLTmL3L64~wNo92Q(`Vd2Wd z64+xHA}r89(}|_K!P4Dg=^lp#7h71k@~{N13x)^_^v{FD(#>G$X0ddO!-9(~EL?e5 zmWQ2_F+^CPe|8f~SA(Ui#nLqn3of>>aOGj?V*T17?_)a*5f1?ocwpcpHVZp@~7Op%jf$M@H!UFx%do!MsI~gpUES64j zSa7k0g{%6pV2H3l|BNS=js{Cdi=|^67F=v$;mX4j*kc$XEYLrTh^2$U(!pZs5Qha9 zTUfaAumtuPh6oGv&t_t2Z?LqtSlY*7!NnF9t~@M(>w+P|0{wG{SlSsZ?JSmdDJ+4{ z;NfBm3s)YNu!nk>ArJMq@+8_1vb<+`43UR=T+u^4XwS2xs;!}_t);4M997s$qKYdI zSePoz5LH}x5(8CXh^XR}VE zgI*(5mkd>xELE4{sKRCvRa|+%!c<{~sN%|#7^n(EL={)03fh10Ry-45G*n%*R9%dt z3R_iFapeIEQ-v9#iYrfIpehUzRa}uO*j%$o)dfS<1xwY16jk;tyc-Z(Ra9~10Smla zhaqye4!VCmv79$p&RZz4@=;>V2H3l|8(4jrQ5 zek>RwEYLqgiRC4O>aOGhM z>@f@x7U-YV#B#=9Ib*S$iNk`6Ei7DlSOV7tLxctTXD_k5Xt2C!vAh_E1s7XbxT+ru zh6oGv&ojhw+F&_tv7C;>f{QIIT-A>SLxctT=L)gBV6ePkvAht61s7XbxbmiqRO6y_u&!tlBnX!0~WaK7^0tSf&T2d1J9Eu444xZ%!xQK*h~V$ zRsCQvM8iOXP9T`44Vb4bn5W~w;BpHLSM`Iz5Dfz@w2WY$GGLyvV4jKtgUc;2T-6T- zLo^Ju&~Ab`u3+Ffz2g?l@f4UX)#h8dyn6QN@)9EKC(H zOV!ahs<2f>6;~dxFjbf#s<`qb2CBjkQN z!orn@C2(CZL|CAI_7lq?gXNILawrZ9F1E06==%3TXa?oHoXt5lO!-9(~ zEL_!(1w(`d`lsVAJWW1fusmV0JQ0Tl7h71k@~{N<7={Q7^v_UYIbg6HuviYnVZp@~ z7Op%jfjx#H!UFv>i&*v>Ec-2%{c%`uv4w>z4@=;>V2H3l|EwXF#|@UpEtbdQu;5|~ z3s?1H!4P4A{&|F09y3@TvsfOB!-9(~EL_!(1w(`d`sXCE>@!&QSuFeFu;5|~3s)YN z!2N3ga!Ji-)=l7KVq;vVzE3DhXof~Sh(`A z1nzwd5f@isOSS)+uu;5|~3s)YN zz;(e8VS)bHMl8DxmfaT1?i7~52i>^X!orn@CG6o5X2`=Mt~`nM0~7CqZVZu!M_kdv zBWTYfq-vK^1<&d2vQ+I#QDx7<`|t>RNmOy=0SjDq4AD=vK!08&n4Jd9P77vd92jgS zf#IrtFc_j?ph5fY!4u^U17?Q>vm*`+F1NsNRX-RE(J;_LQwe6f0khqL*&YW5ms?=C zsviu7Xc%ar)daIm!N7BR+bo!EDKN{ezl7x7Gq~IW!<7dn?DT>ea(dy)lW1>j@970Y z?L90s(vgOA}r9J zBZy^_!LrF>*%XHb7h71k^08QN^!4sd3=tOSpE<;`(O}tVv22XPf{QIIT-A>SLxctT zXDzX8FjzKNEF0pm;9?64S3VZ&#O_@e3=tOSpMAu#-e6g8v8<27f{QIIT=`hSdJIE^ z1^VY%Vp(Uftg~3w#bLq478b62EMe<{A;JRv)8-L8k3DR#JZ!N%oWc@#rN_k<7Op%j zVV5t=kjocWo<#e?;q6)sk;@lXboqkz96+kp8miV>s@A5cvS;DFd|@w%Dy}?WftN1~ zk!6SWoIxxP87vQ3EDyzD!Cn#;u6!(E+Yv*A1=@2Jv8*vz)>tfS;;`Ui3kz31may%J zA;JRvvzJ&_8!W3Wmep}saIuAjD<4bPx?qT~K>wU1mQ@DJDvM=R92Q(`Vd1KNEEpmz z&_CCR!oro0C9KCVL|CAI`ag=N{FMgFN{eM>92Q(`Vd2Wh64qlF zA}r89Q;21S!Lq_)SrLZ?7h71k^09=i3x)^_^v`l)S#Gc_w^){^umoO;aj}JkD-TQ9 zr5H2hQp}Yn(Y^?JFU1%lmtwByQVi|6gH$b3s^B@jWtOUCDXQ#QcrV4+OQMP^4_M%( z7(?`vEzqAQ2xh4Pv($oF8V3fONnp6D9}I?Q7--OI1hd3|Sz^H~i35YnEihcw4+cXt z47AYTeR!r^Y``qGU>3)L!Q~bhuIdMaAsPl+Xg0wtQZR)UjTafyFEwn@7*|T>!Ifto z8>)idwTB^cYT(KfX>UsJsR24@9kDDlSQa`gxKP5vmFI>7SujLcxbj2>vOohpLM#gm zmIV&WqNM4Bg)7eu2eM#@uyEyx3}k_BdWu*cFjyXNSQc6=TzPIdkOf18g)2{FAPaQU zE5tJ2V43f*EU;L(^4xGB3x)^_SDwf~7U-rfkKu`Ip20HDWPx7-@qop`mFI@HQZ2-(um)bHjn_f+51fl_xTg1-fYnt;-yPWsb=L>oU(` z;mUKvf$M@H!orm&GLQwjiCJbFEVGljH)+YgLS(i<*0j1*Xj-U+bNsDet8ShA+oTk@ z5_2sfT-9&(7(znwEgEx0cQ&E5CetF#GQeh8V6)SfCcU`Yy$z~s(xS?B4At*7_`}bTCr&c*fa}lS_)X;ieVcF7+3WJ!w>=E ziol@F7;LHmHq`=~8V3y9K)|@F9~g!R7*_-aZT1|k*c1b7iUl?$4j8t9fN@nnFboke zt_Td;>>7bhHozuZV3Sk80{0lUfq-#UKQIgtFs=v;+Kj;_8DNtPl;i;*uAt0`E6XaOH^% zWPxsCmN5p)7?TCgW8*9qt~@s!xGoqXEL?da16iP(4%51fHdscREU+$PEf%gkHypSw z7$PiOc_IT@pqrRwl)*B}WPx=VW3h1Mx#7Td!4P5L$`cvL0^M|))@7u@GSXogZLx6W zx#2(-3=tNtJduGc&`oXjO8D+6><+vOqU6%MgQQh{*!yv0)YqSDqUVTo()x7Op&zfh^EX zYiL~t8!UrO7Fd^|77JIN8xC9-3=tNtJduGc&`r!TNU^}1(g!7TZ=#-H9AuEy^#o(! zukjvY3E|2!`>@x?F++TCq7$SC{<4=*D0fwCcmYo4{>|jI612wKZEMayqL+o(nNer}uAz}x1O~(Ux523$d zr@v*Ve;hm5kYa}`4@;OG%n&~Q5_3A2M4 zVuveFVxS!i5j(JJmXMvkhMm5aoxXAGU_*)>t~@MZb}&QiaOFu1w1XjH2X@VFveU<~ z)5o&YCypI#NU_6}hb7DoW{4fGJc)sJFhuOYu6d5^^fv7Dw(RtdV+R{j>~Q5_3A2M4 zVuveFVxS!i5j(JJIzNGD3EjwM~*ujPrJ6w5K z!t7v%*x|~P7-$DW#18D5DP*UMVW*2_r%N0=*pOm}D-TPU9n26rTzL`$?O=%5fnD1^5Q9LEkeq}bug!xCl(GsF&8p2R>q7$SCH*E~UXIvI94S#~ z+FPpH$5Dl?Dyq2hfQ6~T3{l0ECoxbJhKMSzNEK|Zhe=gCLsdIVRl7KeblRYet79jrUSrV2Ae6<40bKvftbs<SaUK%a*E_Q&g=A`!QN< zRZ+#22dt7vafOl1lD`ID*Sn?yU15m0f(>=&ePjwOj3iU%3{&SUQ|D4loyZ6Mz%h2J znBvNVRY|0n!pQoX!Vob9`$?Gs3vB8o!_-Tbsh3hreKtrG_Nj>C$|I_RMDc`)_4R}y z;tASFc>)LQ>8#=DtmWx!il@MLWn!C(D6TxBDv1{z^2X^rp{QV z&ZL+Me9tGgshHx*W2%x!F@=%!HH9H!3K~h70t;;FMZ?sKmZ=w0Oa(rrfQ>4qxbm0^ zyYyj(h~mnV7rRsDXRoJPbiYpITm@3Q=Ra|)z165&& zsN#xLL04@gRWBH-Ua(ZX5JwfZs;J`10~V$VGei|vp2R>^7$T~;B2}=tj*_b94OP!u zs-BOd3R_iFapeIEQ-v9#iYrfIpehUzRa}uO*j!gg)pLfb=PXsvrKk$Lqlm34s<`ri zRT3$#FtWa9bqo<#u%Xmh9V`q!iucl=HB3EgnR+(GRNx&&>{KzumB&;ikzxuX>uU-_ z#1!l&WeO~?sZ)ljQ)5DbiYt$)N+QJ+M%LF9hKMO>BxMRLOrf4SX_z`` znL3$bD(pTr_Nj>C$|I_RMDc`)_4R}y;tASFc>)LAQO_8jp0PYVlj14xE;Y8Ph~mm4 zs**@Cg^~3&g&|@J+DMrK3vB9yVd{is>O_jEz>R`!DyF#dn5raFOkrewO<{ghP9uu;VnR~}P=mvjsvQ}Ao1xS~rsw7@btsXS$XJ!OGC6$cFa zO2D|P9~g!R7*_-aE4GQijw`TYi^j(-u;VFUfm;^aK)|>P0`va(y;qw&+gbiA=xm#GI02XNraC3qD9Z~+EEsj|JjzsWBtwsK@>4N-u z_W(vnKR~$Z2bgQOV|ai4u;PJ!IBfA8uA4`GjbPxz5NtAObFPBg+}joyB5lEyCo-@t zFhtsdD{2cYbX!0xNLzp+Zi^?CMreyCEsamc(TKe!8oBZ?+q=u#9T+0r0WG1r1E$Q~ zaY$i7cO0^?4y9lPUQ4j$1dFR6EN^#Uh;#>6p2)!Nz!2#UuBbb((A@zYA>9Fr2Gb@x zs5C-%9JDkZjH3}-PBe1mVGisL43X}DmQdXRQ=Up#Pbe(tjwdXvCsMF#f?hqrjuR@b zf~dUBfg#cyTzMh`n*&3nIk=+cz(O|%G=ww<7~)gM0c8=I2(jCwesykrHn+WSsg$3R5sD<@t3YP8NyOh{+g2h!3*7YN$J20}o z4^=Qkx`Qj~4lHzcKu1V-fFkaWN0dhBjz=twkHpc4Ehiee3exDkPl_SZ9ncc0J7CJ( z9eWiPbjMx`Yi|lx;JE`^PO!KN!t!-v$>9T-{Pa|ebCvD3oZ83zknPO!KN!t!D2;H&6(zqjzMr=9J$d!jV@Z5nR(jCwesykrHy^iB^VcQiJbjNlJ zYkLY-*sFrraYDsa5S6z%FhrVzD^Fx#b6|)x2UpY_Sm@?}hLGj}L;R3so3aSavCXo$ zEs8~KII+l;2RX1eFhqI-8bb93%$OgsY*kdy8(S@^ttnK2_d2lQ1dFR6EN^pQh%^UR zp2)!Fzz}H;uBbV%(9Ho2A@XvB^aja+${1G@u5q&uJ`RCmCX zxjQy1Ea;BS7S`qzEZe(xDY4}Qi>n~4>qkm=U}Syobzq2e2UpY`Sm^G6j*#vEMcf^m zlt$=|O_s(@aWrDfiAJu1G3(ZJehVQoyodP~srq}Xvn#Z~>N zFhr=hqLqZ@8cEm74F=Z+i)%v)SKvE%u?GZ43VA4l_xUroCS?FgBEF>!LrU_!9^1mt~@s!$buol!j&g7kOi7)Ik7x! zusrOrtWO$HSh(`sa3BkY2n$!9$Uqk8rY*#>)?iudu&lFKxboa^APa^F3s;`VKo;nx zCy3=CgXJNI@L77JIN8xCZ_5MklU6B)fRa9Yus0ZBi42Ve>BhEGuXD9d6 zny5dBHQNAAezl9-oyxFcb6r__AOemGBU$jnFED^VV?j@W0?2+^&shfSEDLs4MA$hl ztR9E}tHJ~p1`JpLIZ3cH4cM6$?97O;vt3v{5CK+&2`mg4umEy_U}qSxGc4E{KG+Pq za+V9L2O_|#FoA^u0~SCScDeyO-GZI&gUzsKXS%R@AOfrk6Id89U;(7-3B1cU&48U| z!A|qRW?0!7F03Ai0IR|T76uGh0Abjv2JBP|c4|b}=`O4uhybg?1QrGiSO6JHD?7!2 zonpaG@xf+j<7qCe9*6*|!UPru3|Ih}O0bg+*vS^`WFKsXHlFIj>VXKbDokKuz<>o1 zhMi=;03Zp6J^v%h;0OW2=hWkxP`XXA-i3Z|C2XV5Cs0Sh- zsxU#+18#Z-#3XD3AxL?ONn}7&VS=a!-1H2HN!S%a9BUwsH4))q z+ISaH54e-aaK2Sxf~W`F^bCke7$c4`5XYE^a7G>HBI*Hm5*b!eg$be_aMLp&CSkpv z!8>}R4aCtVBCO(A7f}zmlgO}&DohadfSaBHF$rVDQ3m2D6A@N%jEkrT+(~3uMHME9 zdcaN3fS81hqE#GeAdYkpN4to6z@0<}L=`58dcaN3fS82MCd3g2;s^(El#8eb+(~3W zRAGXs2i)`wh)LKgLL6=&4tEeox`=wfokRvi6()#!z)jD9n1t;j#9;>FFb8pji>L?O zNn}7&VS=a!-1H2HN!T$$9BLpAH4)*AI^0Fn1MVa;oKaPnAnE}(Jp*DA#)v}<#33dk zoKc6lh1RNDcvfxQ*7%(0j14ze{ct2;L0Xxuw9q56r=(iOO zb}98h1WFYqlrUgW0>J>H9AHomuqX$3C`(P`9TNOoc+%e?G02700})_Vn83n-0Sh1u z+uwlgZ^8EW!Dcw)40K`jKm=G7Ca^GIzyioPTG@UEY(EROpAR-CD@(s4C4FHBxU700 z0;>uWRv0i?frA&euff{aV(sf={R?5`-}#Xa+uw!N0})_Vn83n-0Sh1u+sA`Iuthl=(@!&}pNxCDta=~< zs|piV7%*6YgHOiY4AyQIYd0TjhArE}h1CNQU{#pF!hit_APn2pfbD9*cJ;w#*s|SS zSUnH{R)q;H3>dHg!mwQwEc`mrE*5MTA8dw|?dHPj0T;F&=>!Wev#Ip*m)XkGQ{Q}@ zgdN5$4+80ryu-u!F8P|yhPuv{y3Rgz8TzEFt4gtg$>Qs8Uy7Kf?bxD|`4xT3H zoUiF*sOw~@>*P~czH+I*Dz}TPP7k>1>X9z$RC>9(^7K@7N!aPKuIrSq>1e3yXsPSy zQ&+xnsp>kr>hyrCt{&;4PNkQtD^E{VmxMX$pzAv3YdR=(@O(%IOI-(_x(tt>I=SkS zfi|a-XItO|g1>E;o;xbm!Vi4hS}MN@i?9gqfUK&mE;Vd*e<{~0`5n=B!Q^Y&8!YWD zmi9iD49{qEbXk&t!G4zVn@DA8pRZ|`Zt-@TSMOO)@Y z)P_!i=r=vX$vY{e_o#5YI^#{qZ)QkR)vx-mD$PJ;uQq6Dky<%ppK%wK^WMTgm2}JP z`Rdy8E^G{|CTrHt>cDos4lKWs)OG9NcAy@Juw*Jsnn4ewr(3OEsB@dr4~0onK)TTu zplKcTMcYa@K>1lQRixeka54=4baxN0m^SA zb=}$b`ZEn1Is*#IitI79HyEtaRJZU7Y~O#uVO1^`XG0ooWU+gK{w_*CZQu{8Y# zm-NTd?Oc<3z%^MGo{FlnM5G>oaDc{(PYXC}n&$+#!s&ssuiHy!hike2?U%>n0xBEo zS`M5wQ9u20Er&l{+eH0g-}>AWXzR9t9&p~9V8GZ=py@QJ zyjp3`l<)4;Gt;YkMd6+SQ0bYgR?l4Z^-KoTHg3=80e4mFkuE)>(xaS&RhaY)3>ZBF znz(1K7%Hz=DzErdmYpY4o90@M&VTYV>UzL6Sr(qUJye#6)B_N%Pr_=Ll)y@^@f7qoR+k{oSdj|Xa82YKJjnjO20rQLCsn=txg{Mz(drk=B-O@;QxMGTMa)t z*0f>s23;mMEtXbQwW@76xpYUXrnmg6bjPoM+O!dz4NJNEnpW4|(yEkeIkQvq)*Wwa zSPOUBTP0srtiH3hdgg6!DBM}wuz9Y1?Hf8J|90sBUs6oIt=PD#QKQ;Mr9W*^eP{AD zwS}4R70IU|^*0c`stV=;U(#?gJZ`<^{?fHvD|kE#|80sU8aDrAm&vvGA&)|Svo4d9 zuSiTaY<@cx?$^|sU(>|=nug8a!X+j`N~zbg_;!WYmw}d{$^FR^Tr0>LpiHPqGA;mr zMPhHf*rSsrtkz{~hhH{#c!T7}E34_*iSjnKc40L>>}g;Ka|6}Pkop^l=4OVw6Ahb#GqBmB zaWdh>XsA?mTZ5WQ>O2URE?Jf?nU>5SLM^wHdLq2yo(T0o`l-ZPgSsAisxUbd>H+Hv zmke*E=D28JU$n3<`moENx=O{q>|*Ny7rQ(?6(){TQy`bke-)UO*{zc@D1;uNZ)@Sb$u)GpQU9g9MN(H#Wn&5HU#r zxnjUqa-}f@__6``vIWSMJCn)*F-QQpa$_^BASMYQR}A=auC$N<&l!N{EI_W@nN$vl zK?2B?8=Ca^=Qm0K_B# z#IqQ@Gc*+9g%AHB&fEXlzT)D9sIth~mkShi}l`Bmqz>@~xNehrGcP5ns zVvqoG<;G@MK}-@rt{CuSuC#&xpHYCYot{Ymo2Zunp7A{(tNdxgQ`X}#xFtQ1Oz5rm z;=o>-(FtQlC#)Hrh&Q8??u_&R&nOueWmGVmPD=qY1H zPgyg1D&CAvxHHlNJfmdb0?p{SF{9(wjE={f(bMjX^Z?H&8R&Q#&rQdS86C4`bS&PC zo^ofT2Y5!wKp&dXQDa6&tr;DSH>2b3jPwA{C>a<|Gdg0-=!i9=Bk^W*%$<=Q;29+Y zlW0bV)r{apg2TDeTpY#I5}XoCaL?j!uI5SgHBdfj&H72-tTVi@ctob1+%mk0Ne#%k zIvH4?CTP5LdGC=)jVOqJz>E;;e#u;n7VR@EI3#> zH6U=wz;)otZ!>k}p2*c4&@ac`;I|AKZ$vcSyUFi~$ zY5e<*M$4YOdI_BPcbbwXXC3JMHgrRTmY4AlSj~FC*Q^=bACzY0Rn-ITJ>2qit1at# z%|(TY0zCj17IdzbH`)Sa8Gi9GdBg)1Rrs_>Py_Z{~% z{{2RiwXLkZ{|`XBeT*wDdwRdMr}z8zbcTj|!rjw)AibSa_p}O=b=L#5r&TRIpA4L} z_cT19+@Gs?TwRahg7vti<8hykvWK>*oBDujLl3w%vWJrlxJRtQjXRrsVJr(zH4RyE zWrS#UfowWiIQX)YVd1B2*8!;TeQNm?@O4I6{+K9P}bS z;(yc-`lu!J(TGAHbA{>wm$`DGDocdw0XIB@PzW=HvK2>Ya*H!b=p%;EM=YU_L=?Ku z6{-hZ=E{YtED@>)-0%!SAUA9aQ50hhV_UU%xA zS7BmQ52UB3o@n2svDEE}sO}M0ogPSsOI4@BM4cW;Pft~s zggslPZcnae_f2|mLs-^BQMe~&KNQ7PO`i74!DmWWXn1t7F%JkUUx^`tEi19hT8UlZE0MYn_PD!D54iiF{PdT)&MHjS zSr70!Cj(Omc;`)8=gL=PrA$y(WT&+vJHuBb)!A-$Z|DJbmJDp5DebsP&R#2fW1nEl zO6;&!Vn_H&r0$Jf?%vP?5%z`(lf9t_c%74h69l}y(seGs2bGFTPwS{3z<{d*J%yQe z-H-{&ifp%5WV>%g%BPsRH+H&vLl3aCWT4wwyl!l()LHon?glve9p?J znCfhY>r4-@vt(crO=;^*a`sv|pDYw?S&6OIN^A{ZiPUD<&MP7CdLY92M1{%uL=W&f zCj;vUcuS@0T)tUTakHII4#)&$MYdQgvcY^&=`53sXjpuwH`d*xb*}um zfFUwLS&?5)WG|@o@M`r0$LN z?%vP?5%z`(lf9t_c%74hH3Yo2(seGskfq{gyVmZL3CfDBwN_-UZ$-+dn7TLCxqCwo zu(M>~7)|M+N}ZKo$Zn9cmt}(D>>K&C7TWUUQS2y;jaA zeFR%pVvV&DYr!n%>Q%mf^1NWnN<3(-#Dn20k=iV)c_jp14@5Yhs4zL7=mB2mWZ)_R zudH;P%QtH(ZnpEufLHLs1{0JOS!u1vO5cic?IE>mTROg-R+ zXOOAFM5Z1fnMr+wWG*#iF12JXjVN=uD^m}+yp_vTSt3&pxZxROsxXnM2S{d8UnH4J z44F$TnM)$dT;|Hu11@jnGF6ty)B|pK2AL{MWaVWWWr<8Z;D%?Aslr629w3=XeVSxGV90#HlKDVHnG0Q+dcfta zT&BtrnR>tt&mdEUiA+5}GLyQ~1-t;wH)PJYWX_K$bAc;U54gOQ%T!q+QxCY|8Dy$3 zk*NnrW>SwJnez;p^DLS3BFcQgm8l0@-pXaFERm@P-0%!CRhY=s10*x4=aJ00hRnH^ z%(*_9(4N#`_ZnfzI#rm4?Hs5Jb6nB?a;l7S5bIL82-V*$>I z2sqCL)B`Ty+cjSykWYmPUovoj_+}e?vn{^a5&7o2e0sp;%d&tfO#qXD(*!un0Gwq3 z&WZ>)#|6{_E?|ZQRAIuG40O1N*M^w}-%N{dW<w=>qBj7cfJEsxaY8238T@G=p!N#WyV? z-wc;e54e0;7Eq-LU^1|W0H+#&Q!T)$KEU#ag{jxT=`NriZ~-g7L!q+d4uu|Y!^Jub$iXn4~C38wdnbTaEdcftaT&BtrnR>tt&mdEUiA+5}GL!l$ z$((G+oNURQ98u;}SEe3tc`KKxvP7mHaKkgmRAC}h50K2H9&iaSw37^(lPsB&d@{>t zl)BBQxH9#C%bVfvAgC}ojU@xqh;O37H__so7?E$X%cloiz6^i!K!pikGO&{PCK!AZ zEWQa5`6ju1dcft&uzo5`_>zI0#5dmH8*lNAkH|OC<dcfstCeMVdst$Z6M1=`oGO&*LMjCu0ExwTv`9`~Zdcfs-oA6BteWpi+312es zIPr}z_(oWKBO>yRa{2Ut%a>vORG9E31J4uRaD#8S#Wy@6-$<8F54e08)=z~AUoz0{ z3Z6fQ8GOSmzF`shM!0->AOfEX6TW0%5b+H)_=Z}1LnHDHclq>y%a@@)RhaN41Jj6a zh`~3+;u{i?Z;_~SMm+u{NeOMlPeNbV-mkc~bd;<->ffnDuhEF zRhaN40~d*JfWbGw;u{c=Z;;EU2VA}k>!-qmFB#}{6|WEd4Zi*sU;l`F16@8n;PPcy zKNTi?$-p?`>u2!wv-tW&46A*Dops2frZ4^*Wl}G@%4?!*WcyS11?{N{#0SY zmkewozCH$DAB(R~M81A5pB`}eGW4ek6TW2NAo2A!_y(9AVb@}vw%a>vORG9E3 z180b@m%-P|;_Kz(%kVNsAD2%LxO|mAnXIzp$z(m?hL=BeoBA?`3X><3^#DDYoYbAJ z;mNwEA+x6?vu8w^yo2(Y^W*xdr`9ucso3#bPo0IDzzn2c;B zz-|U$Hw&;^M8F;{pdN?-sKPX0GV&w=b~OOIT7X?60(N%+^*{tb6{Z1`kyi+?ivon- zV&BCA?BWA_r`*5az>i;2_h2^{P!G6(m7ma5mYmS^fE!+Z`bfPxs4zL9=>a;SC3UYh zFIU}GsOfCT>}<*G98qRhSEe3tc`KKxvP7mHaKkgmRAC}h50K2Ho zSB1%)++<(}@pUlxI#_%iBJy=|`Sd^pJ{2Z>$-pt42=>eB7!-Fst zCVa`jdE#ql@U^q}+C}8+;PUB#2z)9`_>zGhZSl&`*5GSv@wJV}*WTsR11?{N{ini& zFBup^d~FQAHWpu-hsNxcK8!sIfm2k0`J)Cb7q|FB7TK>I(Y$^Y?~ET2y5HMaGiVV3+(45?kz z3{ApW`hfxroFTIR)@1)}lKpo)vfnvmQb!=;EKLRjUEATQ`M)&Tf0<_hU9bql}c zBz2$tmqRACOIG>$ilgLoCAAw}etJkfTXB}0tfZ!M6_nda;cvCV-Cg;Kkm8QyomS#qZe>b~vqs`76d?B7hVe~Sn9 z?+%#M5x_W0z@VN;V878|zcImn6A$cu2TW=g>}_&d4}PZ|X9*b8O9<@O8tm65*stS( z{hI?Obp$ZZ5-_N@64liCH#uwtAgU{H7MfM>;DXs}6b4hK(mX1QHUCt~&fzM%b zX8`IIMD|ln_EVGWr}4=C#UYbA1{sG58Pq$8?4LB*Kbd6z6p!qm9Wtq1vJAf!g0ln+ z>f;3Vj~eVBO|XBA2li73OzH?=oF!mTUm&o5&|v>yg8f50uzzyEq;|ow>@p4$GN^lY z!gKK7YqGyL$^Jeb**`jDQoCdsdXcjP4C=82_IDcW?@X}2iwE`(4w%#~Se7N@Fd>6_ z0g?Sgll{ab`-z7v%UzGZchIDE(JH@ea+F*)rFNssFIA~`Jvd7)n^Mzd6UvR`@W3zLwKn9x2D6t^*Ah_OX^*Z zpEwGob~&@`Fb>oA?qT2@q5X|U`x_JOZ{nf-*g=yz1{#NHG#Kd78Bh3sth2cVHynvmJ`~K7_HEv@sCWjA9>Ik z$Wz}Ns_2L8Quo?lJ7`k7XyyAj^}NhkbiT^BXe>3IQ=r^UoPVh~|I+0A%XplB<#0+J zfs?a@Q)=Rb@+fisP;>s!T4bC%qn_~D;{pgZp)gWoT;>w=f1?`eVGGX;LnBe48uaZ(%Q2aZ6gUC8X& zB9ODA2;?jg_ybem_msfzYJuN11%B5fuqYk)*}w+;zT;17*I(vn(Z|tI^l_Hx`@X5~ zyGq}8w7&0{`o81Qm*E2YJ;$HauD|TrB9ODA2;?jg_&rnLca*?yYk}W31%BHjFvFSt zyN*DqU4hxNMIdKK5y)90@VlnKZ!3ZKYJvBf0`K(*%}La9k1lxs=hx3t1!!f3 zdjwW~pZA-NKdD`RnWIG?M@P}eS)%WoroOK$eP7f1zGmwCnnz!TyS(3U{7LQl%bqO) zIXj9#&Juy&Fa>^13H+)S_*GNjS3LqV+~xhcBT#BrVD@Yg$k|Z@a+V1Ex+(ChO5j&m zAiO&96;t3>JOVRx$=4i#Qo91nFO{iJR&bUGl-kWMU!2ruWH?I%N==txF5zkD_g7Vy z;Mv-*C4!-(Pk*J3uee|x?O{(+*@HU5f2Cv`eqXtwkZXP0ll4E@7d(mzsjgAkVP zpRZW`)1owy)P70#&zDTKUy7ji%Z^&9)77Rn4rfW@eA#TAFO?P&-CeqI?lS4_s++Eq z;cjLN2U6;E$khJfEa@Mq-Rung!&%ZlQd9qMsr#pe)jxNs{`sQrpD&t*zZlQ(mmI@V zyB0E>e>h9p=u2iBeNna17jzqa!G!#R2QtHD>@EjV>U7A|HsUO4BdOi&3~j_&(neBK z8*!=I=q{^`zEFCIHfnR-M$Jvb&EpyVqGMQU*FuIi;w)*SFPd%CytJ1fOS+9pCS=J2 znUhxsY64#!_=3YIbvk2e7jc$!k<@N>hA!eP=_0AAi@4NX^aZPnO6p{Er|zOVO~H3Y z6WrVpEVU~kLlbe9G*NT2iSAVAqC0dG-C;7`;bF}1z`x``N}Udw+C`itT_m-eouP|3 zOS(vE>LM<67nQ6oxY~r;F8Zt~__NUj zf8G%+wJRY*6LFR_(dW%3`mAcA&*&!ljLG;J4`YV=MW1sZrA~)T?IO;SE|S{K&d^1i zC0!&nbrF}ki#}&{(PvZ_eOhNfg})kdFEZS+aqMxQhde=?ro zPdkRCPB)zTV4t(3jXrI*(I-_KeL_Qi!i4;U2Qn{ruip}Q_xe)~qtp=?IZGI&rj>^B zC_Re!xW@driTQC4W`?&YeA3~RIszwW38&P=2_Oe{z0g|%>@}nl?hZW?9G~|a&$PalS zGwjKaIFM3DfaENJ{D=wpq0%T?$z~d|nF-mfZpeyWZTPT5Cv^lm&Jwy0n{>@eGl}kl zn(l)p-3RNY%kq@?ha5<$BS3PNKz_)C{GfvTfQI~l3HbpJWQIO%=0Hjv0g|%>vY83_ zfzmQs$@go>_nVOK_dr(ubm9jcMyVq(a+WZD&}4kSTFCcl#`l?w@AEKbc(&^U4y4o( zAUR7QKVU+>PeHy{L%!F9e6I(x^5@%<*_dlln*G~;_r#`ky_GwjIs zIgnCEfaENJe4h#V9tHVs4f$>p^4%WD4EF)v>p)5!0g|%>^1UYHyA|Z^3<*DFbGzm$ zHEhxNJe}*UYg`9QvVbhKiEa%3z1-!ukopvi ztheffo4RH%de`hGa+a>dT{GEb?}GkpqJEe9yY!B?ek3i!n!VdOTSy&YgK?I0fz;{Q z)=8*P$4Q8@WdFW9IZLVy{H{{Z?)aGZo%K0Uy-`k$=R<#R_-34__~fK;n>V?qalJ6h zuK+a!T&soy* zP*b1lUbwgMJ8Ryd4ZcH5Oa9>6yBu(+uXEQR<&}o=Ys_7Z-%<1Sx_2DhI9(l#bFpz} zgs(Xn?uiBLxQwZyIk^dSW|6xFuP*2H?i!TirrkBDgT+{;^1BA*w-9v3!1Yer@TRXB z-!*u3Ij?uupxkKsn#o;*x0|QQx9c5m-8Cq`h14~Br*pQD+C7zJ&z939XB!s~?g0)XJ_WlynVJ4KS#0W&fYn5?(d#+?z#7#d#1gmW>)CA zWHa-6Ev*hk%G`-%v12N8Cl<`DD)S*rsCC&E>IxDdX=$O>Wt(;ynS?w~^YbMwt;{G} zKF_6hv^&9iTIh3!u(bD8sJbKoVhEG#9J;+iH0;J!e1&c)QH|Y>&xi@lxov0kg;{#~ z>#@|Yn^M1?A@vmiy~2`uU7kT_Nm^P8bh(&zq0~!SS{AM_hp_eNt3nvUl0si$IwOSM zP^GlfzUBEN`aV7GSLke^FvKg4Fx4bTN{MKi9L53{ngSPQ2wa7hbu59?Wm_mJ^o69Q z1x}Z3+G*?x1y0h^0*A5?vKYTR+F@|8q{O8SehD*sE@leS%%0nJ=9$?vqD9Wd!C2}K zno@r-L+aCSDD1O!OX_vmmdxt3wbV=6X^WAjT`2XEmX`W;)65=JX7)fyp|9XUIhffk zyR7JY7tjhjJKxO0Gd~au+yPVI4rB;ig_ebu!0ECra25JO($WH_%Qo!_0w-x{fkW9c zv+!mQ1eZ$$abWxM=-bNYLVPJ$pc(4r!DS_7GCd?X_4D>@<>}_vqMxe9v8UTTczgR< z-7+CG@Bz5T3ineNqcBK_QN zvn|8a&svT5n`*p2LyarQ+U1rS>$0uJY1)NqENSTu*JYu`vZy5;({J?=<*C2 z0$N`Y4Y?$i;Y-YhTr#_c?6Vr8%XUL5^tPm>WmuPsX&3f3XniLo!nAu^YW9@X|ym&pqRFDO4L zn7OzlSQYeSOJH3bgLSb9*2NiMrTHra>k>EWx^{Bv|R5E3}T)!20dq=MbZd zVz4eU!MZ2|tTcaxVC}WQ(q#!2$`1);;Rs(f$@-}1%snw!drYwQWPp|CuMn(@EU7(+XU9PL}%`b!P;elwJQUxG=GI)?Y6+uWeFC_W5LXFNwCslzD-~~ zsrb`sxNL&8oB>vvze2E9EUUf()?I{1t+=Y=NcA5-gNIBA98F1S>7(+XU7l zia)J}fGu8xX=Q+w=C2T}wgr|hOR!LWOfa)l60EeCZ!cI&v1BcoU@c{UmFBMytiS?G zmnB#zORyG8f|c&MZ362F(V2@eSc@iDiy2_0`6~pgWr3y35-gOzA(&Yx30Au2wim30 z7_0>otc47)()<;IwPb;%%MvViD0H#60EeCZxdM0DE_p8Z<=5=Gr&soR|wXE1(q&Luu#7LgFH0Pl>{p-=GzO_ zTr630CRjMm%0+uwG|gWjSo0QGx-7v$S%TFl307Lnw+XC25}nzI!D^UbH8Q|T^H&H~ z(*jGEC0HnbTrg8F307Lnw+XDr6n|O`X*XMMcGWY$O7m9;)|>^FE=#ab{*qwEF9}v! z%(oXTKb9=t1k29=E6raaSPcs-U6x>>EWz?hf|VBYZ362XqBFf1EYAeX%K$6QUm;j^ z3oKohV4?h7W~LR^*BkYtKK={qVRNH1hok_@&+}^XkG@bh#J_agtF^*rM64 z*5?EnCgn$Gyi*-N`d;nia^0)@Oz6;wwoi=X$&SBqEnc<|-E+Kw7e`!-yp!vGOk{hn zn34KMr%8<9&C4&Zd49by*PLHiTxtdFl(O)1XQHDv;$>*(Kr zE1svMS-`t-_XaE&2E%oz=aqiHd8L0dK*HrFE`REE<^b3a=u;Tjdwcgr^xw6O$UE%U zvTNYnbm%8)(DOuxXm}eC1avT7?cE*y>BCReHeT%2q6uVf16)y-E5$J-gJO<M4}dDL%|xJF%5eiz+Ji1=xU$(b|tQ=K_9(hKLV^znRvT3`qllqy9% zN*P7?6+aZOpyV6sw-*@KIJ@jwFNwVO;yt@=rTkQpe|Pl5$I&{xic)Dns1?pQIvc}C zfNUK0@4`vm?mbZte|{@TwKLysK6tt_7Y%Et!uiwDkyD-4d!i%n{k2Z;n|Padva=Aj zPJzgy_jm94o%Q)}E?hW8wWz5JkFGC5b>_R?z2V~h^zVcBQ5AY@u3dwc2GPC~jiXd2 z^dChH`kDF&q=z-cwxNnguU)x2TKNq?b?Cfhb6$4xt=z@F!7;S}tY2~7vM%_;$uLu* zpq!*DU;TuoD|D1b31m3+k^4VsJ%X_CX_W116wJ$_|1%-_2u+>x*rz^aQAb4MlxqKB zSEGn2#Ww{G@tbOqP%{x3BX0@iUgH>(Vl74_iqK+;9QWssFF3H)f2-NlQC*w zK#OX*HJ&M~(IY-V0}hdHHC&>&)y9Cz!zH*(442-Oey_0+&cS~Wo)q6e>pB=~dkyLw z;bg&Y6HZT4KmyAhHrCN)!B|U5wB$?ce%$>iOM%%|Dv`ANNDYi~eN!vdi^uPFfQP!GUZLHG&;_tbPXY+3_tTtEafARMM-Z01ii@)djVSlxb zcaT5nMURIkm;I$h(%CN5ARtZc(oj$O*@ZhAkXCjVa6!7*UBLxuVE0m7kluAeT#&YP zufqlDSa%4u3`n)6`Ag_XQ@pO%32}@*1nHt% z0lGPU2+JNy==q_A^h0zjm}^~u&zr5D?D&VsMaM%6a9VKoc=UTeXSb!(jLsZ675)A9 zpClj6KN>b4?JRcN4|b2-+x6ZLzvTKm+qv?SEm_rnAzuWJ^z~^+y4a5t zssmZ2;T@7lPd>?0qvQ+a%de4)M37o|nyMjqFS-8e=97{Fn_rknGDPI~M|GMY3G<6t z8;io)x*>d>dRRB5TbN&(;F0-lg3ChlOO*`cO7jWJ{8}}pm|v^L6!UAuJT+8hTo*`VHz$PlDa)^~ScCJD@g`Pw{~X&xukr89q8 zNZ|sk(tjSnJO$YaKfVlMjcU=;fALMsAL%a-qD7NC#Pr^Ce1E6jz9zV~74<%bp91|8 zC}0`jo~Skl8uh!Q`|vZ(&FFee*R4+d7@oWu+on-(@XeZhlIUH<6GS!$!ZS7%j08g7 zWo?6G#MQNXYd#V3yqnc4J@2+OZOXjcszLMaX41sdyc@N&s40K?JY|~F&PYb3OMjj+N;yfGQ9UODqZhOp6XPmS$TMR|#-s-7 z^k{L2FeT$q7E}1~Q$}EGJx+|kv_Sjp8G*%w6o@=+j=4V3kAmy5tYXTcTQZoL1_ zdyytWdQ0wtMhHP1!bQqk7RAx+Z1JO*1}T2ZMcNTR3I|rZz8vf!#V9qVU^A4L{P@rx1K5kF_~3-ZK|qP3*>$@s?|@k2a-A$}CbCdDsC zXh-~<#cwH3{3tX~9;G-hLOLiwQAL|II4)+riP*hH^zgu^FfT89K%B9GMMo4a#eW@Z zBSMXXZ_na7)Du>0Ef##u05J;x0>|mVmc+s^pX_QLLsmHK63^4Wh;-qQX6iCDuaRh8 z9fy)|AF;*!@ARWCYHPj0Tk8!VR~Xzzm8{@4yLna>j@ošXp;EvTkaO_8;J-AQX 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 Um`FP}Ag$dp@&o!lobuNH1Laxa@Bjb+ literal 0 HcmV?d00001 diff --git a/tests/compilers/issues.rs b/tests/compilers/issues.rs index 471e465c30c..3261fce42d2 100644 --- a/tests/compilers/issues.rs +++ b/tests/compilers/issues.rs @@ -442,3 +442,20 @@ fn large_number_local(mut config: crate::Config) -> Result<()> { assert_eq!(&Value::I64(1_i64), result.get(0).unwrap()); Ok(()) } + +#[cfg(target_arch = "aarch64")] +#[compiler_test(issues)] +/// Singlepass panics on aarch64 for long relocations. +/// +/// Note: this one is specific to Singlepass, but we want to test in all +/// available compilers. +/// +/// https://github.com/wasmerio/wasmer/issues/4519 +fn issue_4519(mut config: crate::Config) -> Result<()> { + let wasm = include_bytes!("./data/4519_singlepass_panic.wasm"); + + let mut store = config.store(); + let module = Module::new(&store, wasm)?; + + Ok(()) +} From 874fd6fd085271bf1ea5f593fae3f0b3052f82bd Mon Sep 17 00:00:00 2001 From: Edoardo Marangoni Date: Mon, 15 Apr 2024 15:44:28 +0200 Subject: [PATCH 3/3] feat: use `emit_cbz_label_far` only on panic-inducing functions Instead of directly changing the behaviour of `emit_cbz_label`, introduce a new function `emit_cbz_label_far` that does the trick and use it only in functions that induced a panic in the `wasm` files collected in https://github.com/wasmerio/wasmer/issues/4519. --- lib/compiler-singlepass/src/emitter_arm64.rs | 48 +++++++++++++------- lib/compiler-singlepass/src/machine_arm64.rs | 8 ++-- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/lib/compiler-singlepass/src/emitter_arm64.rs b/lib/compiler-singlepass/src/emitter_arm64.rs index 3ef97fd93fb..65505f07252 100644 --- a/lib/compiler-singlepass/src/emitter_arm64.rs +++ b/lib/compiler-singlepass/src/emitter_arm64.rs @@ -354,6 +354,12 @@ pub trait EmitterARM64 { reg: Location, label: Label, ) -> Result<(), CompileError>; + fn emit_cbz_label_far( + &mut self, + sz: Size, + reg: Location, + label: Label, + ) -> Result<(), CompileError>; fn emit_tbz_label( &mut self, sz: Size, @@ -2575,28 +2581,17 @@ impl EmitterARM64 for Assembler { reg: Location, label: Label, ) -> Result<(), CompileError> { - let near_label: Label = self.get_label(); - let continue_label: Label = self.get_label(); - match (sz, reg) { (Size::S32, Location::GPR(reg)) => { let reg = reg.into_index() as u32; - - dynasm!(self ; cbz W(reg), => near_label); - dynasm!(self ; b => continue_label); + dynasm!(self ; cbz W(reg), =>label); } (Size::S64, Location::GPR(reg)) => { let reg = reg.into_index() as u32; - dynasm!(self ; cbz W(reg), => label); - dynasm!(self ; b => continue_label); + dynasm!(self ; cbz X(reg), =>label); } _ => codegen_error!("singlepass can't emit CBZ {:?} {:?} {:?}", sz, reg, label), } - self.emit_label(near_label)?; - dynasm!(self ; b => label ); - - self.emit_label(continue_label)?; - Ok(()) } fn emit_cbnz_label( @@ -2604,6 +2599,25 @@ impl EmitterARM64 for Assembler { sz: Size, reg: Location, label: Label, + ) -> Result<(), CompileError> { + match (sz, reg) { + (Size::S32, Location::GPR(reg)) => { + let reg = reg.into_index() as u32; + dynasm!(self ; cbnz W(reg), =>label); + } + (Size::S64, Location::GPR(reg)) => { + let reg = reg.into_index() as u32; + dynasm!(self ; cbnz X(reg), =>label); + } + _ => codegen_error!("singlepass can't emit CBNZ {:?} {:?} {:?}", sz, reg, label), + } + Ok(()) + } + fn emit_cbz_label_far( + &mut self, + sz: Size, + reg: Location, + label: Label, ) -> Result<(), CompileError> { let near_label: Label = self.get_label(); let continue_label: Label = self.get_label(); @@ -2611,17 +2625,17 @@ impl EmitterARM64 for Assembler { match (sz, reg) { (Size::S32, Location::GPR(reg)) => { let reg = reg.into_index() as u32; - dynasm!(self ; cbnz W(reg), => near_label); + + dynasm!(self ; cbz W(reg), => near_label); dynasm!(self ; b => continue_label); } (Size::S64, Location::GPR(reg)) => { let reg = reg.into_index() as u32; - dynasm!(self ; cbnz W(reg), => label); + dynasm!(self ; cbz W(reg), => label); dynasm!(self ; b => continue_label); } - _ => codegen_error!("singlepass can't emit CBNZ {:?} {:?} {:?}", sz, reg, label), + _ => codegen_error!("singlepass can't emit CBZ {:?} {:?} {:?}", sz, reg, label), } - self.emit_label(near_label)?; dynasm!(self ; b => label ); diff --git a/lib/compiler-singlepass/src/machine_arm64.rs b/lib/compiler-singlepass/src/machine_arm64.rs index 2518dec0a0a..9d449638a1c 100644 --- a/lib/compiler-singlepass/src/machine_arm64.rs +++ b/lib/compiler-singlepass/src/machine_arm64.rs @@ -2810,7 +2810,7 @@ impl Machine for MachineARM64 { let dest = self.location_to_reg(Size::S32, ret, &mut temps, ImmType::None, false, None)?; self.assembler - .emit_cbz_label(Size::S32, src2, integer_division_by_zero)?; + .emit_cbz_label_far(Size::S32, src2, integer_division_by_zero)?; let offset = self.mark_instruction_with_trap_code(TrapCode::IntegerOverflow); self.assembler.emit_udiv(Size::S32, src1, src2, dest)?; if ret != dest { @@ -2835,7 +2835,7 @@ impl Machine for MachineARM64 { let dest = self.location_to_reg(Size::S32, ret, &mut temps, ImmType::None, false, None)?; self.assembler - .emit_cbz_label(Size::S32, src2, integer_division_by_zero)?; + .emit_cbz_label_far(Size::S32, src2, integer_division_by_zero)?; let label_nooverflow = self.assembler.get_label(); let tmp = self.location_to_reg( Size::S32, @@ -2887,7 +2887,7 @@ impl Machine for MachineARM64 { dest }; self.assembler - .emit_cbz_label(Size::S32, src2, integer_division_by_zero)?; + .emit_cbz_label_far(Size::S32, src2, integer_division_by_zero)?; let offset = self.mark_instruction_with_trap_code(TrapCode::IntegerOverflow); self.assembler.emit_udiv(Size::S32, src1, src2, dest)?; // unsigned remainder : src1 - (src1/src2)*src2 @@ -2925,7 +2925,7 @@ impl Machine for MachineARM64 { dest }; self.assembler - .emit_cbz_label(Size::S32, src2, integer_division_by_zero)?; + .emit_cbz_label_far(Size::S32, src2, integer_division_by_zero)?; let offset = self.mark_instruction_with_trap_code(TrapCode::IntegerOverflow); self.assembler.emit_sdiv(Size::S32, src1, src2, dest)?; // unsigned remainder : src1 - (src1/src2)*src2