From 96acc540f4687c381ecf007f94e9161487d1b121 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:07:32 -0700 Subject: [PATCH 1/8] use page_size=1 for instrumented components --- Cargo.lock | 37 +++++++++++++++++++++++++++++++-- Makefile | 10 ++++----- assets/debug.wasm | Bin 92827 -> 91914 bytes assets/proj_cargo.toml | 1 + assets/recorder.wasm | Bin 237715 -> 239072 bytes assets/workspace_cargo.toml | 1 + components/debug/Cargo.toml | 3 ++- components/debug/src/lib.rs | 9 ++++++++ components/recorder/Cargo.toml | 1 + components/recorder/src/lib.rs | 9 ++++++++ src/codegen/mod.rs | 16 +++++++++++++- src/instrument.rs | 27 ++++++++++++++++++++++-- src/run.rs | 1 + 13 files changed, 104 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3784148..df93e9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "allocator-api2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c880a97d28a3681c0267bd29cff89621202715b065127cd445fa0f0fe0aa2880" + [[package]] name = "ambient-authority" version = "0.0.2" @@ -156,7 +162,7 @@ version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" dependencies = [ - "allocator-api2", + "allocator-api2 0.2.21", ] [[package]] @@ -560,6 +566,7 @@ name = "debug" version = "0.1.0" dependencies = [ "getrandom 0.3.4", + "talc", "wit-bindgen 0.52.0", ] @@ -1221,6 +1228,15 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.29" @@ -1552,6 +1568,7 @@ name = "recorder" version = "0.1.0" dependencies = [ "serde_json", + "talc", "trace", "wit-bindgen 0.52.0", ] @@ -1573,7 +1590,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08effbc1fa53aaebff69521a5c05640523fab037b34a4a2c109506bc938246fa" dependencies = [ - "allocator-api2", + "allocator-api2 0.2.21", "bumpalo", "hashbrown 0.15.5", "log", @@ -1647,6 +1664,12 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "semver" version = "1.0.27" @@ -1830,6 +1853,16 @@ dependencies = [ "winx", ] +[[package]] +name = "talc" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081e3f3ad542dc4cd0ae720f752598f8880fd364dc2d031132e3509f673aa23" +dependencies = [ + "allocator-api2 0.4.0", + "lock_api", +] + [[package]] name = "target-lexicon" version = "0.13.5" diff --git a/Makefile b/Makefile index 66d4b1d..9457206 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ all: build-components build-cli build-cli: cargo build --all-features --release build-components: - cargo build -p debug --target wasm32-wasip2 --release - cargo build -p recorder --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p debug --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p recorder --target wasm32-wasip2 --release cp target/wasm32-wasip2/release/debug.wasm assets/debug.wasm cp target/wasm32-wasip2/release/recorder.wasm assets/recorder.wasm @@ -25,7 +25,7 @@ test-record: $(MAKE) run-record WASM=tests/rust.wasm # test the same trace with a different wasm replay target/release/proxy-component instrument -m replay tests/rust.debug.wasm - wasmtime --invoke 'start()' composed.wasm < trace.out + wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm < trace.out # build-only test target/release/proxy-component instrument -m record tests/calculator.wasm target/release/proxy-component instrument -m replay tests/calculator.wasm @@ -40,13 +40,13 @@ test-dialog: run-fuzz: target/release/proxy-component instrument -m fuzz $(WASM) - wasmtime --invoke 'start()' composed.wasm + wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm run-record: target/release/proxy-component instrument -m record $(WASM) $(MAKE) run-viceroy URL=localhost:7676 target/release/proxy-component instrument -m replay $(WASM) - wasmtime --invoke 'start()' composed.wasm < trace.out + wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm < trace.out # test host replay target/release/proxy-component instrument -m replay --use-host-recorder $(WASM) target/release/proxy-component run composed.wasm --invoke 'start()' --trace trace.out diff --git a/assets/debug.wasm b/assets/debug.wasm index d22efa2ee77ae892be8f27d0ef85de41bc86156b..33a5ad9424b0a1d6fba63ec1fda97cfea51cc33c 100644 GIT binary patch delta 13336 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 P(B<^2XRAk2`H24oJYUma delta 14091 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

