Based on a some searches, I see that Mozilla is really driving webassembly for the rust programming language. I see bare minimal stuff on swift and wasm. Any one here working on that space?
There's an active discussion on this thread:
opened 09:11AM - 14 Jun 14 UTC
closed 11:44PM - 18 May 20 UTC
wontfix
Hi team, playing around with Emscripten in earnest for the first time, not my us… ual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift program to JS:
``` swift
println("Hello, world!")
```
So far what I've tried is:
``` sh
xcrun swift hello_world.swift -emit-bc -o hello_world.bc
emcc hello_world.bc
```
but that fails because it can't find certain symbols (looks like the standard library isn't present):
``` sh
Value: %1 = call { i8*, i64, i64 } @_TFSS37_convertFromBuiltinUTF16StringLiteralfMSSFTBp17numberOfCodeUnitsBw_SS(i8* bitcast ([14 x i16]* @0 to i8*), i64 13)
LLVM ERROR: Unrecognized struct value
Traceback (most recent call last):
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/emcc", line 1540, in <module>
shared.Building.llvm_opt(final, link_opts)
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/tools/shared.py", line 1267, in llvm_opt
assert os.path.exists(target), 'Failed to run llvm optimizations: ' + output
AssertionError: Failed to run llvm optimizations:
```
Drilling a bit further, and looking at how `xcrun swift -v hello_world.swift` actually works, I'm able to use this linking command to compile the bitcode to an executable using normal `ld`.
``` sh
cp /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswift_stdlib_core.dylib .
/usr/bin/ld hello_world.bc \
-lSystem -arch x86_64 \
-L . -rpath . \
-o hello_world
./hello_world
=> Hello, world!
```
So, it seems like `libswift_stdlib_core.dylib` is the only dependency for `hello_world.bc` to be properly linked to an executable.
But I'm stuck - is there some equivalent between the `-L` and `-rpath` flags on `ld` that I should be passing to `emcc`? Or is a dylib like that not possible to be used in emscripten? The final command I tried was:
``` sh
> emcc libswift_stdlib_core.dylib hello_world.bc ~/src/experiments/swift.js • 2.1.0p0
WARNING root: emcc: cannot find library "swift_stdlib_core"
Value: %1 = call { i8*, i64, i64 } @_TFSS37_convertFromBuiltinUTF16StringLiteralfMSSFTBp17numberOfCodeUnitsBw_SS(i8* bitcast ([14 x i16]* @0 to i8*), i64 13)
LLVM ERROR: Unrecognized struct value
Traceback (most recent call last):
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/emcc", line 1540, in <module>
shared.Building.llvm_opt(final, link_opts)
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/tools/shared.py", line 1267, in llvm_opt
assert os.path.exists(target), 'Failed to run llvm optimizations: ' + output
AssertionError: Failed to run llvm optimizations:
```
Hopefully something's possible from here - Swift is a neat high-level language with a nice type system and no garbage collector, which makes me think it's a good fit for compiling to JS.
1 Like