diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..8a35bfa --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.wasm32-unknown-unknown] +runner = "wasmtime run" diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ad3fd8f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git* +target/ + +*.lock +*.md +*.txt +.dockerignore +Dockerfile* diff --git a/Dockerfile.test b/Dockerfile.test new file mode 100644 index 0000000..ed159c2 --- /dev/null +++ b/Dockerfile.test @@ -0,0 +1,10 @@ +FROM rustlang/rust:nightly + +RUN rustup target add wasm32-unknown-unknown && \ + cargo install wasmtime-cli + +WORKDIR /app +COPY . . + +RUN cargo test +RUN cargo test --target wasm32-unknown-unknown diff --git a/src/barriers.rs b/src/barriers.rs index 45b3ae0..eecfc14 100644 --- a/src/barriers.rs +++ b/src/barriers.rs @@ -157,6 +157,7 @@ #[inline(always)] pub fn optimization_barrier_u8(mut value: u8) -> u8 { unsafe { + #[cfg(not(target_arch = "wasm32"))] std::arch::asm!( // Rust requires us to use every register defined, so we use it inside of a comment. "/* optimization_barrier_u8 {unused} */", @@ -169,6 +170,14 @@ pub fn optimization_barrier_u8(mut value: u8) -> u8 { // Since the assembly block is a no-op, we easily uphold all of these invariants. options(pure, nomem, nostack, preserves_flags) ); + + // WebAssembly only supports local class + #[cfg(target_arch = "wasm32")] + std::arch::asm!( + "/* optimization_barrier_u8 {unused} */", + unused = inout(local) value, + options(pure, nomem, nostack, preserves_flags) + ); } value diff --git a/src/lib.rs b/src/lib.rs index da67333..d18e966 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,6 +21,7 @@ //! page](https://www.chosenplaintext.ca/open-source/rust-timing-shield/getting-started) for more //! information. +#![cfg_attr(target_arch = "wasm32", feature(asm_experimental_arch))] #[cfg(test)] extern crate quickcheck;