U&>8^(jVn!UTup1-

a+93^ZE?iA(O)~v)5{E36AO~|OfISPaI1X?w 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 Dd|Nd$ diff --git a/assets/proj_cargo.toml b/assets/proj_cargo.toml index 58aa0dd..6a52f39 100644 --- a/assets/proj_cargo.toml +++ b/assets/proj_cargo.toml @@ -11,3 +11,4 @@ path = "lib.rs" wit-bindgen.workspace = true wasm-wave.workspace = true arbitrary.workspace = true +talc.workspace = true diff --git a/assets/recorder.wasm b/assets/recorder.wasm index 3a7c0792546481b50c41020d8e5c1b94e8edf9a3..dee6ab1c23ce6430f9ad7995cf1f842a1417367e 100644 GIT binary patch delta 55087 zcmeFa2bdJa)<4{*dS=t?LL)3J>;f~x0!s#gCBrrXiXchM0reUe0~nBNnq5FeMFd+Z zL_|~+L{JoD5m6T-3Mgh&R1EjZ^`c-#Bz(V9RoyciK;Qp+@ALnj@A(#by1U}3lj~G< zx3|8|_KkH`^t2nS*_mUVeZ?hYSr$D*jnAS4CA_2UA>K5*$a~Um;eBe4B9iV^cCL3+ zs5z1Mw@_EIb;7bxOUlrf--NnQn(TZViggS}DAQ|>tC8Ux%9QKxwR7uq%evsaD?40q z<++z#b)}W*m4ypQ;J1;tE?gg1Tf*@K+3W1Jc9tMJL^#s2L^zZd$+j(`oUjNXk?Pc~ zlj%fqA`yXeW|ox|0^By$J0fI-F#sEXX=!P8ng|K};Xag;W7{If3fU?}P!9gc&Jk8v zM7T_jpgQ3r@K-O96Ap2YAsfg*O{=aICX@*Ce@l?a3D*&#KHuvJG<|{La>F6~4~38x z7WlEl_``|+B3WcNNXyL3Ov|wVDjLhm!l1K+h5m%d%wkB9V})&8ASD#G(`*~HFwSr& z2Z;_YaIzVOpnrjmfVaB2X=%C0x3bX$Mv^VU*$q*=QI5y~GPplN^B_zJ1J0?7cJe~$ zG=Xlzzi=95?4Em$mG&mZ66BVZRa%jR<*FaztG#P<%HFm5yj3RjMIPri;h(1b(}sWA z@=rVdY0p0$_@@*9sKV3k`ck#ql~aCRvR>WHHHqCgv6z3>%+aI<~YM=eLv(LF`+~wz;eeuPY{moh_GH()O zxfHpT>OCalO`FfB+%7BV!V5+nKjwt7Xa4>Ct0$j(?Qi0|C+QwqO!w0gl5{W4qX%d% zJxCAJL$sV8r@i7AG0k2{e~4u?$9{~K(i8MEeMK+RRQunwn|`B%R3=u6#GT?XajUpP zED_ViEb*wAA!duE;ubMe+$0_rcZr2!nwTOU5qFCZ>0Nq{KA^4iK5e13biY_6Hqv78 zCT*fM^q_b^+%A@h72Jhs;$Cs1C>NgiTzn?xig`kcd&JFRs#s4i(kk(# z_#z?xA-)pZ#Xj-4{k?d~e%k&?thc58l6|}Vv&cFiGuPU}ifpqfBhjJ^f0o;Md|VXj zOa7f4vqgz0i9&!}D;CP8NR*0%6$|rSlw7M=SkbUc69?y5oRbl=`4mE?aGgXciZm!i z1uiC{)JA0YurnguBpS6kSPk4nX&n~(NYrvgZ>vGnLhX1OSQ(uU$+5Utk#OSa+ySmK zVuYkLzRZpT3S5SxX+!hJ$HUR|(r7y0kB?^z%a3P9!wEDH#d&-zGfDun;NsF)*e;2N zo!iko173iHXeNM&XXaRuNHimwK9YxuhBCNGG&(F_)ge=dxDGdlI$>2O4WP9s=LX&F zyVjRkr3y|r6irK@N9P{S!SJGXu?XQ5Vq5?lZS0I5A_K!FHEh=@Wt0WTayyr5Iz+9y z5##`cML1EhD2R%Ip&lX{6}s0rxs~5@zr`XCCGr^Q8&pCAXa5v*Zbd3X6iP5yp%{6y z7dKJ50tmi5z;i7FpeO~vGYMF~q}H)()M?-bb?So1QK}s?6t&T^H+xXq{Hjfm8{+Y! zl@RiG9~Dbf%@;r_x!DG%x{GQ+)kcW`C{Urcfl$?6P{tof7hvyy*3DlSRWwlz$g0DN zL_QWozC1<)c@!mJOTcE;V=`FkCvGVTVUdiB!()P_5{MNbX@VJ&$-^@A=hYljjcXZ9 zZB^{${92AQZVHVtWGtd?Lh(2E#vnq5(W#rkOqpSrJE2v9)x(AufaP^=4L#wYu@Hnp zm2tj6V`yIW;}UqC>qd=?)b#<|qXAnnRRLz8-Jqn>S*{bmwqb%3bVE|%*;>$e7(g*2 zGZn>9eHfl#6x)YKG0HHCZC`3|pB=YS&;aI(g+vL)4;G8FbVNfj+h+9Hii9=f#SSEb z35P*NqPCk|%378c5MYDSvIgf=W8n}4#R>!kT3eBbM}{sbUDJrXI|_2W^#%3McF<^4 zkwGNYwG9=;>N*Yu%_w!S95-|{_?Pp*q;YGYrD~}LDsk2w%AKpZ?1d`Ip{gponY?crcGIlNT%zoaR8n2FL#5yW%)Jab!>b#uQV6)V9mxe)0TDW4aRDCTvF*!(Hb-eT zd;aizqk*IpCkAc^45Mo6Qx+Ea*~8S1K9yOIP*-tRnH=y4HNowvk5KExd^Tr1AUAO= zda_swSv~1Ce3SqPzN`W(Bn9+M9gt8yXtiPr3_YZf>L7zXG&UYFk!>fGsZ-csyW@{B zWr(U5pZ_edZL+q&m{Supc(IVPnlT6-*QBlj0sF}8>_LusjK^5PSc7!q1SwDXfvHf00ygXpRLo zfmDZ_3I>=528oQNaS;?C$hO-b94JZ#CZg%fZ;GZ(y(XS9aKMR-M>bNSXvSh!T*;O@ z9xf7z>=@J#%LCkMPGcf+Q<{e|L0LvObOQ4>nVQ_#Kv2>hFp;~s5r#hkt-%J2wXEfe zD|%Z>#bGGf=@F8tO zq51JFW{G$@vkqolush5^36ne9(&dKT8?$XgX^Vih|`> z4zGiwh%48Qfwfo|q83<+QRS3sS0NgXjG|O=IdA};EAv_fMJz{XlYRx-g7!DB`p zS6m(dt_2#S6Wk{^l+bf<8^#&^#nJ$-@|$78d87;j&o2Qpgadd{SOU3xVYV?nb*|BxWp)Y0d!!rX~2@(2})@rX?dpKpQah@YIS$LaA5g1ZFuy%v3e&<6i4p zt!cppfPuLn4MRY9gtUZ$e!f_0N~SSuWT?KvwNVlg6$Zj$jes}{7s=ogbBIdEa5OG7 zW-^B42-YAP73o^0F#f>`Q*fvmQ?MlIIN?X(Ar6}q8ioSt1{+x_n;}C_2}XwzFX(|J zHsBr`Y^b52IEInr#3XB@ex|RpLKuh=a0MYeVbIHqOb4ZMl5Hos++-o5 zq_`X=5-4Jn6kt}t*kbWxp69Cu@Z$MO=`PNN?t-3U%@Yl=3Sb_DBt{-|DD2OC63O_S zaYbzHitsQnG&^ue+%oc|fVl@k!4fBstVB++B~k^vn__5ap7^oDRLz9|9_xfi*p{N~ zA6A0xv|zW!!70iiD~uy-1n}KimF#+FI*%(8Ejn0HH^gFret1@3a|ElX)VZ4{UGR6) zc({MCqCRw+kLotFbekP8M!#7e)FGPXQjn25JLC$-^Ums!o71ECL^vA?h0r+s1i-<*AI9O;>5%?k#QzfpzZ_}~ z@c*g?-Uj|t^8a6he|Dw*jN@O|LogiwSMaaYAT#{`75qcIllZTN|B?TH2mkps`Cmz! zQ4I+rV9c(pX<4Y*qcXBptHxk&&j@O&v?T=<0_ICxpxAm_1(05dC958zU5Mv0tULqt zLP__g^8XaK0mRi*OHVxzHFTvI|985DqXUQ-Vo?L8kz+q>TJRs;!??lH zx>!IUM}-Su6fGV4Vhad3*oVMKFlB_XGOE->QIHI~;E}q(Ws9~ zpBe#ZiU5%hywQycYeI~3oRSn%{DmJoJ{Q056SH`rE7MP0C_29AU4GLffFYLx+eR*IEF#5$Q3 z0VJQQ&!=F1jVGp*d&+_r=ly4`urSS{j!a zA2%@?IK=~?EO>sEspeO}7<^we0DxFrKylqsX43OCS#U*^=P7tb#Zm)DG?9TbgN>7N z+0%J~#j`|~Sh($2gVd90ONHbjPYKL~T@`6k@J4B9J|;MNB^cl`cf}ECbCqZB0-Sso z4#stu3AwXGDbIz_|4_tR0M*c(1d|rsv5%Q3b)g0so}u}0$lNl-9vNYLwJ*X`VACk# z?c5Ac58!PLMIjrjyf~>g(ot8r98nulY~@tJ$6*}$?mMQ{P-%=q%;i8Lj$MJ2K%zns zxWJz%r6rMQvVbUqM5rZ3BHVPwp_=F@%z_k*Lu9jeuf6mJXpt?47EfmnM@1tGdEM3b z-M1rHU>8Dc%21zI60qzNtR!ThNz4swR-8;?;e4zMx|LW^<~(PbG?H!01ir zuUqMI%-v7sR^6?XE6tI8x`=m}hk2STuCjbX)rTt9~-j+Y6Qz2m~UCIMm#)d6ovQ_ zjSw*Jr^=B_xa~CRP;vV1^)OPnn5!-vvlOA&#H>gD54q$M?%K3pJC`8z{#V%Kzs4nr zzs4s2H7-f~H8%OLamg^&5r57mwQ_qx=`GVAuRSfqDwH5Ui}SMp$*t`V3QaiN=fBR^TJ6%Fc)<3Hl!j1v{O1J&vzxcXGAqP%hKGO*{A$ z_SX?HUW^UCq9TDBNepB4RTlJ#ePu06tBeqTT{Y5OFTxo}4i85U21NB0VY3z`Xg$oR zv6%6cN|n5pY4jB~sHAHgI%~X0yfESD$UQV=ER&=7a6vfU0=us^iDCJOw=ku%OOO{0 z$1=DKybxX_fbHX`AEL_$vAWjL&O_WC(tI*S%BafLm^8mEC{j42 z>b7S$1k}L3HN<}(FFN_SH3u=!6zLT13>K5Q` z=uj7XLSFy6O`4dNINF@DmhnP}!rqANrmYQ_yxMRAaYBNo@sZ1VWZ-MR;{YTTm z>G8}KQ@yitx^Qr&=bhKb$ojPbmbghX~JLET?0)jPO6MlGf>0pOEox^*Y2 zB^YeU!%b+Cx=BX`#MQ^UVfg6^s%o_9Qz1x6BUS(z-1Y zI*u9wPSr*fW(gIt)@!e71o+8_TjO1|k08wSN<|3xQ>7(IhxqLG-#+=D;#w zUQ8&kF%ujH;YjjZom7Tf9R5EGfA}n2JG#0`ILO8l9y11Dutj zk9Z41l#HgGKD!cLt{ZV4VJjM0Y*V^#EwFrHbT(>dUmQz!*08(-wHe-t&7y;J3$aYS zsNsfU8IXOm#{xRntY~DaS))?QJeha&noKrNqye(`XtR#F8BAQI>z`ILF-CK?_pfGc zx;fDdkW4iU++ZyznvSx5XvmmcP!|B&R~j?uZ96g#O9aZWU^T#)12$S|upwwpb)`9h zr|4S+cY7g~mL9}&acdB-Y=fl_& zr-zNIA!iL!&v)43lyE&w*LJA)7G^QncC4o}dbLhvpk}vhiR}WDgmOxA=h|@%j4JENmbMWBL@T_?aB>8>pXFGD=|aW z14`!ssbD1g70N^*yo1>zh>c|s4)=om+F*`%voA#nSPRTBZN{qZ6E2$>3)lin-#li2 zhjNDRjp=q^#$e&njfmAUFUHVW0hn4GGU=L#!PgOKq8*wXixzHbfVonI&cfLX|pl@1yi>B|VD4@NqW zKE$z%_+<=+lO7Jl4@}Mu9E%6UFAuHq0xdTgh2nNIVi_Q!QJ0W6=yNNU#eK6(=7Ag# z5-@dAP7B}~#3Oo{HNt_GES9N6#GPEK6VVa-IOr{^^e@Jh!PLZJbZx@SyJ5qDFsoh_ z@NGmvESp!dvwL7~y@I|FCqzqlNU$F~B%y^XYGF^nM64*ly+l`retK%8;lG2~S|OEH z%^^e*aI;84KcJC-Q`6Y|3f{d_g)fxo_(Z|}&9q=QB*w3~L3v<-?g#_xbt5*8R>s?R z%MpRI+-6bh0)#(Yx-tr>nN*5up!*~3Nd-|96MfW&8yE0UK1vQ$DsThmp&nzm4M)A*Z6r9<^tDbi<=betco;{ze zo_8VVUF^)cvsZ80>-Fh1ie`Ep2eC+GEb=B&K9_iXB0EweLcc5~)%6>KofFciXE_Ia%!d6j#+)`&B` zUVYo-qa=LVD*3zp{OkLU#pvGYdq?ML-9)*Y!k`j9 zYntV~)h{cXSUTX7AgfSiVX+0`f)?&ASxzr{L*00_ z0zSN6xtm9`z0oId7f-ks(pE2TV5I>_xG#g{I541M_h@d{z$Wy(mvvM=&GlLxH4?vP z=N963*Wv>F&K}eQzq^lWhu;ZHTH_aMDc-UrPH^v+h>-@8WJtWx6vi{Ju!rCiFg~H1ET_`@V#qgnS}@qSb^}Qe>*OC0!P|ax zw;Gx7!xc(awub;U)K$YS&;<|J;UBJeS!J$w_0S0&rm0>*z_5#nbsC3` zChExH#byA07J}Y-03(Mt@}3$#%`~VM#xVd^=!(7d0Q_2cT#E-Va(J#c`M5e_YWd3P z$K??iLh;6->E09M{Y0ZB4+5dj!Ru1)PVV%dd3R+c(Dww zi&&Tyt@rvKe{@RIGmg(oR6~hRO@k6Jzs+pO;DQrEh7E&WLEWTI(;G|u;+<&5lPgvdE*Hl&2ks6R-K2O8!4-YZ1 z!`M(Y!QAeRK2dABe6Re(3!w&ddk0UYcWWr`^;6t1?p z!Ez?wc%Pr-&RAnWvB9WlO?&If%WGs}GnNsmQ`*+Z3{>LmQ(Dx>jB-s_8E?}m zEijDTr!>r0a)1>ucG`stv~|M?GMR>9$4+H!*Ynh6DGdQ}XamzCEus5Pom(R_0Abl_ z9cyF;!2ft!>l&F@c+;As%jx$w0#V8=cf$|7h~m7YSe_ti-uB5&z0etj2K8!78fpbq zKcC##JL!xV#NzK~98*`hFfQ=~13W&*+j7Pr`qaxk^OnGrz-FPk4|BO!Hm-s9`kDE8 zy8Epu-NRi6mb^30$VcOO;|l3*uirSAe)SUL-Z#*M+@4C~=dn^}4Yux@PTqIdNMW0cZC?+FRG=dEVLixPRj80gY8PJUBF0RfGbc zu3PxYOFyUWk%p1Nv8-$aUqfylF9fP5ang++;KSn^8SiiB45rt-N6)zkL#Y3^<4tsb zw{~T0=RKZ2!{KL9$TFVdKXqoB&djlSBcGpFwPFtRdb%H=_aB@Iiu}wZ)S&v+|Jl7t z+t?`z%jT@*g7K`JbT+SH=UM+2Lj!ih&X-=3b8kLUV>AHHZ{6Rn9#liX#IN@5xdXbr zrWgq^lb#qQLL`_F!A<8$ksfZX$R2WD5ybhj^V+6qlzZzZ)u)%emFJb$eU;l|ba5}v z^IqFan?bUia#k2;UfPyk@g6*X2)*iUy0pOCdtUoYh?yzb`+}3eI}P+K|BRc+{IlSqB>ya|!9TxV)D}aEmF8FL`TujAa+x>z;=KPL zw_vYk3b$mr2DMp9(bU{><|Q?_rO12ZlF@&GV{W;0pyHU}@M(Kr(Aq1xth3^j<<)4F zqGg5}4YSABFt<(cHOzMtm_s5HeeJ^B@uqj}#3Xl=)!>eICo*>&n0QF;=yW;jk*h9e zJ@WbG=Q!1*@jY+!6@{nk#GP8kLyi{FjBL0$W@DTih_6vRDe|A8Aii$#irMwgCD%(u55mc5>Y%?go$g8uZ;Z2PSBqZOEqZEtBb1`hx4xLgx@!=DuBND=Blz9)Son|ioQsHMQc0nj!WZS-AOrK*3~)Sg}keo z7tXud*BGB)J=O4nZ~uG)=CS>I{mdM1!Q^(;ilmsx7KUBc`0V2Ry=lX*lxie?NGlH! zm)=$$=KZgDNBw;?MsWAvTNP@|s$G@p4Grmz(tglr9AUw_kT%bG-fw?@;xMe*K=Z|1 zqs+M1SeiF`Le%SZZA)bqyVC2PcdcgFu3%RCx+JqMsllwLUDp%<{{6Z?Vb3h>;{PvsP z5x*Bt@9Z_WIgYCyHxI5+{s@eL>|9OyC7L0G^A^h@`=($Q!z^q3yiF<(z$Ej6 zdYe_AX0z(`HhMd6d&LAagYZ@`UE46DQ}w)H23F_xeEPs^dwaKP_zxypSKi)_c6m?T zej=?~nK`pH(Q{sxJ6h5A-pO~Y0Ka9<;z?@BtYDIw>1Ol1l!1k#ZzieN&bom<^!Cnb zf_jNNU-P!jzB%Ro4S#;4(BLfhPV%1Y^eMLhY9P|sH;}45ssztd1n);2gbavjndQ#% zdfe55wtJ`D)ugrQ8xP?d{34pV)hzvl9)y4J!!)S9g&X#*i=bi_m zJNKN}Sh-x#j|lf26UQnKzdR{JjXZHrDZS@?drzNJH0Q6;mA~Vbd5?j+0RgZu7RMY- zV?650aRdLsunnqsvFIEPGmZNqqdI7DZ`6HFLG4TLYXWF0=EZY$PcJDdtMH_o1O5N~ zyc@vWm)zU6mCoO4hQW)KYEv*a`I_}BxGd0euijgfu8VH*ez~_RDz}+G5M5k6zcYUC zo8K*aJCA}lB4s#xyieyhAE=8j(JlX5j}cEV&bBUjO?#>A`f=tP4VM5Y@G@ z!l(&=X=T8{VRw)2Y^JyRzGDE^!TSa)5aZqj3+mu%(gKcDKe*s1gO#5(R>0V35?I;0 zfMeM4`#a!w)cx-pNmF||PY-tf&i$FCq*!2AFH_;%VCU~FZ|uUB0QZ`OjQhJ6UV~rf zfoAya^uYP~nk&N0YRnhv#S&?-p)3(A9%zVCuRSoV$nXwIsdoXWEkVA@Ko#CTrmOUR zu&s%ttWoedJ2iq)Q+N+N*ub0hU?$p}_h8{*U+Ou$s+Ylo*MLmdb*pT?gH#3>wcQQ6 z#7xhAC}uibqLaSW9sbki_a~m2w{q-5f{JE?=&YM`@W(e*oQQ|?pxIRpIj?&+EIQwW zwEePpc9s z-pHN0i7e%f{3kpM3D>-f5v|=``J?r*Ci2CjUG!>~TlNbx8=eHf;xp_i?;qr~kRX57 zq4K*Z?6?bS%hy7_g!owx4BCnjV&3~!-m$a=VIgwmWBu^^!((y$HdwYGSazGQN8TMY zT%lS;P-gS8Q9&dSk4Y#^(SG>|+Pm`F<;z7(Q%Ja#s=V5%$RSYSZqN;Gf;dU$0?OU)}=4VB>Fuwugt@{D;=TR}>_6$cu7Wvj#Vqt|BD zGTPyNu&Q%Fe65z|c)3saB+nc1G+tZdUG#Kc!`C~!WltBSYg;wf`{d~sXyf41N11;2 z{N;XcT0KU4tM2q)SuS|fQpg9=`(ZV=n_E$op~o}#S8s4d)O35N$(~hlL7}gtu&$dD z;6^1S3C1zYU(=*|FyGdp7++;MiJ$|DAAwe{jhc=E$|+Gc5%a78DQuIs9M;>V0H1Fb;Y@5 zoW<{SVV8!LM#L#E_m;1lkf(FB8?Ds|Ua#OxDfhZR*QQ#F!D8l>&wZ7rJ4<#KWM1}s zj~bZ)EYCmxWwl0wEM9os_`(D+t=#KZSx~K1vh~UdqO9EeqH=Nr1v&4yFhdIQkSK;DWZdym+s;2~E5-x5>?l_97dkP|Z8jO+uEp`{i8vx7YpU zuK2y^NBWT`!u{sN)b_|;=gx^ho_%jivd_2QPd zC`yL(i!2z&W?!-YPyyaBQTCXZ{#sK}_Jr5!wX?-7<=!o?O%^wod-jHYJcxlC&g0Xg z8%}krHJ0Y$^%=YeH)t#qja9Ny$>I%j*#FbP;w>$uod}Mqiyj8Ou6kJf`th{L`{VUl z_?_{_Wc-FVsy-7NJK$#d#xdf?a*sB}7>>eCoHl0Dc)odI(*$6p^X9f~Ft9SqUGf_X zt20B}9mKP+f^XbsKg*lCc}Q(|Te)rX^W=wMmCQRcyd`ffJVLiTJ*8#uzRm4xZQ`CS zzmd4T+`IFgS#=FSx~1}|UYB?8r#rm2-;IhH<=#*4p2*-2d+!WJ=F<0O@LkXMdp1`% z<%K-nWEJ8)tpPS|Ce0o1H(}B|_WlVmRTM#!PL%Dct+8+}9e5$ULmB1~y~I9fIZ!j4 zn(Km1{HcT&t1l=NAZ+>v$BA3Zy|y2=_6~f|R$rdLqbUFIL~&cW_tA%O zgSV|d-ZHn21(D9&I#vDl^qPE>#UyO?QM)s5V;01$23x<<3^;3iBq4{lsitJ@FfAHL z?O=m5W(x9zmUrjO zW6q3YiycMGJck#J=XkemA9k*Z!{EJh4V-`RJQl-O4{ii(yVdlal8IoTkGQIt*w*L5 zw>6ntepgWaxU%;btH`k977Z!basQW%T+O1}{WRS@b_kdT%5(!hm(&Yphr9h6-U(mz z&Q~@=lqh31M~xL5()5VDrC+tEB_F29UjyLpbw-048B;1$ zC*5jftkxOrYh-+>GYV^D+_dHt)mBY(-L>WrBU!973Tm|VlFl%k5?Sp{c)GwV{I*k6 z%jgOvioCtw9w>TX8@vAu@V(v@-xkwCZ|S!a=qWG%-@W=g$~*|w6D?Jb-Quhs8VR_1 zx9SOu{FA;2;q`Ozw0tD|=H2n{!N%*YG##=!(cbiZ-gp0Q+jJM}p{i5eof`BI767{K zeEiS6^#Y^vFwyl_^tP+MAU?ai+21wCl>5o={-(uyv-joqF*vBZTQyex@Uh~Na__(z z_F35(Ubd@+lK*+NdapgbS9aHJxQfwHW8&?7yZgn~3blB_-L20uwfMQKl^OidQaqww z2oMhqv=BV4^xplU1y=rk`yq`BXQ~pr|s+8P4jI?2Zj*pjNpyI}TZD1*W+1JO6 z@@ox@z$i=hH!|3tzSkSKza`4uxc^a;v|_JUe4u}(FDv!DFAn6ItjfLKyaWAF`lAC) zlSv0uQonytO*d zC`jZXX3KfXZf($+8Cn-26ARFO#VtC|4)WmC`g!l_Jm?$d1k~eK0U1C))Okr@u&c+< z`%354MZFQaBBF$T=8rlvCukH7s-JgI=Osr0=S~Sihy?-g%V&wk8EVd&FXMu`(JpzC zAb<4%vHtn;CP7_08Icn3W3^PNhm7%xk!)TRFr%0|Uy%ZQCU*#G)kY~`cvf1N{ZjLE zDTBXArsb@YJ!~qZ)$(+k@(et8{UNWjsegP8*c@sJ`vN!;QQ$nI?-`D@eCa$Zx7pO& zaQfVR3<37X?vnl5Q4bRW!t*VEa5{^$+VyL>TUCOyU)~U+{!}iX3sJO=@v9Jh;8iI3 zLlbHyGsDym`A3J7`FIdVDnvbOQ)8!NA69h*7S^w zXHZ+JkjG`v44NxH&Y*(&t62xCVY}FWjBVJ?8!|JK{D%c>ckMDowT{UAddiDHlQUBu zmq~q;O;c@p(Ln z<*)Byrh#{`U^OXfm}i9|oijte8Nml)GD!+gRvvu{#lrTT6l@-l#D&)C!X@J262ZVr&up4DutgcHJ0asCnUI3l9J4rel zXl0#xG^tn(5lblnw!#6nv|{%N1k@8HQ6fszNax74^{BAJYDSMv;46OP2SE>F69JSU zzcPot71e>eYO0JJK?ONxQl(z({V&<=2s%J(W!L&3@)~(sed^7lBZD&252TivrS4FsOD>HETJFnDq9tP3 ze`78cw9!y6)W!Yqg$u)Kug}+Psk(CRmHADnNkYdY zcu|bsY@y|aOOuus4C86jvva>01~04Wu^1rca)xt{8Ue>|bX6?d^I}$vN6rmG`8}hX z!YjS~rtorSJ2^J>yHcDVr+SG^1|8`h%^O`{&3% zn$f8jYt2Az*+DJ!W$cY{eR8L(B>#gx++Z6q4UZVlHJi_{jp3z-74Nh|ow=&crURUS z%DdHt|GFWBgzz3dxxP7l0ZZ{v6qfeYiZ7!uSh&T@m~bnPj?)!56||sM@{2h2*4M|! zwPKl{d{ht~wt&$vdUCG!rJUUYRkuiddhRIbh@piP)!PI)ju_Y(-t&xYTK>*Cu6KJO zjN8ZZ^+M{@P9q}Zt}uw;Koqqwk18`QLhc%kkWXZbmW0J|IZ~f^QF54ua@tfjo7I*e znfg|wgC(%Uq4fVkGnS}Yn|D4%YVb5T^5kzVsl~C?iq;8PmW>xcS80Mbl|@ZRuB?({ zrgM~8NqIjXw|8zU8jVjQ+}D zH83$c$2U*NlBcyMk3N^XT2n!mssJ%uaZt|cPX+CKT=Cd^sFD5V62&mB(CY@>;qz1F z8B6I%xocDcEYK50)cR-**b9p^w<5L-H^Xv1;%?XxHR#!3Fx**V z_zTWXy2HqoP1_K5B+EW+s7nC*mi=;48)|LhY^&s=Hq^@5uElIWi;@+YE+nQ(O^0eQ zf^Mo&N2fD&I{Vb&O)WKu!+?~urPKd9akjOE(fmw;{Tl0`#-OmEZ#dA7xF?em82b+! zq6V^Id%CLOJB&qe3Y1s-z)jgMA81ehdgW@lr9E}P%;7+LYSJL7vo)x3Jd`EdccA?4 zb8liAM=kxP&TO;^FAZ&C0MqW%lr4%1p5Ed?ATya=<+r^QEx^xxwF5PyDe@m3=o&Z^ zXLY1Da3*f;Nd1j7!MY#L1S@qo6Q6XX>x?t8;(#32iN-=vtm>3>Ca?;roQW?x(Iv*2 zxJwB${LnKxQ}^m=3p+zYeJwxfOjpuoIjRc{)*S4XDVaeK20TG_y3hNZE?0M1cnenyVQw&a<)@UiG4k z8;mC2SCNxmMMR=De+MAVS1UWTOjg&DX=QI@#Q9uy z?n=!P3OW?`Rm~xaL(cI+p8!uj=u!CZutiuA3UrRiQXl+sSnfL@$^~ z!#9F>2V)2y*4W5;55weG3SO7`i5!5ZUSa#j6;sP20tpXRisYPPI@aHu>+<5!r}DdE zI`*!E;c4OkA*gqk!j^ z>VT{H`Anl(;dkQ8x4eChRs4*gWF=}9fxqUKE;CznQp@c%eXCcb3=isqx zDCf$zdQqcd6G*PMI;8hhser*-+UOvp@P@v615-;mp$p~tlPcz_{=KPH&+5X42T|D= zAiiPjx^4goU<@Bbu06juU1c=mwEJY^KGc<_$>aLav9v?Z?Sq+Gx%{RNMbFS85H*u7 zb~7T3B9PQy%X?+9vhDSFoY`@^-i=%chqlbzGk;UWFa3coy%lJwccVPFFAV}$J=&M9 z&s9TFUw4BF;CGY=ch(fyryn(L{yXxNQ0UjoB8xF@9BKDw*}EUMgZwUM_M@hmsu{N& zx^h)N>S3ns*pFqD7yEaXn_g;MJmUpbcUxqvKQ*wqk)Hi&MBphHFDJt2iY@=8-V(Kj~F51?ZssyKY<>18j<`X$scW3KP;3@xD+dT+5i z-M1?I&KIHH>to|J8yG>L`yPH&p}&svFL{3nO*cBrs3+8yJ)ma|R+gZzr7rq1Dtnmx zVk9;2M!cHV&qwC2CslKiU=oD)bls~aGE9)*wQv-vXF1<6S>T54lsyI_NVZpAH4q{; zRn8koz58f%ysQFByc0Cc@$Pf|{kRzTDrOPAZ#j(jjqtwZW3Yfu?lZFPQPjCW2mbIe zoKd`aXRHbQh51p(weqy1sFOdagX`rDgDKiHs8GTc1_c%HZX49taunqmpq3pPsI{p; z75)!_x@-`2#_$&oqJjB9nUMl$k*JD8fn#B9>Zt;S`FLXxkixILb^c&H`c_~SNY-~S z^)kY_ZHl~pFvX5M?BKXQcY_|B3cj%-2#anROkMQ+#zmvRHM|qwa54T>n)-SXkiG)l zwjV+z4K>|xiwanMQE#ntevwm#P@Bg4xNS%#zZM#cd4|a_N0ToPq0Ws}RTx4&Y11#D zf!l!WoTI7H5S6XofQzq`u;4jAaeHxgW5HV+4F9V>Z1rdjQd8T)Y!hvj9u2|zSU!F< zHP$`4yHjfto~i)3w;xU2L5qgR(7+~1TJUEA@gR}L4C{Og?Z7?8c8$ z45c21t!4os1BX(_W(OD`-uJ<7wi)tDEp#F0fSfs$T8+?U{K=_$$r`_ECz|e}86XnZ zW7rbZ)`Dst#N$jTCmU^wW2t?;T^bP`EVDuC89CrsY8b1LZ0Z}x<|0^jEEO3}pI^=% zw_bk5k_)B^pq`p8z{4u6H!Wb&s14>&mdbfXesnAi@@>OovgNQ^oKy92}{^laB=5VB8p*FlP;1lYl4@GA@nK~;?pDHHBFK4 zkED{mXbH@2x&PK0mR$nuSH>64brbFjD0B1JB)a{edC7?slOK$wf6;BS@&wh?A&Q+s&&hcwk{iSV)+k4pxmLYU z0B?Pp#%zpOz`hf~4qwY7PlDO~hdlcv8VMin$&;uj?r>@>?UUiweJ#7348P(Za?;7v z&2ZEnJ*!($vF2n_;iu0|p+S1C;%-yi25hR;MYZniOOuLY)|O)?+qKj&@!(o=Ohnhu zxtinyr(&g|_Qj=or$Nuol~qqyo<<#-Xs*RK=D<8fyxQUWbvxvNBxkIA1P1lTL`0F)N7@Rw4L|GrwyM&pyISGl*RDhm4QIj=xvsm~nI* z#Q%je>Q&x9B}be?>GZZd z@f<3m`(@%BI%?BC~5YyC_P zjM5ug`tTk(_g#I-B8Nu@byK$cnO{H&GJ?OFOCO#p>%Bqs_isuBhM!wg zQm#1{>lJ!9JI)1jzA5XRrwX5SUd_TY&!ZvYwkfjic}nsQQ6wfOolkY?5qZ=3h*vx! z*PlTGMgvwNJ+30P}MR?b!ZhyP{ z{37buUQK6VIfN<8OKEJJ*)2gJ$!uB_yl3${*{c)|**aNTikQ)-6}ObqN<4um`&~?H zTg+o^thN&~({hKn5oW#zDgzeT&4#8F6>36!nXbP;kgw zCnfZ0y!(;Gui3-=7%iw`#bUZ?#oTUXNZFAn7CZGNzxsTKxlHK*ABiXyGjwGxy-x-e z_wc2SIi5T1Zd{c{6CrmGx1c@?hPIKjTi@d)Oqkud`_!HO?nlU-p=*WQGIhZp)WfE2 zz0w(S@A7k}>s<8BO`4Ww>0Ff<0;k5&iZ}}z#mCO@Qnx2+Fba#r3WmQ}d|hRDlYMN} z#iv3raVi#yd_KxdZZtIBJqFDei}&E`U3wWcw>RKo)@9VUju{+p^1-;}$Cpuo%KZH@ z8f)J&CHFo8zY)lJ004COZD{xJcr7kAKXBK2v96h$S#j^^NC z)UR4^(&W>nyW(2gpidxh$cw$O%+R0Z@vvG=H z5y)WpmN2^2$K?K;@v}>ljDHxmm+xOiU1Dpv;Q*d8zEj`t(C~pDW$Q^4ZRr5s zU*frGIW>)&_8k%-#wN6rC ziuj#m!dr5&v27OPkiP>BZ#7CWu!fSd0b#VWq_#P`zXKB>o z)}XHVMw(d9(3mt2aARw3H1z%GMr>GmQQmVC4T~xU=C4*^G7xYCcpVUFD-gPwih=>* zN$y}k18%0p%7FaqW{i_4jf)$Lr!N%|>atwgK{@rteNYsARH0E0=)pwNEy&5Y(9yMy>785X{lg69gInol zHRQ8yqXvhd3sy<0(glb$bXjy8O=x83Vk}RRI_+i{>I|Pj&o$VgIEcUZ#9ukXJDrgr zo8C@G!>c^+c4`xiU_8$2Y^Zpc&!H(79MBQ|*5h8`+<5HsDlR z*L@j83`#_~`iJt_d&zC56B8VvaGfg=f-!3#_Yl5t zz(C?T*hps*>bpJx`Y;iHUVilewK{7n!>_oZQgZ_&N?pOAsiA>j_~&l2hUMewMR&#e z^<@@6!|2X^ny*wi+Id@{;}Z26Z$_;15hvgy?4MLz^dP-RBg{@j=UYzqpGbf>fYHDv zyH)jC*RoPJnu9ScD|k>JDd%#Yx~0> z&8IT!5kw2Vk^LXRR)A0CsgKYQ#Cjfhgf2&7gT*w;tW0vi9qI&z%$X-AEvC*XE0eq* zY2{+-Mf2o$iz#?;nAi3y>Mo&^sF_|c4PM*HJP;47*Gpo0`Kg@tD4lL5vu0F+_ag6- zKRrra%z9k9`<5Qh2ViWs6Mt;zJr)m^ zez{^PHcfpacP(WM;Q8m)^2o=iL$Jq-w^Hyb<)x2N&rGw<_^vIt=Zgm3!dKJe>yJ^B zpfK+R<-$KcMqhMU$MGArgvakI1#K}qz`i?_@!v&af&?#XP?pQka$xJ9^7Q3&avqq# zhzn~1<_)Zj3g-v8X}Jo3?p#i73z7?i?9jr$;3bQY+d4}1rpO~7$Cln39=mI3&`2?*;(%2P{uV1A2 z&-qa{TS*0Itj|g;7~WWMBA-lvaFt)=hE#)^xcrZWgzv0qyqgyfLAb2S*b$ue%kiWERPfhpzyED=Ms zqmNE&FtA_b^=qiP2_DIfGVdAcY{DRwa^y3VOTWq=k|h?`UgErG=uA^lkZ2~uexp45Ijqb~kqo(E=!loe4fSzUEc5p-4fi? z*+@fz8}|hS^?sG3-=zlfh8HLkE4^t5{8V^w^b~Cl}i2FyY7?=M~G&! z_v>Kz{qn5WsaG)Yg|AadRa%AQ6Kknqb`JKV;=`sO&UWpDYIH zc=K)QWWcVJ3*Je#_CGI%PX9`4hb~s!^BFDMQPzXDv)0_f$->>U`Yy#Vz8n}v`NF$2 z9GsB-9^Fqb%VqD;7&EAsW%zxn&}$X&Bv))zrV?NJc4yqiEa#Xf%d~<*g_P+2;d#(s1QEUFU$@`vFA#QJMcC-B9o-4^F+W zKTw04bh+}W^63w$g(<-gC;JINYsq*pzWtdx_gW z3h1!x5G6iVC5pL?ncPdF2B|*Kjo>?o?hIALFTo>si;T_nN1@p#p!3X4s{MSFG$jlt z9IA2`7#+8$db5VWwN|Rw@)<26S|YF74$H7a-oKqrpd}T*Y^QnY=F$9}dhj6ff*mx_ zEU6iIl11)NA)-qzx=#rL?@sv@Cz# zNmsPdrmY4wYqF-C^&RyyLbuIt;*;-afl=pAZ>H{DcA zc%sWpK{@IN%G3MN;@PgZk)HbI^+iCngt@=Q4k5{y3A@Z(V-!#8z?9b(<=luxR?+&@+NBB6iWZ$3Qbj_CKKT)4# ze=q-p&0Bt(a_>*nTiiIcqWEX{KZW{1Z2nXp_F5s{$j@Q3!eGw}_gQ>jao;Z#u2l{0 ztYQWN4o*>n`)V(dq6TNos8yBTo>YVTREfi?!JV}?GDVZA19ZUr+DkmDRVkNPR;2`R zj$p$v;PQ}Li8)wEF8qzM46m-cL&3aM-trs847>YjTHT_(nkKPA?7>z^zYX2pfr?Xq z$EN-wO`lCV(P+RF+1uu4RD8CVJkea6JixXHPtcPS+-?x+R?gZFe}9R5WIsiVwFL~y z2DiFw(msaVoi;wsW9*~cx1TOIu==K?;<^L0D2#SvA;F4$SV)`%#r{x849&p#yKFHy zRIQ3EsVBZLCN$&*N*R4s5mMkeT1_ce)5(XgT<5Tr6Ic%XuXSBht!Wm(kbFylH;4Er zG4;A0N5^Ie!5-=MZ#0oP$!=P1NoafkKBQ-l2dqN-pFEx+UaptKx(OB?31slyK+k zp;t9HAve%+up@^k;X8~WcT?@%1ll&_uB*MoiX(jQAKjQD70YtP<&^I+ZyAU)lcpt; zO-rvv;-u;ZEk_%)hZ~78Ndt4Rk!VSG$(DKINEn}!^F)eyyD3lj#s}tYU7l!@G)3R# ziEc1OvPEMtw9(xR2~VqGdTe}MJBp1zb(}jZrZyH|kp{zk^n2yI;x%VFCU9-O7>=p@ zhJ10-kxGFg48ncP#~I^;k`e6|~(KY8K3FCQj6wT=6~23~n#eM@Oc+ zUQTW%nhsA!JP_blWq7iQ3yqp&WR6UiDw835*&jquSbot=;yfLs^?3=- zs^4sqm-1tx=~23O!*XHw8NaolSaL*o;DsM#LFkqr-tk?0!-hvEso_88#btTuq2$m5 zHVj%t{1)L=eDIaW&ymGHVxo5|A154lj2pyk_CZSy^t8ChHv<(uA8+!DCHWX{4Cw)( zeM_IxTL_L1x-CR2M2RkJA(q+5%xx{En0Wb{x`j$OVu%(lZ7n*O(3#Ev*YYQB0U2_4 zwH8IFomV6l7&l~_naazTi^N)FCEAFIIQ`H@#D=S38T|m&keT`r3IZ>Xv1(joc8&Q@ z#RUohHRYLYg}=!cG`PL3=#;7od?`{dFXvaN2dW^+e&4ng&5qZoW>tU(yqN`4RDmDw zO_g0UZS+g0CG|m2TAtQU48)ihv=bfcst4tx=?HUYMzgTc@ku+;+wi=Oz@x)}=YuAa z{J~p|1C3w+40t{$FVAl;x`3Q>+lv*xYg=_XSkv&9Ppz2HQ8cGBG+C+@&#Z3ueP4n7 z^FvzqnpqV)JBd+dF5~-Trm30@`5EcedoURq5%4Wv+NA7KQ#4W4t%Z1215Q<~c(w~H zrtc}6`L_K2NO7@A^W7_XVOKFzn>Kf!DQCPvi{~dWm~djSvC*i*ZGKxt-NYz8TXm=1 z$&;08&zVcFn`nnw?F-#R3BA0!JERYHt&1T)FIS8z2E&|Qg${q}v+)}|s}1!qbt=B^ zAugtqOc#2pC!EDRv?jc)j|UkiB0?NBYTNx;7qP1pskEw;Df>hbA?z%cPxcZGjL&(O zPR*)PvrJT}xlWg<@0Wq(2U9AI;hK!3sc=ZQ^VJMFsJGatbr`%7sC0gfL%KWtGa2tA zM)}UuEO|{I;Xg%wP%h~siV@EJypQnT%ChMWd39gmzt8cYe7vtJ@sGY@F)f$3_YnK?rf9XcKuyiEyx?o81}Ls6Mw654VZD z_NpTGpBW{BM<;zx<__)LDbt}%t*lcb`U03?B_eJRrh!pCB(|J5K=>Pu zQ(&rEgMO{(=ZY*r?^PUgl(@k*46|&On%n!bpB+4eSTzG;mlI^|)OGxjSr#H={-cZA zs%9mdTUWK8^ymn`%BHG0hpAF~4YfbyN!j!m(cWNf&Fk{DqeZ9IhVm&(=(9D_^Yp4# zL{(i?t?KAwM5nGbtM2+vu}#!e{Z!z!_pTN5={gW6`TEdyL|ju zahl1RwL{h$Ci)f{K2|GY{^TFt93BZsx_ffsFww)*TlTG7F-)}YqU$aDmcha5Eq04w zxQy&@7Zyz*YN5PuWG?WOQ#&pz!k3FI42pZ=P-A?Ry z(ce5jg2!pUmlqu`^2N40{9u@H_9<5 zh(frgSDzrR$=P$K!0rUzr5{=MeZ_$jMB5D6=1kF*vgH0VM7xU9&lIEWiX~@@4;y=x zFF6&7YsC$t(<{GUZ$*|A%8bq8n9*ceRtAm`4uRv9bjNCjGnm!tm2%$`*Bw*tkHPg3 zDfj)%eaL(ArTV!S-s0e%+qEq2f&WgIf8Q*c_iBnuEZzhiH8S_BE`GENVMdbd? zqILJ5G90U`DdWSPiThTWj&&r?C!6!FICHt@aIPaSdQtMZjC;`YgGS%GgHlOqEVZJGZ(9aa~+%uaArtOD{vHv z#>-3I5seasNb-AXiR)H4xTkJuj&&~1g%~X}0Aj0n zj6Cx_(J*uH7{{uQ`pBY%HiG|xN* zw+c5h_JPPxoP}FPWAO=&#i;sMNTa?P5_vSYBb|GhgEMQMdvIo`7URq#za8wr^;1c3 zHtx^C@i!d&=ab@GT%U*Id>j|xxR9yG%*=GT2uCT7@i;EV@iaPUjC1vl-b6YN$4~zl z_pD8GPL$$95l>u#YyRUl`M4CvR-l9dECjO`;(QqnZiDkDRJ)&O(iW9F*5$aq0>_m& z`1&dwJXro)dZLz{r*Y=AWx}!Yp-Lb6P~`TSq>3bgxEl9<#Tf=;{+WyV7@919_)yeO zFswd&f5-J|^zl57H*tK9<9i(YanwD@v7$KIHSegf$5PSptNF5J(_NcU4z+wLm05vxLYR z*`ZTiRSgXxiJgFeU_eB`L2!dJ$nZeNaTyeF#SO)A#cj}WToL36`eaubl}+Avy8<#l zmG{T{+Dme>Y9OobvyxnI-Uj8OXOFj$}yv)pXam?eNwv;3Wb!L|TA!!5bEW zz5%I@L!XMmCd)uBM_RFc;iuwzF|kFJ8=dLMrE_N>mjPCYT>75}xdi;)$a9dJ$ffVa zkOS;~RjvwhxjYwE@tdEEvAIjZOM7dOXCdE?T&`{x_+9no_wmrZq7W}w&D#s$9Le|W z6={=hLBZG@w{I(u%Zm3Smj<6gF46uS-uWrxVC!Qr`5}*E3l%(kq-SqiXza8+}n$PD6wFq%+;lr{9oo&Pi=f&7+xnQBOI#?S67&c(e`*Ea8aLW_@j0tU`Ik7hrpKCQ{%*K zCp@F3s!{{#$1KSi3`}=aJE8@nsv5Kcs%|DGp$`7;^{Tq22Xs9U@OT5#_5Et6GTE$z zr&Lwf7}434R&A`R(m$wjM5W~f;dd3`Do`-%2^f%g5ko$o<(N+WRQ;CK&gB=a!v8eC z9p^;{M7R9k3B=zrkrCrY2Srhx5s6rSOI1yu5sVtTd6}zrk-mKS8PlV)(V-g0j9b&g zkys_V6*M%*Fl@&T8vclFL_(QYUSh`kn_i?_6=rM}DjOb6Hv+21R(-)JKqr({!%7}a z=;$KMZ*{Eea&G*UnCQir+XV%KXFD~ui8%Ab9VvnX)XKru0zo@s$*J@?y5Ara#7fQ(kQ?jZhEzvLX4~u-^FLs%?4vU<+KqVX|poS&TNbD&nxX!GZRZuVv zfBVNOD`S<@vS+KFY_lejxkV&C6%@b)rMjTtLOF@J-kR8aCoDlX;h?I|52$k-pNs@u zvqMGz*YkR@0?88g+9P=W6Xc#pgipDW%a4e@qW26Ql|;Gx#u5Bh)`yiO>c#$}B1`mD zIkPbqgIPyKhA48EN6tPYQu%|UqP@6km|L&iF_ES8llA)Y++!kD6qmY+RgEc$pFf7D zRQ-p$5^-E~69Zx{Gy1sbCkBRGX2)^SQH1K51}8*EWe{hc5F^FloB8Yskb5aGh(bVo^L%P<|-4o(OLX%H<1mQP2w46@j}OB4xhvG(d}nN2W1Ms zFEvxw=FvnYEEPWdWX|R1LbNhR&G|ruDc&scEVw z;;|7PP9$KNj;e)bUZUk)C?YC;kz|Qkzc8sB5Kvc+ zlxIrVzQ?7RlMH`{e0^UC08#gguXYuS6xaLrHb#3FCz#>lMukTv(O6mn|478idr8!TZo=Gy%j0fMs244T zGj(Z3t$A7#>O(gx1upkY6Y4e@G@JX&!8Kj_kVZ9qT7ecI4eXRve~maqGV>MO$S%GWoQmw{i1!G)8%p%iGZ;LJK723fYJEHUpyt^X}rWX~%T`lxZ)JfUNV>(eURc{Pt}n~@;4>sIJhC4y1+`*=qXU34EM(As(a8lK&4APZ1xv&eG^%j?Rp&&j1y}JutiNn6ov-X^kNsag< zP7uXeNf!idae^G^3?7>a`EHk9Ch7NhT_)W??<>7|N*-!!S(HWpR2K1`ESkzsWdQ;{ z;7_vOo$f)q^_Y?6Q?TNPb>3WP3H*4pp_1zG(d2=ih@kH{*bC$PJq_Y~kz>2p9S2>WuoLI{86{6fOvHLkONQV5`2B=|@njm8@ai$`F_uk)aVHzw#- zKF83axJ8WwZGSWpwL?qXGR?dwbCXM7Bk83sy%DsyS@2_Cnj)47PE{!^a8mmom9qFQ z70MO$%r42?l3+9(N0*{eM69gWt<_-hRxb9zPj^Xrl}n$M^lFzb^nt!j((;T)55Plk?pXkXzK-7uz|`F` zYs={d;B7qz4EXt<`C5bK1Hz6N2?!ezM8t38r-EeBCNYi+QxJgFRg}WdBqNOO5n(C1 zig%RY&5?Tr?@yztNq-UJ5PZ79=X+BJKHnXLjeM4`w>ps4%H%$Yy{nVSL;ApV1 zeSn+~@Kb$&a1ZkBeaYdvz9{#Qq~`$DkVUz&2ynRBRUasV`eFW|2;lMvS6oGNleUQY zxMEP_b44_WxAsG?hW4X&Nn6Fj|CFmq+eFjTg2)iJ^S^KrARFUx-W|G=S1*yBO(; z?)^ga;B`{;w3zIQ_(oLxNs68keWj>9SMSFT(-=r;K+e?z;om#=ixj?I3Z9dK{`9;U z#@jNe2cI1X?AXCwLR2#71<`0$;%@jwkz`l6!+5?Ft4i4a06lbOS+lDDC7P8<1@24Z zm9r~86iJe+wyNiSBpOL^^}LT0ggv|Z6Ojao6OUKLKNU?ckm2}ei2@Z)M-?110$o<|$qpA@weNxgx0iy+F6ylVT=*JK2 z843G8x}t4T^b_wMNki$BDBx|A=?YdyQ9GdOuu)V(XT%UbHv^lLv%G&47KwA5KN?W+ zGnbEsr=RDoqp81GMEw0|?2r~?nMv%W`;MXRbRz+-%i#J8#!#tPLR=^tkz7Wd#Z3vu zqNRWeT(T`cT!!1{n@M73FU}c@Mr$73e$lJzop@C2;4Yq)j-l>lj9 zoInv`n#So->`4>*ulW;ktv~U~iCD1K0a#W|1k4|uNa=L9%U!|clhE<}Nm%LEW8Ff5 zgs3~9c=;qu+y;Jm67^C3Ywct*Xd`Yk65}^|GVpd2v3Dd8<5n=(O>UWtX}gzyL_vJ` z?3qFX=srw9Vv1Kzp+aCTinQYorjUp32ks;^ou*>Be}MZ;#e(}FT(oE^o?xt-N}cE- znjm}Z=i^hUEB%cwz4Zx(fpwcP*oje_5vFcH@m(Yshl3CV%}|HN}n;YdOgAKnpBqbBuxV5`c?LraFbWArK_;hTpYnl zww*tS;5O-LPO~r_&tQ+7IgWBT!^T9hh2}i_AEJX&^xP$)Za9fCWTO>3c(F|yHk?n| zXy}W4NM<`Z!@&mRC7$BohV<|Jw1bWB%iKPS#q$+j8pQ}_u(tyDjp1q3T;R+31hZ%w lH51fNGHv)=6zk$!QA!sLA{QlBi-tuPndaNKOrwLw{{j$x#!3JH delta 53922 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 0x80000] = [MaybeUninit::uninit(); 0x80000]; + // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. + unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } +}; + mod bindings { wit_bindgen::generate!({ path: "../../assets/util.wit", diff --git a/components/recorder/Cargo.toml b/components/recorder/Cargo.toml index e64a57a..ddd92bc 100644 --- a/components/recorder/Cargo.toml +++ b/components/recorder/Cargo.toml @@ -10,3 +10,4 @@ crate-type = ["cdylib"] trace = { path = "../../crates/trace" } serde_json.workspace = true wit-bindgen.workspace = true +talc = "5.0.3" diff --git a/components/recorder/src/lib.rs b/components/recorder/src/lib.rs index 8566a28..4b3939d 100644 --- a/components/recorder/src/lib.rs +++ b/components/recorder/src/lib.rs @@ -1,3 +1,12 @@ +#[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] +#[global_allocator] +static TALC: talc::wasm::WasmArenaTalc = { + use core::mem::MaybeUninit; + static mut MEMORY: [MaybeUninit; 0x80000] = [MaybeUninit::uninit(); 0x80000]; + // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. + unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } +}; + mod bindings { wit_bindgen::generate!({ path: "../../assets/recorder.wit", diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 9de3718..b445bfa 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -22,6 +22,8 @@ pub struct GenerateArgs { /// The path to the output file. #[arg(short, long, default_value("lib.rs"))] pub output_file: PathBuf, + #[arg(long)] + pub use_custom_allocator: bool, } #[derive(clap::ValueEnum, clap::Parser, Clone)] pub enum GenerateMode { @@ -84,7 +86,19 @@ impl GenerateArgs { let traits = trait_generator.generate(); drop(trait_generator); state.output.extend(traits); - let file = state.into_output_file(); + let mut file = state.into_output_file(); + if self.use_custom_allocator { + file.items.push(parse_quote! { + #[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] + #[global_allocator] + static TALC: talc::wasm::WasmArenaTalc = { + use core::mem::MaybeUninit; + static mut MEMORY: [MaybeUninit; 0x80000] = [MaybeUninit::uninit(); 0x80000]; + // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. + unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } + }; + }); + } let output = prettyplease::unparse(&file); std::fs::write(&self.output_file, output)?; Ok(()) diff --git a/src/instrument.rs b/src/instrument.rs index 06fd281..ce97122 100644 --- a/src/instrument.rs +++ b/src/instrument.rs @@ -17,8 +17,12 @@ pub struct InstrumentArgs { /// Whether to use the host recorder implementation or link the recorder component #[arg(long)] pub use_host_recorder: bool, + /// Whether to use a one-byte page size for the wasm component + #[arg(long, default_value_t = true)] + pub one_byte_page_size: bool, } +// TODO: Add one-byte and regular page size wasm binaries const DEBUG_WASM: &[u8] = include_bytes!("../assets/debug.wasm"); const RECORDER_WASM: &[u8] = include_bytes!("../assets/recorder.wasm"); @@ -63,10 +67,27 @@ pub fn run(args: InstrumentArgs) -> Result<()> { } // 5. Generate Rust binding for both import and export interface - bindgen(&tmp_dir, &wit_dir, &args.mode, "imports", "record_imports")?; - bindgen(&tmp_dir, &wit_dir, &args.mode, "exports", "record_exports")?; + bindgen( + &tmp_dir, + &wit_dir, + &args.mode, + "imports", + "record_imports", + args.one_byte_page_size, + )?; + bindgen( + &tmp_dir, + &wit_dir, + &args.mode, + "exports", + "record_exports", + args.one_byte_page_size, + )?; // 6. cargo build let mut cmd = Command::new("cargo"); + if args.one_byte_page_size { + cmd.env("RUSTFLAGS", "-C link-arg=--page-size=1"); + } cmd.arg("build") .arg("--target=wasm32-unknown-unknown") .current_dir(tmp_dir.as_path()); @@ -128,6 +149,7 @@ fn bindgen( mode: &Mode, world_name: &str, dest_name: &str, + use_custom_allocator: bool, ) -> Result<()> { let out_dir = tmp_dir.join(dest_name); let status = Command::new("wit-bindgen") @@ -154,6 +176,7 @@ fn bindgen( bindings: binding_file.clone(), output_file: out_dir.join("lib.rs"), mode: codegen_mode, + use_custom_allocator, }; codegen_opt.generate()?; let status = Command::new("mv") diff --git a/src/run.rs b/src/run.rs index b71dc7c..2db054f 100644 --- a/src/run.rs +++ b/src/run.rs @@ -74,6 +74,7 @@ pub fn run(args: RunArgs) -> anyhow::Result<()> { let mut config = Config::new(); config .consume_fuel(true) + .wasm_custom_page_sizes(true) //.debug_info(true) .wasm_backtrace_details(WasmBacktraceDetails::Enable); let engine = Engine::new(&config)?; From 872e7f1b2d8e49b5648d45ec398a9707babbbaaf Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:18:21 -0700 Subject: [PATCH 2/8] try 1.92.0 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3ea1112..637cb12 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,7 +19,7 @@ jobs: with: target: wasm32-unknown-unknown, wasm32-wasip2 components: rustfmt, clippy - toolchain: 1.93.1 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 + toolchain: 1.92.0 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 - uses: bytecodealliance/actions/wasmtime/setup@v1 - uses: bytecodealliance/actions/wasm-tools/setup@v1 - uses: bytecodealliance/actions/wit-bindgen/setup@v1 From 2a1b2d3cda3eabb1453532f0a6d1f0ce828b3e4f Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:27:10 -0700 Subject: [PATCH 3/8] try mac --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 637cb12..d9df3d2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ on: jobs: build: name: Build and Test - runs-on: ubuntu-latest + runs-on: macos-latest env: WIT_BINDGEN_VERSION: 0.55.0 WAC_VERSION: 0.9.0 From 3f1ac9c22fa7dd7366f29ec9025cd7ec4352c397 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:29:43 -0700 Subject: [PATCH 4/8] pin wasm-tools --- .github/workflows/main.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d9df3d2..ebf66bf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ on: jobs: build: name: Build and Test - runs-on: macos-latest + runs-on: ubuntu-latest env: WIT_BINDGEN_VERSION: 0.55.0 WAC_VERSION: 0.9.0 @@ -19,9 +19,11 @@ jobs: with: target: wasm32-unknown-unknown, wasm32-wasip2 components: rustfmt, clippy - toolchain: 1.92.0 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 + toolchain: 1.93.1 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 - uses: bytecodealliance/actions/wasmtime/setup@v1 - uses: bytecodealliance/actions/wasm-tools/setup@v1 + with: + version: 1.244.0 - uses: bytecodealliance/actions/wit-bindgen/setup@v1 with: version: ${{ env.WIT_BINDGEN_VERSION }} From e51b32296f4b6916054ed5f9446243830652da9a Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Tue, 22 Sep 2026 13:37:54 -0700 Subject: [PATCH 5/8] add page size 1 adapter --- ...apshot_preview1.reactor.one_byte_page.wasm | Bin 0 -> 49589 bytes src/instrument.rs | 29 ++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm diff --git a/assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm b/assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d5067817cc2bcfdda220cdcb45abfb70ea6fcc3a GIT binary patch literal 49589 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 literal 0 HcmV?d00001 diff --git a/src/instrument.rs b/src/instrument.rs index dc7e02b..99534da 100644 --- a/src/instrument.rs +++ b/src/instrument.rs @@ -26,6 +26,8 @@ pub struct InstrumentArgs { // TODO: Add one-byte and regular page size wasm binaries const DEBUG_WASM: &[u8] = include_bytes!("../assets/debug.wasm"); const RECORDER_WASM: &[u8] = include_bytes!("../assets/recorder.wasm"); +const WASI_ADAPTER_ONE_BYTE_PAGE: &[u8] = + include_bytes!("../assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm"); pub fn run(args: InstrumentArgs) -> Result<()> { if args.use_host_recorder && !matches!(args.mode, Mode::Record | Mode::Replay) { @@ -88,10 +90,20 @@ pub fn run(args: InstrumentArgs) -> Result<()> { let status = cmd.status()?; assert!(status.success()); - let exports_wasm_path = - component_new(&tmp_dir, &wit_dir, "exports", "debug/record_exports.wasm")?; - let imports_wasm_path = - component_new(&tmp_dir, &wit_dir, "imports", "debug/record_imports.wasm")?; + let exports_wasm_path = component_new( + &tmp_dir, + &wit_dir, + "exports", + "debug/record_exports.wasm", + args.one_byte_page_size, + )?; + let imports_wasm_path = component_new( + &tmp_dir, + &wit_dir, + "imports", + "debug/record_imports.wasm", + args.one_byte_page_size, + )?; // 7. run wac opts.generate_wac(&imports_wasm_path, &exports_wasm_path, &wit_dir)?; let output_file = "composed.wasm"; @@ -169,6 +181,7 @@ fn component_new( wit_dir: &Path, world_name: &str, wasm_file: &str, + one_byte_page_size: bool, ) -> Result { let wasm_path = tmp_dir .join("target/wasm32-unknown-unknown/") @@ -184,8 +197,12 @@ fn component_new( wit_component::StringEncoding::UTF8, )?; // create component from the embedded module - let component = ComponentEncoder::default() - .module(&wasm)? + let mut encoder = ComponentEncoder::default(); + encoder.module(&wasm)?; + if one_byte_page_size { + encoder.adapter("wasi_snapshot_preview1", WASI_ADAPTER_ONE_BYTE_PAGE)?; + } + let component = encoder .encode() .context("failed to encode a component from module")?; fs::write(&wasm_path, component)?; From 1595c79f9936b01eaa3413168a78f5aa2467f64c Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Tue, 22 Sep 2026 15:57:02 -0700 Subject: [PATCH 6/8] fix debug and recorder --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9457206..fb031b1 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ all: build-components build-cli build-cli: cargo build --all-features --release build-components: - RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p debug --target wasm32-wasip2 --release - RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p recorder --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1 -C link-arg=--adapt=assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm" cargo build -p debug --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1 -C link-arg=--adapt=assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm" cargo build -p recorder --target wasm32-wasip2 --release cp target/wasm32-wasip2/release/debug.wasm assets/debug.wasm cp target/wasm32-wasip2/release/recorder.wasm assets/recorder.wasm From a2b547afe5b1a288610ec43d8ea1cc43440483e2 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Tue, 29 Sep 2026 19:56:10 -0700 Subject: [PATCH 7/8] add libc-alloc --- Cargo.lock | 6 ++ Cargo.toml | 2 +- assets/debug.wasm | Bin 86941 -> 76145 bytes assets/recorder.wasm | Bin 236915 -> 226115 bytes components/debug/Cargo.toml | 1 + components/debug/src/lib.rs | 2 + components/recorder/Cargo.toml | 1 + components/recorder/src/lib.rs | 2 + crates/libc-alloc/Cargo.toml | 6 ++ crates/libc-alloc/src/lib.rs | 176 +++++++++++++++++++++++++++++++++ 10 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 crates/libc-alloc/Cargo.toml create mode 100644 crates/libc-alloc/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6bb481a..c84bd2b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -566,6 +566,7 @@ name = "debug" version = "0.1.0" dependencies = [ "getrandom 0.3.4", + "libc-alloc", "talc", "wit-bindgen 0.62.0", ] @@ -1200,6 +1201,10 @@ version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +[[package]] +name = "libc-alloc" +version = "0.1.0" + [[package]] name = "libm" version = "0.2.16" @@ -1584,6 +1589,7 @@ dependencies = [ name = "recorder" version = "0.1.0" dependencies = [ + "libc-alloc", "serde_json", "talc", "trace", diff --git a/Cargo.toml b/Cargo.toml index 0c87833..9e15512 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ members = [ "components/debug", "components/recorder" -, "crates/dialog", "crates/trace"] +, "crates/dialog", "crates/libc-alloc", "crates/trace"] [workspace.dependencies] wit-bindgen = { version = "0.62.0", default-features = false, features = ["bitflags", "std", "macros"] } serde = { version = "1.0.226", features = ["derive"] } diff --git a/assets/debug.wasm b/assets/debug.wasm index 4e2ff00289ac5e430daf55a63e1da5d6bb03885d..84bddb069dc3e8bea6d0652110aeed5c4c6c09b8 100644 GIT binary patch delta 7305 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 AtN;K2 delta 18136 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 HXU_isTZQ>` diff --git a/assets/recorder.wasm b/assets/recorder.wasm index 62ff851a0efe87e68296ac2811984ddfe3f74e00..04b89b988730c479f2cde793450151cdd8bacd5b 100644 GIT binary patch delta 21690 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�uO7&~-Iw!J4V+jW{M$gJi63Fz)CH=O zfi!ppZ>-gFGq@*T$(v}k4H;0?RrcC#)M&MMlELe_tl?^=Ert(5Owc!zNAR^ce*wX| zVn-%6+>gbHOx_+_P}M=a17DA$8#$Oue13Yy1}K2680tHm!YAU=Al{5`#1{AC8@wqF z#7|@)d{a+BrVPe%Z{~+Xq9ZJ{8{#=JEInVFwYFhkY+}2#>{MF?0+TcU^Eq zGhzrr*{vL>PFVo290DEPCiV>Bovobz?u*6tjoavFgH-!z;QUf5MSl+M)+`KQ_-ggBKuOb%H?LfTR1J3$0KXolgpFckJ!1zxvV@^QiB@PFqy$& z5%NaBUV0AWmFcJ$K8!cUJH;D^!F7BiZpq7W5t#>byxFv zMZ6#OFpnqV{jivPq&Y_BcBD#q=`8?eF42S>4OpCJOT^9R=TffNX>25f+ zG{1r9{X_x6tZh%3ub4duYqsc39>`4n1-;2Di4((d4)jhR=#JAE?!!WwX6fs`lA* delta 32011 zcmcJ&2Y6J~_C7po@0rXblfWQ>ge1Vs&_eHl&?nM6s3;1A7K9K;A&8X;Ma3&fITyBw z3Mdwo9xe{kJEQTR-DV>aMz6R$*XdQ` zZBf5dL*uo$L+;b7&f45TTL5>Xs7gI~MnoIWR_R7fjm=eB7(Z5ZQZrR;v`m$@<_*=> zJejPTkCv{ef~-PYi{{EVR;H-KyF@iKUI^af(*@xpC0eI(EXi@l!Gjvc~1) zBN1d6{$QQJP09>Fx*U zetMkd({frxkI^x?M7}AXrQ`BBdRK0sjkKPgr!Djj9iq4B8#+cG(job<_=tX_XT+SK zxJs|mFZ7sLC4QyH#S`K;dQz+wmuQVxD|XRx@o(|8m@EFFzvypzjsB!Zg%VGRe~Aah z0`ZVoC;p&UXsK8v9uZ5#GO<{kBSS0{7ioo<&JJ90XChf=Zeu=fl-Z%p$I!u3^OLtM}L z>eKVZPQN5%yXzfCi>K>#MD^lY4TkV-O2cAqtaj?FxPF{^3fG;DyP}s%jYo5x+08Nx z)%0uqbkLa6{3ASNw0N4{H@^SFf2Bk@%Cbrdxdc60_D1+_}viAg}OTGS+qW zVt{XS?i#&aQycU-jf=O}FuYw_fg!`XOrd9sU+rQi`q^932Il!X7jJ4gW zS8m>g=0EG!3(eH)-jV()9@YI5K}U=Z8PBv?#x!_E;B{NJSELF&rV6{~3RB=C@FJLo zG@F;wgdL?)vpp{xRj%KeXjbEj^>w{Ou9xDuVw}4E(Mp-2MvcWiThKCNch8!1#W>Nk zQKf<|ZY372#P@m?1&{XPg5UJoSgv3@-JORE#-red-c2fHhP(T*cfCrPUanamH5>P- zXAPc5VKy7;pGS`Y$C4XaHPS>o+yIX#&oX0nAEs$}pLI1uobyC5&KT0See^DFz)PMl z@Rne#>zhpfHumzG*$U8Y8IeM;c(*}C34oDsze$zsB#KyY4GT`iF%fpR( zWjIzW!#iKN0S@bYKH8;nKj4<%sDxs1c+*c2JEv z8gE_@Xp!XL?v8>MSa8qVhB2r?xu*6FN~}0q5094d@KfbHFXyqu>kh6|uNCLDL*C%Q z&xQq>q6Helf)N~=VEBf#sgNB;U~p&+WA>1QaxxDNO*CE}QoZK)CJMaN+?E)i>`t~s zNO`w$YRKYhC7gvZ`kZdBQv)S9^aHC0VwIv);o=J`!_;AQDr5m$T1$=9!{)U#aTuzF zJ~Uo5BLyRv0yWb_ecS+4I}ki`c5jZf2#uk()m?sdn8cwyVT_Y7`I~R}dE_-gna)t8+W+pPj*u z3xj=gZgb<4T%TuM#XdLZ)-d{y=t(<`#Ut9%9^=4>4tOrjOEjwAoJ_A7EpNVoemCab zoLNe7THMQ&NoIZ*E{bG9uP!bjv{SqVSfdF^J@;P5k@0l;71WPR6?2 zUWaF|`5qVT)y+9PuNf0Z-cG+6hevk8)p@JG?j_x@D>kZpc@ZkV$LM=&OM1n)^VW1w zx9!$-bilazwwYBm3}WqWT@IG@VjIo{Q zOXI$=LusjTWNdAE(>OmirDEwGT)HPp*Bw`@V%|{ByAgRqD(8*myotyQj!R4k0mP!b zBj>?(6>l21lmMw76KVibBPP_R2aJ0rT#xIX2{%SBWmNe^T(of%Kx{WLw|9kRyxa^F zUyDY>!h}%(m@LE%#=H!cR<9w=G0sh7vs5jMJ8hKJydrfTZk9zdH7luNUKrbtXQfum zOXYgaQ14_`3EDT+@cBu;3c4Lu`%{w|SI7!eSm*ZtQgenbbQquI*73Y_E$!(y+0>qz z#=6P1=?7!~WK)CMLVH?FVeOearF#Xv3~7(?;go(_W1406hsMmxwlv0PX-u3mR+d)) zXGj5FGbT;VfvUVewPU@IsyN)*6PBr$EmZmkqeV^!s7rdG-&m020ZA)!c0gr@Pn%Xr zWsXeyZ&arF^bDv>-t=^+%nQ?NJ53i8ZS1|Tneo^3)fGls&H~*~&ZM*1@#cjXcTXNO zZe?DGaX%Qd?`&eU%x?@zN9O-W=55OFrI~lcb2D^C6N`Bw$?y36!Jv#{lsJRZbvF1~PcH$RwWkrB!Y$AwQnxQY%L-4}%D3>656 z*HahNqo;}&FQ`SvdpAM`#k(ImCorRYe&J9{f&#N2j@82vQk6vmXs%K1ks3zsqDI!! zhVaul>#1pl>N?)HgWBPb^hf(oJW`+b8v7q<<=m&oDvj2QlZ@(%6X
    EdL1!|1d4 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 XFS^R6RA03mCdW~OlBL7sHsAjPKqv@2 diff --git a/components/debug/Cargo.toml b/components/debug/Cargo.toml index 6609ae2..c659090 100644 --- a/components/debug/Cargo.toml +++ b/components/debug/Cargo.toml @@ -10,3 +10,4 @@ crate-type = ["cdylib"] wit-bindgen.workspace = true getrandom = "0.3" talc = "5.0.3" +libc-alloc = { path = "../../crates/libc-alloc" } diff --git a/components/debug/src/lib.rs b/components/debug/src/lib.rs index b9e9bbe..8e0fc98 100644 --- a/components/debug/src/lib.rs +++ b/components/debug/src/lib.rs @@ -1,3 +1,5 @@ +extern crate libc_alloc; + #[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] #[global_allocator] static TALC: talc::wasm::WasmArenaTalc = { diff --git a/components/recorder/Cargo.toml b/components/recorder/Cargo.toml index ddd92bc..65d6d67 100644 --- a/components/recorder/Cargo.toml +++ b/components/recorder/Cargo.toml @@ -11,3 +11,4 @@ trace = { path = "../../crates/trace" } serde_json.workspace = true wit-bindgen.workspace = true talc = "5.0.3" +libc-alloc = { path = "../../crates/libc-alloc" } diff --git a/components/recorder/src/lib.rs b/components/recorder/src/lib.rs index 4b3939d..72f3970 100644 --- a/components/recorder/src/lib.rs +++ b/components/recorder/src/lib.rs @@ -1,3 +1,5 @@ +extern crate libc_alloc; + #[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] #[global_allocator] static TALC: talc::wasm::WasmArenaTalc = { diff --git a/crates/libc-alloc/Cargo.toml b/crates/libc-alloc/Cargo.toml new file mode 100644 index 0000000..6ab6b85 --- /dev/null +++ b/crates/libc-alloc/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "libc-alloc" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/crates/libc-alloc/src/lib.rs b/crates/libc-alloc/src/lib.rs new file mode 100644 index 0000000..f25c160 --- /dev/null +++ b/crates/libc-alloc/src/lib.rs @@ -0,0 +1,176 @@ +//! Replaces wasi-libc's dlmalloc with the Rust global allocator. +//! +//! wasi-libc's `sbrk` assumes 64 KiB wasm pages, so its dlmalloc traps when the +//! module is linked with `--page-size=1`. Defining every symbol that +//! `dlmalloc.c.obj` provides keeps the linker from pulling it (and `sbrk`) in. +#![no_std] + +#[cfg(target_os = "wasi")] +mod imp { + extern crate alloc; + + use alloc::alloc::{Layout, alloc, alloc_zeroed, dealloc, realloc as rust_realloc}; + use core::ffi::c_void; + use core::ptr::{self, null_mut}; + + /// `max_align_t` on wasm32. + const MIN_ALIGN: usize = 16; + const EINVAL: i32 = 28; + const ENOMEM: i32 = 48; + + // Each block is laid out as `[padding .. total_size, align][user data]`. + // The header is `max(MIN_ALIGN, align)` bytes, so the user pointer keeps the + // requested alignment, and the last 8 bytes hold what `free` needs. + unsafe fn header(p: *mut u8) -> (*mut u8, Layout) { + unsafe { + let total = *(p.sub(8) as *const usize); + let align = *(p.sub(4) as *const usize); + ( + p.sub(align), + Layout::from_size_align_unchecked(total, align), + ) + } + } + + unsafe fn write_header(base: *mut u8, layout: Layout) -> *mut u8 { + unsafe { + let p = base.add(layout.align()); + *(p.sub(8) as *mut usize) = layout.size(); + *(p.sub(4) as *mut usize) = layout.align(); + p + } + } + + unsafe fn alloc_aligned(size: usize, align: usize, zeroed: bool) -> *mut c_void { + let align = align.max(MIN_ALIGN); + let Some(total) = size.checked_add(align) else { + return null_mut(); + }; + let Ok(layout) = Layout::from_size_align(total, align) else { + return null_mut(); + }; + unsafe { + let base = if zeroed { + alloc_zeroed(layout) + } else { + alloc(layout) + }; + if base.is_null() { + return null_mut(); + } + write_header(base, layout) as *mut c_void + } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn malloc(size: usize) -> *mut c_void { + unsafe { alloc_aligned(size, MIN_ALIGN, false) } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn calloc(n: usize, size: usize) -> *mut c_void { + match n.checked_mul(size) { + Some(total) => unsafe { alloc_aligned(total, MIN_ALIGN, true) }, + None => null_mut(), + } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn free(p: *mut c_void) { + if p.is_null() { + return; + } + unsafe { + let (base, layout) = header(p as *mut u8); + dealloc(base, layout); + } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn realloc(p: *mut c_void, size: usize) -> *mut c_void { + unsafe { + if p.is_null() { + return malloc(size); + } + if size == 0 { + free(p); + return null_mut(); + } + let (base, layout) = header(p as *mut u8); + let align = layout.align(); + if align == MIN_ALIGN { + let Some(total) = size.checked_add(align) else { + return null_mut(); + }; + if Layout::from_size_align(total, align).is_err() { + return null_mut(); + } + let new_base = rust_realloc(base, layout, total); + if new_base.is_null() { + return null_mut(); + } + return write_header(new_base, Layout::from_size_align_unchecked(total, align)) + as *mut c_void; + } + let new = alloc_aligned(size, align, false); + if !new.is_null() { + let old_size = layout.size() - align; + ptr::copy_nonoverlapping(p as *const u8, new as *mut u8, old_size.min(size)); + free(p); + } + new + } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn aligned_alloc(align: usize, size: usize) -> *mut c_void { + if !align.is_power_of_two() { + return null_mut(); + } + unsafe { alloc_aligned(size, align, false) } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn posix_memalign( + out: *mut *mut c_void, + align: usize, + size: usize, + ) -> i32 { + if !align.is_power_of_two() || align % size_of::() != 0 { + return EINVAL; + } + unsafe { + let p = alloc_aligned(size, align, false); + if p.is_null() { + return ENOMEM; + } + *out = p; + } + 0 + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn malloc_usable_size(p: *mut c_void) -> usize { + if p.is_null() { + return 0; + } + let (_, layout) = unsafe { header(p as *mut u8) }; + layout.size() - layout.align() + } + + // Internal aliases used by wasi-libc's locale and atexit code. + #[unsafe(no_mangle)] + pub unsafe extern "C" fn __libc_malloc(size: usize) -> *mut c_void { + unsafe { malloc(size) } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn __libc_calloc(n: usize, size: usize) -> *mut c_void { + unsafe { calloc(n, size) } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn __libc_free(p: *mut c_void) { + unsafe { free(p) } + } +} From 4608472baa383ca48882eb30414b00f273806bae Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Tue, 29 Sep 2026 19:59:18 -0700 Subject: [PATCH 8/8] fix --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index fb031b1..600017f 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ all: build-components build-cli build-cli: cargo build --all-features --release build-components: - RUSTFLAGS="-C link-arg=--page-size=1 -C link-arg=--adapt=assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm" cargo build -p debug --target wasm32-wasip2 --release - RUSTFLAGS="-C link-arg=--page-size=1 -C link-arg=--adapt=assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm" cargo build -p recorder --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p debug --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p recorder --target wasm32-wasip2 --release cp target/wasm32-wasip2/release/debug.wasm assets/debug.wasm cp target/wasm32-wasip2/release/recorder.wasm assets/recorder.wasm @@ -64,4 +64,4 @@ run-viceroy: done curl $(URL) kill $$(cat viceroy.pid) || true - rm viceroy.pid \ No newline at end of file + rm viceroy.pid