.c -> .ll: clang -emit-llvm --target=wasm32 -S sample.c .ll -> .s: llc sample.ll -march=wasm32 .s -> .wast: s2wasm sample.s > sample.wast .wast -> .wasm: wast2wasm sample.wast -o sample.wasm
> On Oct 5, 2016, at 20:19, [email protected] wrote: > > What are the commands you used to generate each intermediate step? > > In your .wast file, there should be a segments section which, among other > things, initializes the stack pointer. Since that is not there, it's being > initialized to 0, and then the translation of alloca yields a negative > address. I suspect this is what's causing the out of bounds. > > As a workaround, what happens if you compile from C to LLVM with optimization > enabled? It seems like it'd likely be able to get rid of the alloca and avoid > any memory access at all, at least for this tin > > On Wednesday, October 5, 2016 at 4:26:23 AM UTC-7, David Klassen wrote: > Hi, > > I started playing with the current wasm implementation and there are some > things that are not clear for me. > > If I compile this wast i get the expected result: > > (module > (func $add (param $x f32) (param $y f32) (result f32) (f32.add (get_local > $x) (get_local $y))) > (export "add" (func $add)) > ) > > module = Wasm.instantiateModule(new Uint8Array(buffer), {}); > module.exports.add(1,2) // => 3 > > But when I try to compile from C, I get an exception "Error: memory access > out of bounds" > > This is the C source: > > double add(double a, double b) { return a + b; } > > Fist I compile it to llvm ir: > > ; ModuleID = 'sample.c' > source_filename = "sample.c" > target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" > target triple = "wasm32" > > ; Function Attrs: nounwind > define hidden double @add(double %a, double %b) #0 { > entry: > %a.addr = alloca double, align 8 > %b.addr = alloca double, align 8 > store double %a, double* %a.addr, align 8 > store double %b, double* %b.addr, align 8 > %0 = load double, double* %a.addr, align 8 > %1 = load double, double* %b.addr, align 8 > %add = fadd double %0, %1 > ret double %add > } > > attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" > "disable-tail-calls"="false" "less-precise-fpmad"="false" > "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" > "no-jump-tables"="false" "no-nans-fp-math"="false" > "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" > "stack-protector-buffer-size"="8" "target-cpu"="generic" > "unsafe-fp-math"="false" "use-soft-float"="false" } > > !llvm.ident = !{!0} > > !0 = !{!"clang version 4.0.0 (http://llvm.org/git/clang.git > <http://llvm.org/git/clang.git> b1b3141a30d56f4feb3cc68f57d1ebaf6fbad246) > (http://llvm.org/git/llvm.git <http://llvm.org/git/llvm.git> > cf04e5f0f84bd44c375bf866d777708df39935df)"} > > > Then to .s: > > .text > .file "sample.ll" > .hidden add > .globl add > .type add,@function > add: # @add > .param f64, f64 > .result f64 > .local i32 > # BB#0: # %entry > i32.const $push2=, 0 > i32.load $push3=, __stack_pointer($pop2) > i32.const $push4=, 16 > i32.sub $push6=, $pop3, $pop4 > tee_local $push5=, $2=, $pop6 > f64.store $drop=, 8($pop5), $0 > f64.store $drop=, 0($2), $1 > f64.load $push0=, 8($2) > f64.add $push1=, $pop0, $1 > # fallthrough-return: $pop1 > .endfunc > .Lfunc_end0: > .size add, .Lfunc_end0-add > > > .ident "clang version 4.0.0 (http://llvm.org/git/clang.git > <http://llvm.org/git/clang.git> b1b3141a30d56f4feb3cc68f57d1ebaf6fbad246) > (http://llvm.org/git/llvm.git <http://llvm.org/git/llvm.git> > cf04e5f0f84bd44c375bf866d777708df39935df)" > > > Then i use binaryen s2wast: > > (module > (memory $0 1) > (export "memory" (memory $0)) > (export "add" (func $add)) > (table 0 anyfunc) > > (func $add (param $0 f64) (param $1 f64) (result f64) > (local $2 i32) > (f64.store offset=8 > (tee_local $2 > (i32.sub > (i32.load offset=4 > (i32.const 0) > ) > (i32.const 16) > ) > ) > (get_local $0) > ) > (f64.store > (get_local $2) > (get_local $1) > ) > (f64.add > (f64.load offset=8 > (get_local $2) > ) > (get_local $1) > ) > ) > ) > > And finally use wabt to get wasm file. > > If I try to run the result in Chrome Canary i get "Error: memory access out > of bounds" > > My goal is to be able to pass ArrayBuffers and other args from JS to wasm > module and to be able to write the code in C. Can someone help me to solve > this issue and maybe point to some useful resources. At this moment it is > hard to find any working examples. > > > -- > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > <http://groups.google.com/group/v8-users> > --- > You received this message because you are subscribed to a topic in the Google > Groups "v8-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/v8-users/u03PhW4wPeg/unsubscribe > <https://groups.google.com/d/topic/v8-users/u03PhW4wPeg/unsubscribe>. > To unsubscribe from this group and all its topics, send an email to > [email protected] > <mailto:[email protected]>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
