From 96acc540f4687c381ecf007f94e9161487d1b121 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:07:32 -0700 Subject: [PATCH 1/4] 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 zcmbtb33wD$wysmvoiyoAQZb3yLv@EGAtWRuWFue-WRo2?V1y8ofJsQm#wJJy#0_)? zy+FC3;=;oP6{l6)zzDdb!YJeJ=s3=E-puy~=lSNz49fe@t?DE!`rgdINA+FKJ?GrB z*S*EYx7~LhbMHB*Y6q@yi&xY!iS8i(Q5HnVUonaHnNPDJtN7K26g=B}!LSmz!GY z(o5aoBu;$i&b;K?!`+HEsF)G__;9n`x#2DQH<0le(ZK&A9Q{< zztt@oBc`TBC$+XOUAd}aS!ctNVRiKjmo3h!Z*6aA=~QAw^{I4Ki515ql7qUhwq{{N zb$flyk|j%Pm5tP|lN6J@m-xI%$@}S&@k3vwsWYya_X2ICrR%9~NpNBFm5Up?Xi>{L zs%^TuePn4_MP>Pj{;Sp$tSu_cXj^?%<27_WT}#(d#|FBQZlIM5=C|&l$7$J$&gC`L zLvlCK0s4TRrjO})iupagL;p^1QPl1CXrGa&IWO^o7uR)lDPDsps8$(Dw(1JdxM+o2 zia{pnw|4Qo_aSI7n1yziViq(7)B&=o-yvEOa_A=U>3Nkkuks|2s69x~^7KJssAfT< zz0mtTQA8M@-V{*6_!x)2&BkPQdBDIH?ntJ@rue~hy9mYS;rT^;08dwfU+X&DEwU2^ z_kWCcqWnKNZ9MpoaLU3kNWYiY#Cl_8&rtRI?S7ooH#GeLd&Gg?C41tBgj9Wm6mAyS zgYa$ux6>0-;_%z0G@4Wamc9KH{XVfOaRA*Z?oQ04&0=5T1%bO5-ca+DWEN? z^+x?3Zt6Qk=J{1ox4p=Sz|mguN#KH%XZCZqL`^m{Gr7@F%x*cL9~3i(SI5}e#Hi17 z>9>k|vogixr1{}ta)$RNKEnT)NGp-hb?FI1_Ns6PDo8ZqVK zf0NS;MZb-e;3pG|XJeky{Nw|;qHne*c%|+bfkC|S9X6pT2vQde7XK!t1vEBk)ldxWWE3_Prevso zx8x28wn_fnUQm$yxxtCy7Jo^)z=0P~4I+9nUW^ZVKC$*RieD znK|i)ZIoan%7}9OVo!HB>{dT4x-+NIFGOtr0iclNuZRy*@JI?~LZkk;Sl9ozVZ0Fz z-ZmqL4vV#cRPmHiDPsB${O6Wm5_LrS%RlQ+v!lBHMSuMLfU@*QSU{#Sk*yX{5T*`( zcJrYAvZxq1!d9FK%Yhvcl(}}`8i@Pv11qC{*CSif9}^c2`hp%6g9eYLM?>|42NF7) zve6N5WOv|sPtG7wms25IbJ91DVLgs+ZbHmT7}7yci5rI04LCi9u%)rn zC>4sQ54fH?64p5-caEpqHrua6ch>nH@QcKvza;h*4v+f!Uy^i!_c0t<>FbN zH<`W?PvlM1ZbM2wnU^eolkx=}5Rc?fqHgiu`F{1wbzYWuI4$GjIMaGD2!0_{e+_60?VqA)XLL)3Qd)!njlmgrB z>}+-mW0ZlQ56+VXSHN-S6pr>Bw6%8*VeR;rg;gZnMPuk`F|nwP_KN3=Y!El14qPdSRg4;D17-67qs#e2kn$3LLDz=+f(p|zmrY=k)tkV@^ zHo^_mu{qjzSdu?Bhu##k$KK!+jgE!$)bX*a>3y-}!Z*_Gs>YqC%rM;9>LpH9<2K7s z)reW+W@q#OR58GXJpf0L9qtjYj=SckQ7jt2Pyc{77k0!45D$tbEFAumczJV(pPSdP3TgQC5k0Galffsn^}dyuq(=H1eSGWpIoBm~ZC|s}lX55r@uJogspSv9MjrHmW z#Pc&k2yshiR?Zq4dkV+$XSc9i;h)Du)~qopuP{U`A|Sl$^*-&_#M)W8 zDf|13yxFJyM(Dt-V-)7n@ruySOFTp&@z|y9;ThCU90@}CmqiiM)Y&s4|1!V$=<+i9 zt%#pp1D{$pdjulnBeV1Ab@9>c>4=j<=9HmbJ7+w`AD(j|+JBy7(ubkKxt!KRm;cNl z`dX~KVkStxaYZmpIxNj^>e5BWyoBI~%)a7HK|pbg(MiLk%S6z3=7obSBS_?|8Rw(GGtool5ol`Smkr+6?;Y`*)n{ObJ^?jb2pNEmW>g!R9K2^=N=%>{ep0iRc zUa$kz&9Mc?@l35N6#r9`MJGhs!r^#MTez6s3q8FsrALE~p2VlMl@k6k$g-{OOf`yc z>c&Hh=bZ4159?#;nD|3|1)c*I&4e8;UowdtljS`oePkoz`&aP>G9kn={L=J2HE-55ikz^&e32%A~(7wl{o4w}=&u<-sEy zpD?T-!y=DtKFVFZ9GJ?OV5z#DyJ&WGZGfA1BUo**M-br<1zOw84<0`Du)8CmmDo#7 zK$oZw*g)L;_6RU|&91IPKy-x1Cq?5e$Bzn@hl2K4lldXWvDS~8(H<&MzvHF7-Pf2? z4m>65Cw9{emZ%>%%{~O0n46RKVut=xZ}V$zYE`IAzvXp}M$lz`EnB<>xH0p&-FI`} zW&X*Ab9yK3p36Mm2guDt7^0orW#W-?d&G68Q z_RMN&+9(Yf>^7FJe8c{~?cCSL&VRzn#kcK+ew+l5QUjDcY& zQ^`}Lf0(YeXg3$RDvmdpMVP+W)KQRf-?}bf@R-5z(Gf;Je}s((J}BPn7#Y`#pZCPr zjm{LhPgHacz_YruOv66K9i0L6_H}09`Eh4)jzh6M?3+eE^M_NXPDM_JlKSbAqTgfk z*;CoF!U@u2j0kB?vJDpDquI7sO=WQ!ur%po(1HDz=k374XDo6zdzK9gN)MLuFg%89 zx;(vMP0DduTmxA|ukT_i90U4zI&e!>_J#o%-3AtXU&lU&U(aQOX$%0Gt=n;Ir+21f z%V8O781_dT+gS_87SAjnWt{G^EESlZ^a@xZ#32$_RA_9CvsMHyI|CS~!ob+IlpTVR zS4ISvePRQhWZR;eE~VZhI0!SM(Qk|SjTHqN8_)MEHU!Tg(T5*zm_$DuYne)p+Qs54 zgF2xVv0q{ksg~$^1)>Rk9J0ZixX2I-pAey%-RfdhL zRy8HU{h<=S(rY#x82+{@QwE5%tGeT*R5%bwQLw&D5562DCOQRRnW*2J?B(nl_0f{^~4=r2Oh% zJ4iFcu(fVER=W1(v%;b`Xoto8U~x=1EW!W~xkPL5lEqTDi24vG5`*m75nt}efPo^c z+if>$dIC3&0Z6x#7<-mG_*t|vGCIqdR&Lkqcx(gqw-(7-TfU;r-qyCRXXG|!u1nWt zc*cArPqO5%UiV;FQ1(l=tuqJ;CrXAQ1*O=6Le~-0rR&?`97U3?W=8e?dRvL#t$&fW zh-a>uY)Cgp_BZgx+M{!X6O;pXfX~{H-NUl056km6?2?JWbFC>^pK@(4>+Ue?E3XxH zF=Gpd&Mn)ppBcOxDcc_MUCM;$2v&uY!tAD$a4aGl%*19B!ieahahd|6A#K)xjX_w~ zO*rRvzPaw$k8k6@ufKkRRHdY;n5X!)5xlN!a|#px8H&NF$mxoKbRESUyrDJ8QH+ya zdew8$jkbE4Zrqpffi#m~Bb1C|>@-}(d4s4}IQ7&mnYG@er?e!Y{@l-W!>}Znc$dmX!N%@tcUny> zYnh}?3U*G7=3_?|LSrDpa5wrRp$@=x%+UgCSrCT1R}_FHJ}h$t zfKpqQ;Yhm%Sa$4~kvV|`ue~g;fG23GtS1k2#{~P?a>q}TKZ-$oew%fVZL8P>@vtZ0 zmR`bg4aXr*uT#sz20$VPdcZyC`j~GlO!mtH);$c z5=V@FkAp(zF|0>+^LxBnmErOG3^&Y#VOR)Qgf%c5r;i1w!wnxhKOgz9bi9Tah}9}K zeQ7%BD8%d%whK-Uc_U!3P955!GS}Gsxz~)m4GMs z#nV7$PG))lwf99v5F*lTGRaav&W@$*62cQ$6lKP8tZ-D{uUGZ`PFFqKW7xP(w=GoZ zj<2BFWY@vrjVl( z25p~TgHT*f1l8mzDchuK>nUuLeG&~+g{wX+P3B4)B2pMt5Ca~NL=N|{aAB}Mmu;e$ zNwDi#g-y%8He}VI=ErI_FE^W?+aGDTaCXNqEFmnCTjF`{V*#5VVi21j-}JHPp)P4N zwFyC>LTs~r8{XREq6lH^`fSHCAV{q`{>04M2iCwAA?+ADl5$ChdV0+mSEJI5<^CY% zGtJn&B52nJy>=YIb}Sb~uu!BO%NFby^*-!a<0_u*7y^>QkXFfNEXlx(dnG3&nh>5~ zecFF*8MsU}2=xP%dU}91AgZ&9Cz9dVDWt+;fgV833A{g*;3WkK7f$e?armtu*H99N z9T{yRPL%8=0+W>bfEGB-NeksYoMwjD2b6j4;CPlHYIbl${*l^rNwY}ydu$|ZniA9L zmZ{m6i5bT-`R>KGOpHloz^(rg%MA80O&sfTPLgTHU{^iE1Yx@foiI61*yLmk`A1Fe zG>hZ->tT~qIdtNb*)ciU>SJlMlACU>rVV63Oc3)&gcDS7OAjG*Cg zJ%%WQ*as7n5d}34(yT0$Ic~vU5v=TbtP3pJA3nh4J)B^Ot(b!femtPbdS-UeLnYN; z1~3Ym_S-r8`5^rBEMFYZnwE2V*G%ecGDkPE#O3OALm7kjIGw|#JZwRx^1E#IWMZ;k zcsc_zrK3_r00E0AK)|8|03JlRWc)ZhDR}kv!KgXCr7*?iO?dVnpVo?JIqAY>vrg@iajGH+lp zEGVyc4XLmZ{tG5`HWHkHa%PdjHq+&OxQi=G=%r2msLK)1U1qQmT`W^gEN$X9%mTSn zu3>e2L89unuj>jjB6yX-cY!<)MM$x+)HUy;_;O8>2X_dIyp9v6#0^exg^F^*@M{o} zh9o7$fpOHXUWpW>m8P@nXwYMPsHKCAJ;ii@8u5vXy*c}k7VKy!i^CZcR1LeTmUJ

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 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 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/4] 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/4] 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/4] 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 }}