Guild icon
swift-developers-japan
main / wasm
Avatar
@hiragram
2:25 AM
@omochimetaru -emit-irで吐いた.llをemに食わせると Appending variables with different alignment need to be linked! って言われてコンパイル通らないんだけどなんだかわかりますか・・・
Avatar
はい
2:25 AM
$ ./emsdk-portable/emscripten/incoming/emcc swift/hello.ll -o swift/hello.html warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'x86_64-apple-macosx10.9' error: Appending variables with different alignment need to be linked! ERROR:root:Failed to run llvm optimizations:
Avatar
全体としてはわからんけど何かの型についての情報が足りないって感じがする different alignment は アライメントが違うってことだから
Avatar
全文
Avatar
例えば Int は 8 ?(4?) で、 UInt8 は 1 で、みたいな。
2:26 AM
Appending variables ってのがよくわからんね
2:26 AM
どの次元の何のAppendの話なんだろう
Avatar
元のSwiftは print("Hello, Swift!") これだけ
2:27 AM
1行
Avatar
ll を生成した行は?
Avatar
$ swiftc swift/hello.swift -emit-ir -o swift/hello.ll
Avatar
swiftc swift/hello.swift -emit-ir -static-stdlib -o swift/hello.ll だとどう?
Avatar
変わらんすねえ
Avatar
llのサイズ変わった?
2:31 AM
元のやつだと、 print と String についての情報が生成されてないから
Avatar
かわんない
Avatar
あと @convention(c) func a(x: Int) -> Int { return x * 2 }
2:32 AM
とかから試したほうが良いと思う
2:32 AM
print とか String の定義とか
2:32 AM
いろいろあるから
Avatar
ok
Avatar
あれ~サイズ変わらないのか
2:33 AM
あれか、static-stdlib は リンクステージの話だから、
2:33 AM
ll を吐くステージで止めてるから意味ないのか。
Avatar
@convention って初めて使った。
Avatar
(c) つけとくとC言語から呼び出せる関数になる
Avatar
@omochimetaru swift/hello.swift:1:2: error: attribute can only be applied to types, not declarations @convention(c) ^
Avatar
付ける場所が違うかもw
Avatar
コンパイル通んなかったw
Avatar
調べて
Avatar
ok
Avatar
@_cdecl じゃないかな?
Avatar
emscripten側は内部に持ってるclangを使っててターゲットが asmjs-unknown-emscripten で、swiftcはターゲットが x86_64-apple-macosx10.9 になってるっぽい
2:50 AM
warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'x86_64-apple-macosx10.9'
2:51 AM
swiftc側のコンパイルをasmjs-unknown-emscriptenをターゲットにできればいいのかな
2:52 AM
微妙に書いてないな・・・
2:54 AM
あーどうなんだろう、同じになったほうがいいけど、しなくても大丈夫な気もしつつ。
2:54 AM
LLVMIR の時点で LLRMIR 側の i32 みたいな型で記述されているから
Avatar
alignmentが合わないのはそこの差異が原因ってことはないもの?
Avatar
ターゲットの違いがあまり問題にならない気もする
Avatar
ふむ
Avatar
いや、ありえる
Avatar
なんか調べた感じemは自分でclangのコンパイラ持ってて、swiftcで使ってるやつと別のやつが動いてる気がする
Avatar
うん、それはそう
2:55 AM
emはIRからその先の変換処理をもつために独自改造したclangを使うんだと思う
Avatar
emのSwiftに関するなっげえissue今読んでる
Avatar
序盤はdylib周りよ
2:56 AM
とりあえず @convention(c) はおいといて普通にfuncつくろう
2:56 AM
普通の(トップレベルでキャプチャがない) funcはC互換な気がしてきた
2:57 AM
ObjCから呼べるし。(thunkが作られている可能性はあるが
Avatar
hello.swift空っぽにしても同じエラーなんだけどそういうもん?
Avatar
マジか
Avatar
なんかfuncとかのステージにすら立ててない感ある
Avatar
逆にコンパイル後ってそれ何が入ってる?
Avatar
; ModuleID = 'swift/hello.ll' source_filename = "swift/hello.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.9" @__swift_reflection_version = linkonce_odr hidden constant i16 3 @llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8 define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* ret i32 0 } attributes #0 = { "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3,+x87" } !llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !9, !10} !0 = !{i32 1, !"Objective-C Version", i32 2} !1 = !{i32 1, !"Objective-C Image Info Version", i32 0} !2 = !{i32 1, !"Objective-C Image Info Section", !"__DATA, __objc_imageinfo, regular, no_dead_strip"} !3 = !{i32 4, !"Objective-C Garbage Collection", i32 1280} !4 = !{i32 1, !"Objective-C Class Properties", i32 64} !5 = !{i32 6, !"Linker Options", !6} !6 = !{!7, !8} !7 = !{!"-lswiftCore"} !8 = !{!"-lobjc"} !9 = !{i32 1, !"PIC Level", i32 2} !10 = !{i32 1, !"Swift Version", i32 5}
2:58 AM
空のhello.swiftのemit-irしたものね
Avatar
@llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8
2:59 AM
これあやしそうだね
Avatar
その怪しみ分からない…
Avatar
appending
Avatar
おー
Avatar
あと、外部関数 __swift_reflection_version
2:59 AM
が絡んでる。
2:59 AM
原理的にいまうまくいかない理由になる。
3:00 AM
; ModuleID = 'swift/hello.ll' source_filename = "swift/hello.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.9" define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* ret i32 0 }
3:00 AM
↑これだけにしたらいけないかな、あと、 main があるのおかしい気がしてきました。
3:00 AM
static library としてビルドしよう
3:00 AM
まあ、 main って名前の関数になってくれるかもしれんけど。
Avatar
Hello All, I tried using clang 3.9.0 to emit the llvm ir with -target wasm32-wasm32-wasm32, but end up getting warning for different data layout and target triple. The question is if llvm WebAssembly target is usable as is to generate llvm ir to be fed to emscripten ? The warning is expected, but should not cause problems in practice. The important things are the same in those two triples. (Except perhaps for the size of long doubles, is that important in Swift?)
3:02 AM
target違いのwarning問題なしみたいなこと言ってる
3:02 AM
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift p...
Avatar
↑はどう? シンプルにするのと、 static libary にするの。
Avatar
llをこれに置き換えればよし?
Avatar
うん。
Avatar
やってみます
Avatar
余計そうなのを消してみた。
Avatar
warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/wasm-libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/wasm-libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: incorrect target triple 'x86_64-apple-macosx10.9' (did you use emcc/em++ on all source files and not clang directly?)
3:05 AM
warningはなんか出たが一応エラーなく終了した。
Avatar
いけたw
Avatar
wasmファイルも書き出された。
3:05 AM
電車降りちゃうからまたあとで
3:22 PM
これ、今のSwiftじゃWebAssemblyできませんよでFAなのかな
3:22 PM
かなしい
Avatar
swiftc本体からのwasmターゲットが駄目なだけじゃないか
Avatar
Avatar
これはwasmバイナリの生成パスでしょう
Avatar
clang -emit-llvmとかそういう感じ?
Avatar
LLVMIRを生成して、そこから先はemやclangの機能でもっていきたい
Avatar
IRGen.cppでwasmサポート無いって言われてるから無いのかなーと判断したけど
3:25 PM
要はswiftcが-emit-irで asmjs-unknown-emscripten というターゲットでIRを吐く必要があるんじゃねという理解なんだけど
Avatar
本来的に
3:27 PM
LLVMって 言語→CPU中立なIR のフロントエンド と、 IR -> アセンブリ のバックエンドに
Avatar
うん
Avatar
分けたのが価値だったはずで
3:27 PM
でもなんでLLVMIRの生成にターゲットトリプルが絡んでくるのか
3:28 PM
そこがよくわかってない
Avatar
CPU中立なIRっていうのはCPUに依存せず同じIRっていう意味であってる?
Avatar
CPUの差と、実行ファイル形式の差(ELFとか)はまた別で、後者まではIR生成時に決まってしまうのかなあ
3:29 PM
そう
3:29 PM
同じIRからarmv7とかx86向けのアセンブリを作るのがバックエンド
Avatar
つまりosxターゲットのIRとwasm用のIRが違うのがおやおやという感じなのよね
3:29 PM
そこはなんとなくわかる
Avatar
osxターゲットというのはちょっと違う osxは armでもintelでも動くから
Avatar
おう
Avatar
で、osxの実行ファイルやstaticライブラリは Mach-O 形式
3:31 PM
あとemscriptenはもともと LLVM to JS なやつで
3:31 PM
wasmがないころからあったプロジェクトだから
3:31 PM
wasm object formatではない ELF や Mach から JSに持っていく機能があると思うんだけどなあ
3:33 PM
こまったなあ
Avatar
僕もいろいろやってみる
Avatar
@omochimetaru なんかググりのキーワードありませんか
3:36 PM
学びたい
Avatar
キーワードはもう出てる限りだと思う
Avatar
ヒィン
Avatar
バイナリと実行ファイルのしくみについての知識が不足してそう
Avatar
してる
Avatar
急がば回れ感
Avatar
そうね
Avatar
少なくとも現時点で「こうやるとできる」ってテキストは見当たらないから
3:46 PM
なんとも
Avatar
$ swiftc -emit-ir -Xcc --target=wasm32 first.swift -o first.ll
Avatar
↑それだと昨日のfatalErrorのとこに行きそう
4:34 AM
多分clangがSIGABRTで死んだ
4:34 AM
darwinが云々いわれているの、これLinuxで同じコマンド叩いたらしれっと通ったりしないかしら、というのを考えている
Avatar
<unknown>:0: note: No available targets are compatible with this triple.
4:35 AM
死亡メッセージこれだね
Avatar
でも、本当に存在しないやつとはエラーが違うのでなにかありそう $ swiftc -emit-ir -Xcc --target=wasm32aaa first.swift -o first.ll <unknown>:0: warning: argument unused during compilation: '-mmacosx-version-min=10.9.0' <unknown>:0: error: -fobjc-arc is not supported on platforms using the legacy runtime <unknown>:0: error: unknown target triple 'wasm32aaa', please use -triple or -arch <unknown>:0: error: clang importer creation failed
Avatar
5 swift 0x000000010f02cfe7 swift::performFrontend(llvm::ArrayRef<char const>, char const, void, swift::FrontendObserver)::$_0::invoke(void*, std::1::basic_string<char, std::1::char_traits<char>, std::1::allocator<char> > const&, bool) + 551
4:36 AM
clangじゃなくてswiftcだと思うよ
Avatar
swiftcか
Avatar
clangの関数とかも使って作ってるから
4:37 AM
clangっぽい関数も出てくる。
4:37 AM
エラーメッセージでswiftのソース検索すれば多分デル
4:37 AM
ていうか普通に swift::performFrontend じゃないかな
4:39 AM
さっきのメッセージはここからllvm内部から戻ってきてそう
Avatar
DockerでUbuntuたててその中でやってみたけどやっぱSIGABRT
4:58 AM
Darwinとか言われなくなったけど多分Macでやったのと同じ話だとおもう
4:59 AM
お仕事もどります 🙃
Avatar
error: <unknown>:0:0: in function _T01b3addS2i_SitF i64 (i64, i64): WebAssembly doesn't support non-C calling conventions
7:30 AM
define hidden swiftcc i64 @_T01b3addS2i_SitF(i64, i64) #0 { entry: %2 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %0, i64 %1) %3 = extractvalue { i64, i1 } %2, 0 %4 = extractvalue { i64, i1 } %2, 1 br i1 %4, label %6, label %5 ; <label>:5: ; preds = %entry ret i64 %3 ; <label>:6: ; preds = %entry call void @llvm.trap() unreachable }
7:31 AM
Swiftのトップレベル関数は swiftcc ってコンベンションになってて、 llc の wasm モードがそれをサポートしてないからダメっぽい
7:36 AM
LLVM自体は swiftcc のサポートがバックポートされてるっぽくて
Avatar
おー
Avatar
CallingConv::Swift で調べると lib/Target/X86とか lib/Target/ARMに
7:37 AM
CallingConv::Swift の分岐がある
7:37 AM
でも lib/Target/WebAssembly には無い
7:37 AM
これが一つの壁っぽい
Avatar
これ誰の進化が必要なんだ
Avatar
LLVMのwasmターゲットがswiftccをサポートする必要がある
7:39 AM
LLVMのIRまではswiftccがサポートされてるけどwasm仮想CPU向けが無いってこと
Avatar
LLVM側かあ
Avatar
wasmの関数呼び出しについて調べて、swiftcc周りのx86とarm周りの勉強をすれば
7:40 AM
ちょっと進むね。
Avatar
けわしー❗
7:40 AM
けど興味あり
Avatar
険しいけどちょっとおもしろそうだからいろいろ調べてみようかな
Avatar
本家LLVMとSwiftのLLVMがどのくらい乖離してるのか見てるんだけど
10:17 AM
git show-branch llvm/master origin/swift-4.1-branch .... + [origin/swift-4.1-branch~577] Canonicalize the spelling of RefDie (NFC) + [origin/swift-4.1-branch~578] dsymutil: strip unused types from imported DW_TAG_modules + [origin/swift-4.1-branch~579] Debug Info: Don't strip clang module skeleton CUs. ++ [llvm/master~5237] Recommit r274270, [CMake] Module builds depend on target intrinsics_gen to be built first.
10:18 AM
本家のmasterの5200コミット前と swift-4.1-branchの580コミット前に共通のコミットがあってそこからわかれてる、つまり5700コミットぐらい乖離している・・・?
Avatar
おもしろ
Avatar
commit 18e8f9ef0645b15c777547d8655a17a315b0815d Author: NAKAMURA Takumi <geek4civic@gmail.com> Date: Wed Jul 19 11:27:31 2017 +0000 Recommit r274270, [CMake] Module builds depend on target intrinsics_gen to be built first. The builder clang-x86_64-linux-selfhost-modules-2 complains. Investigating. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308439 91177308-0d34-0410-b5e6-96231b3b80d8
10:21 AM
その共通のコミットが2017年6月なんだけど
10:21 AM
半年間ぐらいSwift側の成果が本家に戻ってないってこと・・・?見方があってるのかよくわからない
10:26 AM
あ〜〜〜〜
10:26 AM
Swiftの方のLLVMだと、最近のWASM対応が入って無くて、 llc b.ll -march=wasm32 -filetype=asm -o b.s llc: error: invalid target 'wasm32'.
Avatar
xcrun clang で動くclangは-target=wasm32使えたけどそういうもん?
Avatar
llcはllvmのツールで
10:29 AM
clangはまた別管理だから
Avatar
ふむ
Avatar
それはあれだよね、C言語を .ll にするときに、ターゲットをwasm32にできるってことよね
Avatar
そそ
10:30 AM
Cはできた。
Avatar
その続きっていける?
Avatar
emscripten?
Avatar
clang: a.c => a.ll ( この続きは何を使う? ) (edited)
Avatar
10:31 AM
できたって言ったのは .llじゃなくて .bc 吐くのだった
10:31 AM
xcrun clang -emit-llvm hoge.c -o hoge.bc
10:32 AM
.ll 吐いてその先は試してない
Avatar
bcとllは同じもののバイナリとアスキー版じゃないんかな
Avatar
そうなん?
Avatar
bitcodeファイルはllvm-disコマンドでテキストのLLVM IRとして出力することができます。
Avatar
へー
Avatar
disってことは逆かな アスキーのIRが バイナリのbcになるんかな
Avatar
なんとなく中間表現→ビットコードのイメージだった
10:34 AM
llvm-as is the LLVM assembler. It reads a file containing human-readable LLVM assembly language, translates it to LLVM bitcode, and writes the result into a file or to standard output.
10:34 AM
If the input is a file that ends with .ll, then the output file is of the same name, except that the suffix is changed to .bc.
10:34 AM
llvm-as で .ll が .bc になると
10:35 AM
で、llcで .ll または .bc がネイティブアセンブリ (.s) になりますよと
10:37 AM
で、wasm32な .s を吐ければ、あとは Wasmのツールの管轄
10:38 AM
Cから生成された .ll であれば llc で .s にできるけど、 swiftから生成された .ll は、 .ll の中で swiftcc などのSwift仕様が含まれていて、 llc が通らない。
10:38 AM
ってのがここまでの流れ。
Avatar
llcをどうにかする方法を模索する流れ?
Avatar
実装するしかないんじゃあないかなあ
Avatar
おおごとになってきた
Avatar
swiftc -emit-ir b.swift -o b.ll llc b.ll -o b.s libs=/Users/omochi/work/swift-source/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx gcc -L$libs b.s -o b.out LD_LIBRARY_PATH=$libs ./b.out
2:09 PM
↑そもそも通常のswiftの場合で実行までの手順を調べた
2:11 PM
$ cat b.swift print("hello swift")
2:12 PM
printだけじゃなくて、 _swift_retain とかも外部リンクされているので
2:14 PM
wasmに乗っける時に持ってこないといけないんだけどそこらへんもやり方が謎
Avatar
-static-stdlib の挙動について調べたけど、 /usr/bin/ld に -force_load_swift_libs を渡すようになっているだけで、
2:52 PM
/usr/bin/ld についてはオープンソースになってないから、何もわからんという結論になった
3:50 PM
llvmの引数属性として Swiftの self 用とか Swift の error 用とか足してある
Avatar
upstream-with-swiftっていうブランチがあるけど、CIは通ってないぽい。 https://ci.swift.org/view/swift-master-next/
Avatar
Kotlin/Nativeはwasmを正式にサポートしているのね
Avatar
昨日 LLVMの lib/Target をリーディングしてみたけど
1:49 AM
CPUに関する広くて深い知識が無いと何がなんだかわからん、ってなった
Avatar
KotlinNativeがwasmサポートしたのごくごく最近だった。
7:03 AM
We’re happy to announce the release of Kotlin/Native v0.4, KotlinConf 2017 edition! This release adds support for accessing Objective-C APIs on iOS and macOS, WebAssembly target platform, as well as introduces major changes making app development in Kotlin/Native way easier. Platform … Continue reading →
7:04 AM
SwiftがどうにもならないとしたらKotlinでWebフロント開発のほうで遊んでようかな
Avatar
KotlinNativeでwasm、 $ kotlinc -target wasm32 hello.kthello.wasm が直接吐かれて超楽っぽい。
6:22 AM
emscriptenいらずかも
Avatar
omochimetaru 12/4/2017 6:32 AM
よいね
6:33 AM
メモリ管理ってどうなってる?
Avatar
どうなってるとは
Avatar
omochimetaru 12/4/2017 6:33 AM
Kotlin/Nativeってことだから、参照カウント方式だったと思うんだけど
6:33 AM
弱参照作れるの?
Avatar
まだKotlinハローワールドしかしてないので答えを持っていない
6:33 AM
やっていく
Avatar
omochimetaru 12/4/2017 6:36 AM
想像なんだけど今は弱参照作れなくて循環参照で無限メモリリークだったりしない?
Avatar
うーん
Avatar
omochimetaru 12/4/2017 6:40 AM
Kotlin/Native uses automated memory management, currntly based on automated reference counting with cycle collector. See here for details: https://github.com/JetBrains/kotlin-native/blob/master/runtime/src/main/cpp/Memory.cpp
kotlin-native - Kotlin/Native infrastructure
6:40 AM
Will Kotlin native be garbage collected or managed manually like C, Rust, etc?
6:40 AM
まじかよサイクルコレクター入ってた
Avatar
サイクルコレクターって何ですか
Avatar
omochimetaru 12/4/2017 6:41 AM
循環参照があってもメモリ解放してくれる機構のことです。
6:41 AM
pythonとphpに入ってるよ。
Avatar
へえ
Avatar
omochimetaru 12/4/2017 6:41 AM
あ、それの、参照カウンタ方式のときに使うアルゴリズムのことね。
6:41 AM
普通のmark-sweep等のTrace GCなら循環の解放は当たり前なので。
6:43 AM
循環参照の問題が無いから特に何も書かれてないのか かっこいい
Avatar
omochimetaru 3/10/2018 2:45 PM
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift p...
2:45 PM
swift-wasmに進捗があったみたい
2:46 PM
The calling conventions are mostly for the backends, so it should be possible to just ignore it. That is, if swift didn't emit it, it should be ok, and for now you can strip it from the IR manually for testing. (There are exceptions like tail call optimizations that are done on IR and depend on the convention, but I don't think that would be an issue here.)
2:47 PM
swiftccコーリングコンベンションは普通に無視すればいいよってkripkenさんが言っていて、そのあと他の人が進捗してる
Avatar
そのスレの最後にもあるし、さっきTwitterにも書いたけど
Avatar
omochimetaru 3/10/2018 2:49 PM
お?
Avatar
swift-llvmがLLVM 6.0に追従したようなのでちょっと楽になるのかな https://github.com/apple/swift-llvm/pull/80 (edited)
2:50 PM
WebAssembly backendがSwift付属のLLVMに含まれることになりそうということで。
Avatar
omochimetaru 3/10/2018 2:50 PM
あ、なるほど
Avatar
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swi...
3:02 AM
Swift for WASM スレで、定期的に誰かしら「なんか進捗あった?」って書き込まれるんだけど
3:03 AM
今回はなんかでかめの進捗が報告されてる
3:04 AM
stdlibのビルドはほぼできたらしくて
3:04 AM
バイナリのリンクとかdylibの取り回しの方をWASM環境に適用するのに手こずってるらしい
3:04 AM
めっちゃ大変そう > Unfortunately, a build system used within Swift compiler infrastructure is not very modular, it uses a mix of shell scripts, Python scripts and CMake.
Avatar
This adds an extension point so the ABI can declare whether or not it supports the swift calling convention. Open to suggestions if you think this doesn't belong here (or is flat out the wrong ...
2:25 AM
いつぞやのwasm対応でswiftcc切るやつ、ジョンマッコールに、「ちゃんとやりなさい」ってリジェクトされてて笑った
Avatar
omochimetaru 4/10/2019 1:25 AM
@daniel_dunbar Are you still working on Swift WebAssembly exploration? (SR-9307, https://t.co/u88AVpVn2M hasn't seen activity since January) I'm also trying to get Wasm working (trying to integrate either Emscripten or WASI as the runtime) and would like to know how I can ...
1:26 AM
新たなWASM進めるマンが来た!(ダニエルさんは作業止まってたらしい)
Avatar
omochimetaru 5/10/2019 7:56 PM
おお!?
7:57 PM
Website for the SwiftWasm project. Contribute to swiftwasm/swiftwasm.org development by creating an account on GitHub.
7:57 PM
zhuoweiさんが主にやってるっぽいな
7:58 PM
What&#39;s in this pull request? This pull request adds initial support for compiling Swift code to WebAssembly. &quot;Hello world&quot; works, and a large subset of the stdlib already ...
Avatar
https://forums.swift.org/t/wasm-support/16087/17 正しく意図が読み取れてるか自信がないので相談させてください。
If there's the equivalent of an import table or GOT, it might still be interesting to have something like RelativeIndirectablePointer, but with an absolute address, to still be able to avoid up-front load time costs for cold metadata structures.
これってGOTがあるなら絶対アドレスにしなくてもロード時間は減らせるよね?っていうことですかね。
Avatar
omochimetaru 2/20/2020 7:41 AM
もしインポートテーブル(Windowsのやつ?)かGOT(Linuxのやつ)と同じものがWASMにもあるなら、 RelativeIndirectablePointerを採用することは意味があるだろう(be iteresting) もし(それがあるのに(but))絶対アドレスを使うのであれば、 コールドメタデータの起動時のロード時間を減らす事がそれについても(still be able)できる
7:41 AM
と読んだ。
7:42 AM
起動時じゃないかもな、(up-front)
Avatar
なるほど
Avatar
omochimetaru 2/20/2020 7:43 AM
RelativePointerを使ってれば、内部のRelative差分についてはGOTのエントリが減るわけだから、GOTの書き換えコストがカットできるって話かと思った。
7:43 AM
RelativeIndirectablePointerは、基準となるシンボル(GOTエントリ)からの相対オフセットでアドレスを表すから、リンクするのは基準シンボルだけだけど、 絶対ポインタを使ったらそういう隠蔽が効かなくなって何もかもGOTエントリに載ってくる (edited)
Avatar
RelativePointerを使わない場合でもwasm上では内部のシンボル参照にGOTは必要なくて、静的にリンクするときに全部解決されるはず。
7:48 AM
あと、GOTエントリに何もかも載るのは普通のGOTじゃないですか? (edited)
Avatar
omochimetaru 2/20/2020 7:48 AM
うん、俺もそう思ってて、WASM実行プロセスにGOT自体存在していないのでは?
7:49 AM
WASMファイルを動的に追加で読み込んだ場合って、JavaScript経由で関数取り出してガチャガチャとバインディングするしかないよね?
7:50 AM
RelativeIndirectablePointerで指し示す対象はシンボルの公開をしないでおけて載らないんじゃないかしら? > GOTエントリに何もかも載るのは普通のGOTじゃないですか? (edited)
Avatar
GOTはLLVMがそれっぽく見せかけるために静的なテーブルを用意してくれますが、動的にリンクしたりするのは出来ないです。
Avatar
omochimetaru 2/20/2020 8:01 AM
通常の関数呼び出しはそれ経由になってるの?
Avatar
1つのオブジェクトファイルにまとまってないやつはそうなるはずです
8:04 AM
リンカが関数テーブルを作ってくれて再配置可能wasmモジュール間の関数参照を解決してくれます
Avatar
omochimetaru 2/20/2020 8:05 AM
あ〜オブジェクトファイル境界がそう効いてくるのか。
Avatar
なので、返信としては相対絶対に関わらずGOTを経由するケースはあるのでIndirectPointerを使う必要はある、ですかね。
Avatar
omochimetaru 2/20/2020 8:10 AM
オブジェクトファイルって .o 単位の事?
Avatar
そうです
Avatar
omochimetaru 2/20/2020 8:11 AM
.o ごとにGOTがあるの? .dylibごとかと思ってた
Avatar
うーん、あれれ。たしかにリンク時にテキストセクションを参照先のアドレスに書き換えれば良いからGOT経由しない気がしてきた
Avatar
omochimetaru 2/20/2020 8:15 AM
そうそう。
8:15 AM
でdylibごとだとするとwasmの場合全部静的リンクされてるから
8:15 AM
たとえGOTがあったとしても誰も使わないのではと思って。
Avatar
そうそう、それ朝思ったんだ。朝の時点では「本来GOTを経由する必要は無いので、RelIndirectPterって本当に必要が考える必要あるよね(interesting) 」だと思ってたんだ (edited)
Avatar
omochimetaru 2/20/2020 8:18 AM
あ、but以下読み違えてたかも
8:20 AM
絶対アドレスを使えば静的メタデータの読み込み時間は回避できるよね(関節化が無くて速いから) か?
8:21 AM
avoid up-front load time costs がよくわからないな〜
Avatar
butの前後関係がイマイチわからんなー
Avatar
どうして静的にnon-PICなwasmファイルを構成する個別のオブジェクトファイルにGOTがあるのかわかった。コンパイラ自体はPICなコードを吐くから個別のオブジェクトファイルにGOTエントリが生成されるけど、リンカはnon-PICなコードを吐きたいのでそれを静的なGOTとしてwasmに埋め込むんだ。
Avatar
リンカはnon-PICなコードを吐きたいので
ここの「ので」がわからなかったので、詳しく知りたい
11:02 AM
位置独立コードからデータを参照する場合はさらに間接的な方式となり、そのコードがアクセスする全グローバル変数のアドレスを格納したGOT (Global Offset Table) を使用する。コンパイル単位またはオブジェクトモジュールごとにGOTがあり、コードから見て固定の相対位置に置かれる(ただし、ライブラリをリンクするまで実際のオフセットは不明である)。リンカがモジュール群をリンクして共有ライブラリを作る場合、各モジュールのGOTをマージし、最終的なコードとのオフセット値を設定する。
https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%BD%AE%E7%8B%AC%E7%AB%8B%E3%82%B3%E3%83%BC%E3%83%89
11:03 AM
↑とりあえず、オブジェクトファイルごとにGOTはあって、静的リンクするときにマージされていくものらしい (edited)
Avatar
のでの意味
これは単にwasm-ldのデフォルトの挙動としてnon-PICなコードを吐く、という意味でした。一応PICとして吐くこともできるんですけど、その場合はEmscriptenのABI unstableなdynamic loaderの仕様に載っかることになるので一般的ではないです。
Avatar
単にコンパイラがオブジェクトファイルを生成する時にはPIE対応してGOTを含めているのがリンク後も残っているという話?
Avatar
そんな感じです。
11:32 AM
リンカの中で分岐があって、静的にGOTを作る場合とdynamic loaderであとからリンクする場合があります。 https://github.com/llvm/llvm-project/blob/c8f9e526bc5319f2d0beed4012fbf17b11e15161/lld/wasm/Relocations.cpp#L47-L59
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
ふむふむ
Avatar
技術的内容は理解していないのですが、英語としてはこの"but"は「ではなく」くらいの意味じゃないかな。「GOT的なものがあるので有れば、絶対アドレスではなく、Relative..Pointer的なもの持つことをを検討する価値があるかも知れない」。
Avatar
おお、そうすると頓珍漢な回答をしてしまったかもしれない…
12:28 PM
ありがとうございます
Avatar
んーわからん。英語わからないのでリフレーズしてください、が確実か?
Avatar
そうですねー、適当なこと書くよりそれが確実ですね
Avatar
https://forums.swift.org/t/wasm-support/16087/19 だいぶ前提が共有されたみたいで話が前進しました
Well, if all wasm code is eventually linked into one object file for deployment, then there shouldn't ever strictly be a need for a GOT (though Swift or LLVM may end up incidentally generating entries because it assumes a symbol might come from a dynamic library in many cases)...
😊 1
Avatar
omochimetaru 2/20/2020 4:53 PM
結局IRGen飛び越えてLLVM内部の方に行くのね
Avatar
このスレッドの文脈でKeyPathの呼び出し規約が通常のswiftccから逸脱しているのでは?ということを質問してみました。 https://twitter.com/omochimetaru/status/1232538643731927041?s=20 (edited)
@kateinoigakukun あ〜そっか、サンクの仕様までを固定しておけば、本当のプロパティのgetter自体のABI仕様は露出しないのか。それはありそう。
11:34 PM
@Joe_Groff Hi! While I was fixing the rest of failing test suites, I found that another issue for ABI. As described here, Swift ABI allows using non-generic function as generic function directly. On WebAssembly runtime, this ABI causes signature mismatch between callee and...
11:37 PM
具体的にはindicesの有無とジェネリックコンテキストの有無がオプショナルになっている部分です。
11:39 PM
さっき回答が来て、それを見るにこの呼び出し規約は多分KeyPath特有で、これのせいでKeyPathのインライン化も面倒なことになっているらしい https://forums.swift.org/t/wasm-support/16087/23
Regarding key paths, their weird calling convention is also an issue for optimization, so we may introduce a SIL convention for key path accessors, which would be another marker you could use to lower them to a consistent LLVM function type for wasm:
Avatar
omochimetaru 2/27/2020 2:07 AM
so we may introduce a SIL convention for key path accessors, which would be another marker
2:07 AM
これって、新しいSIL conventionを新たに追加して、KeyPathアクセサにそれを設定するようにしようと思っていて、
2:07 AM
そうすれば、KeyPathアクセサのところにWASM対応を仕込まなくても、
2:08 AM
このSIL convensionがついてる関数の呼び出しのところにWASM対応を入れるようにすることで
2:08 AM
今後同種の呼び出しが追加されたときもうまく動くようにできるって意味かと思った。
2:08 AM
conventionってcalling conventionの事なのかなと。
Avatar
同じように解釈しました
Avatar
omochimetaru 2/27/2020 2:23 AM
あい。このマーカーが付くまでのことに関しては、KeyPathアクセサしか存在しないと。
2:23 AM
Swift ABIの文書でのくだりだと、細かい調整以外は原則Cコンベンションと同じだって気当てあって
2:23 AM
Cコンベンション自体が原則、末尾引数の無視が可能だから
2:24 AM
なんか厳密なロジックだとあらゆる場面で無視されうる気はする。
Avatar
あー、たしかにそんなこと書かれてた気がするなぁ
Avatar
omochimetaru 2/27/2020 2:24 AM
swiftselfとかswifterrorに関しても
2:24 AM
専用のレジスタを割り当ててオプショナルにすれば性能が出せるけど
2:25 AM
最悪それがなくても、ベースのコンベンションがCで可変だから、そこの仕組みで無視したら良いしね、みたいな
2:25 AM
触れられ方をしている。
2:25 AM
まあ、どうせ無理だしスルーが良いと思うけど
2:25 AM
規格としてもう禁止してほしいよな。
Avatar
ですねー
2:26 AM
逆にclangとかのCのwasmローワリングはどうなってるんだろう
Avatar
omochimetaru 2/27/2020 2:27 AM
たしか〜に
2:27 AM
Cでコレがダイレクトに効いてくるのが確か
2:27 AM
Cの可変長引数として実装した関数を
2:27 AM
固定引数の関数として呼び出しても動くっていうのじゃなかったっけ
2:28 AM
あれ、逆かな?
Avatar
そのへんちゃんと調べたこと無いなぁ
Avatar
omochimetaru 2/27/2020 2:28 AM
てか、printfとかどうなってんだろうね。
Avatar
ちょうどva_listのテストケース壊れてるんで調べてみます
Avatar
omochimetaru 2/27/2020 2:29 AM
format文字列とパラメータ数が不一致の場合、引数のclaimができないはず
Avatar
↑のClangのWebAssemblyローアリングパス調べてみたんですけど、シグネチャが一致してない関数呼び出しに対して、新しくその呼び出し専用の関数を作って置換してました。
4:16 AM
ただこれができるのはcalleeが特定できるダイレクトな関数呼び出しでないといけないのでSwiftの場合は同じ要領ではできなかったです。
Avatar
omochimetaru 3/12/2020 4:16 AM
じゃあ動的な関数ポインタ経由だったらダメなのか。
Avatar
です
Avatar
omochimetaru 3/12/2020 4:17 AM
壊れてるやん。
Avatar
変換用のPassがあって、それ読む限り関数ポインタまで追っかけてないように見えるんですよね https://github.com/llvm/llvm-project/blob/master/llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
omochimetaru 3/12/2020 4:18 AM
まあ動的にやってたらわからんしね。
4:19 AM
そうかあ。そういうこともあるんだなあ。
Avatar
こっちのPassで関数同士のbitcastに対してサンクを挟んでるのでそれで実は動くのかもしれない https://github.com/llvm/llvm-project/blob/master/llvm/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
omochimetaru 3/12/2020 4:20 AM
いずれにしても uintptr_t とかタグポインタとか挟んで取り回してたら検出できないっしょ。
Avatar
そうですねー。
Avatar
omochimetaru 3/12/2020 4:22 AM
まあやっぱ本質的には互換を取る方法は無いってことなんだな。
4:22 AM
いろいろな前提条件の範囲でごまかすしかない
Avatar
そうなんですよ。高級ゆえの制限が既存アーキテクチャよりめちゃくちゃ多い
Avatar
wasm向けツールチェーンの配布をはじめました。swiftenvで入れられるので良かったら試してみてください。 https://twitter.com/kateinoigakukun/status/1240070796321492992?s=20
自動で毎日UTC 00:00に最新のSwift for WASMツールチェーンを配布するようにしました https://t.co/ZAi1ggJfDe
👏 1
Avatar
omochimetaru 3/18/2020 9:09 AM
swiftenvを使わずにxcodeのツールチェーン切り替えではできないの?
Avatar
~/Library/Developer/Toolchains に手でインストールすればXcodeからも切り替えられます
9:12 AM
インストーラは署名しないといけなかったり面倒だったのでまだ作ってないです。
Avatar
omochimetaru 3/18/2020 9:13 AM
あー、インストーラってそうなのか。 でもswiftenv入れるよりはハードル低いと思った
Avatar
なるほど
9:13 AM
時間あるときに用意してみます
🙂 1
Avatar
SwiftでWebアプリ開発のPoCを作ってみました https://twitter.com/swiftwasm/status/1247797285016055809?s=20
Things are progressing really well here at SwiftWasm! With JavaScript/DOM bindings and SwiftPM more or less working, @kateinoigakukun created a simple Conway’s Game of Life demo here: (wait for it to load, binary size is still something we’re working on) https://t.co/mIDYmV...
🤩 1
8:21 AM
ローカルで動かす分には全く気にならなかったんですが、インターネットを介すと無視できないダウンロード時間がかかります
Avatar
Kishikawa Katsumi 4/8/2020 8:24 AM
おお、すごい。 めっちゃすぐ動いたよ
Avatar
omochimetaru 4/8/2020 8:26 AM
いま買い物に出てるけど4G回線で一瞬だった
Avatar
うち今WFH勢で回線逼迫していて20秒くらいかかった
Avatar
omochimetaru 4/8/2020 8:27 AM
ww
Avatar
うちもキャッシュないと20秒くらいかかるんですよねー
8:28 AM
ちなみに一瞬だった勢は下りどのくらい出てますか?
Avatar
omochimetaru 4/8/2020 8:29 AM
Avatar
Kishikawa Katsumi 4/8/2020 8:30 AM
ダウンロードのスピードはどのくらいですか? Fast.comでは瞬時かつ簡単に、お客様の推定ISPスピードを表示します。
8:30 AM
そんな速くないよ。
Avatar
うーん何でそんなに差が出るんだろう… https://fast.com/ja/share/90Mbps.html
ダウンロードのスピードはどのくらいですか? Fast.comでは瞬時かつ簡単に、お客様の推定ISPスピードを表示します。
Avatar
Kishikawa Katsumi 4/8/2020 8:33 AM
ほとんど一緒や
8:34 AM
ChromeとSafariのプライベートセッションで試してみたけどやっぱりすぐだったよ。計測したわけじゃないけど2、3秒もかかってないと思う。20秒は絶対かかってない。
8:36 AM
WebAssenblyは演算した結果を見せようと思ったらJSのブリッジが必要になってCanvasとかDOMを使って表示する、ということですか?
Avatar
そうですー
Avatar
Kishikawa Katsumi 4/8/2020 8:40 AM
なるほど。じゃあ描画がボトルネックのものをなんとかするものじゃないんですね。 SwiftとWebでいわゆるビジネスロジックが共通化できる、というのは明確な利点か。
Avatar
omochimetaru 4/8/2020 8:42 AM
高速化にも期待したいですね 書きやすいRustのポジション
Avatar
Kishikawa Katsumi 4/8/2020 8:44 AM
実際、今のJSとRust、Swiftで速度差ってかなり違うんですか?
8:45 AM
今のJSは普通に速い印象。
Avatar
ちゃんと計測したことないですね、
Avatar
omochimetaru 4/8/2020 8:45 AM
JSとRust比べるとちょっと早いみたいな事をgfxさんが以前言っていたような
Avatar
ほー
Avatar
omochimetaru 4/8/2020 8:46 AM
RustとSwiftはいい感じの比較をそもそも見たことがない
8:46 AM
使う領域が重なってないから実験する人が居ない・・・
8:47 AM
ただJSのJITとWASMランタイムに歴史の差があるからJSが結構速いって感じらしい
Avatar
Kishikawa Katsumi 4/8/2020 8:48 AM
まあRust、Swiftの比較は重要じゃないと思います。JSと「Rust、Swift」でそこまで違いがあるかどうか、ですね。
Avatar
前にChromiumのWASMランタイムちょっと読んだときは未だあんまり積極的なJIT最適化は無かったですね
8:52 AM
ネイティブバイナリに近いパフォーマンスを実現するっていうのがwasmのウリなので気合い入れてるとは思うんですけどね
Avatar
omochimetaru 4/8/2020 8:55 AM
スマホでは5秒ぐらいだった 多分初見の時にボタンの意味とか考えてた
8:55 AM
これ緑の初期状態が出るまでがロード時間か。
8:56 AM
8:56 AM
macだと1秒ぐらい。
Avatar
Kishikawa Katsumi 4/8/2020 8:56 AM
インターネットの速度がめっちゃ速い
Avatar
めっちゃ速い
Avatar
omochimetaru 4/8/2020 8:58 AM
有線のゲーミングマシンならもっと速いで😏
Avatar
バイナリサイズはRustとかGoでも問題になってるんですけど、標準のモジュールの粒度が非常に小さいので一応どうにかなってるんですよねー
Avatar
omochimetaru 4/8/2020 9:01 AM
家庭くんが留学して解決してくれるんでしょ。
Avatar
GSoC採択されなかったとしても個人でやると思いますけどねw
Avatar
omochimetaru 4/8/2020 9:03 AM
留学のほうがオマケだった
9:06 AM
GSocのテーマそのままクラウドファンディングにしてiMacPro調達しようぜ
😎 1
Avatar
4秒ぐらいで見れますね (ただ netlify はCDNに乗ってないとでかいファイルが極端に遅くなるので、あんまり見られてない地域からとかだと遅くなるかも?)
🧐 1
Avatar
iWork for iCloud 10.0では、C++/ObjCで書かれWebAssemblyとして取り出された機能を含む様になったらしい。 https://twitter.com/lrz/status/1250453967957561344 (edited)
What have I been working on lately? Just a few days ago, iWork 10.0 shipped with iCloud apps that now include features extracted from the native codebase (C++/ObjC), using WebAssembly!
Likes
293
Avatar
omochimetaru 4/16/2020 1:49 AM
アップル自身が既存コードのWASMポートを運用してるのか〜
Avatar
やっとwasm向けFoundationのビルドが通るようになりました https://github.com/swiftwasm/swift/pull/1000
Bits of the dependency installation scripts were refactored to make the local development a bit easier. Overall, Foundation is not fully working yet due to the OOB bug, and to link with it you need...
🎉 10
3:49 AM
まだほとんど動かないですが…w
3:50 AM
リンクするとバイナリサイズは11MBから26MBにガッツリ太りました。 (edited)
Avatar
誰かがやるだろう思っていた SwiftWebUIのwasm移植を@CarsonKatriさんが始めたみたいです。 @State周りもちゃんと動いていて凄い https://twitter.com/kateinoigakukun/status/1268065986294378502?s=20
PoC of SwiftWebUI using SwiftWasm was published! https://t.co/SjWSQdi7w8
👀 1
6:31 AM
6:32 AM
SwiftUI with support for WebAssembly. Contribute to carson-katri/SwiftWebUI development by creating an account on GitHub.
6:32 AM
シュッと試すためのスクリプトもREADMEに用意されていたので手元で動かしてみると楽しいと思います。 (edited)
Avatar
omochimetaru 6/3/2020 6:33 AM
おお・・・
Avatar
omochimetaru 10/6/2020 1:20 PM
The SwiftWasm book to get you started. Contribute to swiftwasm/swiftwasm-book development by creating an account on GitHub.
1:20 PM
読んでる
Avatar
1:20 PM
昨日ちょっと書き足した
Avatar
omochimetaru 10/6/2020 1:21 PM
配布してるツールチェインはxctoolchainではないんだね
Avatar
あー、とりあえずtarballで配布してます
1:22 PM
xctoolchainだとなんか違うのかな
Avatar
omochimetaru 10/6/2020 1:22 PM
Xcodeから切り替えられるから安心感があった
1:22 PM
swiftenvを入れたくないので。
Avatar
あー、なるほど
Avatar
omochimetaru 10/6/2020 1:22 PM
自分で入れるとするとどこに置こうかなと迷う 迷うだけだけど
Avatar
swiftenv最近僕も微妙だと思い始めてきたのでちゃんとやろうかな
Avatar
omochimetaru 10/6/2020 1:23 PM
とりあえず $HOME/swift でも作ろっと
Avatar
ツールチェーンによってあったりなかったりするコマンドがあって、shimsが頻繁に壊れて事故る
Avatar
omochimetaru 10/6/2020 1:24 PM
1:25 PM
xctoolchainだと
1:25 PM
export TOOLCHAINS="org.swift.51220191107a" で
1:26 PM
swift自体が自力で切り替わってくれるようになるけど
1:26 PM
この形態の場合はこういう切り替える方法はあるんだろうか
1:26 PM
それともPATHで直接参照させるだけ?
Avatar
PATHの優先度変えるだけで良いと思います
1:27 PM
付随してるライブラリとかはswiftcからの相対パスで決まるので
Avatar
omochimetaru 10/6/2020 1:27 PM
PATHだけいじって $ swift が切り替わってれば他はいろいろと連動するはずってことね、OK
1:30 PM
げ!
1:30 PM
1:30 PM
全部のコマンドに対してこれが出るぞ!
Avatar
うそーん
Avatar
omochimetaru 10/6/2020 1:30 PM
一度右クリックから実行すれば許可リスト入りするけど
1:30 PM
bin/の中の全部にやるのは大変w
Avatar
なんかそれ手元では出ないんですよね
Avatar
omochimetaru 10/6/2020 1:32 PM
誰がビルドしたか的な情報が入ってんのかな。
1:33 PM
コマンドラインで一気に浄化する方法探してる
1:34 PM
EXAMPLES To check whether Mail.app is allowed to run on the local system: spctl -a /Applications/Mail.app To allow Frobozz.app to run on the local system: spctl --add --label "My Stuff" /Applications/Frobozz.app To forbid all code obtained from the Mac App Store from running: spctl --disable --label "Mac App Store"
Avatar
じゃあ僕はちゃんと署名する方法探します
Avatar
omochimetaru 10/6/2020 1:34 PM
助かるw
Avatar
omochimetaru 10/6/2020 1:43 PM
[omochi@omochi-iMacPro bin]$ sudo spctl --add --label swiftwasm $(pwd)/swift-demangle Password: [omochi@omochi-iMacPro bin]$ ./swift-demangle Killed: 9 [omochi@omochi-iMacPro bin]$ sudo spctl -a swift-demangle swift-demangle: rejected (the code is valid but does not seem to be an app)
1:43 PM
できそうでできないなあ
1:43 PM
--master-disable でセキュリティ全解除する情報ばっかり出てくる
Avatar
それは嫌だなぁ
Avatar
omochimetaru 10/6/2020 1:45 PM
I have a "command line tool" target (not an App bundle) in Xcode that is being blocked by Gatekeeper. I've used this tool for years as a simple installer for my PostCheck Address Book plugin. In 2...
1:45 PM
The solution is to distribute the command line tool on a signed disk image rather than in a zip file.
Avatar
100正しい
Avatar
omochimetaru 10/6/2020 1:46 PM
なんかspctlでコントロールできるのは .app だけな雰囲気がある
1:46 PM
the code is valid but does not seem to be an app
Avatar
うーんこれは誰の証明書でサインしたら良いんだ
1:50 PM
Apple Developer AccountはOSS Organizationみたいな括りは無いんだよな
Avatar
omochimetaru 10/6/2020 1:52 PM
CIで作ってるなら、誰かの秘密鍵をCIに設置しないといけないね・・・
1:55 PM
うおーだめだわからん、Finderで右クリックした時相当のspctlの叩き方が不明。
Avatar
それこそ手元で署名したら良いんじゃないですか?
Avatar
omochimetaru 10/6/2020 1:57 PM
再署名ってできるんかな
Avatar
再署名できるはず。XVimとか入れるのにXcode再署名したことがあるきがする
Avatar
omochimetaru 10/6/2020 1:58 PM
なるほど
Avatar
というか今回はもともと署名されてないから。。。 (edited)
Avatar
omochimetaru 10/6/2020 1:58 PM
実行ファイル単体って
1:58 PM
どこに署名がうまるんだ?
Avatar
objdumpするとinfo_plistなるセクションが出てくるからMachOバイナリとして埋まってるんじゃないですかね (edited)
Avatar
omochimetaru 10/6/2020 2:00 PM
なるほど。
Avatar
いや、よくわからんな… これ
Avatar
omochimetaru 10/6/2020 2:04 PM
iPhoneだけで、Mac developerのidentifier入ってなかった。また明日・・・
Avatar
なるほど
Avatar
omochimetaru 10/6/2020 2:06 PM
swift-demangleが通らなくてもswift demangleは通ったから(swift-frontend)は右クリック済み (edited)
2:06 PM
もしかしたら困ったら手動で右クリックしてればそんなに困らないかも
Avatar
なるほど?直接発火するバイナリさえ浄化されていればOK?
Avatar
omochimetaru 10/6/2020 2:07 PM
そうっぽい
Avatar
でも普通にbrewとかで入れたバイナリって署名されてないけどワーニングでないですよね。
2:09 PM
何が違うんだろう
Avatar
omochimetaru 10/6/2020 2:14 PM
たしかに・・・
2:15 PM
Safariでダウンロードすると
2:15 PM
危険マークが付く?
Avatar
そうかなと思ってさっき試してみたんですけど出ないんですよね
Avatar
omochimetaru 10/6/2020 2:19 PM
/usr/local は聖域?
2:21 PM
chromeで落としたけど駄目だった
2:22 PM
safariで落とした時に許可したやつはいけた。
2:22 PM
バイナリのハッシュ?に対して許可登録してるっぽいな。
Avatar
TN2206: Intermediate to expert level overview of macOS code signing that details specific options and gotchas
2:22 PM
読み始めた
Avatar
omochimetaru 10/6/2020 2:23 PM
思ったけど、もしかしてhomebrewは
2:23 PM
homebrew側でなんかやってんのかもね最後に。
Avatar
いや、やってないです
Avatar
omochimetaru 10/6/2020 2:23 PM
そうなのか
Avatar
brewで入れたgdbは自前で署名しないとプロセスアタッチの権限が無くて使えなかった記憶がある
Avatar
omochimetaru 10/6/2020 2:24 PM
ふむ
Avatar
$ codesign -dvvv /usr/local/bin/swiftlint /usr/local/bin/swiftlint: code object is not signed at all
Avatar
omochimetaru 10/6/2020 2:24 PM
Avatar
どうして俺たちのツールチェーンだけ…
Avatar
Kishikawa Katsumi 10/6/2020 2:25 PM
Notarizationは?
Avatar
omochimetaru 10/6/2020 2:27 PM
/usr/local/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin に動かしたけど駄目だなあ。 フォルダコピーするときにFinderが謎のダイアログを出して確認してきたからなんかいけそうな気がしたけど。
Avatar
Notarizationとcodesignは関連するんでしたっけ
2:29 PM
Apple's notary service requires you to adopt the following protections: Enable code-signing for all of the executables you distribute, and ensure that executables have valid code signatures, as described in Ensure a Valid Code Signature.
軽く調べただけなんですけど、Notarizationはcodesignを前提にしている? https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution
Avatar
Kishikawa Katsumi 10/6/2020 2:29 PM
それはちょっとわからないけど「開発元を〜」っていうアラートは公証があれば消えると思う。
2:30 PM
コードサインはなんでもいいんじゃないかな。
Avatar
なるほど
Avatar
Kishikawa Katsumi 10/6/2020 2:32 PM
Command Line ToolのApple公証を行う XcodeでCommand line toolを作っている場合、.appと同じ用にOrganizerから公証を行うことができません。 Terminalからコマンドを叩...
Avatar
ありがとうございます 🙏
Avatar
omochimetaru 10/6/2020 4:11 PM
右クリックで許可されたファイルであっても
4:11 PM
[omochi@omochi-iMacPro wasm]$ spctl -a /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/swift-frontend /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/swift-frontend: rejected (the code is valid but does not seem to be an app)
4:11 PM
spctlから見るとrejectedって出てる
4:11 PM
spctlを超える何かで許可されてる・・・
4:11 PM
昨日調べたやつだ
4:12 PM
com.apple.quarantine ついてるかどうかで
4:12 PM
変わる
4:12 PM
どこにも書いてないけど
Avatar
omochimetaru 10/6/2020 4:12 PM
なんじゃそりゃ・・・
Avatar
それだけ
Avatar
なんだそれ。。
Avatar
サイニングいらない
Avatar
When I’m packaging an application for deployment, I normally download the latest version from the vendor. If it’s a drag-and-drop install, where the application is a self-contained bund…
Avatar
homebrew は自分でダウンロードしてファイル作ってるから、そのフラグがつかないから
4:13 PM
サインしてないけど、そのバイナリでも実行できる (edited)
4:13 PM
普通にブラウザやcurlでダウンロードしたりzipで解答するとそのフラグがつくから、gatekeeperが、お?なにそれちょっとまって (edited)
4:14 PM
って言ってくる
Avatar
omochimetaru 10/6/2020 4:14 PM
[omochi@omochi-iMacPro wasm]$ sil-opt Killed: 9 [omochi@omochi-iMacPro wasm]$ xattr sil-opt xattr: No such file: sil-opt [omochi@omochi-iMacPro wasm]$ which sil-opt /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/sil-opt [omochi@omochi-iMacPro wasm]$ xattr $(which sil-opt) com.apple.quarantine [omochi@omochi-iMacPro wasm]$ sudo xattr -r -d com.apple.quarantine $(which sil-opt) Password: [omochi@omochi-iMacPro wasm]$ sil-opt --version LLVM (http://llvm.org/): LLVM version 10.0.0 Optimized build. Default target: x86_64-apple-darwin19.6.0 Host CPU: skylake-avx512
4:14 PM
ほんとだ できた・・・・
Avatar
notarization はサインしたあとのはなしだから (edited)
Avatar
omochimetaru 10/6/2020 4:14 PM
spctlじゃなかったのか。。。
Avatar
サインしなきゃそもそも要求されない
4:14 PM
ちがいますね
4:14 PM
どこにも書いてないし
Avatar
omochimetaru 10/6/2020 4:14 PM
アイヤー
Avatar
Appleのドキュメントも明言してないけど
Avatar
omochimetaru 10/6/2020 4:15 PM
ありがとうございます!
Avatar
First of all: I’m one of the developers of Little Snitch, a user-friendly firewall for macOS that allows creating rules on a per-application (or per-executable) basis. We occasionally have users who run into issues because executables installed via Homebrew do not have a code...
4:15 PM
長いけどこのスレ全部読むとなんとなくわかる
4:16 PM
I think you’re mixing up a few things here. Developer ID is a program by apple that provides code signing certificates, among other things. Developer ID has nothing to do with any review process whatsoever. Notarized apps are an extension of the Developer ID program. Notariz...
4:16 PM
このへんがポイント
Avatar
omochimetaru 10/6/2020 4:16 PM
find . -perm +111 -type fxattr を組み合わせたらガッと浄化できそう。
Avatar
そんな感じ
4:17 PM
昨日めっちゃ調べた
Avatar
omochimetaru 10/6/2020 4:17 PM
奇遇ですね。
Avatar
ちょっとバイナリ配布のアレがあって
Avatar
omochimetaru 10/6/2020 4:17 PM
ww
Avatar
いまいち理解してなくて
4:17 PM
人としてまずいと思ったので。。
Avatar
omochimetaru 10/6/2020 4:18 PM
おかげで人に成れた
Avatar
xattr -r -d com.apple.quarantine ディレクトリパス でディレクトリ内一気に消せますよ
Avatar
omochimetaru 10/6/2020 4:18 PM
マジか
4:18 PM
findもいらんかった
Avatar
-r は recursive
Avatar
omochimetaru 10/6/2020 4:19 PM
removeかなと思ってスルーしてしまった なるほど。
4:19 PM
recursive deleteか
Avatar
なんでかわかんないけど、まあ何と無くわかるんだけど
4:19 PM
このquatrain フラグをつけるのは、open(2)するプロセスの責任で (edited)
4:20 PM
べつにカーネルが面倒見てくれてるわけじゃないっぽいんだよねー。
Avatar
omochimetaru 10/6/2020 4:20 PM
え。
4:20 PM
じゃあシェルが勝手にやってるんですか
Avatar
だから、RubyとかでHTTP GETしてFile.write()したバイナリはそのまま実行できる
4:21 PM
サインされてなくても。
Avatar
omochimetaru 10/6/2020 4:21 PM
あ、フラグを付ける時の話ですか?
4:21 PM
実行時にフラグを見る話ではなく。
Avatar
そう。フラグつけるのは任意。
Avatar
omochimetaru 10/6/2020 4:22 PM
そうすると、safariがDLした時にフラグをつけて、それをmacOS標準のアーカイバが展開する時に、中身にフラグを付け直してるんかな。
Avatar
フラグ見るのは execve(2) でやられてる
4:22 PM
それっぽい
Avatar
omochimetaru 10/6/2020 4:22 PM
なるほど >execve
4:22 PM
ははあ・・・
Avatar
appleのツールは守ってる
4:23 PM
homebrewはRubyで書いてあるし、多分意図的に守ってない
4:23 PM
そもそもhomebrewを最初に入れるときに許可がいるっていう
4:23 PM
そう言う話だと思う
4:23 PM
あのインストーラースクリプトはcurlとかで取ってくる必要があるから。
4:24 PM
chain of trustかなあ
Avatar
omochimetaru 10/6/2020 4:24 PM
なるほどなあ
Avatar
かたや、notarizationはdeveloper idでサインしたら最近は必須だから、 (edited)
4:25 PM
サインすると面倒という見方も...
4:25 PM
どのみち、エンドユーザーにでるダイアログに大差ないからね
Avatar
なるほどなぁ
Avatar
iOSのようなサンドボックスじゃないシステムの妥協としてはまあ良い方なのでは。
4:27 PM
ということをAppleはどこかに書いたらいいとおもいます。 (edited)
4:28 PM
ブログ書いたらいいのかな。。
4:28 PM
辛いのは誤った情報が溢れてることなんだよね (edited)
4:28 PM
ITのひとの寝言みたいなやつとか
Avatar
omochimetaru 10/6/2020 4:30 PM
ITの人の寝言とは・・・w
Avatar
ITのひとがなんかこうしたら俺んとこでは解決したよみたいなまったく理論的でない個人のポエムみたいな情報かなあ
Avatar
omochimetaru 10/6/2020 4:31 PM
ww
4:35 PM
[omochi@omochi-iMacPro wasm]$ ls -alh total 20432 drwxr-xr-x 4 omochi staff 128B 10 7 01:32 . drwxr-xr-x 14 omochi staff 448B 10 7 01:07 .. -rw-r--r--@ 1 omochi staff 21B 10 7 01:08 a.swift -rwxr-xr-x 1 omochi staff 10M 10 7 01:32 a.wasm [omochi@omochi-iMacPro wasm]$ wasmer a.wasm hello world
4:35 PM
ハロワできた
💯 1
Avatar
codesignコマンドの--deepオプションが全然再帰的に効かなくて困った。。。
4:41 PM
$ sudo codesign --force --deep --sign "Developer ID Application: Neko Chan (XXXXXXXXX)" --options runtime --deep-verify swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/ $ codesign -display swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift-package swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift-package: code object is not signed at all (edited)
Avatar
omochimetaru 10/6/2020 4:41 PM
/Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi';
4:42 PM
XCTestはないから swift test はできない?
Avatar
いや、あるんですよ
Avatar
omochimetaru 10/6/2020 4:43 PM
なんか俺が間違えてるんかな
Avatar
うーんなんかツールチェーンが腐っている気がする。。。
Avatar
ねこちゃん
Avatar
🐱
Avatar
omochimetaru 10/6/2020 4:45 PM
[omochi@omochi-iMacPro usr]$ tree | grep -i xctest │   │   │   ├── XCTest.swiftmodule │   │   │   │   ├── XCTest.opt.bitstream │   │   │   ├── libswiftXCTest.dylib │   │   │   ├── XCTestOverlayShims.h │   │   ├── XCTest.swiftdoc │   │   ├── XCTest.swiftmodule │   │   ├── XCTestOverlayShims.h │   ├── libXCTest.a │   └── swiftpm-xctest-helper
4:45 PM
たしかになんかは入ってるな
Avatar
オフィシャルのツールチェーンと比較しようと思ったのにswift.orgが落ちててスナップショット落とせない。。。
Avatar
omochimetaru 10/6/2020 4:48 PM
うーん、 --sdk を指定してないのがいかんのかと思ったが
4:48 PM
swift build と swift test は指定すると逆に通らないな
4:48 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot <module-includes>:1:10: note: in file included from <module-includes>:1: #include "LibcOverlayShims.h" ^ /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift/shims/LibcOverlayShims.h:31:10: error: 'semaphore.h' file not found #include <semaphore.h> ^ <unknown>:0: error: could not build C module 'SwiftOverlayShims' <module-includes>:1:10: note: in file included from <module-includes>:1: #include "../../../../share/wasi-sysroot/include/ctype.h" ^ <module-includes>:1:10: note: in file included from <module-includes>:1: #include "LibcOverlayShims.h" ^
4:49 PM
a
4:49 PM
ミスってた
4:50 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift test --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot /Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi'; found: arm64e-apple-ios-macabi, x86_64-apple-ios-macabi, arm64, arm64-apple-macos, x86_64, arm64e-apple-macos, x86_64-apple-macos, arm64-apple-ios-macabi, arm64e import XCTest ^ /Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi'; found: arm64e-apple-ios-macabi, x86_64-apple-ios-macabi, arm64, arm64-apple-macos, x86_64, arm64e-apple-macos, x86_64-apple-macos, arm64-apple-ios-macabi, arm64e import XCTest ^ error: fatalError
4:51 PM
ビルドは通った (TOOLCHAIN_PATHがシェルから消えてた) けど、could not findだ
Avatar
あ、corelibsのswiftmoduleの配置がマズそう (edited)
4:55 PM
とりあえずIssue立てておきます
Avatar
omochimetaru 10/6/2020 4:56 PM
古いのダウンロードしたらいけたりするやつ?
4:56 PM
いまやってるの swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a なんだけど。
Avatar
動くスナップショットはあるはず
Avatar
omochimetaru 10/6/2020 4:57 PM
なるほどね
4:57 PM
bookに出てくるやつにするわ
Avatar
10/2はもう腐ってます
🧟‍♀️ 1
Avatar
omochimetaru 10/6/2020 4:58 PM
笑う (edited)
4:58 PM
イントロで紹介してるの10/2やで
Avatar
それは凄く良くない
4:59 PM
e2eテストが足りてないですね。
Avatar
omochimetaru 10/6/2020 4:59 PM
しょうがないよやること無限にある
Avatar
たぶん1ヶ月前くらいのスナップショットなら動くと思うんですけど、古いのもはオプティマイザが壊れてたり別の問題があるのでとりあえずXCTestは待っててください
Avatar
omochimetaru 10/6/2020 5:00 PM
了解!
Avatar
同様にFoundationもimportできないと思います 😢
5:00 PM
あれ、できた
Avatar
omochimetaru 10/6/2020 5:02 PM
executable作ってFoundation走るかみてみる。
5:06 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSTimeZone.swift.obj): undefined symbol: CFHash wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: _CFDeinit wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: CFDateGetTypeID wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: CFDateGetTypeID wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSRegularExpression.swift.obj): undefined symbol: kCFAllocatorSystemDefault
5:06 PM
エラーが1000行出てきた
5:07 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ tree -L 2 -d $TOOLCHAIN_PATH/share/wasi-sysroot /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/../share/wasi-sysroot ├── include │   ├── arpa │   ├── bits │   ├── c++ │   ├── net │   ├── netinet │   ├── netpacket │   ├── scsi │   ├── sys │   └── wasi ├── lib │   ├── wasm32-wasi │   └── wasm32-wasi-unknown ├── share │   └── wasm32-wasi └── usr └── include 17 directories
5:07 PM
sysrootはあってると思う・・・
Avatar
あ、
5:08 PM
思い出した
👀 1
5:09 PM
{ "extra-cc-flags" : [ "-I", "TOOLCHAIN_DIR/usr/lib/swift/wasi/wasm32" ], "extra-cpp-flags" : [ ], "target" : "wasm32-unknown-wasi", "version" : 1, "extra-swiftc-flags" : [ "-I", "TOOLCHAIN_DIR/usr/lib/swift/wasi/wasm32", "-Xlinker", "-lFoundation", "-Xlinker", "-lCoreFoundation", "-Xlinker", "-lBlocksRuntime", "-Xlinker", "-licui18n", "-Xlinker", "-luuid" ], "sdk" : "TOOLCHAIN_DIR/usr/share/wasi-syroot", "toolchain-bin-dir" : "TOOLCHAIN_DIR/usr/bin" }
5:10 PM
こういうdestinationファイルを作って、TOOLCHAIN_DIRを置換して、
5:10 PM
swift build -c debug --build-tests --destination wasm32-unknown-wasi.json
5:11 PM
--destination オプションに渡す
Avatar
omochimetaru 10/6/2020 5:11 PM
やってみます。
Avatar
cartonでビルドするとこれ隠蔽されるんですけど、たぶんおもちさんの好みじゃ無さそう
Avatar
omochimetaru 10/6/2020 5:14 PM
carton使う気は無いですね
5:14 PM
好みじゃなくて・・・
5:14 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(Data.swift.obj): undefined symbol: _withStackOrHeapBuffer clang-10: error: linker command failed with exit code 1 (use -v to see invocation) error: link command failed with exit code 1 (use -v to see invocation) [16/18] Linking SwiftDeclWebPackageTests.xctest
5:14 PM
なんかもうちょっとぽい感じになった。
5:14 PM
エラー一件
Avatar
なんだこれ
5:17 PM
package initで作ったパッケージでは通る
5:19 PM
The error is raised by wasm-ld: wasm-ld: error: /Users/maxd/.carton/sdk/wasm-5.3-SNAPSHOT-2020-09-23-a/usr/share/wasi-sysroot/lib/wasm32-wasi/ libc.a(__original_main.o): undefined symbol: main The ...
5:20 PM
直したやつっぽい
Avatar
omochimetaru 10/6/2020 5:20 PM
[omochi@omochi-iMacPro wpkg]$ swift package init --type executable Creating executable package: wpkg Creating Package.swift Creating README.md Creating .gitignore Creating Sources/ Creating Sources/wpkg/main.swift Creating Tests/ Creating Tests/LinuxMain.swift Creating Tests/wpkgTests/ Creating Tests/wpkgTests/wpkgTests.swift Creating Tests/wpkgTests/XCTestManifests.swift [omochi@omochi-iMacPro wpkg]$ open . [omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:20:23: error: cannot find 'Process' in scope let process = Process() ^~~~~~~ /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:23:20: error: cannot find 'Pipe' in scope let pipe = Pipe() ^~~~ /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:44:28: error: value of type 'Bundle' has no member 'bundleURL' return Bundle.main.bundleURL ~~~~~~~~~~~ ^~~~~~~~~ [6/9] Compiling wpkgTests XCTestManifests.swift
5:20 PM
完全に空のディレクトリからやりなおしてみたらこうなった (edited)
Avatar
Processは使えない気がする (edited)
Avatar
omochimetaru 10/6/2020 5:21 PM
ああ、たしかに。
5:21 PM
これをちょっと書き換えてみるか
5:22 PM
import XCTest final class wpkgTests: XCTestCase { func testExample() throws { XCTAssertTrue(true) } static var allTests = [ ("testExample", testExample), ] }
5:22 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(Data.swift.obj): undefined symbol: _withStackOrHeapBuffer clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) [7/8] Linking wpkgPackageTests.xctest
5:22 PM
同じシンボルでコケた
5:23 PM
ほんとだ。リグレッションだ > issue 1824
5:23 PM
10/05が駄目なんだな
5:24 PM
10/02にしてみるか。
Avatar
$ cat Tests/helloTests/helloTests.swift import XCTest final class helloTests: XCTestCase { func testExample() throws { XCTAssertTrue(true) } static var allTests = [ ("testExample", testExample), ] } $ ~/Downloads/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift build -c debug --build-tests --destination wasm-5.3-SNAPSHOT-2020-09-08-a.json [12/12] Linking helloPackageTests.xctest /var/folders/br/7sr_p7cj7v549x_gtkb33df00000gp/T/tmp.BSZU6PLa $ wasmer ./.build/debug/helloPackageTests.xctest Test Suite 'All tests' started at 2020-10-06 17:24:16.346 Test Suite 'testBundle.xctest' started at 2020-10-06 17:24:16.346 Test Suite 'helloTests' started at 2020-10-06 17:24:16.346 Test Case 'helloTests.testExample' started at 2020-10-06 17:24:16.346 Test Case 'helloTests.testExample' passed (0.0 seconds) Test Suite 'helloTests' passed at 2020-10-06 17:24:16.346 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'testBundle.xctest' passed at 2020-10-06 17:24:16.347 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'All tests' passed at 2020-10-06 17:24:16.347 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
5:25 PM
うーーん??
Avatar
omochimetaru 10/6/2020 5:25 PM
そっちも1005なのか。
5:25 PM
あれ、.xctoolchain ?
Avatar
ああ、これは作業中のツールチェーンです
5:26 PM
バイナリ自体には影響ない
Avatar
omochimetaru 10/6/2020 5:26 PM
あとdestinationファイルは09-08?
5:26 PM
jsonの中身は1005なの?
Avatar
お、合わせたら再現した
5:28 PM
じゃあ09-08は動く
Avatar
omochimetaru 10/6/2020 5:29 PM
なるほど。
5:35 PM
10-02で同じエラーでた
5:35 PM
09-08落とす
Avatar
5.3-SNAPSHOT-2020-10-02-a はOK
Avatar
omochimetaru 10/6/2020 5:41 PM
あー、DEVELOPMENTなしのほうか (edited)
Avatar
そっちはもうちょっと安定してる
Avatar
omochimetaru 10/6/2020 5:41 PM
なるほど
5:48 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-09-08-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-09-08-a/usr/share/wasi-sysroot/lib/wasm32-wasi/libc.a(__original_main.o): undefined symbol: main clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) [8/9] Linking wpkgPackageTests.xctest
5:48 PM
グアア
5:49 PM
10-02 無印 ダウンロードする
Avatar
ウオー見つけた
Avatar
omochimetaru 10/6/2020 6:01 PM
ウオオオw
6:02 PM
__withStackOrHeapBuffer のテストケースがあれば・・・
6:02 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-10-02-a/usr/wasm32-unknown-wasi.json [12/12] Linking wpkgPackageTests.xctest (edited)
6:03 PM
10-02無印でビルドできました!!
6:03 PM
[omochi@omochi-iMacPro wpkg]$ wasmer .build/debug/wpkgPackageTests.xctest Test Suite 'All tests' started at 2020-10-06 18:03:44.789 Test Suite 'testBundle.xctest' started at 2020-10-06 18:03:44.790 Test Suite 'wpkgTests' started at 2020-10-06 18:03:44.790 Test Case 'wpkgTests.testExample' started at 2020-10-06 18:03:44.790 Test Case 'wpkgTests.testExample' passed (0.0 seconds) Test Suite 'wpkgTests' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'testBundle.xctest' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'All tests' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
6:03 PM
XCTest走った〜〜
6:05 PM
お、手元のプロジェクトの方もビルド実行できた
6:06 PM
bookのやつは無印の10-02だから結局オッケーだったのか。
Avatar
わーい 🙌
Avatar
omochimetaru 10/6/2020 6:08 PM
今日は終わっときます〜 どうもありがとう〜
Avatar
おやすみなさい〜
Avatar
知見のおおいthreadだった
Avatar
destination.jsonの書き方はこれか。 https://github.com/apple/swift-package-manager/pull/1098
General This adds experimental support for cross compilation or more precisely configurable destinations for binaries to SwiftPM. The basic idea is that you hand a JSON file in the format described...
Avatar
とりあえずFoundationリンクできないやつは治った https://github.com/swiftwasm/swift-corelibs-foundation/pull/143
Resolve swiftwasm/swift#1824 (comment) $ swift build -c debug --build-tests --destination wasm32-unknown-wasi.json wasm-ld: error: /path/to/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swi...
Avatar
norio_nomura 10/7/2020 5:06 AM
.xctoolchainにしてexport TOOLCHAINS="org.swift.…"でツールチェインを切り替える仕組みは、SwiftPMがツールチェイン添付のXCTest.swiftmoduleを使ってくれないから、SwiftWasmには使えないんじゃないかな。 (edited)
Avatar
そうなんですよね。今はとりあえずdestinationファイルで-I付けてツールチェーンのXCTest.swiftmoduleを優先するようにしてるんですけど微妙。。。 (edited)
Avatar
omochimetaru 10/7/2020 1:22 PM
C側ではattribute付きのextern宣言をしておいて、 WebAssembly.instantiate でJS側の関数をWASM環境にいれるやつ
1:22 PM
これ引数と返り値の型はどうやって合わされてるの?
Avatar
実行時検査ですね
Avatar
omochimetaru 10/7/2020 1:24 PM
あー、C側の呼び出しが
1:24 PM
WASM環境だから
1:24 PM
ランタイムが引数の型を知っている?
1:25 PM
普通のC環境だったらcallerが信じてるcalleeの呼び出し規約と引数に応じてレジスタ/スタックを構成してからジャンプするけど
1:26 PM
WASMだと 関数と引数を指定してコールする抽象度だから、
1:26 PM
WASMランタイムがその情報に基づいて引数の値をWASMの型からJSの型に変換してからJSの関数を呼ぶ?
Avatar
多分そういう実装になっているはず
Avatar
omochimetaru 10/7/2020 1:28 PM
なるほど・・・
Avatar
calleeが引数をどう使おうと要求している引数の数が提供される数を超えない限りは問題ない
Avatar
omochimetaru 10/7/2020 1:29 PM
仮引数に対して実引数の数が足りてなくても
1:29 PM
JSだったらundefinedになって呼び出されそう
1:29 PM
例外飛ぶんだっけ
Avatar
どうだろう。。
Avatar
omochimetaru 10/7/2020 1:29 PM
あと
1:29 PM
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
1:30 PM
// Output stdout and stderr to console const originalWriteSync = wasmFs.fs.writeSync; wasmFs.fs.writeSync = (fd, buffer, offset, length, position) => { const text = new TextDecoder("utf-8").decode(buffer); // Filter out standalone "\n" added by every `print`, `console.log` // always adds its own "\n" on top. if (text !== "\n") { switch (fd) { case 1: console.log(text); break; case 2: console.error(text); break; } } return originalWriteSync(fd, buffer, offset, length, position); };
1:30 PM
これがいまいち理解できないんだけど
1:30 PM
ここにかいてある print って Swift.print のこと?
Avatar
これ書いた覚えがないな…
1:30 PM
多分そうだと思うます
1:31 PM
↑bookにもこの書き換えが出てくる
1:31 PM
Swift.print の末尾の改行が不要なのであれば、 print(str, terminator: "") って呼び出せばよくない?
Avatar
たぶんconsole.logの改行とSwift.print側の改行で2つ改行されるのが嫌なんじゃないですかね
Avatar
omochimetaru 10/7/2020 1:32 PM
この wasmFS.fs.writeSync の先に繋がってる console.log で勝手に改行されて改行が2つになることを気にしてそうな
Avatar
そうそう
Avatar
omochimetaru 10/7/2020 1:33 PM
でも、それおかしいことになるよね
1:33 PM
console.logはどうやったって改行をつけちゃうというか
Avatar
途中に改行入ってたりすると壊れる
Avatar
omochimetaru 10/7/2020 1:33 PM
与えられた文字列の単位で行をわけて表示する仕組みだから
1:33 PM
逆にそもそも Swift.print("str", terminator: "") ってやっていたとしても
1:33 PM
console.logによる改行?というか表示上の区切りは生じる
1:34 PM
blameみるとたしかにこれかいたのはJedFoxさんだな
1:35 PM
いや、ちがうな、
1:35 PM
更にずっと前に Max も同じことやってる
1:36 PM
ア…
1:36 PM
まあ見た目をキレイにしたい気持ちはわかる
Avatar
omochimetaru 10/7/2020 1:36 PM
やるなら改行が来るまでバッファリングして
1:37 PM
改行のところで分割してconsole.logだったら
1:37 PM
結果が同じになるから正しいと思う・・・
1:37 PM
でも fflush() が呼ばれたら詰む。 (edited)
Avatar
どうしようもない
Avatar
omochimetaru 10/7/2020 1:40 PM
console.logにマッピングしてるのがまあ無理だよね
Avatar
Node.jsだったらprocess.stdout.writeにマップして幸せになれる
1:42 PM
ブラウザでのSwift.printはどうせ開発者しか見ないし。。。
Avatar
omochimetaru 10/7/2020 1:42 PM
Monorepo for Javascript WebAssembly packages by Wasmer - wasmerio/wasmer-js
1:43 PM
デフォルトのconsole.logにつなげてる場所どこだろ
Avatar
wasmer-jsのリポジトリではそういうユースケースないです
Avatar
omochimetaru 10/7/2020 1:44 PM
const originalWriteSync = wasmFs.fs.writeSync;
Avatar
wasiアプリケーションのstart関数が終わった後にまとめてstdoutをprintしてる
Avatar
omochimetaru 10/7/2020 1:44 PM
このoriginalWriteSyncの実装はどこに?
1:44 PM
1:44 PM
あ〜
Avatar
じっそう?
Avatar
omochimetaru 10/7/2020 1:45 PM
これフックしてconsole.logに横流ししてるだけか
Avatar
そうそう。フックしてconsole.logに流した後、元のwriteSync呼ばないとバッファリング壊れるんで。 (edited)
Avatar
omochimetaru 10/7/2020 1:45 PM
読み間違えてた。なるほど。
1:46 PM
これがないと wasmfs的には /dev/stdout にファイルとして書き溜めてるだけなのね
Avatar
そうなんです。
Avatar
omochimetaru 10/7/2020 1:48 PM
うーん。Swift側にconsole.logを意味的にもインポートしてくるのが良さそうだなあ。
1:48 PM
でもXCTestの出力は多分勝手にstdoutに出されてるよね・・・
Avatar
Rustはwasm-bindgenでconsole.logをRust側に引っ張ってきてますね。
1:48 PM
そうなんですよ
Avatar
omochimetaru 10/7/2020 1:49 PM
XCTestの出力は逐次で見たいなあ。
Avatar
XCTestは大体wasmerとかwasmtimeとかコマンドラインでやるからconsole.log必要なくないですか? (edited)
Avatar
omochimetaru 10/7/2020 1:51 PM
DOMがちゃんと操作されるかテストしたい。
Avatar
ああそうか〜
Avatar
omochimetaru 10/7/2020 1:51 PM
だからブラウザ上でしかテストできない。
1:51 PM
This seems like a bit of a computing systems 101 question, but I'm stumped. I am integrating existing code from C/C++ project A into my own project B. Both A and B will be linked into a single
1:51 PM
C環境で、freopenとかdupとかで
1:52 PM
stdoutの向き先を自前で用意したpipeにすることができるんだけど
1:52 PM
WASI上でそういうのできんのかな。
Avatar
wasi-libc側でできそう
Avatar
omochimetaru 10/7/2020 1:55 PM
どういうスタックになってるんだ?
Avatar
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
Avatar
omochimetaru 10/7/2020 1:55 PM
wasi-libc が wasi APIの上で実装されたlibc ?
1:56 PM
こう
Avatar
omochimetaru 10/7/2020 1:56 PM
Swiftはlibcを使ってるつもりになっているのか
1:56 PM
普通のプラットフォームがこれ
Avatar
omochimetaru 10/7/2020 1:56 PM
freopenだとファイルパスだからちょっと微妙だよね、dup2が良さそうだ
1:57 PM
なるほど
1:57 PM
freopenの中がdup3だ
Avatar
リダイレクトしてどうするんですか?
Avatar
omochimetaru 10/7/2020 1:58 PM
自作のpipeオブジェクトに対して
1:58 PM
別スレッドからselect pollingすればリアルタイムに吸い出せる
1:58 PM
いやスレッドないな・・・
1:59 PM
stdoutに来てるストリームを受け取れればあとはどうにでもなるので。consoleには出せないけど。
1:59 PM
<pre> タグの中に流し込んでいくとかのほうがマシな挙動だと思う。
2:00 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:00 PM
WebAssembly System Interface. Contribute to WebAssembly/WASI development by creating an account on GitHub.
2:01 PM
WASIになんかリッチな名前のdupがあった
Avatar
ちゃんと名前がついていてわかりやすい
2:02 PM
writeFileSyncで引っ掛けてpreタグに流し込むだとまずいんでしたっけ
Avatar
omochimetaru 10/7/2020 2:02 PM
制御がSwift側にない。
2:02 PM
JS側でできるだけ何もしたくない・・・
Avatar
なるほど
Avatar
omochimetaru 10/7/2020 2:03 PM
でもなんかコスパに見合ってる感じがしないねえ。
2:04 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:04 PM
freopenがrenumberでかいてあるんだな
2:04 PM
これsyscallはどこに行くんだろ
2:04 PM
f2 = fopen(filename, mode); if (!f2) goto fail; if (f2->fd == f->fd) f2->fd = -1; /* avoid closing in fclose */ #ifdef __wasilibc_unmodified_upstream // WASI has no dup else if (__dup3(f2->fd, f->fd, fl&O_CLOEXEC)<0) goto fail2; #else // WASI doesn't have dup3, but does have a way to renumber // an existing file descriptor. else { if (__wasilibc_fd_renumber(f2->fd, f->fd)<0) goto fail2; f2->fd = -1; /* avoid closing in fclose */ } #endif
Avatar
syscallはよばれないっすよ
Avatar
omochimetaru 10/7/2020 2:04 PM
いやなんか不穏だな
2:05 PM
なるほど・・・
Avatar
改造前のコードが残ってるだけですね
Avatar
omochimetaru 10/7/2020 2:05 PM
そういうことか〜
2:05 PM
じゃあこのwasi-libcにはdup2はなくって
2:05 PM
freopenはあって普通にC関数としてwasiのrenumberを呼ぶのか。
Avatar
ですね
Avatar
omochimetaru 10/7/2020 2:06 PM
逆にWASMSwift環境からは
2:06 PM
普通にWASI APIは直接触れる?
Avatar
ヘッダインクルードすれば
2:07 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:08 PM
wasi APIって言っても、ただモジュール名と関数名とシグネチャが指定されてるextern関数なので
Avatar
omochimetaru 10/7/2020 2:09 PM
なるほど
Avatar
特に特別扱いされてないですね
Avatar
omochimetaru 10/7/2020 2:10 PM
wasi側のAPIでなんとかfdを作ってrenumberでstdoutをくっつけてから非同期に読み出せれば
2:10 PM
やりたいことはできそうだな。
Avatar
非同期に読み出せるか…?
Avatar
omochimetaru 10/7/2020 2:12 PM
poll_oneoff(in: ConstPointer<subscription>, out: Pointer<event>, nsubscriptions: size) -> (errno, size)
2:13 PM
うーんちがうのかな。
2:13 PM
読めるように成ったら関数読んでくれるコールバック登録的な仕組みがあればできそうだけど
2:15 PM
そもそもファイルに紐付かないfdが欲しいけど・・・
Avatar
libcのレイヤーでそういうのあるのかな
Avatar
omochimetaru 10/7/2020 2:17 PM
open の世界だったら pipe がそう
2:18 PM
fopen が返す FILE* は 生fd のラッパー
2:20 PM
mkfifoでパス付きのpipeを作ってfopenするとFILE*に見えるけどpipeらしい。でもlibcじゃなさそう。
2:22 PM
うーんなんかなさそうな気がするな〜
Avatar
コールバックはなさそう
Avatar
omochimetaru 10/7/2020 2:23 PM
unixのファイルディスプリプタは
2:23 PM
ファイルといっても実際には抽象的なストリームで
2:23 PM
pipeもsocketも抽象化されてるんだけど
2:23 PM
wasiのファイルディスクリプタは本当にファイルシステムの方のやつしかなさそう?
2:24 PM
poll_oneoff(in: ConstPointer<subscription>, out: Pointer<event>, nsubscriptions: size) -> (errno, size) Concurrently poll for the occurrence of a set of events.
2:24 PM
poll_oneoffがconcurrencyって書いてあるんだけど
2:24 PM
subscriptionの構築方法がさっぱりわかrなn
2:26 PM
subscription { subscription_u { subscription_fd_readwrite { file_descriptor } } }
2:26 PM
なんかこんなのを作れば fd が監視できる気がする?
2:26 PM
でもコールバック関数を渡せそうな場所がない。
Avatar
これシグネチャ的に関数ポインタ渡せなくないですか
2:27 PM
ですね
2:28 PM
pollの実装に使われてるからこれは待つ感じかな
Avatar
omochimetaru 10/7/2020 2:29 PM
あー
Avatar
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
Avatar
omochimetaru 10/7/2020 2:30 PM
メインループの中で使うやつか。
2:31 PM
イベントが無かったらすぐ抜ける方なのかなあ。
2:33 PM
なんか、自分で、毎フレーム呼びまくってポーリングするためのものにも見える
Avatar
ぽい
2:34 PM
libcのapiってそういうの多いですよね
2:35 PM
あ、
2:35 PM
fd_writeって関数をSwift側に作ってリンク時に静的にそっちに実装が紐づくようにすれば良いんですよ
Avatar
omochimetaru 10/7/2020 2:36 PM
あー
2:37 PM
それstdout以外はどうしよう
2:38 PM
libc上でやるんじゃなくてlibc実装をフックするのは確かに・・・
2:39 PM
でもそれだったらあれだね、最初のJSの方式で
Avatar
void __wasi_fd_write(...) { // do redirect return original_fd_write(...); } void original_fd_write(...) __attribute__(( __import_module__("wasi_snapshot_preview1"), __import_name__("fd_write") )) (edited)
2:39 PM
こんな感じになるかな
Avatar
omochimetaru 10/7/2020 2:40 PM
あー
2:40 PM
そこは名前指定がもう一手かかってるのかややこしいな
Avatar
ややこしい
2:42 PM
Safariがi64をJS境界でサポートしていないことのpolyfillでも似たようなことした https://github.com/kateinoigakukun/swiftwasm-pad/blob/master/Frontend/Sources/i64_polyfill/i64_polyfill.c
swiftwasm-pad is a online playground to help developers learn about Swift on Web. - kateinoigakukun/swiftwasm-pad
Avatar
omochimetaru 10/7/2020 2:44 PM
今のビルドだと
2:45 PM
sysrootの中にある何かが既にそれをやってるんだよね?
2:45 PM
なんていえばいいんだ、wasiのfd_writeの実態に紐付けられようとしてるexternは既に書かれてる (edited)
2:47 PM
Swiftstdlibとかももうlibcとリンクされてるわけで
2:47 PM
そこをつなぎ替える?
Avatar
いや、Swiftサイドはwasiのインターフェースをフックするみたいなことはしてないです
Avatar
omochimetaru 10/7/2020 2:48 PM
wasi-libcをビルドしてできたlibcがツールチェインに既に入っているんじゃ?
Avatar
Swift stdlibはlibcとリンクされているけど、__wasiプレフィックスの付いてるexternなやつたちはundefinedのままです
Avatar
omochimetaru 10/7/2020 2:49 PM
なるほど。
Avatar
リンクされている、は嘘だ。
2:50 PM
実行可能ファイルに最終的にリンクするときに全部一気にリンクする
Avatar
omochimetaru 10/7/2020 2:50 PM
バラバラにstatic libで配布されててswiftpmがリンクしてるけど
2:50 PM
wasiシンボルはそれでもまだつなげていなくて
2:50 PM
それはwasm上でロードするときにwasmerのjs実装が流し込まれてるのか。
Avatar
で、その結果、最後までundefinedだったシンボルについて、ランタイムサイドからインポートするようなImportセクションを書き出すのがリンカの仕事です
Avatar
omochimetaru 10/7/2020 2:51 PM
そうするとやっぱJSで流し込む直前につなぎ替えることになりそう
Avatar
つなぎかえ?
Avatar
omochimetaru 10/7/2020 2:52 PM
> void __wasi_fd_write(...) { > // do redirect > return original_fd_write(...); > } > void original_fd_write(...) __attribute__(( > __import_module__("wasi_snapshot_preview1"), > __import_name__("fd_write") > )) (edited)
2:53 PM
↑この方法が機能しない気がしてる
2:54 PM
__attribute__(( __import_module__("wasi_snapshot_preview1"), __import_name__("fd_write") )) __wasi_fd_write(...) ↑すでにこう書かれたヘッダーがビルドに含まれてるわけでしょ?
Avatar
はい
Avatar
omochimetaru 10/7/2020 2:54 PM
original_fd_write と、 wasi関数を受け取ろうとしてるやつが2つできちゃうし
2:54 PM
どっちが本物になるのか曖昧にならん?
Avatar
あー、
2:55 PM
たぶんおもちさんの誤解ポイントが分かった
Avatar
omochimetaru 10/7/2020 2:55 PM
もともとある wasiのfd_writeをつなぎこもうとしてる __wasi_fd_write と 新たに作ろうとしてる、 もうひとつの fd_writeを本当につなぎたい original_fd_write と、
2:55 PM
2つある状態になる。
Avatar
リンカがシンボルを解決するタイミングでは __import_name__ は見ていなくて、C的なシンボルでルックアップしています
Avatar
omochimetaru 10/7/2020 2:57 PM
あ、じゃあ、実装付きの __wasi_fd_write が別途存在すればそれはそこにつながるのか。
Avatar
で、wasi-libc側のヘッダに書かれた __wasi_fd_write は実装が無いがユーザーが定義した __wasi_fd_write には実装があるので、この時点で __wasi_fd_write はundefinedなシンボルではなくなります
Avatar
omochimetaru 10/7/2020 2:57 PM
ふむふむ
Avatar
definedなシンボルに対してはリンカはimportエントリを発行しないのでwasi-libc側のヘッダの __import_name__ は無視されます
Avatar
omochimetaru 10/7/2020 2:59 PM
はいはい。
Avatar
original_fd_write は実装が無いのでundefinedなので、__import_name__ に基づいてimportエントリを発行します
2:59 PM
なのでリンカ的には曖昧さは無いんですよ
Avatar
omochimetaru 10/7/2020 3:00 PM
なるほどー そこの処理手順がわかってなかった
3:01 PM
たしかにそれなら安定した挙動でさしこめるな。
Avatar
リンカを書くとリンカの気持ちがわかるようになる
Avatar
omochimetaru 10/7/2020 3:03 PM
シンボル解決できたらimport attributeを無視するの気持わかるのだいぶ深い
3:06 PM
あ、もう一個シンプルな方法あるな
3:06 PM
/dev/stdout を wasi で fopen して poll_oneoff 回せば良いんだ。
3:07 PM
スレッドは立てられないから、requestRenderで毎回見るとかtimerとかぶん回す必要があるけど
Avatar
あー、別のwasmインスタンスを作ってその中で回す?
Avatar
omochimetaru 10/7/2020 3:07 PM
別のインスタンス!?
3:07 PM
そんな裏技があるの
Avatar
え、WebAssembly.instantiateをJSから作るだけ。。。
Avatar
omochimetaru 10/7/2020 3:08 PM
回すとは?
3:08 PM
this.view.setUint32(nevents, eventc, true); while (bindings.hrtime() < waitEnd) { // nothing } return WASI_ESUCCESS;
3:09 PM
タイムアウト無限だとビジーループしてそうなんだよね実装が
Avatar
wasmerのwasiインスタンスをもう一つのwasmインスタンスと共有してpollを回す
Avatar
omochimetaru 10/7/2020 3:09 PM
The window.requestAnimationFrame() method tells the browser that you wish to perform an animation and requests that the browser calls a specified function to update an animation before the next repaint. The method takes a callback as an argument to be invoked before the repaint.
3:10 PM
ブラウザだと多分これが良いんだと思う
3:10 PM
ああ、「回す」の
3:11 PM
ループを作る方法が問題ってこと。
Avatar
あーそうか
3:12 PM
難しいな
Avatar
omochimetaru 10/7/2020 3:12 PM
今年も vimconf にスタッフ兼発表者として参加してきました.名札の名前が「ドッグ」でじわじわきました… 開場 当日は準備スタッフの作業のために 8:30 に会場へ.山手線の遅延に巻き込まれて 8:45 ぐらいに到着. 電源ケーブルの配線などをやりました. Vim on Browser vimconf での発表は今年で3回目です.最近趣味ではウェブのフロントエンド周りや Electron を触っているので,今回は便利プラグインとかの実用的な話からそれて "Vim on Browser" というタイトルで発表してきました. ブラウザ上で「本物の」...
Avatar
requestAnimationFrameがマシなのか
Avatar
omochimetaru 10/7/2020 3:12 PM
りんださんがvimをブラウザで動かした時に同じような問題があってそうやってたって言ってたようなないような (edited)
Avatar
見たことがある気がする
3:15 PM
こっちのスライドだ
Avatar
omochimetaru 10/7/2020 3:16 PM
WebWorkerで並行実行させて
Avatar
atomicで止める
Avatar
omochimetaru 10/7/2020 3:17 PM
AtomicsAPIとやらでタイミングを制御とな
3:18 PM
うーむ。
8:54 AM
関数にしておけば名前が被ってしまう問題も回避できそうに思います。
Avatar
シャドーイングを回避するとそうなりますよねー
Avatar
メソッドチェーンで書けないのも、どうせ try とか await は前に書くし、前に書いちゃえば良さそう。 let x = try await jsTry(jsAwait(foo.bar.baz))
8:55 AM
jsTryAwait があってもいいか。
Avatar
どうせ try とか await は前に書くし
たしかに
8:57 AM
let result = await jsAsync(fetch)("...")
Avatar
そっちは大変じゃないですか?どうせ fetchPromise 返すんだから、 await jsAsync(fetch("...")) でも良さそうな気も?
9:00 AM
エラーについては JSValuecase error(JSValue) を追加すれば良い?
9:00 AM
あ、循環しちゃうから indirect
9:01 AM