Guild icon
swift-developers-japan
main / swiftc
Swift compiler
Avatar
コンパイラのチャンネルを作りました
😆 2
swift 3
12:38 PM
$ swift -Xfrontend -emit-ir -Xllvm -debug a.swift -Xllvm -debug をつけると、 LLVM_DEBUG で吐かれてるいろんなデバッグ情報が、出てくるんですね。
7:01 AM
コンパイラコードの解説
7:01 AM
SIL関数がLoweringで引数のインデックスがずれる話などが書かれてる
7:02 AM
他の領域についても書いていきたい感じのようなので、助かる
Avatar
TBDのところを早く書いてほしい!
Avatar
Guaranteed Optimization 無しでコンパイルするオプションみたいなの無いですか?
Avatar
それは聞いたことないなー。 特定のPASS限定で最適化するオプションなら知ってますけど
Avatar
protocol P { associatedtype T func f(_ g: @escaping (T) -> Void) } class C<S>: P { typealias T = S private let _f: ((S) -> Void) -> Void init<Q: P>(q: Q) where Q.T == T { // Error: cannot assign value of type '((S) -> Void) -> Void' to type '((S) -> Void) -> Void' self._f = { g -> Void in q.f(g) } } func f(_ g: @escaping (S) -> Void) { self._f(g) } } でエラーメッセージが不親切な件の原因を探している過程で、意図のわからないコードがあったので質問させてください // Try to simplify irrelevant details of function types. For example, if // someone passes a "() -> Float" function to a "() throws -> Int" // parameter, then uttering the "throws" may confuse them into thinking that // that is the problem, even though there is a clear subtype relation. if (auto srcFT = exprType->getAs<FunctionType>()) if (auto destFT = contextualType->getAs<FunctionType>()) { auto destExtInfo = destFT->getExtInfo(); if (!srcFT->isNoEscape()) destExtInfo = destExtInfo.withNoEscape(false); // 👈 ですが、これコメントの通り関数の型の不一致に escaping とか throws とか混ぜるとややこしいので出さない的な意図であってそうでしょうか? https://github.com/apple/swift/blob/5e7da0e3dcf13c603233c1f2aad1f1aded8821df/lib/Sema/CSDiag.cpp#L3250
swift - The Swift Programming Language
11:38 AM
あれ、ちょっと思ってたのと違うな… この分岐で拾われているように見える
11:45 AM
コードリーディングだけだとちょっとつらいですね…これ実際に swiftc を debug build して見ないとすぐにはわからなさそう…
Avatar
swiftcのlldbでdumpメソッドが使えなくて困ってる
Avatar
omochimetaru 8/8/2018 3:40 PM
@Yuta Saito とりあえず、 Step Into で dump() の中に潜ってみたら?
Avatar
コード上のdump()は動いてました
Avatar
omochimetaru 8/8/2018 3:47 PM
何も出力されないのが正しい挙動の可能性も。
3:49 PM
SILのinstructionは少なくともdumpできるっぽいですね
Avatar
omochimetaru 8/8/2018 3:49 PM
今手元でビルドしてるから通ったら試してみる
3:49 PM
(さっきから3回失敗した
😰 1
Avatar
ありがとうございます!
3:52 PM
a
3:53 PM
Xcodeのlldbに出力されると思っていたんですけど、
Avatar
omochimetaru 8/8/2018 3:53 PM
うわ、またこけた
3:53 PM
あw
3:53 PM
そこかw
3:53 PM
アタッチしてるならプロセスのほうのコンソールに出るよ!
Avatar
なるほどーーーーーーーーー
Avatar
omochimetaru 8/8/2018 3:54 PM
それなw
Avatar
wait for executable to be launchedだ
3:54 PM
盛大に勘違いしてました 🙇
Avatar
omochimetaru 8/9/2018 5:06 AM
@Kuniwak エラーが不親切な件を調べてみました。 直接の原因はわかりました。 根っこの原因は、Sema(型推論)モジュールのバグではないか、というところまで推測したところです。 下記にわかったことを整理しています。 CC: @rintaro @ukitaka
👀 2
Avatar
o,
5:54 AM
なんと、とりあえず gist 読みます
5:56 AM
なるほどーーーーー
Avatar
omochimetaru 8/9/2018 5:57 AM
はい、なので根っこの問題は、 AnyFunctionType exprType が構成された時点でもう発生していて
5:57 AM
推論させたかどうかで変わるので、推論器にバグがあるんじゃないかなあ、というところ。
Avatar
omochimetaru 8/9/2018 7:29 AM
Sema読んだこと全く無くて全く取っ掛かりがわからんw
Avatar
omochimetaru 8/9/2018 8:24 AM
制約アルゴリズムの中でブレークしても何がなんだかわからんな・・・
Avatar
omochimetaru 8/9/2018 10:26 AM
尻尾つかみそう
Avatar
omochimetaru 8/9/2018 10:48 AM
[omochi@omochi-iMac-PC43 warn]$ swift aaa.swift aaa.swift:16:9: error: cannot assign value of type '(@escaping (Int) -> Void) -> Void' to type '((Int) -> Void) -> Void' f = { (g) -> Void in ^~~~~~~~~~~~~~~~
10:48 AM
なおせたかもしれん。
10:49 AM
めちゃくちゃ闇が深い
Avatar
omochimetaru 8/9/2018 6:51 PM
むむむ・・・
6:51 PM
タプルの中に関数が入っている場合や、オプショナルの中に関数が入っている場合などは
6:51 PM
@escaping が暗黙に確定しているんだけど
6:52 PM
そのような型が絡んだ型マッチエラーの場合に
6:52 PM
暗黙だった @escaping が、明示された形で表示されるようになってしまう副作用が出てきた・・・
Avatar
omochimetaru 8/10/2018 3:41 AM
This PR add default constructor of PrintOptions explicitly. This is already implemented by c++ compiler implicitly. But, it can not be called from lldb session. (lldb) p f->getLoweredFunctionTyp...
3:41 AM
↑この前のやつ、また困ったのでゴネたら 許された
👍 4
Avatar
omochimetaru 8/10/2018 5:10 AM
lldbでラムダ式の中とかにいる時に、外側のスコープの変数にアクセスする方法ってありますか?
5:10 AM
ラムダ式の実装の匿名クラスが this を shadow してしまって、困る
5:11 AM
XcodeのGUIのほうだとなんか見れるからできそうなんだけども・・・
Avatar
[&]なラムダ式ってことでいいんでしょか?
Avatar
omochimetaru 8/10/2018 5:13 AM
Type Solution::simplifyType(Type type) const { if (!type->hasTypeVariable()) return type; // Map type variables to fixed types from bindings. return simplifyTypeImpl( getConstraintSystem(), type, [&](TypeVariableType *tvt) -> Type { auto known = typeBindings.find(tvt); assert(known != typeBindings.end()); return known->second; }); }
5:14 AM
↑ここで、 known->second の行にいるときに
5:14 AM
Solution::getConstraintSystem->dump() したい
Avatar
もし普通にやって見えないなら、スタック降りれば見えないですか?
Avatar
omochimetaru 8/10/2018 5:15 AM
あーたしかに、 [&] でのthisの暗黙ミュータブルキャプチャですね、
5:15 AM
あ〜〜〜
5:15 AM
まあたしかに・・・
5:15 AM
普通にやると、 this はラムダ式自身になってしまっていて
5:15 AM
見えないんですよね
5:16 AM
xcodeだとthisがプルダウンできて、そうするとその中にもう一度thisがあって、見えるんですけど
5:16 AM
同じように this->this-> ってかいても、
5:16 AM
error: expected unqualified-id
5:16 AM
になってしまいます
5:17 AM
内側にthisがあるのはラムダキャプチャーしてそういうフィールド名が生えてるのかな・・・
5:17 AM
今回のケースはエスケープしてないからたしかにスタック戻れば見れますね。
Avatar
ラムダ式の中でthis使ってないから参照が生きてないのかな・・・
Avatar
omochimetaru 8/10/2018 5:19 AM
typeBindingsは this->typeBindingsの略記なんですよね
5:20 AM
Xcodeのほうでも出てるから、できそうなんだけど・・・
Avatar
Xcodeのツリーは fr variable だと思うので、ちょっと違うんですよねー
Avatar
omochimetaru 8/10/2018 5:21 AM
ふむふむ
Avatar
下書きだけど、なんとか望んだ挙動をするパッチができた、testも通った
Avatar
よくわからない変数名の短縮のノリがわからなくて
12:10 PM
スタイルを寄せられない・・・
Avatar
ノリで大丈夫っす!
😂 1
Avatar
omochimetaru 8/10/2018 2:44 PM
ぐわーーだめだーーー
2:45 PM
あと少しのところまで行ったけどその作戦じゃ別の場所が破綻してだめだった
Avatar
今のmasterは FunctionType の入力が TupleType/ParenType だったのを FunctionType にパラメータリストを持たせるようにしていく過渡期なので、ここに手をだすのは危険だったかもしれないですね。
Avatar
omochimetaru 8/11/2018 1:56 PM
そうなんですね、ついでに直ってほしいな・・・ チケットはたてといた https://bugs.swift.org/plugins/servlet/mobile#issue/SR-8499
🙏 1
Avatar
omochimetaru 9/3/2018 6:11 AM
// RefBox.value.modify sil hidden [transparent] @$S1a6RefBoxC5valuexvM : $@yield_once @convention(method) <T> (@guaranteed RefBox<T>) -> @yields @inout T { // %0 // users: %2, %1 bb0(%0 : $RefBox<T>): debug_value %0 : $RefBox<T>, let, name "self", argno 1 // id: %1 %2 = ref_element_addr %0 : $RefBox<T>, #RefBox.value // user: %3 %3 = begin_access [modify] [dynamic] %2 : $*T // users: %5, %8, %4 yield %3 : $*T, resume bb1, unwind bb2 // id: %4 bb1: // Preds: bb0 end_access %3 : $*T // id: %5 %6 = tuple () // user: %7 return %6 : $() // id: %7 bb2: // Preds: bb0 end_access %3 : $*T // id: %8 unwind // id: %9 } // end sil function '$S1a6RefBoxC5valuexvM'
6:11 AM
今のmasterで、コルーチンによるmodifyアクセサが生成されるようになっている
6:14 AM
再開したらresume, 中止したらunwind
6:14 AM
中止ってなんやねん
Avatar
modify(&x.b)modify 内で結局書き換わらなかったときかな?
Avatar
omochimetaru 9/3/2018 6:22 AM
struct IntBox { var value: Int = 3 } func mod(_ value: inout Int) { value *= 2 } var box = IntBox() mod(&box.value)
6:22 AM
今これを試してみたんですが、 modifyが使用される形にはならなかった。
Avatar
protocol HasInt { var intValue : Int {get set} } func mod(_ val: inout Int) throws {} func testing<T: HasInt>(x: inout T) throws { try mod(&x.intValue) }
6:58 AM
で、 // testing<A>(x:) sil hidden @$S4test7testing1xyxz_tKAA6HasIntRzlF : $@convention(thin) <T where T : HasInt> (@inout T) -> @error Error { // %0 // users: %3, %1 bb0(%0 : $*T): %3 = begin_access [modify] [static] %0 : $*T // users: %11, %16, %5 %4 = witness_method $T, #HasInt.intValue!modify.1 : <Self where Self : HasInt> (inout Self) -> () -> () : $@yield_once @convention(witness_method: HasInt) <τ_0_0 where τ_0_0 : HasInt> (@inout τ_0_0) -> @yields @inout Int // user: %5 (%5, %6) = begin_apply %4<T>(%3) : $@yield_once @convention(witness_method: HasInt) <τ_0_0 where τ_0_0 : HasInt> (@inout τ_0_0) -> @yields @inout Int // users: %8, %10, %15 // function_ref mod(_:) %7 = function_ref @$S4test3modyySizKF : $@convention(thin) (@inout Int) -> @error Error // user: %8 try_apply %7(%5) : $@convention(thin) (@inout Int) -> @error Error, normal bb1, error bb2 // id: %8 bb1(%9 : $()): // Preds: bb0 end_apply %6 // id: %10 end_access %3 : $*T // id: %11 %12 = tuple () // user: %13 return %12 : $() // id: %13 // %14 // user: %17 bb2(%14 : $Error): // Preds: bb0 abort_apply %6 // id: %15 end_access %3 : $*T // id: %16 throw %14 : $Error // id: %17 } // end sil function '$S4test7testing1xyxz_tKAA6HasIntRzlF' なので、アクセス中に throw したときみたいです。
Avatar
omochimetaru 9/4/2018 6:33 AM
6:33 AM
struct Stone { var _x: Int = 3 var x: Int { get { return _x } _modify { yield &_x } } } func mod(_ x: inout Int) { x = 8 } func main() { var a = Stone() mod(&a.x) }
6:33 AM
define hidden swiftcc void @"$S1a4mainyyF"() #0 { entry: %a = alloca %T1a5StoneV, align 8 %0 = bitcast %T1a5StoneV* %a to %swift.opaque** store %swift.opaque* null, %swift.opaque** %0, align 8 %1 = alloca [32 x i8], align 8 %2 = bitcast %T1a5StoneV* %a to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* %2) %3 = call swiftcc i64 @"$S1a5StoneVACycfC"() %a._x = getelementptr inbounds %T1a5StoneV, %T1a5StoneV* %a, i32 0, i32 0 %a._x._value = getelementptr inbounds %TSi, %TSi* %a._x, i32 0, i32 0 store i64 %3, i64* %a._x._value, align 8 %4 = getelementptr inbounds [32 x i8], [32 x i8]* %1, i32 0, i32 0 call void @llvm.lifetime.start.p0i8(i64 32, i8* %4) %5 = call swiftcc { i8*, %TSi* } @"$S1a5StoneV1xSivM"(i8* noalias dereferenceable(32) %4, %T1a5StoneV* nocapture swiftself dereferenceable(8) %a) %6 = extractvalue { i8*, %TSi* } %5, 0 %7 = extractvalue { i8*, %TSi* } %5, 1 call swiftcc void @"$S1a3modyySizF"(%TSi* nocapture dereferenceable(8) %7) %8 = bitcast i8* %6 to void (i8*, i1)* call swiftcc void %8(i8* noalias dereferenceable(32) %4, i1 false) call void @llvm.lifetime.end.p0i8(i64 32, i8* %4) %9 = bitcast %T1a5StoneV* %a to i8* call void @llvm.lifetime.end.p0i8(i64 8, i8* %9) ret void }
6:33 AM
define hidden swiftcc { i8*, %TSi* } @"$S1a5StoneV1xSivM"(i8* noalias dereferenceable(32), %T1a5StoneV* nocapture swiftself dereferenceable(8)) #1 { entry: %._x = getelementptr inbounds %T1a5StoneV, %T1a5StoneV* %1, i32 0, i32 0 %2 = insertvalue { i8*, %TSi* } { i8* bitcast (void (i8*, i1)* @"$S1a5StoneV1xSivM.resume.0" to i8*), %TSi* undef }, %TSi* %._x, 1 ret { i8*, %TSi* } %2 } define internal swiftcc void @"$S1a5StoneV1xSivM.resume.0"(i8* noalias nonnull dereferenceable(32), i1) #0 { entryresume.0: %FramePtr = bitcast i8* %0 to %"$S1a5StoneV1xSivM.Frame"* %vFrame = bitcast %"$S1a5StoneV1xSivM.Frame"* %FramePtr to i8* ret void }
6:34 AM
テストコードみてたら、 _modify でもうお試しできるとわかった
Avatar
norio_nomura 9/4/2018 6:35 AM
ほう。
Avatar
omochimetaru 9/4/2018 6:41 AM
@swift-main struct Stone { var x: Int { get { return 1 } _modify { var x: Int = 3 yield &x y = x } } var y: Int = 0 } func mod(_ x: inout Int) { x = 8 } func main() { var a = Stone() mod(&a.x) print(a.y) } main()
Avatar
swiftNightly BOT 9/4/2018 6:41 AM
8
Avatar
omochimetaru 9/4/2018 6:41 AM
ローカル変数のアドレスをreturn!(yield
6:46 AM
resume.0とか関数が作られてるってことは
6:46 AM
ステートマシン変換型じゃなくて
6:46 AM
復帰先を、都度関数ポインタで返してるから、CPS変換型って感じ?
Avatar
omochimetaru 9/4/2018 6:58 AM
スタックフレームの代わりにフレーム用のメモリ領域を引数で取り回していて、 そのサイズは32バイト, フレームがそれよりでかい場合は、malloc/freeでサイドアロケートするっぽい
Avatar
コンパイラのコンパイルが通らないのですがどなたか助けていただけませんか /Users/hiragram/Development/swift-source/swift/stdlib/public/SDK/Intents/INIntent.swift:25:19: error: value of type 'INIntent' has no member '__setImage'; did you mean 'setImage'? (self as! INIntent).__setImage(image, forParameterNamed: keyPathString) ~~~~~~^~~~~~~~~~~~~ ~~~~~~~~~~ setImage Intents.INIntent:10:15: note: 'setImage' declared here open func setImage(_ image: INImage?, forParameterNamed parameterName: String) ^ /Users/hiragram/Development/swift-source/swift/stdlib/public/SDK/Intents/INIntent.swift:23:17: note: 'setImage' declared here public func setImage<Value>(_ image: INImage?, forParameterNamed parameterName: KeyPath<Self, Value>) { ^ /Users/hiragram/Development/swift-source/swift/stdlib/public/SDK/Intents/INIntent.swift:32:26: error: value of type 'INIntent' has no member '__image'; did you mean 'image'? return (self as! INIntent).__image(forParameterNamed: keyPathString) ~~~~~~^~~~~~~~~~~~~ ~~~~~~~ image Intents.INIntent:12:15: note: 'image' declared here open func image(forParameterNamed parameterName: String) -> INImage? ^ /Users/hiragram/Development/swift-source/swift/stdlib/public/SDK/Intents/INIntent.swift:30:17: note: 'image' declared here public func image<Value>(forParameterNamed parameterName: KeyPath<Self, Value>) -> INImage? { ^ [973/1575] Compiling /Users/hiragram/Development/swift-source/build/Ninja-ReleaseAssert/swift-macosx-x86_64/stdlib/public/SDK/Foundation/macosx/x86_64/Foundation.o ninja: build stopped: subcommand failed. utils/build-script: fatal error: command terminated with a non-zero exit status 1, aborting
2:15 PM
https://qiita.com/rintaro/items/2047a9b88d9249459d9a rintaroさんの記事をなぞっているんですけど
Swift がオープンソースになってしばらく経ちます。 コンパイラや標準ライブラリの開発に手を出してみたいけど、リポジトリを落とした後どうしていいかわからない!という方のために、まずは開発環境...
2:15 PM
utils/build-script -Rt これでこうなる
Avatar
Xcode のバージョンは何ですか? また、xcode-select されてますか?
Avatar
Xcode10bです
2:17 PM
あ 最新ではないかも
Avatar
omochimetaru 9/4/2018 2:18 PM
これ
Avatar
Version 10.0 beta (10L176w)
Avatar
omochimetaru 9/4/2018 2:18 PM
もっと上の方にエラーがあると思う
Avatar
最新じゃないや
Avatar
omochimetaru 9/4/2018 2:18 PM
並列にコマンドが走ってて、どれかが転ぶとエラーになるんだけど
2:18 PM
近くのやつは成功してて、もっと上にスクロールすると、並列実行してた別のコマンドが落ちてたりする
Avatar
error: value of type 'INIntent' has no member '__image' こういうのは並列関係なさそうな気がするけどそういうもん?
Avatar
omochimetaru 9/4/2018 2:19 PM
あ、それか。
2:19 PM
$ xcode-select -p の出力は?
Avatar
Xcode 最新にして、再度実行する際は --clean つけて build-script 実行してみてください。
Avatar
$ xcode-select -p /Applications/Xcode-beta.app/Contents/Developer
2:19 PM
これはさっきの最新じゃない10b
2:20 PM
最新にします
Avatar
今はb6じゃないとダメと思います。
Avatar
omochimetaru 9/4/2018 2:20 PM
がんばってxip解凍しような
Avatar
ありがとうございます
2:20 PM
がんばります
2:20 PM
;;
Avatar
b6でコンパイラコンパイルできたけどXcodeのプロジェクト作ってビルドしようとしたらこういうコケ方をするんですがなんか足りてないのかな https://gist.github.com/hiragram/33bcacd7b7ac601478330e0d16a2759e#file-swiftc-xcode-error-txt
GitHub Gist: instantly share code, notes, and snippets.
5:29 PM
一旦コマンドラインでやるか
Avatar
omochimetaru 9/6/2018 12:30 AM
最初に使った build-script に与えたオプションは何だった?
12:30 AM
もし、 -Rt だったなら、 releaseビルドだから、 XcodeでビルドするときはXcodeのconfigurationをreleaseにしないといけないよ
Avatar
omochimetaru 9/6/2018 12:41 AM
この記事では、swiftコンパイラ開発における作業環境構築の知見を紹介します。

リポジトリ構成

swiftコンパイラプロジェクトは、複数のリポジトリから構成されています。その中で主役となるのが[apple/s...
12:41 AM
スキーマが作成できたら、ビルドや実行をする前に、スキーマのBuild Configurationをビルドバリアントと同じものに設定する必要があります。
Avatar
ああー それっぽい 2時半で見落としてたやありがとう
Avatar
omochimetaru 9/6/2018 2:00 AM
これ自分含め何人も踏んでる (edited)
Avatar
norio_nomura 9/6/2018 6:30 AM
mutableAddressWithNativeOwnerから_modifyhttps://github.com/apple/swift/pull/19154
This switches Array from using mutableAddressWithNativeOwner to using a yielding _modify
Avatar
omochimetaru 9/6/2018 7:07 AM
もともとそんな謎アクセサがw
Avatar
@sil_name(hoge) みたいな、「SIL上に現れる名前はこっちにする」的なやつなかったでしたっけ(前にどっかで見たような気がするけど見つけられない)
Avatar
norio_nomura 9/9/2018 11:42 PM
@swift-4.1.3 -frontend -emit-sil @_silgen_name("hoge") func f() {}
Avatar
sil_stage canonical import Builtin import Swift import SwiftShims @_silgen_name("hoge") func f() // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>): %2 = integer_literal $Builtin.Int32, 0 // user: %3 %3 = struct $Int32 (%2 : $Builtin.Int32) // user: %4 return %3 : $Int32 // id: %4 } // end sil function 'main' // hoge sil hidden @hoge : $@convention(thin) () -> () { bb0: %0 = tuple () // user: %1 return %0 : $() // id: %1 } // end sil function 'hoge'
Avatar
あ、それです… ありがとうございます
Avatar
omochimetaru 9/10/2018 2:10 AM
へえ〜そんなのが。
Avatar
lazy var hogeすると hoge.storageという名前のstorageがsilに現れるのでなんか適当な他のプロパティを @_silgen_name("hoge.storage") したらおかしくならないかな〜と思ってやりたくなったけど型のプロパティに対して付けられなかった
Avatar
omochimetaru 9/10/2018 2:18 AM
コンパイラ都合で作られる何かしらのもの、ドット区切りでネームスペース風にしてるのをほかのところでも見る (edited)
2:19 AM
プロパティの名前はそのまま関数名になるわけじゃないから、varに対してはつけられなそうだね
2:20 AM
varに対応して生成されるgetterと衝突するsil名を別の関数に与えておく事はできそう
Avatar
@swift-4.1.3 struct A { var b: Int = 1 @_silgen_name("_T04hoge1AV1bSivg") func itazura() -> Int { return 2 } }
Avatar
no output
Avatar
@swift-4.2.4 struct A { var b: Int = 1 @_silgen_name("_T04hoge1AV1bSivg") func itazura() -> Int { return 2 } }
2:30 AM
帰ってこない
2:31 AM
@swift-4.1.3 struct A { var b: Int { return 1 } @_silgen_name("_T04hoge1AV1bSivg") func itazura() -> Int { return 2 } } print(A().b) print(A().itazura())
Avatar
1 2
Avatar
@swift-4.2.4 struct A { var b: Int { return 1 } @_silgen_name("_T04hoge1AV1bSivg") func itazura() -> Int { return 2 } } print(A().b) print(A().itazura())
2:31 AM
帰ってこない
2:31 AM
#swiftbot-sandbox こっちでやります
Avatar
またXcodeでコンパイル通らなく鳴った no such file or directory: '/Users/hiragram/Development/swift-source/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/src/Release/libcmark.a'
4:18 PM
今日はねます
Avatar
omochimetaru 9/10/2018 5:50 PM
libcmark.aが見つからないのはスキーム間違えてるやつよ
Avatar
utils/build-script --xcode --release-debuginfo がこういう死に方するの何だろう Assertion failed: (FD >= 0 && "File not yet open!"), function preferred_buffer_size, file /Users/hiragram/Development/swift-source/llvm/lib/Support/raw_ostream.cpp, line 701.
Avatar
omochimetaru 9/11/2018 4:39 PM
それなんだっけな
4:39 PM
運だった気も
Avatar
2回cleanしたけど2回コケて心折れそう
4:45 PM
3かいめしてる
Avatar
omochimetaru 9/11/2018 4:45 PM
クリーンは
4:45 PM
フォルダごと消してる?
Avatar
buildフォルダごとけした
Avatar
omochimetaru 9/11/2018 4:46 PM
うーんじゃあハズレコミットかなあ
4:46 PM
0908snapshotが
4:46 PM
昨日ビルドできたよ
4:48 PM
あと
4:48 PM
—skip-build-benchmarksをオススメする
Avatar
Avatar
omochimetaru 9/19/2018 1:22 PM
コンパイラがジョブをプロセス分離してposix_spawnするパターンにあたってしまって
1:22 PM
デバッグができなくて困った
Avatar
omochimetaru 9/19/2018 2:43 PM
xcodeのlldbコンソールからdetachした後で、
2:44 PM
Debug > Attach to Process で
2:44 PM
スポーンされてるサブプロセスにアタッチしてやれば
2:44 PM
一応できた・・・
2:44 PM
ただしブレークする猶予は無い
Avatar
frontend が posix_spawn するのですか?
Avatar
omochimetaru 9/19/2018 2:52 PM
はい
2:52 PM
/usr/local/bin/python /Users/omochi/work/swift-source/swift/utils/line-directive \ @/Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/WkKut.txt -- \ /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./bin/swiftc -c \ -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk \ -target x86_64-apple-macosx10.9 \ -resource-dir /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./lib/swift \ -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/../../../Developer/Library/Frameworks \ -Onone -g -D INTERNAL_CHECKS_ENABLED -D SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS \ -I /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./lib/swift/macosx/x86_64 \ -module-cache-path /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./module-cache -no-link-objc-runtime \ -Xfrontend -enable-resilience -nostdimport -parse-stdlib -module-name Swift \ -Xfrontend -group-info-path -Xfrontend /Users/omochi/work/swift-source/swift/stdlib/public/core/GroupInfo.json \ -swift-version 5 -warn-swift3-objc-inference-complete -Xfrontend -verify-syntax-tree \ -Xllvm -sil-inline-generics -Xllvm -sil-partial-specialization -Xfrontend -enable-sil-ownership \ -Xcc -DswiftCore_EXPORTS -warn-implicit-overrides -module-link-name swiftCore -force-single-frontend-invocation \ -Xcc -D__SWIFT_CURRENT_DYLIB=swiftCore -parse-as-library \ -o Swift.o \ @/Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/WkKut.txt (edited)
2:52 PM
元のコマンドはこれで
2:53 PM
C->performJobs に入って、その中で posix_spawnに到達します
2:55 PM
#0 0x00000001033edfaa in swift::sys::Task::execute() at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:198 #1 0x00000001033f0301 in TaskMonitor::beginExecutingATask(swift::sys::Task&) at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:504 #2 0x00000001033eebf3 in TaskMonitor::startUpSomeTasks() at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:477 #3 0x00000001033ee7a3 in TaskMonitor::executeTasks() at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:451 #4 0x00000001033f106f in swift::sys::TaskQueue::execute(std::__1::function<void (int, void*)>, std::__1::function<swift::sys::TaskFinishedResponse (int, int, llvm::StringRef, llvm::StringRef, swift::sys::TaskProcessInformation, void*)>, std::__1::function<swift::sys::TaskFinishedResponse (int, llvm::StringRef, llvm::StringRef, llvm::StringRef, void*, llvm::Optional<int>, swift::sys::TaskProcessInformation)>) at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:678 #5 0x000000010036431a in swift::driver::PerformJobsState::runTaskQueueToCompletion() at /Users/omochi/work/swift-source/swift/lib/Driver/Compilation.cpp:1089 #6 0x0000000100361333 in swift::driver::Compilation::performJobsImpl(bool&, std::__1::unique_ptr<swift::sys::TaskQueue, std::__1::default_delete<swift::sys::TaskQueue> >&&) at /Users/omochi/work/swift-source/swift/lib/Driver/Compilation.cpp:1388 #7 0x00000001003675ec in swift::driver::Compilation::performJobs(std::__1::unique_ptr<swift::sys::TaskQueue, std::__1::default_delete<swift::sys::TaskQueue> >&&) at /Users/omochi/work/swift-source/swift/lib/Driver/Compilation.cpp:1501 #8 0x0000000100334d61 in run_driver(llvm::StringRef, llvm::ArrayRef<char const*>) at /Users/omochi/work/swift-source/swift/tools/driver/driver.cpp:176 #9 0x0000000100332632 in main at /Users/omochi/work/swift-source/swift/tools/driver/driver.cpp:246
2:55 PM
// Spawn the subtask. int spawnErr = posix_spawn(&Pid, ExecPath, &FileActions, nullptr, const_cast<char **>(argvp), const_cast<char **>(envp));
2:55 PM
スタックトレースは↑で、この行に到達する。
2:56 PM
int Compilation::performJobs(std::unique_ptr<TaskQueue> &&TQ) { において、冒頭のperformSingleCommandに突入するif文をすり抜けるのが
2:56 PM
決定的な分岐かな。
Avatar
ああ、frontend を spawn するですね。
Avatar
omochimetaru 9/19/2018 2:58 PM
この場合の外側はfrontendとは言わないんですね。よくわかってない。
Avatar
-driver-print-jobs (うろ覚え)で実際にどんなコマンドが実行されているか調べて、直接実行してみるのがいいと思います。
Avatar
omochimetaru 9/19/2018 2:59 PM
おお それは良さそう ありがとうございます
Avatar
swift -frontend がフロントエンド
Avatar
omochimetaru 9/19/2018 2:59 PM
りんたろーさんの記事にも書いてあった気がしてきた (edited)
Avatar
swiftc はドライバーです。
Avatar
omochimetaru 9/19/2018 3:00 PM
なるほど。
3:01 PM
driver-print-jobsありました
3:02 PM
おお、でた
3:02 PM
あ〜〜〜
3:03 PM
/Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/bin/swift -frontend -c -filelist /var/folders/1v/_s33fkpj07g9y3zvdfs9cz9m0000gn/T/sources-ffe05d -supplementary-output-file-map /var/folders/1v/_s33fkpj07g9y3zvdfs9cz9m0000gn/T/supplementaryOutputs-7c1c06 -disable-objc-attr-requires-foundation-module -target x86_64-apple-macosx10.9 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -I /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./lib/swift/macosx/x86_64 -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/../../../Developer/Library/Frameworks -warn-swift3-objc-inference-complete -warn-implicit-overrides -g -module-cache-path /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./module-cache -module-link-name swiftCore -nostdimport -parse-stdlib -resource-dir /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./lib/swift -swift-version 5 -Onone -D INTERNAL_CHECKS_ENABLED -D SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS -enable-resilience -group-info-path /Users/omochi/work/swift-source/swift/stdlib/public/core/GroupInfo.json -verify-syntax-tree -enable-sil-ownership -Xllvm -sil-inline-generics -Xllvm -sil-partial-specialization -Xcc -DswiftCore_EXPORTS -Xcc -D__SWIFT_CURRENT_DYLIB=swiftCore -parse-as-library -module-name Swift -o Swift.o
3:03 PM
パラメータがテンポラリファイル経由になるんですが、これが消されてしまう
3:04 PM
なんか消さないためのif文があるな
3:04 PM
options::OPT_save_temps
3:04 PM
できた!
3:05 PM
ありがとうございます、これは捗る
Avatar
それか、Xcode のデバッグで swift プロセス実行されるので待ち状態にしておけば、うまくアタッチ出来ないかな?
Avatar
omochimetaru 9/19/2018 3:13 PM
ドライバーにアタッチしちゃいます
Avatar
なるほど。
Avatar
debugのswiftでstdlibをコンパイルするとき、imacproで6分ぐらいかかるんだけど、semaが70%ぐらいの時間を消費していて、全然並列化もしていないんだけど
12:44 AM
型推論の並列化ってできないのかな 直感的にはかなり難しそう
Avatar
やばそう
Avatar
あ、でも、メソッドに閉じてるからいけるのか?
Avatar
型は全部生成された後で、メソッド毎にやるのはいけるんじゃないかな?と言う気がしてる、ただ、、
12:50 AM
変数を右辺から推論する系があってこいつが閉じない、難しそう
Avatar
メソッドごとに並列化するだけで
12:51 AM
36並列は軽く使い切るから
12:51 AM
そこは良さそう
Avatar
lazy var foo = mySignal.map {...}.flatMap{...} ↑こういう悪い子がいるとな
Avatar
型の定義を洗い出すところはどのくらいかかってるのかねー
12:53 AM
たとえばそういう式が2つあれば、マシンパワーとしてはそれぞれで使い切るから問題ないよ
Avatar
いや、コイツが存在すると型が非決定性にならないか?という話
12:54 AM
推論終わらないと型が決定しない
Avatar
ジェネリックな型が複数箇所からアドホックに誕生する部分は
12:55 AM
推論自体がメソッド単位で並列化しても
12:56 AM
同期制御が必要だね
12:56 AM
推論自体は並列でも、型環境(?)はグローバルに合併していく
12:57 AM
stdlibのIRを得たいんだけど
12:58 AM
一手に6分かかるからしんどい
12:58 AM
同時に130ファイルぐらい突っ込まれる
3:49 AM
Swiftシンボルprefixが $S から $s に!
Avatar
おお < "This is the final ABI mangling prefix"
3:59 AM
一瞬マングリングが定まったのかと思ったけどプレフィックスだけか。 (edited)
Avatar
omochimetaru 9/20/2018 4:01 AM
int swift::Demangle::getManglingPrefixLength(llvm::StringRef mangledName) { if (mangledName.empty()) return 0; llvm::StringRef prefixes[] = { /*Swift 4*/ "_T0", /*Swift 4.x*/ "$S", "_$S", /*Swift 5+*/ "$s", "_$s"}; // Look for any of the known prefixes for (auto prefix : prefixes) { if (mangledName.startswith(prefix)) return prefix.size(); } return 0; }
4:02 AM
bool swift::Demangle::isOldFunctionTypeMangling(llvm::StringRef mangledName) { return mangledName.startswith("_T"); }
4:03 AM
_T, _T0, $S, $s の 4つがこれまでにあるっぽい
4:04 AM
Swift5ではABIを安定化するから $s から代わる事は今後無いと・・・
4:05 AM
このPRで #define MANGLING_PREFIX $s になるってことは
4:05 AM
4.2リリースして、次はいよいよSwift5を目指すのか。
Avatar
次は Swift 5 で 2019 年前半って公式にアナウンスされてる情報じゃないんだっけ?
4:13 AM
噂?
Avatar
swift-evolution の README には Early 2019 とありますね。
Avatar
おお🙂 < swift-evolution の README には Early 2019 とありますね。
Avatar
Adjust expected release timeline for Swift 5.
Avatar
お、なんか昔は次の冬にリリース予定だった気がしてたんですが、これを見た記憶かもしれないですね。
Avatar
yutailang0119 9/20/2018 6:45 AM
WWDCのセッション終わった瞬間に書き換えられてて、はや!ってなった記憶が
😯 2
Avatar
投稿しました > SwiftコンパイラのManglingの勉強方法 https://t.co/8bQ9CZ6r80
👀 4
11:04 AM
↑参考にしてくださいな
Avatar
ほう @swift-4.2.4 demangle -expand $S1a3CatC4nameSSvg
Avatar
Demangling for $S1a3CatC4nameSSvg kind=Global kind=Getter kind=Variable kind=Class kind=Module, text="a" kind=Identifier, text="Cat" kind=Identifier, text="name" kind=Type kind=Structure kind=Module, text="Swift" kind=Identifier, text="String" $S1a3CatC4nameSSvg ---> a.Cat.name.getter : Swift.String
Avatar
lldb上でisとかisaって使えますか?
Avatar
とある記事に載ってたコードですけど、 @swift-4.2.4 protocol SomeProtocol{ // required method func r() // optional method func o() } extension SomeProtocol { // optional methods func o() { print("o() in SomeProtocol") } func p() { print("p() in SomeProtocol") } } class SomeClass: SomeProtocol { func r() { print("r() in SomeClass") } func o() { print("o() in SomeClass") } func p() { print("p() in SomeClass") } } let sc: SomeClass = SomeClass() sc.r() // 出力 "r() in SomeClass" sc.o() // 出力 "o() in SomeClass" sc.p() // 出力 "p() in SomeClass" let sp: SomeProtocol = sc sp.r() // 出力 "r() in SomeClass" sp.o() // 出力 "o() in SomeClass" sp.p() // 出力 "p() in SomeProtocol"
Avatar
r() in SomeClass o() in SomeClass p() in SomeClass r() in SomeClass o() in SomeClass p() in SomeProtocol
Avatar
SomeProtocol が明示的に書かれている場合は、protocolの実装が優先されるのはともかく、なんでこうなるんだっけというのがコンパイラレベルで気になったのでだれか教えて〜
Avatar
omochimetaru 10/5/2018 7:10 AM
そうですね
7:10 AM
Swiftで継承とプロトコルとprotocol extensionが絡んだ時に呼び出されるメソッドがわかりづらい事があるのでまとめました。

バージョン

``` $ swift --version Apple Swift v...
7:11 AM
↑ここに書いてるけど、その例の方がシンプルだ
7:11 AM
func r()func o() は、プロトコル定義にエントリがあるから
7:11 AM
プロトコルとして呼び出したときにwitness tableを参照する
7:12 AM
func p() はプロトコル定義にエントリがないから
7:12 AM
witness tableにもエントリがないので
7:12 AM
静的ディスパッチになる。
Avatar
めちゃシンプルに理解できた
Avatar
omochimetaru 10/5/2018 7:14 AM
let sc: SomeClass = SomeClass() sc.r() // 出力 "r() in SomeClass" ただのSomeClassのメソッド呼び出し sc.o() // 出力 "o() in SomeClass"  ただのSomeClassのメソッド呼び出し sc.p() // 出力 "p() in SomeClass"  ただのSomeClassのメソッド呼び出し let sp: SomeProtocol = sc sp.r() // 出力 "r() in SomeClass" 動的、SomeClass.rがテーブルから出てくる sp.o() // 出力 "o() in SomeClass" 動的、SomeClass.oがテーブルから出てくる sp.p() // 出力 "p() in SomeProtocol" 静的、式がSomeProtocolなのでSomeProtocol.pになる (edited)
Avatar
完全に理解した。ありがとう!
😁 1
Avatar
@d_date ↓もっとヤバいパターンです😂 @swift-main protocol P { func a() -> String func b() -> String } extension P { func a() -> String { return "P" } func b() -> String { return "P" } } class C: P { func a() -> String { return "C" } } class SC: C { override func a() -> String { return "SC" } func b() -> String { return "SC" } } let sc: SC = SC() print(sc.a()) // SC print(sc.b()) // SC let c: C = sc print(c.a()) // SC print(c.b()) // P
Avatar
swiftNightly BOT 10/5/2018 8:06 AM
SC SC SC P
Avatar
c.b() はwitness tableを見にいくけどb()がcから取り出せず、静的DispatchでP.bになる。(あってます?) c.a() は実体はSCのインスタンスなので、SCのvTableを見にいって、SC.a()になる(あってます?) (edited)
Avatar
ちょっと自信ないですが、僕の理解が正しければ、 bSC の VTable にはあるけど C の VTable にはなくて、 C として呼ばれたときには SCb とは同名同型の別の関数として静的ディスパッチされる、だと思います。
👍 2
Avatar
llvmの話題ってここでよい?
2:09 AM
/usr/local/Cellar/llvm/HEAD-3898e47/include/c++/v1/stdlib.h:94:15: fatal error: 'stdlib.h' file not found #include_next <stdlib.h> llvmのチュートリアルのコンパイルができない・・・・前はできたのに・・・・. brewでllvmインストールして,コンパイルしてたのだが・・・・・
2:10 AM
https://llvm.org/docs/tutorial/LangImpl02.html # Compile clang++ -g -O3 toy.cpp `llvm-config --cxxflags` # Run ./a.out これをやると,stdlib.hが見つからないって言われて,あるのに・・・・って格闘中・・・・. LLVMチュートリアルのソースコードのコンパイルはこうすればいいよーってのがあったら教えてください・・・・・. ちょっと前までできてたのに・・・・・. (edited)
Avatar
Mojave?
Avatar
Mojaveです
Avatar
なんとか動かせました
4:47 AM
でも,なんだか納得が行かない感じです.
4:50 AM
clang++だけ,/usr/bin/clang++を使うようにしたら動きました. どうやら,brewのclang++のサーチパスがおかしくなっているようです・・・・・.うーむ・・・・・
Avatar
brew link あたりで修復してみるとか。
Avatar
なるほど
Avatar
ダメでした
5:59 AM
うーん
Avatar
/use/includeはある?Command Line Toolsを入れてもMojave標準だと存在しません。
6:12 AM
以前の様に/use/includeが存在するのが前提で作られてるモノのために、別途インストールできる様になっています。
Avatar
👏 1
Avatar
ああああああああああああああああああああ
7:04 AM
@norio_nomura 神さま,野村さま それでした・・・・・・・ (edited)
7:06 AM
ありがとうございました・・・・・
Avatar
Xcode10.1, swiftc 11-01 snapshot で、 Xcodeでswiftターゲットをwait for executableしてからターミナルでswiftc実行しても、
Message from debugger: unable to attach
となってしまってデバッグができない・・・
👀 1
4:30 PM
mojaveなのも関係あるかな
4:36 PM
Xcodeからの実行ならできるから、-driver-print-jobsしてから引数を指定すれば一応できるんだけど
4:37 PM
XcodeのEdit Schemeのところで10個とかのargv指定するのUI的に厳しいものがある・・
Avatar
@omochimetaru high sierra 10.13.6 Xcode10.1で DEVELOPMENT-SNAPSHOT-2018-11-01-a のデバッガアタッチできました
Avatar
マジか 違うのはHighSierraなところか・・・
Avatar
DebugメニューのAttach to Process by PID or Name...でProcess Nameにswiftcを指定してAttachしてから、TOOLCHAINS=org.swift.4220181113a swiftcで起動したらアタッチできました。
3:52 AM
on Mojave
Avatar
おお。帰宅したらやってみます
Avatar
xcrun --toolchain org.swift.4220181113a swiftcだとデバッガが見つけてくれなかった。
Avatar
おお?ddunbarさんはAppleの人なのか
Avatar
ですね。とはいえ現在サンクスギビングなので個人的にやってる可能性はあります。
Avatar
The Swift Programming Language. Contribute to MaxDesiatov/swift development by creating an account on GitHub.
2:03 AM
emscriptenのスレで成果報告してるこの人のとは全く別軸でやってそう
2:04 AM
ああ、今お休みなのか。
2:05 AM
あ、swift-clangの方にもPRが出てる。
Avatar
デバッガがアタッチできない問題、Xcodeとhomebrewで入れてるもの全部消して再インストールしたけど治らなかった・・・
Avatar
自分でビルドしたswiftc?
Avatar
そうです、 util/build-script --debug --xcode --skip-build-benchmarks でビルドしたswift, swiftc
Avatar
/Library/Developer/Toolchains/にインストールしたツールチェインのswiftcでもアタッチ出来るから、自前ビルドでも何か手順がありそうだけど… (edited)
Avatar
でも、Launch = Automaticallyで起動するときはちゃんとアタッチできてデバッグもできるんですよ。
2:18 AM
あくまでLaunch = Wait for executable to be launchedができない。
Avatar
ぬ。
Avatar
Xcodeの、Edit SchemeのRunのページにあるやつです。
Avatar
なるほど。
Avatar
だから、プロセスが起動したのが、Xcodeからだったのか、別のターミナルからだったのかという違いによる、セキュリティ的な?何か?による副作用じゃないかと思ってます。Mojaveにしてから、というのもそれっぽい。
2:20 AM
でもこれ以上手を進めるアプローチがさっぱりわからず。
Avatar
Debug process as rootをオンにしたら、Wait for executable to be launchedでTOOLCHAINS=org.swift.42120181030a xcrun swift使って起動したswiftにアタッチ出来た。
Avatar
あ〜
Avatar
repl_swiftにアタッチ出来たぽい。
2:28 AM
/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swiftで起動してもアタッチ出来るから、自分でビルドしたものもいけそう。
Avatar
Lost connection to "My Mac". Restore the connection to “My Mac” and run “swift” again, or if “swift” is still running, you can attach to it by selecting Debug > Attach to Process > swift.
2:28 AM
rootにしてみたら↑なぞのダイアログが
Avatar
一度、自分のアカウントのパスワード入力が必要。
Avatar
そうですね、初回はダイアログがでて、lldb-rpc-serverが権限を求めてきた
2:29 AM
そこは入力しました
2:30 AM
I'm trying to debug a Terminal app upon launch, so I've created a new scheme and selected: I build my app, then I go to Terminal and run the app. Immediately, instead of hitting a breakpoint, I g...
Avatar
管理者権限があるアカウントなら、それでイケるかと。
2:32 AM
あ、ブレークポイントとか設定せずにアタッチしただけだから、また何か違う状況かも。
Avatar
replに対してAttach to Processだと確かにアタッチはできました
2:32 AM
お、ブレークもできた
2:33 AM
replなら待っててくれるけど
2:33 AM
$ swift --version とかを、wait for executable... で引っ掛けるのができないです。
Avatar
Driver::MainLoopにシンボリックブレークポイント置いてちゃんと止まりました。 (edited)
2:35 AM
mainにシンボリックブレークポイント置いて、/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift --versionで止まりました。
Avatar
うむむ
Avatar
getSwiftFullVersionにシンボリックブレークポイントもいけました。
Avatar
ブレーク以前にアタッチが反応しないんですよね
2:38 AM
debug as me のときは
2:38 AM
即座に「unabled to attach」と出てくるので、
2:39 AM
反応はしてて、失敗する
2:39 AM
rootのときは、反応しない
Avatar
Executableはswiftにしてる。
Avatar
同じです。Build Productの中のやつが選べるので、選んでて。
2:41 AM
ToolChainとしてインストールしてるかどうかの違いかな
Avatar
xcschemeファイルを見ると/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swiftと記述されてる。
2:42 AM
ソースからビルドは、当分は試せないかな。
Avatar
あーこれ名前じゃなくてフルパスが裏にあるのか
2:45 AM
<BuildableProductRunnable runnableDebuggingMode = "0"> <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "C6F405DB688E4209BE9944BB" BuildableName = "swift" BlueprintName = "swift" ReferencedContainer = "container:../build/Xcode-DebugAssert/swift-macosx-x86_64/Swift.xcodeproj"> </BuildableReference> </BuildableProductRunnable>
2:45 AM
プロジェクト + 名前 みたいな指定になってました
2:49 AM
<PathRunnable runnableDebuggingMode = "0" FilePath = "/Users/omochi/work/swift-source/build/Xcode-DebugAssert/swift-macosx-x86_64/Debug/bin/swift"> </PathRunnable> 直指定したらこうなったけど駄目でした、反応無し・・・
Avatar
そちらで/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swiftにアタッチ出来るかどうかで、ツールチェインとしてインストールしているかどうかの違いが原因か判るはず。
Avatar
確かに。やってみます。
Avatar
これにはアタッチできました > /Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
4:22 PM
デバッグビルドになってないからか、ソースビューは出なくてアセンブリだったのと、ブレークポイントは効かなかったけど。
4:22 PM
ついでにToolChainとしてXcodeがSwift4.2RELEASEを使うようにした場合は、↓のエラーでwait forができなかった。 Could not attach to name : “swift” Problems with launching via XPC. XPC error : Connection invalid
4:23 PM
デバッグするためにXcode DebuggerとSwiftCompiler側のlldbの何かが揃ってないといけなくて、それがずれてるとかそういう現象か?
4:25 PM
おお、Swift4.2RELEASEのソースからビルドしたswiftcなら両方の方式でアタッチできる。 ただしwait forの場合 run as rootは必要だ。
Avatar
こちらはXcode 10.1でツールチェインにSwift 4.2.1 Release 2018-10-30 (a)を選択してても、問題なく/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swiftにアタッチ出来る。Wait for…もDebug Process As rootすればアタッチ出来るのも変わらず。 (edited)
Avatar
むむ。そこは状況が違うのか・・・
Avatar
あとは試す時に使ったプロジェクトの内容の差かな?
Avatar
これか。
Avatar
新規Command Line Toolプロジェクトでこれ再現したけど、deployment targetとか変えると再現しなくなる。
Avatar
それです!
Avatar
今までのテストは、たまたま開いてたフレームワークのプロジェクトでRunアクションにswiftを設定して試してた。 (edited)
Avatar
なるほど。
Avatar
新規作成で再現したプロジェクトでも、deployment targetを適当に変更してリビルドした直後だと、アタッチ出来たりする。
4:04 AM
とりあえず、開いているプロジェクトの状態から影響を受けるというのは間違いなさそう。
Avatar
なるほど・・・ utils/build-scriptが生成したxcode projからやってると問題が起きるということは
4:05 AM
cmakeが生成してるxcodeprojとxcode10.1の相性問題の可能性がありますね
4:06 AM
とりあえず野村さんの方でXPCのダイアログが出たってことは、僕の固有問題じゃ無さそうだけど
4:06 AM
appleのコンパイラ開発者はXcodeは全然使ってないんだろうか。
4:08 AM
後で僕の方でも、他のxcdeprojからアタッチするのをやってみます
Avatar
ぬ、SchemeのRunアクションの種類によるのかも。
4:16 AM
Yamsのxcodeprojに含まれるschemeのRunアクションで試してたのだけど、Application DataやRouting App Coverage Fileとかの項目がoptionsタブに存在するから、macOS向けのRunアクションではないぽい。
4:17 AM
マルチプラットフォームターゲットだからか。
4:21 AM
Yamsのxcodeprojを使って、Yams schemeのRunアクションでExecutableをswiftにして試してみて欲しいかも。
Avatar
ぬうう、Yams.xcodeprojの作り方をなぞってみても、Yams.xcodeprojの様にXPCエラーが全く出ない状態にならない…
Avatar
ああ、分かった。
4:54 AM
プロジェクトを開いた直後に、Scheme > Runアクション > Argumentsタブ > Expand Variables Based On をNoneにしてデバッガを実行すると動く。 (edited)
Avatar
ほほう
4:55 AM
余計な環境変数が注入されちしまってる?
Avatar
このNoneは、プロジェクトを閉じて再度開くと、NoneからSchemeのターゲットに戻ってしまう。
Avatar
ええw
Avatar
Yams.xcodeprojは、ここに過去存在して今は存在しないターゲットが設定されたままになってるため、Noneに戻らない。
4:56 AM
マルチプラットフォームターゲットとか全然関係なかった。
Avatar
最短手順 1. 新規Command Line Toolプロジェクト作成。 2. SchemeのRunアクションInfoタブ
  • Executableに/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
  • Debug Process As: root
  • Launch: Wait for executable to be launched
3. SchemeのRunアクションArguments タブ
  • Expand Variables Base On: None
4. Breakpoint Navigator
  • Symbolic breakpoint: getSwiftFullVersion
5. ⌘R 6. ターミナルで /Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift -version 実行
Avatar
XPC errorを出す手順ですか?
Avatar
XPC errorを出さずに/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swiftをアタッチする手順
Avatar
ああ。XcodeのToolchainを4.2.1-RELEASEにした場合で、ですよね
Avatar
そう。
Avatar
帰宅後にやってみます!
Avatar
xcodeprojを再度開いた時、Expand Variables Base On: Noneし忘れて一度XPC errorになったら、閉じるまではExpand Variables Base On: Noneしてもダメ。
5:14 AM
開き直して、Expand Variables Base On: Noneすれば大丈夫。
Avatar
毎回Expand Variables Base On: Noneしなくても良くするには、 1. Libraryターゲットdummy追加 2. メインのschemeのBuildアクションにdummyを追加。 3. RunアクションのExpand Variables Base Onをdummyに。 4. dummyターゲット削除、Buildアクションにはdummy (missing)が残り、Expand Variables Base Onもdummy (missing)のままになり、プロジェクトを再度開いてもそのまま残る。
Avatar
missingで残すのなるほどw
Avatar
で、自前ビルドしたswiftにアタッチ出来ない問題も、このExpand Variables Base Onの影響を受けているのならば、missingで回避出来るかも?
Avatar
ありえそうですね、Base On の対象はcmakeで生成されてるものだし、
5:28 AM
4.2.1ならいけて最近のmasterでは駄目っていうのも
5:28 AM
プロジェクト設定はリポジトリに依存してるから、そこで変化が起きるのも筋が通る
5:28 AM
もしその路線なら最終的にはExpand Variablesの副作用の根本原因を取り除くのが一番良さそう。
Avatar
プロジェクトのswiftコマンドのターゲットから作ったschemeだと、Expand Variables Based Onのコントロールがグレーアウトしてて変更できないようです
12:16 PM
空のschemeを自作してからexecutablesを指定するのだと、変更できるので、それでmasterビルドで実験してみます
Avatar
RunアクションのExecutableを変更しないと、Expand Variables Base Onは変更できないですね。
Avatar
ああ、本当だ。
12:44 PM
うーんこのexpand variables baesd onって
12:44 PM
単純に他のschemeの、argumentsとenvvarsをコピーしてくるって機能なんですかね
12:44 PM
なんでそれがXPCエラーに絡むんだ・・・
Avatar
あれ・・・・・???
1:10 PM
できました
Avatar
Arguments Passed on LaunchやEnvironment Variables内で${SRCROOT}などを使う時に、元となる設定をどのターゲットから持ってくるか、を設定するものかと。
Avatar
Xcode10.1 , Toolchain Xcode10.1 標準, swift source 直近のmaster, で、 Debug Process as root で、
1:11 PM
Wait for exceutable to launched が動きました
Avatar
おめ
Avatar
多大なサポートありがとうございました
👍 1
1:14 PM
結局、なにか変わった点は、 Debug Process as root だけでした でもこれも前試したはずだから、ソース側でも何かが変わって治ったのかも
Avatar
Visual Studio CodeでLLVM tutorialのC/C++のコードをデバッグしようとしたら, Stopping due to fatal error: DllNotFoundException: libc.dylibStopping due to fatal error: DllNotFoundException: libc.dylib が出て,プロセスにアタッチできない・・・・.誰か,同じような現象にあったことがある方いらっしゃいませんか?
Avatar
この人と同じエラー出てmasterをビルド出来ないんですが、他にも同じエラー出た人居ますか? 再現方法は、 1. utils/update-checkout --scheme master 2. sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer -> Xcode 10.2 beta 3 3. utils/build-script -x -rt --debug-swift -c https://forums.swift.org/t/swift-build-script-failed-clang-error-no-such-file-or-directory-we4062/21127 (edited)
I am trying to build the Swift source for development, following the instructions in the README for macOS. I am running the build script with the --debug-swift, --xcode, and --clean options: utils/build-script --release-debuginfo --debug-swift --xcode -clean The build ends...
Avatar
Ninjaビルドだけなら通るな。XcodeビルドでClangのヘッダーインポートに失敗している気がする
Avatar
@rintaro text がinternalじゃなくてpublicだと嬉しいんですが、なにか困ることありますか? https://github.com/apple/swift-syntax/blob/master/Sources/SwiftSyntax/TokenKind.swift.gyb#L35
SwiftPM package for SwiftSyntax library. Contribute to apple/swift-syntax development by creating an account on GitHub.
Avatar
@kitasuke 安全方向に振って必要な物だけ出してるだけだと思うので、ユースケース示して要望出してみるといいと思います。
Avatar
書いてみます! 今回のユースケースは、StringLiteralExprSyntaxの値が空文字かどうか判定するのに下記のコード書く時にstringQuotemultilineStringQuotetext使いたかったです。まあ無くても別に問題ないのであったら良いなぐらいですね。 public override func visit(_ node: StringLiteralExprSyntax) { let value = node.stringLiteral.text guard value != "\"\"", value != "\"\"\"\"\"\"" else { return } ... } (edited)
Avatar
@rintaro SwiftSyntaxのリリースタグ付いてるやつは、gyb_generated以下のファイルだけ最新になっててそれ以外のSources/SwiftSyntax以下のファイルは相当古いままのやつが使われてるんですが、それって期待通りなんですか? 下記のコミットが0.50000.0 タグ相当の状態です。 https://github.com/apple/swift-syntax/tree/43aa4a19b8105a803d8149ad2a86aa53a77efef3/Sources/SwiftSyntax
SwiftPM package for SwiftSyntax library. Contribute to apple/swift-syntax development by creating an account on GitHub.
Avatar
@kitasuke 返事おそくなりましたー。SwiftSyntax の 5.0 ブランチ は、11/16 のリブランチ以来ほとんど変更はなく、gyb は SwiftPM での dependency として使えるようにするために swift 5.0 ブランチから生成したものなので、そこだけ新しいファイルになっています。
12:43 AM
SwiftSyntax master ブランチはAPI変更を含むかなりの変更が入っていますが、それらは 5.0 には反映されません。
Avatar
そうなのかー。そしたらKuniwakさんの Syntax.swift に関する変更は入らないのか... https://github.com/apple/swift-syntax/pull/94/files
The result of dump() with Syntax is not useful. For example, the dumped result of Tests/SwiftSyntaxTest/Inputs/closure.swift is the following: ▿ // A closure without a signature. The test will ensu...
Avatar
ですね。swift-5.1-branch のリリースには含まれることになると思います。
👍 2
Avatar
ちなみに、おもちさんに #swift-syntax チャネル作ってもらいました。そこに投稿したイシューについてrintaroさんの意見も聞いてみたいです!
Avatar
omochimetaru 4/4/2019 1:44 AM
LLVM_DEBUGのメッセージって、ファイルの先頭に #define DEBUG_TYPE "sil-inliner" ってタグの定義がついてて
1:44 AM
コンパイラ実行時に $ swiftc -emit-sil -Xllvm -debug-only=sil-inliner ってやると
1:44 AM
それだけ見れるんだね
Avatar
omochimetaru 4/4/2019 2:02 AM
-Xllvm -sil-disable-passでMandatory系を消してやるとSILがわかりやすくなるな。
👀 1
Avatar
omochimetaru 4/17/2019 5:45 PM
.swiftmodule.swiftdocの中身を見たりダンプするコマンドってありますか?
Avatar
llvm のビルドディレクトリ/binにある llvm-bcanalyzer -dump で llvm ビットコード全般ダンプできるんですが、Swift向けに作られているわけでは無く、独自のコンテナの中身は見られないので、あまり参考にはならないです。 (edited)
Avatar
なるほど、ありがとうございます その場合、コンテナの中身のコンテンツはただのバイナリとしてしか見えないってことですよね
12:15 AM
swiftcの動作モードとかで隠し的なのがあるかなあと
Avatar
例として、Swift.swiftdoc はこんな感じ。 <BLOCKINFO_BLOCK/> <MODULE_DOC_BLOCK NumWords=813176 BlockCodeSize=2> <CONTROL_BLOCK NumWords=32 BlockCodeSize=3> <METADATA abbrevid=5 op0=1 op1=1 op2=0 op3=0/> blob data = 'Swift version 5.0-dev (LLVM 06f1615069, Swift edb924f743)' <MODULE_NAME abbrevid=4/> blob data = 'Swift' <TARGET abbrevid=6/> blob data = 'x86_64-apple-macosx10.9' </CONTROL_BLOCK> <COMMENT_BLOCK NumWords=813139 BlockCodeSize=4> <DECL_COMMENTS abbrevid=4 op0=3181980/> blob data = unprintable, 3247524 bytes. <GROUP_NAMES abbrevid=5/> blob data = unprintable, 5004 bytes. </COMMENT_BLOCK> </MODULE_DOC_BLOCK>
12:16 AM
swiftcの動作モードとかで隠し的
残念ながら、知ってる限り無いです。
Avatar
アスキーで読めるところは読めるんですね。
12:16 AM
なるほど。無いならツールを作ってみようかな
Avatar
いいっすね。 llvm-bcanalyzer ベースにするのもアリだとおもいます。
Avatar
コンテナへのアクセスにコマンドを叩くって意味ですか?
Avatar
Carthageで、frameworkがビルドされたSwiftのバージョン判定するのに-Swift.hを見てて、代わりにswiftmoduleからバージョン知れたらいいなと思っていたけど、骨折れるなと思って見送っていたので、そういうツール・ライブラリあるとめっちゃ喜びます😊 (edited)
Avatar
なるほど、そんな利用方法がw
Avatar
Swift 5.1?でModule Stabilityが実現されたらSwiftバージョン判定(バージョン違いでキャッシュを無効にするため)必要なくなりそうではあるんですけど。 (edited)
Avatar
コンパイラツールチェインが勝手に判断するようになる?
Avatar
例えばSwift 5.1でビルドしたものをSwift 5.2のコンパイラでもインポートできるようになるので、ビルドしたバージョンと、今ローカルで使っているバージョンが違ってもキャッシュを無効と判断する必要がなくなる、って感じですね。Module Stability以前と以後が入り混じるタイミングだとやっぱり判定してあげる必要ありそうですけど。
Avatar
Carthageの用途だと5.2でリビルドしたほうが良い気はします 最適化とか進化してるかもしれないし
Avatar
Kishikawa Katsumi 4/18/2019 12:56 AM
キャッシュが使われるのは--cache-buildをつけた時だけじゃないかな
Avatar
なるほど、それでも警告でリビルド促すくらいにはしたいですね
12:56 AM
はい、--cache-buildsの時の話です
Avatar
あ、なるほど、デフォルトは関係ないのか 警告はいいですね
Avatar
Kishikawa Katsumi 4/18/2019 12:57 AM
--cache-buildsを付けたときはキャッシュを使う、が良いと思います。警告はありですが、だいたい誤解されて伝わるのでなくていいんじゃないかな 😅
Avatar
誤解w
Avatar
Kishikawa Katsumi 4/18/2019 12:59 AM
Prebuiltバイナリを提供してたとき、互換性がないから再ビルドするメッセージを何かのエラーだと思う人が結構な数いて、Issueが定期的に来ていました。 (edited)
Avatar
あぁ〜〜 意味がよくわかんないけど黄色いから、問題ないんですか!?ってなるやつ・・
Avatar
ローカルでのビルドにフォールバックしてて問題ないのに、ってやつですね (edited)
Avatar
Kishikawa Katsumi 4/18/2019 1:00 AM
そうそう。まあ、知らないとわからないやつだから、気持ちはわかる。
1:01 AM
バージョンが上がるたびにビルドできなくなるSwiftも悪い 😓
Avatar
Kishikawa Katsumi 4/18/2019 2:08 AM
https://github.com/realm/realm-cocoa/issues/6134 ちょうどRealmSwiftにそういうIssueが来てた 😅 自分のはもうPrebuiltバイナリ置かなくしたけど、置いてるのは定期的にこういうIssueが来る。
!!! MANDATORY TO FILL OUT !!! Goals Install Realm using Carthage Expected Results Framework file to appear in Carthage-&gt;builds folders Actual Results I am getting the following error ***Inco...
Avatar
omochimetaru 4/18/2019 2:09 AM
なるほど・・・
Avatar
omochimetaru 4/19/2019 7:52 AM
BLOCKINFO#0 { } BLOCKINFO#0 MODULE_BLOCK#8 { CONTROL_BLOCK#9 { MODULE_NAME#2 METADATA#1 TARGET#3 OPTIONS_BLOCK#16 { IS_SIB#3 IS_TESTABLE#4 SDK_PATH#1 XCC#2 XCC#2 } OPTIONS_BLOCK#16 } CONTROL_BLOCK#9 ...
7:52 AM
LLVM BitStream のパースができた。
7:53 AM
バイナリJSONみたいなものなんだけど、データ構造を記述するセクションがあって、それに基づいてパースするのが面白い。
7:54 AM
swiftmoduleはこれの上にエンコードされてる
Avatar
omochimetaru 4/20/2019 3:24 AM
As you can probably tell, I've been saving a lot of discussions, waiting for Swift 4.2 to be in a pretty good place before we jump all in on Swift 5. This one's one of the main things I plan to be working on in the next year or so, so I wanted to make sure you all had the big...
3:26 AM
swiftinterfaceができたらswiftmoduleを気にする必要はないんだろうか (edited)
3:26 AM
ラトナーが
This also leverages the existing "generated interface" work nicely, and forces it to be round-trippable, which is also great.
3:27 AM
ラウンドトリップにできたらいいね、と言ってるから、 その場合は、どちらをみても完全に同じになる
Avatar
omochimetaru 4/20/2019 3:38 AM
Hi, everyone! It's about time we give an update on module stability. TLDR: it's looking good. Aside: who's "we"? These days, it's mostly me, @harlanhaskins, and @Nathan_Hawes, but I also want to acknowledge contributions from @Graydon_Hoare before he left the project. We'...
3:38 AM
ホヤホヤで試せるやつでてた
Avatar
norio_nomura 4/20/2019 3:54 AM
@swift-main import Foundation let interface = try! String(contentsOfFile: "/usr/lib/swift/linux/x86_64/Swift.swiftinterface") print(interface)
Avatar
swiftNightly BOT 4/20/2019 3:54 AM
// swift-interface-format-version: 1.0 // swift-tools-version: Swift version 5.0-dev (LLVM 06f1615069, Swift 844d4df31a) // swift-module-flags: -disable-objc-attr-requires-foundation-module -target x86_64-unknown-linux-gnu -disable-objc-interop -enable-library-evolution -module-link-name swiftCore -parse-stdlib -swift-version 5 -O -enforce-exclusivity=unchecked -module-name Swift import SwiftShims @inlinable public func min<T>(_ x: T, _ y: T) -> T where T : Swift.Comparable { // In case `x == y` we pick `x`. // This preserves any pre-existing order in case `T` has identity, // which is important for e.g. the stability of sorting algorithms. // `(min(x, y), max(x, y))` should return `(x, y)` in case `x == y`. return y < x ? y : x } @inlinable public func min<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Swift.Comparable { var minValue = min(min(x, y), z) // In case `value == minValue`, we pick `minValue`. See min(_:_:). for value in rest where value < minValue { minValue = value } return minValue } @inlinable public func max<T>(_ x: T, _ y: T) -> T where T : Swift.Comparable { // In case `x == y`, we pick `y`. See min(_:_:). return y >= x ? y : x } @inlinable public func max<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Swift.Comparable { var maxValue = max(max(x, y), z) // In case `value == maxValue`, we pick `value`. See min(_:_:). for value in rest where value >= maxValue { maxValue = value } return maxValue } @_fixed_layout public struct EnumeratedSequence<Base> where Base : Swift.Sequence { @usableFromInline internal var _base: Base @inlinable internal init(_base: Base) { self._base = _base } } extension EnumeratedSequence { @_fixed_layout public struct Iterator { @usableFromInline internal var _base: Base.Iterator @usableFromInline internal var _count: Int @inlinable internal init(_base: Base.Iterator) { self._base = _base self._count = 0 } }
Avatar
omochimetaru 4/20/2019 3:55 AM
おー
3:55 AM
インライン見えてる
3:59 AM
swiftmoduleにはSIB(バイナリのSIl)が入ってると思ってたけど swiftinterfaceはソースが入ってるのか
Avatar
norio_nomura 4/20/2019 4:00 AM
面白いね。
Avatar
omochimetaru 4/20/2019 4:00 AM
こっちを使うときはコンパイルしてSIL生成してからインライン化埋め込みするのかな
4:01 AM
swiftmoduleはseiftinterfaceのキャッシュになるって事だから
4:01 AM
おかしくはないけどデコンパイルはできないからラウンドトリップにはならないな (edited)
4:02 AM
このスレで聞いてみよ
Avatar
norio_nomura 4/20/2019 4:09 AM
5.1にも.swiftinterface入ってるのか。
Avatar
Kishikawa Katsumi 4/21/2019 1:49 PM
@Yuta Saito 1年前を思い出しながらSwiftPowerAssertから-dump-astのParserの部分を独立させて、現行の環境で動くようにしました。よかったら参考にしてください。 https://github.com/kishikawakatsumi/SwiftAST 使い方は swift-ast parse [FILE_PATH_TO_PARSE] -buildCommand [BUILD_COMMAND_TO_BUILD_THE_PROJECT] 例えば path/to/swift-ast parse "./Framework/Sources/SpreadsheetView.swift" -buildCommand xcodebuild -scheme SpreadsheetView や、 path/to/swift-ast parse ./Lib/KeychainAccess/Keychain.swift -buildCommand xcodebuild -scheme KeychainAccess -sdk iphonesimulator -destination "name=iPhone Xs,OS=12.2" です。 以下、思い出したことを書きます。 (edited)
Experimental project for parsing an output that swift -dump-ast produces - kishikawakatsumi/SwiftAST
👀 1
1:56 PM
-dump-astは全ての型が解決しているので原則としてコンパイルが成功する必要があります。簡単な(依存関係がない)ファイルなら簡単ですが、他のファイルやモジュールを参照している場合は同じモジュールのファイルの場合はそれを一緒に渡す、別モジュールの場合はそれを先にビルドする必要があります。 なので、時間は余計にかかるのですが、 https://github.com/kishikawakatsumi/SwiftAST/blob/master/Sources/SwiftAST/XcodebuildTool.swift#L37-L42 のように swift -dump-ast を実行する前にまずビルドしています。 ビルドエラーが起こる状態で swift -dump-ast を実行した場合、単に失敗するか不完全なASTが出力されます。 swift -dump-ast の出力自体が謎であるのにさらに不完全なASTを相手にするのは無理なので、最初のキモは確実にビルドできるパラメータを組み立てることです。 (edited)
Experimental project for parsing an output that swift -dump-ast produces - kishikawakatsumi/SwiftAST
2:01 PM
最初のハードルを超えたら、完全なASTのテキストが手に入るので、それを読んでいくだけです。 難しいのは constructor_declbrace_stmt assign_expr といったノードの種類がよくわからないことと、それぞれがどういう属性を持っているかが当然Undocumentedでよくわからないところで、Parse自体はそれほど難しくないはず(目的にもよりますが)です。
2:05 PM
https://github.com/kishikawakatsumi/SwiftAST/blob/master/Sources/SwiftASTCore/SwiftAST.swift#L39-L46 ^ を見ると私がどのようにやったかがわかります。 private func process(sourceFile: URL, verbose: Bool = false) throws -> AST { let arguments = buildArguments(source: sourceFile) let rawAST = try dumpAST(arguments: arguments) let tokens = tokenize(rawAST: rawAST) let node = lex(tokens: tokens) let root = parse(node: node) return root } dumpAST(arguments:)swift -dump-astを実行します。 得られたテキストをtokenize(rawAST:)でトークンに分割して、lex(tokens:)でツリー構造を作ります。 最後にparse(node:) でツリー構造のデータに意味を持たせます。
Experimental project for parsing an output that swift -dump-ast produces - kishikawakatsumi/SwiftAST
2:09 PM
-dump-astの出力はS式のように見えるのでカッコを頼りにしたくなりますが、別の意味のカッコが普通に("'に囲まれることなく)出てくるのでそれは難しいです。 代わりに行とインデントを使います。
2:12 PM
func tokenize(source: String) -> [ASTToken] { var lines = [String]() for line in source.split(separator: "\n", omittingEmptySubsequences: false) { let trimmed = line.trimmingCharacters(in: .whitespaces) if trimmed.hasPrefix("(inherited_conformance") || trimmed.hasPrefix("(normal_conformance") || trimmed.hasPrefix("(abstract_conformance") || trimmed.hasPrefix("(specialized_conformance") || trimmed.hasPrefix("(assoc_type") || trimmed.hasPrefix("(value req") || !trimmed.hasPrefix("(") { continue } lines.append(String(line)) } ... -dump-astの出力をまず行ごとに分割します。このとき、いくつかのプロジェクトでノイズになる行(実行コードには関係なく見える上にインデントがおかしい)が発見されたのでそれを取り除いています。
2:17 PM
そのあと、1行ごとに1文字ずつIterateしながらトークンに分割していきます。 私の場合はindent(先頭の空白)、symbol(シングルクオートで囲まれた文字列)、string(ダブルクオートで囲まれた文字列)、token(それ以外の文字列や記号)に分類しました。 class ASTToken { enum TokenType { case token case symbol case string case indent(Int) }
Avatar
Kishikawa Katsumi 4/21/2019 2:25 PM
この段階でテキストがトークンに分割されたものが手に入ります。 ▿ 1498 elements ▿ 0 : ( ▿ 1 : source_file ▿ 2 : "/Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift" ▿ 3 : __ ▿ 4 : ( ▿ 5 : struct_decl ▿ 6 : range ▿ 7 : = ▿ 8 : /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:1:8 - line:17:1 ▿ 9 : "Country" ▿ 10 : interface ▿ 11 : type ▿ 12 : = ▿ 13 : 'Country.Type' ...
2:26 PM
ASTLexer がこのトークンの配列をツリー構造にします。Lexerといってますが、ツリー構造に変換するだけです。
2:29 PM
[(, source_file, "/Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift"] [(, struct_decl, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:1:8 - line:17:1, "Country", interface, type, =, 'Country.Type', access, =, public, non-resilient] [(, pattern_binding_decl, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:2:12 - line:2:22] [(, pattern_typed, type, =, 'String'] [(, pattern_named, type, =, 'String', 'code', )] [(, type_ident] [(, component, id, =, 'String', bind, =, Swift.(file).String))))] [(, var_decl, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:2:16 - line:2:16, "code", type, =, 'String', interface, type, =, 'String', access, =, public, let, readImpl, =, stored, immutable] [(, accessor_decl, implicit, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:2:16 - line:2:16, 'anonname=0x10a8205a8', interface, type, =, '(Country) -> () -> String', access, =, public, get_for, =, code] [(, parameter, "self", interface, type, =, 'Country', )] [(, parameter_list, )] [(, brace_stmt, implicit, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:2:16 - line:2:16] [(, return_stmt, implicit] ... こんな感じです。これでツリー構造とノードの種別や属性情報がプログラムから扱える形になりました。
2:36 PM
ここまではそんなに難しくなくて、大変なのはソースコードから生成されるASTが難しいので、この情報を使っていくところです。 わかりやすいところでstruct_declとかvar_declcall_exprmember_ref_exprdot_syntax_call_exprなどです。それ以外に膨大な種類のノードがあるので、全部に対応するのはとても大変なので、必要に応じてノードをフィルタして使っていく、というのが良いかと私は考えています。
2:41 PM
その必要なところだけ使う、というのをやっているのがASTParserで、 private func parseSourceFileNode(node sourceFileNode: ASTNode<[ASTToken]>) -> AST { var declarations = [Declaration]() for node in sourceFileNode.children { for token in node.value { switch (token.type, token.value) { case (.token, "top_level_code_decl"): declarations.append(.topLevelCode(parseTopLevelCodeDeclarationNode(node: node))) case (.token, "import_decl"): declarations.append(.import(parseImportDeclarationNode(node: node))) case (.token, "struct_decl"): declarations.append(.struct(parseStructDeclarationNode(node: node))) case (.token, "class_decl"): declarations.append(.class(parseClassDeclarationNode(node: node))) case (.token, "enum_decl"): declarations.append(.enum(parseEnumDeclarationNode(node: node))) case (.token, "extension_decl"): declarations.append(.extension(parseExtensionDeclarationNode(node: node))) case (.token, "func_decl"): declarations.append(.function(parseFunctionDeclarationNode(node: node))) default: break } } } return AST(declarations: declarations) } のようにまずStructやClass宣言を拾って、そのあと例えば関数だったら
2:41 PM
private func parseFunctionDeclarationNode(node: ASTNode<[ASTToken]>) -> FunctionDeclaration { let tokens = node.value let name = parseString(tokens: tokens) ?? parseSymbol(tokens: tokens) let accessLevel = parseAccessLevel(tokens: tokens) var parameters = [Parameter]() var body = [Statement]() for node in node.children { for token in node.value { switch (token.type, token.value) { case (.token, "parameter_list"): parameters.append(contentsOf: parseParameterListNode(node: node)) case (.token, "brace_stmt"): body.append(.expression(parseExpressionNode(node: node))) default: break } } } return FunctionDeclaration(accessLevel: accessLevel, name: name!, parameters: parameters, body: body) } パラメータやステートメントをさらに拾っていく、としています。 一番大変なのがこのParser部分を作っていくところだと思います。ここは自分が利用する情報を探しながらトライアルアンドエラーで書いていくことになります。
Avatar
非常に丁寧な解説ありがとうございます! 実はこの週末でPowerAssertをメチャクチャ参考にしながら、括弧ベースのパーサコンビネータからインデントベースの実装に書き換えて、なんとか動くところまで出来ました。
2:43 PM
Speed up your build time. Rewrite your source code as type annotated. - kateinoigakukun/TouchTypist
Avatar
norio_nomura 4/21/2019 2:45 PM
swift-astをいくつかのプロジェクトで試しましたが、clangモジュールのインポートをするためのパラメータが足りていない様です。 output: <unknown>:0: error: missing required module 'clibc' あと、-showBuildSettingsの出力は-jsonを使うとパースが簡単になると思います。 (edited)
🤔 1
Avatar
parameter_listをインデントベースでパースすると正しくrangeを取れないので例外的に処理することにしたんですが、こういう例外が他にも結構ありそうで、なかなか道のりは長そうです。。。 😢 (parameter_list (parameter "i" interface type='Int') range=[foo.swift:1:17 - line:1:17]) https://github.com/kateinoigakukun/TouchTypist/blob/master/Sources/TypeCheckedAST/Parser/CanonicalTransformer.swift#L22-L29 (edited)
Speed up your build time. Rewrite your source code as type annotated. - kateinoigakukun/TouchTypist
Avatar
Kishikawa Katsumi 4/21/2019 2:55 PM
こういうやつですよね? (constructor_decl range=[/Users/katsumi/Documents/XcodeProjects/KeychainAccess/Lib/KeychainAccess/Keychain.swift:229:12 - line:231:5] "init(rawValue:)" interface type='(AuthenticationPolicy.Type) -> (UInt) -> AuthenticationPolicy' access=public designated (parameter "self" interface type='AuthenticationPolicy' inout) (parameter_list (parameter "rawValue" apiName=rawValue interface type='UInt') range=[/Users/katsumi/Documents/XcodeProjects/KeychainAccess/Lib/KeychainAccess/Keychain.swift:229:16 - line:229:31]) 問題なさそうに見えますけど、どういう風に違いますか?
2:56 PM
@norio_nomura xcodebuild -showBuildSettings -json -scheme KeychainAccess みたいに書けるんですね。。。
Avatar
↓こうなっていれば綺麗にパースできるんですが、 (parameter_list range=[foo.swift:1:17 - line:1:17] (parameter "i" interface type='Int'))
2:58 PM
rangeがparameterの行に後置されてるので、改行ベースだとparameterの要素として扱われて都合が悪いんですよね。 (parameter_list (parameter "i" interface type='Int') range=[foo.swift:1:17 - line:1:17]) // ここまでparameterの要素としてパースされる (edited)
Avatar
Kishikawa Katsumi 4/21/2019 3:00 PM
ああなるほど。そうですねえ、そういう都合に合わないケースはありそうですね。
3:02 PM
ある程度動くようになったら、OSSプロジェクトに対してかけていくといろいろうまくいかないケースが見つかります。 私はこういうの作って失敗するケースを見つけて調整して、、、の繰り返し https://github.com/kishikawakatsumi/SwiftPowerAssertIntegrationTests
Contribute to kishikawakatsumi/SwiftPowerAssertIntegrationTests development by creating an account on GitHub.
Avatar
おお、、、やっぱりトライアンドエラーでやっていくしか無さそうですね。
3:08 PM
ここまで大変だとswiftcのコードにtype checkedなastをjsonで出力する機能を付けたほうが楽だったのでは。。。という気になってきました。。。
Avatar
Kishikawa Katsumi 4/21/2019 3:11 PM
それはかなり理想的、、、私が一番やりたいのはAST to ASTですね。途中でJSONとかに落とすんじゃなくてビルドに割り込んでASTの形で受け取ってASTを変換して返す。
Avatar
確かに。ビルドパイプラインに割り込めるようになると夢は広がりそうですね
Avatar
Kishikawa Katsumi 4/21/2019 3:32 PM
TypeAnnotationを付けていく、のはおもしろいですね。逆はビルドできなくなる可能性があるけど、付けるぶんにはたぶん問題ないんですかね? (edited)
Avatar
正しい型情報が追加される分には、今のところ問題は起きてないですね
Avatar
clangモジュールのインポートをするためのパラメータが足りていない
XcodebuildTool.constructSwiftOptions(xcodebuildLog:)-fmodule-map-file=も使う必要がある。
Avatar
Kishikawa Katsumi 4/22/2019 12:29 AM
Package.swiftから子ターゲットのPackage.swiftを読んでいって、modulemapを見つけたら追加、って感じかなあ?
Avatar
norio_nomura 4/22/2019 1:23 AM
xcodebuildLog中のswiftcへ渡されてるパラメータに含まれていますよ。 (edited)
Avatar
Kishikawa Katsumi 4/22/2019 1:58 AM
あれ、 xcodebuildでビルドした場合もclibcないって言われます?
1:58 AM
swift buildの場合だけかと思っていました。でもありそうだな。。
Avatar
norio_nomura 4/22/2019 2:05 AM
SwiftASTでswift package generate-xcodeprojしてswift run swift-ast parse Sources/SwiftAST/main.swift -buildCommand xcodebuild -scheme SwiftASTで言われます。
2:05 AM
$ swift package generate-xcodeproj warning: invalid duplicate target dependency declaration 'swift-build' in target 'FunctionalPerformanceTests' warning: invalid duplicate target dependency declaration 'swift-package' in target 'FunctionalPerformanceTests' generated: ./SwiftAST.xcodeproj $ swift run swift-ast parse Sources/SwiftAST/main.swift -buildCommand xcodebuild -scheme SwiftAST warning: invalid duplicate target dependency declaration 'swift-build' in target 'FunctionalPerformanceTests' warning: invalid duplicate target dependency declaration 'swift-package' in target 'FunctionalPerformanceTests' Reading project settings... Building dependencies... Parsing... failed to run the following command: '/usr/bin/xcrun swift -frontend -suppress-warnings -dump-ast -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/../../../Developer/Library/Frameworks -target x86_64-apple-macosx10.10 -I /Users/norio/Library/Developer/Xcode/DerivedData/SwiftAST-gglvpwfxcdqcbehkwkywmelahzns/Build/Products/Debug -F /Users/norio/Library/Developer/Xcode/DerivedData/SwiftAST-gglvpwfxcdqcbehkwkywmelahzns/Build/Products/Debug -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -primary-file /Users/norio/github/SwiftAST/Sources/SwiftAST/main.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/Errors.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/ParseTool.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/SwiftASTTool.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/SwiftBuildTool.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/XcodebuildTool.swift' output: <unknown>:0: error: missing required module 'clibc'
🙏 1
2:11 AM
SourceKittenでもSourceKitへ渡すswiftcパラメータの構築をやっていて、
  • xcodebuildのログからswiftcへ渡されるパラメータを取得
  • XcodeのNew Build SystemがDerivedData内に作成するllbuildマニフェストから取得
  • SwiftPMのllbuildマニフェストdebug.ymlから取得
という3パターンをサポートしてます。 https://github.com/jpsim/SourceKitten/blob/master/Source/SourceKittenFramework/Module.swift
(edited)
An adorable little framework and command line tool for interacting with SourceKit. - jpsim/SourceKitten
Avatar
norio_nomura 4/22/2019 2:19 AM
llbuildマニフェストから取得する方法は、クリーンビルドしなくても済むというメリットがあります。
Avatar
Kishikawa Katsumi 4/22/2019 2:25 AM
クリーンビルドしなくても済むというメリット
これはいいですね。
Avatar
norio_nomura 4/22/2019 2:36 AM
New Build Systemのllbuildマニフェストから取り出すコード。Yams使って読んでるけど、今だとllbuildSwiftとか使えるのかな? https://github.com/jpsim/SourceKitten/blob/67b93b83bafa83306fbb9dd201d4dfd22661a53a/Source/SourceKittenFramework/Xcode.swift#L287-L322
An adorable little framework and command line tool for interacting with SourceKit. - jpsim/SourceKitten
2:39 AM
SourceKittenはモジュール名を使って探すけど、SwiftASTはどうやって探すべきだろう?
Avatar
omochimetaru 5/8/2019 8:54 AM
ひさびさに update-checkout --cloneしたら、いろいろ増えてた Cloning 'sourcekit-lsp' Cloning 'libcxx' Cloning 'indexstore-db' Cloning 'swift-stress-tester' Cloning 'swift-syntax' Cloning 'clang-tools-extra'
Avatar
omochimetaru 5/8/2019 1:07 PM
build-scriptがいつのまにか完全pythonになってる、bashと比べるとめっちゃ読みやすい、型が無いのでよくわからんが
👁 1
Avatar
omochimetaru 5/8/2019 2:16 PM
完全にはなってなかった、pythonからbuild-script-implを個別のタスクごとに何度も呼び出す
Avatar
omochimetaru 6/22/2019 6:41 PM
Catalina beta 2 + Xcode 11 Beta 2 環境で master の --debug --xcode のビルド通らねえ・・・
6:41 PM
去年もWWDC直後からしばらく全然通せなかったんだよな〜・・・
Avatar
omochimetaru 6/23/2019 8:52 AM
WWDC直前snapshotなら通った > swift-DEVELOPMENT-SNAPSHOT-2019-06-02-a
Avatar
あっ、 xcode-selectするの忘れてた、noobか
Avatar
omochimetaru 6/26/2019 5:50 AM
xcode betaでmaster通った。
Avatar
omochimetaru 6/27/2019 3:05 AM
Thanks for the swift replies! The purpose of mangling makes sense. Some concrete follow-up questions: Is it worth pursuing a more flexible scheme for mangling a list of function type modifiers? And is it possible to do so in a backwards-compatible way? Please see my post a...
3:06 AM
関数のmanglingでアトリビュートが一個しか保持できない仕様になっているので、 convention(c)とautoclosureを同時に使うとコンパイラがクラッシュするらしい https://bugs.swift.org/browse/SR-11027
😹 2
Avatar
omochimetaru 6/27/2019 7:24 AM
Contribute to apple/swift-llvm development by creating an account on GitHub.
7:24 AM
def CC_X86_64_C : CallingConv<[ // Pass SwiftSelf in a callee saved register. CCIfSwiftSelf<CCIfType<[i64], CCAssignToReg<[R13]>>>, // A SwiftError is passed in R12. CCIfSwiftError<CCIfType<[i64], CCAssignToReg<[R12]>>>,
👀 1
7:24 AM
@Yuta Saito レジスタ割当ココにあった
Avatar
すごいちゃんと宣言的に記述されてる
Avatar
omochimetaru 6/27/2019 7:26 AM
この謎言語で定義を書くと
7:26 AM
C++のヘッダーファイルが生成される仕組み。
7:26 AM
// build/Xcode-DebugAssert/llvm-macosx-x86_64/lib/Target/X86/X86GenCallingConv.inc static bool CC_X86_64_C(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State) { if (ArgFlags.isSwiftSelf()) { if (LocVT == MVT::i64) { if (unsigned Reg = State.AllocateReg(X86::R13)) { State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); return false; } } } if (ArgFlags.isSwiftError()) { if (LocVT == MVT::i64) { if (unsigned Reg = State.AllocateReg(X86::R12)) { State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); return false; } } } }
7:28 AM
LLVMかなり複雑で、CPUの種類とか亜種に応じた定義をいっぱい書いて、リゾルバが最終的にどういうバイナリにするか解決するみたいな雰囲気
Avatar
なるほど
Avatar
Integrating libSyntax into the compiler pipelineの最初のPRがrevertされた後に気配を感じなくなったので、わいわいswiftc発表までに内容固まるか不安だ... https://github.com/apple/swift/pull/25193
Instead of creating the AST directly in the parser (and libSyntax or SwiftSyntax via SyntaxParsingContext), make Parser to explicitly create a tree of ParsedSyntaxNodes. Their OpaqueSyntaxNodes can...
Avatar
omochimetaru 7/17/2019 4:02 AM
ほんとだrevertされてる・・・
4:02 AM
でもこれ設計が悪いとかじゃなくて、自動生成系のファイルの兼ね合いでCIが壊れたってだけかな?
Avatar
そうです。なのですぐ修正されたPRが来ると思ってたんだけど、なぜか一週間たってもPRない
4:06 AM
まだ全部読んで無いけど、設計はこれで良い気がしてる。 今までのコアだった SyntaxParseActions HiddenLibSyntaxAction でラップする感じ。
Avatar
omochimetaru 7/17/2019 4:07 AM
jansvoboda11さんのやつ、わりと早い時点でプルリク出ててしばらく動きなかったし、ゴリゴリ実装走ってるというより、結構コンパイラ内部のキャッチアップとか設計の打ち合わせに時間取ってるんじゃないかなという気がする
4:08 AM
SyntaxParseActions ←このActionってどういう概念なのか気になっているから解説待ってます
Avatar
そんな感じする。 SyntaxParsingContext だけでも最初は意味不明だし
4:09 AM
それもカバーしたい!わいわいswiftcは現状の仕組みの説明が中心になりそう。その後に今後の展望を実装を添えてって感じ
Avatar
omochimetaru 7/17/2019 4:10 AM
SyntaxParsingContextが多分パーサのステートで、バックトラックとか中断/再開の絡みでうりゃうりゃやってるんかなと予想
Avatar
SyntaxParsingContextはシンタックスツリー構築するステートかな。ルートのシンタックスノードに対してchildを1つしか持たないので、各シンタックスごとにcontext経由でノード登録するって仕組みだった。中断・再開はここの中でやってたかは忘れた (edited)
Avatar
omochimetaru 7/17/2019 4:13 AM
ふむふむ
Avatar
中断・再開は違う場所だったような気もする。忘れたわ。 ASTContext とそこまでやってること違わない気はする。
4:15 AM
SyntaxParsingContext -> Syntax Tree ASTContext -> AST objects
4:17 AM
Contextが別々のアウトプットを生成するんだけど、各parse~メソッド内で SyntaxParsingContextASTContext への値注入を同じ場所でやってるのが今回のモチベーションのはず
Avatar
omochimetaru 7/19/2019 8:25 AM
SwiftSyntaxだと 1 + 2 * 3 みたいな式が演算子の優先度関係なくフラットになっちゃってるんだけど、これを階層付けするのってparserで解析したoperator precedenceだけでできるから、parserのlibASTで組み替えてるのかな?
8:26 AM
でもそうするとASTGen使う構成の場合、どういうふうになるんだろ
Avatar
SquenceExpr から BinaryExpr への折りたたみはSemaでやってます。Parser は SequenceExpr 作るところまで。
Avatar
omochimetaru 7/19/2019 8:28 AM
おおそうなんですね
Avatar
importしたモジュールも含めないと operator の優先順位つけられないので、Parserでは出来ないです。
Avatar
omochimetaru 7/19/2019 8:30 AM
あ〜
Avatar
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 7/19/2019 8:32 AM
ありがとうございます。TypeCheckExprか。
Avatar
preCheckExpression という ConstraintSystem にかける前処理で呼ばれます。
Avatar
@rintaro Opaque Result Typeの機能はswiftcに全部入ったんでしたっけ? SwiftUIのシンタックス var body: some view {} をSwiftSyntaxに渡すと意図してないようなシンタックスで返ってきます。たぶんswiftc側の修正が必要? some viewsomeView になってしまう。 ▿ typeAnnotation : Optional<TypeAnnotationSyntax> ▿ some : SwiftSyntax.TypeAnnotationSyntax ▿ colon : SwiftSyntax.TokenSyntax - text : ":" ▿ leadingTrivia : Trivia - pieces : 0 elements ▿ trailingTrivia : Trivia ▿ pieces : 1 element ▿ 0 : TriviaPiece - spaces : 1 - tokenKind : SwiftSyntax.TokenKind.colon ▿ type : SwiftSyntax.SimpleTypeIdentifierSyntax ▿ name : SwiftSyntax.TokenSyntax - text : "someView" ▿ leadingTrivia : Trivia - pieces : 0 elements ▿ trailingTrivia : Trivia ▿ pieces : 1 element ▿ 0 : TriviaPiece - spaces : 1 ▿ tokenKind : TokenKind - identifier : "someView" - genericArgumentClause : nil - initializer : nil
Avatar
ありゃ、なんでだろう。bugs に報告いただけますか?
Avatar
分かりました! swift-formatで遊んでたら気が付きました
Avatar
libSyntaxは問題ないっぽい。-emit-syntaxの結果は正常に見えた。
Avatar
@rintaro すみません!いろいろ問題を切り分けたらswift-formatが原因でした... お騒がせしました! libSyntax/SwiftSyntax側では someがSomeTypeSyntaxになってるのを確認しました。
Avatar
お、そうでしたか。swift-formatまだきちんと見られてないのですが、そういう書き換えもするんですね。
Avatar
自分のレイヤーでもトークンを出力用に構築するとこがあって、そこでスペース足したり改行したりしてました。こんな感じです https://github.com/apple/swift-format/pull/10
Produced source code with SomeTypeSyntax is not compilable because there is no space in the syntax Fixes SR-11167.
1:47 PM
swift-formatはまだ処理に凄い時間かかるので、そこが改善されるまで試用段階かなー
Avatar
Token定義にオペレータがないのは単純にoperatorの量が多すぎるからですか? precedenceの計算用にparser内では定義してた気はするんですが。+とか-。 そもそもlexerではそこまで判定する必要ないのかな https://github.com/apple/swift/blob/master/utils/gyb_syntax_support/Token.py (edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
Integrating libSyntax into the compiler pipelineの進捗が見えない!わいわいswiftcで紹介しようと思ったのに困った!
Avatar
滞っていてごめんなさいー。😢
5:29 AM
https://github.com/apple/swift/pull/26403 さっき上げたこれで行ければいいんですけど、どうなるか。
5:30 AM
revert したとこ以降については、それはそれで進めていて、第一弾のこれがマージでき次第順次PR出していく予定です。
👀 1
Avatar
ちょうどPRあげたとこだったんですね、ありがとうございます!楽しみに待ってます。
Avatar
omochimetaru 8/1/2019 5:41 PM
sema読みづらい・・・ this経由とか参照型引数経由の副作用が追いきれない
Avatar
参照型引数経由ばかりで慣れるまで読みづらいよね。parserまでしか読んだことないけど、semaはさらにやばそう
Avatar
omochimetaru 8/11/2019 8:29 AM
LValue-nessに関してSwiftcのConstraintSystemが何をやっているかわかってきたけど
8:30 AM
ピンポイント過ぎて大丈夫なのかコレって感じだ
12:40 AM
↑「大丈夫なのか」って思ったところ大丈夫じゃなかった!
🎉 3
Avatar
omochimetaru 8/20/2019 1:54 AM
時々出てくる Qol ってなんだろう
1:55 AM
コンパイラの性能とか機能向上の文脈で出てくるけど Quality of life の事なの?
Avatar
QoI (Quality of implementation)
Avatar
omochimetaru 8/20/2019 1:57 AM
Iか〜〜〜〜〜〜〜〜〜!!!www
Avatar
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 8/20/2019 1:58 AM
Lexicon.rst見ればいいんですね、ありがとうございます。
Avatar
QoI に関しては、ほとんどがdiagnostics改善という文脈で使われてますね。
Avatar
omochimetaru 8/20/2019 2:01 AM
なるほど
Avatar
omochimetaru 8/25/2019 4:06 PM
読んでたらいくつか変なとこ見つけたのでいろいろ落ち着いたら弄ってみる
Avatar
omochimetaru 9/21/2019 3:10 PM
In file included from /Users/omochi/work/swift-source/llvm/include/llvm/ADT/STLExtras.h:20: /Users/omochi/work/swift-source/llvm/include/llvm/ADT/Optional.h:141:3: error: unknown type name 'constexpr' constexpr Optional() {} ^ /Users/omochi/work/swift-source/llvm/include/llvm/ADT/Optional.h:141:13: error: constructor cannot have a return type constexpr Optional() {} ^~~~~~~~
3:10 PM
Xcode11 App Store版で、コンパイラのビルドがこんな感じで全然ビルドできなくなってしまった。
3:12 PM
他にもエラーが出てるんだけど、clangがC++ dialectをC++03相当で動作してるような気がする。
3:12 PM
こないだまでXcode-beta 11で問題なかったんだけど。
Avatar
omochimetaru 9/21/2019 3:36 PM
あ〜いけた。$ brew upgrade cmakeで解決しました。
3:37 PM
ninjaビルドだといけたので、cmakeのxcodeproj生成が怪しいと思ったのと、 -- The C compiler identification is unknown -- The CXX compiler identification is unknown ↑こんなメッセージが出ていた
Avatar
omochimetaru 9/21/2019 3:47 PM
差分としてビルド時のコマンドラインに-std=c+11が追加されてるわ。
Avatar
masterビルドしようとするとsourcekitdが見つからなくてcmakeが通らない CMake Error in cmake/modules/CMakeLists.txt: export called with target "swiftSwiftLang-macosx-x86_64" which requires target "sourcekitd" that is not in any export set. (edited)
Avatar
add_libraryでsourcekitdが登録されてるのは確認できた
7:16 AM
なんで動かないのか全く分からんのでここコメントアウトして無理やりcmakeだけ通した… https://github.com/apple/swift/blob/b8722fd7d4fc070d685dee2e1173ce180b4896c6/tools/SourceKit/CMakeLists.txt#L45-L47
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
Azure Pipelinesでswiftcをビルドしようとしたら成果物が大きすぎてディスク容量が足りなくなった https://dev.azure.com/kateinoigakukun/swiftwasm/_build/results?buildId=14
4:00 AM
困った…
Avatar
omochimetaru 10/1/2019 4:00 AM
4:00 AM
でかいマシンかりたら?
4:00 AM
4:00 AM
PipelinesはCIのやつか
Avatar
そうそう、publicリポジトリだと時間制限無しでビルドできるのでswiftcビルドできるじゃーん、って試してみたんですけど、
4:02 AM
5時間近く頑張った挙句にディスク足りなくて死にました
Avatar
omochimetaru 10/1/2019 4:02 AM
それでもタイムアウトはないのか、偉いな
4:02 AM
昔Travisでwebrtcをビルドしようとしたけどタイムアウトしちゃって無理だった
4:05 AM
ゴネればリソース増やしてくれるかな
Avatar
Kishikawa Katsumi 10/1/2019 4:05 AM
とりあえずコンタクトしてみるのはいいんじゃない。
4:05 AM
ゴネるというのは気になるけど普通に。
Avatar
omochimetaru 10/1/2019 4:06 AM
compnardさんがAzureでswift for windowsをCIしてるやつはどうやってんのかな
4:06 AM
↑これ
Avatar
4:07 AM
Azure pipelinesってアイコンが出てるし
4:07 AM
やりたいことはいっしょそう
Avatar
特に特別な事してなさそう。とりあえず聞いてみます
Avatar
norio_nomura 10/1/2019 6:16 AM
DebugビルドとReleaseビルドで必要となるディスク容量が大幅に違った様な。 (edited)
Avatar
norio_nomura 10/1/2019 6:26 AM
以前Debugビルドしたときには、60GB以上使ってた様な記憶がある。
6:27 AM
rintaroさんの記事によると、リリースビルドだと10GBくらい? https://qiita.com/rintaro/items/2047a9b88d9249459d9a
Swift がオープンソースになってしばらく経ちます。 コンパイラや標準ライブラリの開発に手を出してみたいけど、リポジトリを落とした後どうしていいかわからない!という方のために、まずは開発環境...
Avatar
なるほど、確かにwindows-swiftはリリースビルドですね
6:31 AM
swiftコンパイラとかllvmはリリースビルドで十分なんですが、stdlibは-Ononeでビルドしたいんですよね。そういう凝ったことできるのかな
Avatar
1.7G ./Ninja-ReleaseAssert/swift-linux-x86_64 3.9M ./Ninja-ReleaseAssert/cmark-linux-x86_64 2.2G ./Ninja-ReleaseAssert/llvm-linux-x86_64 3.9G ./Ninja-ReleaseAssert 27G ./Ninja-DebugAssert/swift-linux-x86_64 5.1M ./Ninja-DebugAssert/cmark-linux-x86_64 42G ./Ninja-DebugAssert/llvm-linux-x86_64 68G ./Ninja-DebugAssert
👍 1
6:35 AM
手元に残ってた成果物だとこんな感じでした
6:36 AM
llvmがヤバいのか
Avatar
リリースビルドで試してみたところ無事ディスク足りたようで成功しました
9:36 AM
デバッグビルドが5時間かかったのに対してリリースビルドが3時間弱で終わった…
Avatar
なんでリリースのほうが早いんだろう?
Avatar
This project has been so fun to work on and I'm super excited to see it open sourced. We've rewritten the Swift driver in Swift 🎉 https://t.co/emv2RdsnKO
Avatar
おお!self-hostの第一歩だ
Avatar
確かに一番外側のdriver層だったらビルドのブートストラップ問題もないな。
4:26 PM
内側の生swiftcでswiftをビルドしてそれでドライバーをビルドできる。
Avatar
それにYamsが使われてるって、今朝jpsimが教えてくれた。 https://github.com/apple/swift-driver/blob/master/Package.swift
Swift compiler driver reimplementation in Swift. Contribute to apple/swift-driver development by creating an account on GitHub.
👏 2
Avatar
litのテストケースでよく使われてる -### って何の機能ですか
Avatar
見たことなかった
Avatar
clangにはそのオプションがあるみたいですね。 $ clang -help OVERVIEW: clang LLVM compiler USAGE: clang [options] file... OPTIONS: -### Print (but do not run) the commands to run for this compilation
Avatar
clang由来のオプションだったんですね
1:32 AM
swiftcのヘルプには出てこないけどテストケースを見るにswiftcにも同じオプションが実装されてるのか
Avatar
LITもclangもLLVMプロジェクトだから由来は同時そう
Avatar
検索しにくい名前で非常に困ってた
1:34 AM
後学のために聞きたいんですが、 @norio_nomura さんはこれどうやって見つけられました?
Avatar
ローカルのリポジトリをVSCodeで検索しました。
Avatar
なるほど、clangの方は関係ないやと思って全く見てなかった
Avatar
あ、swift/utils/update-checkoutで取得できるリポジトリ達を置くディレクトリ全体で検索するのがポイントですかね。 (edited)
😮 1
1:49 AM
そういえば、swift/utils/update-checkoutはLLVM monorepo transitionを自動で処理してくれるのかな? https://forums.swift.org/t/llvm-monorepo-transition-happening-on-thursday-the-17th-of-october/29674
Hi, I would like to provide an update to the monorepo transition posts (https://forums.swift.org/t/llvm-monorepo-transition/25689 and https://forums.swift.org/t/llvm-monorepo-transition-update/27079) where I announced that Apple is working on the LLVM project monorepo transi...
Avatar
それ気になってるけどそもそもなんもわかってない
Avatar
手作業でllvm-projectをクローンしてclang, clang-tools-extra, compiler-rt, libcxx, lldb, llvmを削除してからswift/utils/update-checkout --scheme masterを実行したら、削除したモノ達と同名のシンボリックリンク達が作られた。 (edited)
Avatar
omochimetaru 11/6/2019 1:04 AM
最近[Requestify]ってついた改修が複数発生してるけど
1:06 AM
どういう目的なのか気になってる いまのところの予想 1. ただの内部的なリファクタリング 2. これをやらないと循環するケースとかでバグが取り切れない 3. LSPみたいなプロセス跨いでインテグレートするための基盤
1:07 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 11/6/2019 1:08 AM
Requestifyってそもそもどういう意味なんですか?
Avatar
omochimetaru 11/6/2019 1:10 AM
よくわかってないですがなんかリクエストオブジェクト作って(非同期で?)結果が戻るような、 コンパイラの中の機能をAPI的な感じにしてるような箇所があるので、 そういう風な感じにするやつだろうか?
Avatar
Kishikawa Katsumi 11/6/2019 1:10 AM
あ、なるほど。Requestifyに変えるって意味か。
Avatar
omochimetaru 11/6/2019 1:11 AM
Note that I've called out a couple of suspicious places where we are requesting abstract metadata for superclasses but probably need to be requesting something more complete.
Avatar
Kishikawa Katsumi 11/6/2019 1:11 AM
Requestifyプロジェクトみたいなのがありそう。ってこれか。
Avatar
omochimetaru 11/6/2019 1:11 AM
型がなんかホゲレスポンスとかに変わってる
Avatar
Christopher Rogers 11/6/2019 1:12 AM
確か結果のキャッシュをどうするかとかを定義する型です
👌 1
1:13 AM
計算中にまたリクエストがあった場合にどうするか、とか
Avatar
非同期ではないです。ASTを一通りなめて全部をタイプチェックするのではなく、必要になったときに必要な分だけタイプチェックする等、lazyに評価をしていきましょうという取り組みです。ついでにリクエストに対する結果はキャッシュされるので、無駄が起こらないはずというのと、
1:14 AM
あと、循環ケースが自動で検出される仕組みになっているので、デバッグが楽になる。
Avatar
omochimetaru 11/6/2019 1:14 AM
おおー
1:16 AM
その辺の結果のキャッシュのロジックを共通化してるんですかね
Avatar
Christopher Rogers 11/6/2019 1:16 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 11/6/2019 1:17 AM
お、文書あった 読みます
Avatar
ですね。cache と circular dependency 検出が自動で手に入るので嬉しい。
Avatar
omochimetaru 11/6/2019 1:17 AM
なるほど〜ありがとうございます🙏
Avatar
Kishikawa Katsumi 11/6/2019 1:18 AM
fine-grained tracking and visualization of dependenciesなるほどー
Avatar
ちなみに rust にも Querify という同じような取り組みがあります。 https://github.com/rust-lang/rust/issues/47660
😃 1
Avatar
omochimetaru 11/6/2019 1:36 AM
ほお!Rustを真似したのかな〜とか想像してました、同時期に同じようなことしてるのはなんか他の言語で先行事例があるんですか?
Avatar
どうなんでしょうねー。世界を大きなクエリーの依存グラフとしてモデル化するっていうのは最近はやっているのは事実っぽいんですがー。
Avatar
omochimetaru 11/6/2019 1:40 AM
ほお〜
1:45 AM
Prior art Rust's compiler went through a similar transformation to support demand-driven compilation. We should learn from their experience!
Avatar
まんまだw
Avatar
omochimetaru 11/6/2019 1:45 AM
Rustの話はかいてあった。
Avatar
Christopher Rogers 11/6/2019 2:04 AM
Graydon Hoare (Rust の父的な人)が Swift に導入しました
Avatar
omochimetaru 11/6/2019 2:06 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
2:06 AM
あ〜このアイコンちょいちょい見かけてた
2:06 AM
Rustの偉い人がAppleに移ってたんですね
Avatar
Christopher Rogers 11/6/2019 2:07 AM
コンサルタントだったんじゃないかと思います
2:09 AM
昔Request化のリファクタリングに挑戦してみたかったんです。なぜかw
Avatar
omochimetaru 11/6/2019 2:11 AM
Christopherさんが? > 挑戦してみたかった
Avatar
Christopher Rogers 11/6/2019 2:15 AM
はい
2:15 AM
Graydon 氏じゃなくてw (edited)
Avatar
omochimetaru 11/6/2019 2:16 AM
それで詳しいんですね
Avatar
Hi all, I'm having problems building the compiler from the master branch. I started running ./swift/utils/update-checkout --clone-with-ssh, which worked fine. Then tried building using ./utils/build-script --xcode --release-debuginfo --force-optimized-typechecker --swift-...
10:09 AM
↑この問題でmasterがビルドできないが、
10:10 AM
最寄りのstable snapshotの5.1.2は、
10:10 AM
update-checkoutはllvm monorepo transition適用済みなのに対して、
10:10 AM
build-scriptは適用前になっていて
10:10 AM
--cloneを付けてもswift-source/llvmが落ちてこないが、ビルドではそれを探すので死んでる
10:11 AM
今5.1.1を試しているところ。
Avatar
手元のクローンだと、llvmはllvm-project/llvmへのシンボリックリンクになってる。
Avatar
llvmを削除してから、 update-checkout --clone しても、生成されなくないですか?
10:22 AM
過去のコミットをベースに、llvmを置いてある状態からだと、移行はできるようなものかも。
Avatar
llvm-projectを手動でクローンしてllvmとか削除した後で、utils/update-checkout --scheme masterしたらシンボリックリンクが作られたと記憶。 (edited)
Avatar
ふむふむ
Avatar
下記シンボリックリンクが作られてる。 ./clang -> /Users/norio/github/swift-dev/llvm-project/clang ./clang-tools-extra -> /Users/norio/github/swift-dev/llvm-project/clang-tools-extra ./compiler-rt -> /Users/norio/github/swift-dev/llvm-project/compiler-rt ./libcxx -> /Users/norio/github/swift-dev/llvm-project/libcxx ./lldb -> /Users/norio/github/swift-dev/llvm-project/lldb ./llvm -> /Users/norio/github/swift-dev/llvm-project/llvm
Avatar
うーん、作られなかったのはなんだろうなあ
10:30 AM
今のmasterだともうできない
Avatar
そうなんだ。
Avatar
monorepo transitionが完了している感じがします(その先で↑のissueを踏むのでよくわからないが
Avatar
めっちゃ最近だった
10:33 AM
うげー5.1.1もとおらね〜〜〜
Avatar
ninjaでもだめですか?
Avatar
In file included from /Users/omochi/work/swift-source/swift/stdlib/public/runtime/MetadataLookup.cpp:34: /Users/omochi/work/swift-source/llvm/include/llvm/ADT/PointerUnion.h:162:1: error: too few template parameters in template redeclaration template <typename... PTs> ^~~~~~
10:34 AM
ninjaは試してないです
10:35 AM
あれ?llvmのcheckoutが5.1.1 snapshotになってないな
Avatar
5.1.1のswift/utils/update_checkout/update_checkout/update_checkout.pyはsymlink作る処理入ってない。 (edited)
10:40 AM
5.1.2は入ってる。
Avatar
symlinkの処理って、
10:41 AM
どうやって叩くんです?
10:41 AM
--scheme masterだとその処理に行く前に、
10:41 AM
自分自身がmasterになっちゃいますよね
Avatar
swift-5.1.2-RELEASEをチェックアウトすれば良いのでは?
Avatar
--tag swift-5.1.2-RELEASE
Avatar
(cd swift; git checkout swift-5.1.2-RELEASE)
Avatar
ん、そのあと、
10:46 AM
update-checkoutをどういうオプションで発火するのかです
10:46 AM
update-checkoutがsymlinkの処理に行く前に、update-checkout自身が自身を含むswift repositoryを
10:46 AM
更新したりすると
10:46 AM
てか今回に限らないんですが、
10:47 AM
update-checkoutの働きがバージョン間で変わってる時に
10:47 AM
update-checkout自身がupdate-checkoutで更新される挙動がどういうポリシーなのかよくわからない
10:48 AM
一度発火してるupdate-checkoutはその時のソースのままpythonプロセスに載ってるんだろうか?自己を再度発火したりはしていない?
Avatar
その後はswift/utils/update-checkout --tag swift-5.1.2-RELEASEで良いのでは。
10:49 AM
swiftリポジトリ自体は変わらないし。
Avatar
一回目のgit checkoutでupdate-checkoutのバージョンを選択しつつ、 update-checkout自体には--tagを与えてバージョン変動を防止、か。
Avatar
一度symlinkが作られた後は、5.1.1とかには戻せない様な気もする。
Avatar
なぜswift-5.1.2-RELEASEswift-5.1-branchからではなくswift-5.1-branch-08-28-2019から作られたのだろう。
Avatar
そのへんてこなブランチなんですか・・・?
Avatar
appleがXcodeベータに入れるswiftをビルドする時に、一時的に作るブランチかな?
Avatar
ああ〜。
Avatar
swift-5.1-branchに入ってて、swift-5.1.2-RELEASEに入ってない変更たくさんある。 https://github.com/apple/swift/compare/swift-5.1.2-RELEASE...swift-5.1-branch
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
お、差分の中にOne-way constraintsがある、これ気になっている(まだわかってない
11:36 AM
話題のapi-checkerもか
11:36 AM
5.1.2は5.1.1の安定化リリースで、5.2的な機能追加は5.1ブランチでやってる感じ?
Avatar
いや、それはmasterブランチの役割じゃないの?
Avatar
https://github.com/apple/swift/compare/master...swift-5.1-branch 5.1に入ってて、masterに入ってないコミット
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
11:39 AM
[Constraint solver] Introduce one-way constraints. … 75f88ca 、どっちにも表示されてるな。
11:39 AM
え〜
11:40 AM
いまmasterと5.1結構乖離してるんですね、なにこれー
Avatar
いや、それはそういうものでしょ。
Avatar
新機能はとりあえずmasterに入っていくものかと思って。
Avatar
ああ、5.1にしか入っていないってことですか、ふむ。
Avatar
Introduce the notion of &quot;one-way&quot; binding constraints of the form $T0 one-way bind to $T1 which treats the type variables $T0 and $T1 as independent up until the point where $...
11:48 AM
同じコミットの3c69f6a(ハッシュ違い)がある
11:48 AM
masterブランチ向けと5.1ブランチ向けに
11:48 AM
同じコミットをそれぞれrebaseして出してるのかも
Avatar
Cherry-pickって書いてある。 https://github.com/apple/swift/pull/26661
Cherry-pick the work to enable one-way constraints for function builders to the 5.1 branch as an experiment. Implements rdar://problem/50150793.
Avatar
Introduce the notion of &quot;one-way&quot; binding constraints of the form $T0 one-way bind to $T1 which treats the type variables $T0 and $T1 as independent up until the point where $T...
11:50 AM
master向けがこっちで、5.1ブランチ向けに[5.1]ってつけて別PRなんですね。
Avatar
よくあるパターンですね。
Avatar
そうすると、5.1.2に入ってないものが5.1に入ってるのは特に変じゃなくて、5.1.3で出ることが期待できるし、
11:53 AM
同じようにmasterにも入ってるから5.2はそのまま全部入りになると
11:53 AM
普通か。
11:53 AM
cherry-pickってマージコンフリクト考慮されるんでしたっけ
11:53 AM
それとも、5.1からmasterへのマージはやらないのかな。
11:54 AM
常に両方に出してればそれでいいけど、うっかり5.1の方だけで重要な作業をしてしまう可能性はないんかな、気をつけるのかな。
Avatar
Cherry-pickされてると、ブランチ間のコミットログの差分には出るけど、実際のdiffには出てこない。
Avatar
ならまあ見てチェックできるか。
Avatar
swift-5.1-branchとswift-5.1.2-RELEASEの違いの場合、チェリーピックとか関係ないから、swift-5.1.3-RELEASEがswift-5.1-branchを元に作られると、かなり変更が大きくなるかな。
Avatar
なるほど
Avatar
swift-5.1-RELEASEとswift-5.1.1-RELEASEの違いが少なすぎてびっくりした。 https://github.com/apple/swift/compare/swift-5.1-RELEASE...swift-5.1.1-RELEASE
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
バージョンしか変わってないですね
12:04 PM
ん〜これはどういうことなんだ
12:04 PM
一応バージョンあげといたほうが一緒に出荷されたXcodeのリビジョンとか絞りやすくていいねみたいな感じかしら
Avatar
swift-5.1.2-RELEASEタグ、付け直されてる… https://github.com/apple/swift/commits/swift-5.1.2-RELEASE
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
12:59 AM
While compiling Swift 5.1.2 on Linux I have found the following issues and would like some clarification on whether this is a problem and if a bug should be filed. The swift-5.1-branch which Swift 5.1.2 should be built from is still versioned at 5.1.1 The tag swift-5.1.2-RE...
1:01 AM
バイナリも更新されたぽい?てた。 (edited)
Avatar
Kishikawa Katsumi 12/1/2019 11:38 PM
付け直しとは無茶するなあ
Avatar
swift-5.1.2-RELEASEまでと違い、swift-5.1.3-RELEASEは ちゃんとswift-5.1-branchから作られてた。 https://github.com/apple/swift/compare/swift-5.1-branch...swift-5.1.3-RELEASE
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
swiftc初心者です。Swift 5かなにか最近、witness tableの挙動かわりましたか...?
7:38 AM
あ、勘違いだった。変わってなかった。
Avatar
swiftc コマンドにソースファイルを引数として与える場合に、 トップレベルに実行文が書けるモードになるのって、 「引数が1ファイルの場合」または「ファイル名がmain.swift」 っぽく読めるんですけど、そうなん? (edited)
7:57 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
7:57 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
7:58 AM
「これがメインだよ」ってオプションが無いのが気持ち悪い
Avatar
あ、なんかそれは思った事ある
Avatar
やはりそうなのか
Avatar
omochimetaru 1/28/2020 9:59 AM
@Yuta Saito SwiftRT-ELF.cppを読んでいたんだけどさ
10:00 AM
Mach-Oの場合は getsectiondata っていうAPIがあるからそれを使うけれど
10:01 AM
ELFの場合はそのようなものがないので・・・
10:02 AM
まず、LLVM側で、objファイルを作る時にセクションの先頭と末尾に __start_<section>__stop_<section> というシンボルを生成する。
10:02 AM
そのように思った根拠↓ https://reviews.llvm.org/D10901
10:03 AM
次にランタイム側で __attribute__((__constructor__)) を付けた関数を定義しておくことで、 イメージがロードされた時にこれが呼び出され・・・ (edited)
Avatar
そうそう
Avatar
#define DECLARE_SWIFT_SECTION(name) \ __asm__("\t.section " #name ",\"a\"\n"); \ __attribute__((__visibility__("hidden"),__aligned__(1))) extern const char __start_##name; \ __attribute__((__visibility__("hidden"),__aligned__(1))) extern const char __stop_##name; extern "C" { DECLARE_SWIFT_SECTION(swift5_protocols)
10:03 AM
このように書いておくことで、 asm文を使ってセクション名を指定しつつ、 extern宣言で、LLVMが埋め込んでおいた __start_section__stop_section のシンボルをリンクさせて・・・ (edited)
10:04 AM
#define SWIFT_SECTION_RANGE(name) \ { reinterpret_cast<uintptr_t>(&__start_##name), \ static_cast<uintptr_t>(&__stop_##name - &__start_##name) } ... SWIFT_SECTION_RANGE(swift5_protocols),
10:05 AM
このようにすることでそのstartシンボルのアドレスとstopシンボルのアドレスから、 イメージ中の、セクションデータのメモリアドレスとサイズを得る
10:05 AM
って仕掛けって理解でいいのかな?
Avatar
そうですね。
10:05 AM
細かい話だと、 上の インラインアセンブリはセクションを指定するためのものではなくて、
10:07 AM
IRGenが吐くセクションが空のときでもセクションが常にオブジェクトファイルに含まれるようにするためのやつです
10:08 AM
あと __start __stop はLLVMが出力するんじゃなくて lldが全てのオブジェクトファイルをリンクするときに作ります
Avatar
あ〜れ?あ、じゃあ、これは、
10:09 AM
SwiftRT-ELF.cpp は、それぞれのSwift dylib自体に取り込まれて
10:09 AM
自分自身の中にあるstartとstopを探して自分の中身をグローバルに登録するための
10:09 AM
初期化処理を埋め込んでるのか。
10:10 AM
なんとなく別のオブジェクトになってるイメージがあった。
10:11 AM
lldが全てのオブジェクトファイルをリンクするとき
executableかdylibになる時?
Avatar
初期化処理自体はそれぞれのdylibに対して行われるけど結局1つのグローバル変数にprotocol conformanceとかが登録されるはず
Avatar
うん、そこはそうだった。
10:12 AM
namespace { static const swift::MetadataSections *registered = nullptr; void record(const swift::MetadataSections *sections) { if (registered == nullptr) { registered = sections; sections->next = sections->prev = sections; } else { registered->prev->next = sections; sections->next = registered; sections->prev = registered->prev; registered->prev = sections; } } } これでリンクリストに追加してた。 (edited)
Avatar
executableかdylibになる時?
dylibの場合はそうです
10:13 AM
それです
Avatar
ただこの swift::MetadataSections * swift::(anon ns)::registered
10:13 AM
どうやって1個になってんだ
10:14 AM
あー SwiftRT-ELF.cpp から作られるstatic libraryは個別にリンクされるけど、 ImageInspectionELF.cppからの成果物は本体実行ファイルだけにリンクされるのか?
Avatar
えーとそこは別のdylibになってるはず
10:14 AM
名前なんだったかな…
Avatar
たしかにビルド単位が別だな
10:15 AM
SwiftRT-ELFはswiftImageRegistrationObjectELFで
Avatar
libswiftImageInspectionShared.dylib (edited)
Avatar
ImageInspectionELFはswiftRuntime-macosだ
Avatar
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
おーなるほど > # These two libraries are only used with the static swiftcore
10:18 AM
two librariesってなんだ? L158のadd_swift_target_library(swiftImageInspectionSharedObjectかな
10:18 AM
そっか、libSwiftCore.dylibに含まれてれば、アプリ実行ファイルはそれをdynamic loadして動くんだから
10:19 AM
グローバル変数としてはSwiftアプリプロセスに1個になるか。
10:19 AM
てかよく考えたらランタイム関数がそこに入ってて、そのグローバルを触るわけだからそれで自然だな。
Avatar
結構static executableと差分があるんですよねー
Avatar
この辺の成果物を自分でハックして実行時に引っ張れないか考えてるんだけど
10:20 AM
ランタイム側の登録されたデータ構造は、大体、 匿名namespaceに入っててシンボルが取れない
10:20 AM
あと、今話してわかったけど、ELFの場合は、 __attribute__((__visibility__("hidden"),__aligned__(1))) extern const char __start_##name;
10:21 AM
このスタートシンボルが visibility hidden ってことは
10:21 AM
外のobjectからリンクできない・・・?
10:21 AM
swift_image_constructor は同じobjectの中だからこれが見えて、スタートシンボルが取れて、その場でグローバルに登録しちゃうけど
10:21 AM
外側から後から同じことができないよね。
Avatar
あー、そうか、自分で作ったオブジェクトファイルのstart, stopしか取れないのか
10:23 AM
なるほど
10:23 AM
こういうことさせないために匿名namespaceになってるのでは…
Avatar
visibility hiddenだし、リンカーがリロケートした後は、消えてるないし、シンボルテーブルとかで公開していないんじゃないか
10:23 AM
そう、2段階あって
10:24 AM
個別のdylibの中のセクションデータを読み取るステージ(これはELFとMachで実現方法が異なる
10:24 AM
その後、共通のランタイムライブラリの中のグローバル変数に登録するステージ こっちは型付けされててコードが共通
10:25 AM
だけど、前者についてはMachはgetsectiondataでできそうだけどELFはこのような都合のために無理そう?
10:25 AM
後者についてはC++の文法的に隠れてるのでコンパイル後のシンボル名もわからなそう。(てかstaticだからこれもまたエントリが無いかも
10:26 AM
させないために匿名namespaceになってる
はい、まあ・・・。
Avatar
実行ファイルにread権限が付いてれば実行時にロードされるバイナリとは別にセクションをスキャンして…
Avatar
それは、ファイルシステム側にある実行ファイルそのものを読み取るってこと?
Avatar
そうです
10:27 AM
あーでもdylibを追っかけないといけないのか
Avatar
情報は取れそうだけど、プロセス上のメモリアドレスはわからないよね
10:28 AM
あーそうだね、ロードされるdylibのパスを知るのはもっと難しそう。
10:28 AM
うーむ、こういうのって、一種のセキュリティとしてこのように考えて作られてるのかな。
10:28 AM
同じプロセス空間に自分のコードが注入できる状況にも関わらず手も足も出ないぞ。
Avatar
なんかどうにでもなる気がするんだけどなぁ
Avatar
でもなるとしたら、このスタートシンボルのテクが、いらんはずだよね。
Avatar
とりあえず理解は進んだ、ありがとう
Avatar
僕もちょっと考えてみます
10:44 AM
要は定義された参照可能な全てのプロトコルを洗い出したいんですよね?
Avatar
そうです
10:45 AM
あとマングルされてない名前も取り出したい(これは残ってるかどうかわかってないけど
10:46 AM
最終的に作りたいもの func protocol(moduleName: String, name: String) -> PrtDtor (edited)
Avatar
そうか、ProtocolDescriptorのシンボルはコンパイル時に決定できるからランタイムライブラリにそれを動的に取得するようなAPIが無いのか
Avatar
そうなんですよ
10:49 AM
直接ProtocolDescriptorがバイナリに書き下されてる
10:50 AM
conformanceは動的に引っ張れるけど、それに与えるdescが引っ張れない。 マングル名がわかればdlsymで取れるけど。
Avatar
あれ、でも今ちょっと確認したらlldbでstart, stopのシンボル見えますね (edited)
11:21 AM
(lldb) image lookup -s __stop_swift5_protocols 1 symbols match '__stop_swift5_protocols' in /home/katei/swift-work/reloc/link-elf/main: Address: main[0x0000000000001a60] (main.PT_LOAD[0].swift5_protocols + 0) Summary: main.PT_LOAD[0].swift5_protocols + 0 1 symbols match '__stop_swift5_protocols' in /home/katei/swift-source/build/Ninja-DebugAssert/swift-linux-x86_64/lib/swift/linux/x86_64/libswiftGlibc.so: Address: libswiftGlibc.so[0x0000000000010815] (libswiftGlibc.so.PT_LOAD[0].swift5_protocols + 0) Summary: 1 symbols match '__stop_swift5_protocols' in /home/katei/swift-source/build/Ninja-DebugAssert/swift-linux-x86_64/lib/swift/linux/x86_64/libswiftCore.so: Address: libswiftCore.so[0x0000000000986300] (libswiftCore.so.PT_LOAD[1].swift5_protocols + 428) Summary: libswiftCore.so.PT_LOAD[1].swift5_protocols + 428 1 symbols match '__stop_swift5_protocols' in /home/katei/swift-source/build/Ninja-DebugAssert/swift-linux-x86_64/lib/swift/linux/x86_64/libswiftSwiftOnoneSupport.so: Address: libswiftSwiftOnoneSupport.so[0x00000000000009ac] (libswiftSwiftOnoneSupport.so.PT_LOAD[0].swift5_protocols + 0) Summary:
11:21 AM
こんな感じ
11:22 AM
でも相変わらずlinuxでdlsymが動かない… (edited)
11:41 AM
うーんnullptrが返ってくる
11:41 AM
dlsymの使い方が間違ってるのか?
Avatar
omochimetaru 1/28/2020 1:15 PM
dlsymとLLDBでは内部でやってることが違うとか?
Avatar
先にdlopenしないといけない気がする
Avatar
omochimetaru 1/28/2020 1:23 PM
5行目でやってるよ
1:25 PM
DockerじゃないLinuxお試し環境ほしいなあ
1:26 PM
AWSの安いやつだとコンパイラのビルド終わるまえにターボチケット切れるんだよね
Avatar
やってたわ
Avatar
omochimetaru 1/28/2020 1:35 PM
dlopenしないでdlsym(DYLD_DEFAULT, ...)って使い方もあるけどね
Avatar
そっちだとXcodeで動かないことがしばしばあるんだよね
Avatar
それって実行してるやつ自信を指すみたいなやつじゃなかったでしたっけ
Avatar
omochimetaru 1/28/2020 1:36 PM
うん。今回はmainが別バイナリだからダメ
1:37 PM
Xcodeの件はわからん。
Avatar
docker上でやってるのがまずいのかなぁ
1:38 PM
lldbに限らずnmとかでも普通にシンボル見えるんですよね
Avatar
omochimetaru 1/28/2020 1:39 PM
なるほど・・・
1:41 PM
dlsymをソースからデバッグビルドしてトレースすればわかりそう
1:41 PM
Linuxならソース確実にあるから。
1:43 PM
でもXcodeの方も気になるな。
Avatar
Xcodeの方はクローズドなdyldだからさらに面倒くさそう…
1:47 PM
dyld-655.1.1
1:49 PM
あった
1:50 PM
dyldAPIs.cpp
1:51 PM
DYLD_PRINT_APIS
1:51 PM
この環境変数があるとログが出そう。
Avatar
swift5_protocols 達は__visibility__("hidden")になってるね。 https://github.com/apple/swift/blob/master/stdlib/public/runtime/SwiftRT-ELF.cpp#L21-L28 (edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
norio_nomura 1/29/2020 1:28 AM
terminal.sh-session root@5b642bfaddfb:~# objdump -t /usr/lib/swift/linux/libswiftCore.so|grep swift5_protocols 0000000000518b08 l O swift5_protocols 00000000000001a8 l_protocols 0000000000518b08 l swift5_protocols 0000000000000000 .hidden __start_swift5_protocols 0000000000518cb0 l swift5_protocols 0000000000000000 .hidden __stop_swift5_protocols (edited)
Avatar
omochimetaru 1/29/2020 1:32 AM
hiddenって付いてるとdlsymは返さないってだけかなあ
Avatar
norio_nomura 1/29/2020 1:55 AM
objdumpで見えるシンボルにいくつかdlsymを試してみると、どうやらローカルlになってるものは取得出来ないらしい。 terminal.sh-session 0000000000518b08 l swift5_protocols 0000000000000000 .hidden __start_swift5_protocols ^ ローカルを意味するらしい。
Avatar
omochimetaru 1/29/2020 1:56 AM
いまスマホで見てて数字の1かとおもたw なるほどローカルのエル
Avatar
norio_nomura 1/29/2020 1:57 AM
terminal.sh-session root@5b642bfaddfb:~# objdump -t /usr/lib/swift/linux/libswiftCore.so|grep "swift_copyPOD" 00000000003c7b00 g F .text 0000000000000016 .protected swift_copyPOD (edited)
Avatar
omochimetaru 1/29/2020 1:58 AM
お、G
Avatar
norio_nomura 1/29/2020 1:58 AM
@swift-5.1.5 import Glibc let s = dlsym(nil, "swift_copyPOD") print(s!)
Avatar
0x00007f440c511b00
Avatar
norio_nomura 1/29/2020 1:58 AM
gになってればdlsymで取得できる。
2:00 AM
objdump -tの出力詳細は https://linuxcommand.net/objdump/#_-t を参考にした。
管理人
objdumpコマンドはオブジェクトファイルの内容を表示できるコマンドになります。objdumpコマンドは実行ファイルやオブジェクトファイルを調査するのに便利なコマンドです。objdumpコマンドでアーカイブファ...
Avatar
omochimetaru 1/29/2020 2:07 AM
まあそうかあ 動的リンクの機能に関するライブラリなのだから 返ってこないのがよろしいか。
Avatar
フォーラムでsccacheっていうキャッシュシステムを教えてもらって試してみました https://github.com/mozilla/sccache
sccache is ccache with cloud storage. Contribute to mozilla/sccache development by creating an account on GitHub.
12:02 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
12:04 AM
ビルドシステムを弄る時、毎回LLVMをフルビルドしないといけなかったんですけど、これのお陰でキャッシュありの状態だと3分くらいでビルド終わるようになりました。
😯 1
Avatar
ちなみにキャッシュなしでsccacheなしだと180分、sccacheで初回キャッシュを作りながらビルドすると200分でした。
Avatar
面白い
Avatar
リモートにキャッシュサーバーを用意して分散キャッシュもできるみたいです
Avatar
omochimetaru 2/21/2020 4:05 PM
// expected-error {{}} を実行結果から自動で生成するツールってないかしら
Avatar
-verify-apply-fixes というのがあるのですが、現在のところエラー文言の修正や fix-it の不一致の修正くらいしかできないです。 $ cat /tmp/t.swift guard false { // expected-error {{...}} {{none}} fatalError() } $ swift -frontend -typecheck -verify-apply-fixes /tmp/t.swift -sdk $(xcrun -show-sdk-path -sdk macosx) /tmp/t.swift:1:35: error: incorrect message found guard false { // expected-error {{...}} {{none}} ^~~ expected 'else' after 'guard' condition $ cat /tmp/t.swift guard false { // expected-error {{expected 'else' after 'guard' condition}} {{none}} fatalError() } $ swift -frontend -typecheck -verify-apply-fixes /tmp/t.swift -sdk $(xcrun -show-sdk-path -sdk macosx) /tmp/t.swift:1:77: error: expected no fix-its; actual fix-it seen: {{12-12=else }} guard false { // expected-error {{expected 'else' after 'guard' condition}} {{none}} ^~~~~~~ {{12-12=else }} $ cat /tmp/t.swift guard false { // expected-error {{expected 'else' after 'guard' condition}} {{12-12=else }}} fatalError() } つまりは -verify モードで出る fix-it をオリジナルファイルに適用するというモードです。
7:10 PM
なので、 $ cat /tmp/t.swift guard false { fatalError() } $ swift -frontend -typecheck -verify /tmp/t.swift -sdk $(xcrun -show-sdk-path -sdk macosx) /tmp/t.swift:1:13: error: unexpected error produced: expected 'else' after 'guard' condition guard false { ^ みたいなときに、 // expected-error {{expected 'else' after 'guard' condition}} を挿入するようなfix-it が出れば良いのですが、現状そうなってないです 🙂
7:14 PM
ちなみに -verify/-verify-apply-fixes の実装はここにあります https://github.com/apple/swift/blob/master/lib/Frontend/DiagnosticVerifier.cpp
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 2/21/2020 7:16 PM
おおーありがとうございます メタな話になってて面白い
7:18 PM
文言差し替えだけでも手でやるより便利そう
Avatar
omochimetaru 3/4/2020 5:33 AM
リファクタリングでスコープのネスト段数が変わってしまった時に、 diffがその範囲でガッツリ発生してしまうのってうまい回避方法ってありますか? git自体には-M とかはあるけど、 GitHubでの表示では隠し設定だし、 XcodeのGitサポートでは対応無さそうだし。
Avatar
うちのコードレビューでは無視されるよ
5:34 AM
それ以外の場所では自助努力によって回避されている
Avatar
omochimetaru 3/4/2020 5:35 AM
うちのコードレビューでは無視される
GitHub/Xcode以外のツールでレビューしてるってことですか?
Avatar
そうです
Avatar
omochimetaru 3/4/2020 5:36 AM
自助努力によって回避
これは、どっちだ、ネスト変化を避ける?ネスト無視設定を頑張る?
Avatar
無視する設定をdiffをみたいひとが頑張る
5:37 AM
でもまあほとんどの場合 code review をみに行っちゃうから
5:37 AM
それで満足する感じ
Avatar
omochimetaru 3/4/2020 5:38 AM
なるほど。
Avatar
「これはネストの変更があるから、空白無視してね」って書いてレビューだすことがおおいですね
Avatar
なんかコードレビューだいぶ賢くてファイルの移動とか複製とか適宜認識してこれはあれをコピーしてここを変えただけとかそういう余計な事?をいろいろしてくるので
5:44 AM
インデントの変更とかもガンガン排除されていく感じ
5:44 AM
余計なおせわと言えば余計なおせわ (edited)
Avatar
omochimetaru 3/4/2020 5:44 AM
あ〜、レビュー自体の負担を減らすために一言触れるのは良いですね。 後々にblame見たときのことを気にしていました。
Avatar
blameはつらい
Avatar
omochimetaru 3/4/2020 5:46 AM
コード読む時に結構行単位のblameからコミットに飛んで、その行の当時の意図を探ったりしているから縞模様がなくなっちゃうのは気になる
5:47 AM
でもまあ変更自体は余計な事考えずにきれいに作って、見る側でネスト無視するのがやっぱり原則か〜
Avatar
blameはしんどいけど
5:47 AM
歴史を紐解く作業はいづれにせよ必要で、
5:48 AM
blameがきれいだとそれが楽になるかっていったらまあどうでしょうね多少はねっていう感じだと思ってる
5:48 AM
それよりもmasterが将来のためにあるほうがよいと思う
5:49 AM
プロジェクトによるけれど。
Avatar
omochimetaru 3/4/2020 5:50 AM
masterが将来のためにあるほうがよい
確かに
Avatar
Kishikawa Katsumi 3/4/2020 3:35 PM
happy 2
Avatar
omochimetaru 3/4/2020 3:35 PM
おおお
Avatar
GitHub?
Avatar
Kishikawa Katsumi 3/4/2020 3:36 PM
^ SourceKit-LSPを試していて、こういうののちょっとしたPoCができた。 (まだ全然ちゃんと動かないけど。これはキセキの1枚)
3:36 PM
GitHubです。Safari拡張でLSPと通信して、クローンしなくてもWebでコードリーディングが捗るかも、、、みたいな。
Avatar
omochimetaru 3/4/2020 3:37 PM
手元でハックしているのか
Avatar
なるほど
3:38 PM
GitHub、コードサーチ程度には便利だけどそれ以上はローカルに持ってきてだから
Avatar
Kishikawa Katsumi 3/4/2020 3:38 PM
GitHubはCode Navigation?(そんな感じの名前、宣言元にジャンプとかできる)というのがいくつかの言語ではデフォルトで使えるっぽいんですけど、それと同じようなものがSafari 拡張でできるかなと。 (edited)
Avatar
こういうの発展すると助かる
😊 1
3:39 PM
言語の実装もGitHub知ってるんだからなんならOSの実装も知ってるんだから (edited)
3:39 PM
それくらいまでインテグレートできそうなんだけどな。
3:40 PM
ソースコード→処理系→システムコール→カーネル→ハードウェア
3:41 PM
って辿れたら胸熱
Avatar
Kishikawa Katsumi 3/4/2020 3:42 PM
確かに、言語やプラットフォームをまたいで追いかけられるとめっちゃ便利。
Avatar
omochimetaru 3/4/2020 3:42 PM
それはリポジトリをまたいで飛ぶって意味ですか?
Avatar
うん
Avatar
omochimetaru 3/4/2020 3:42 PM
なるほど
Avatar
ライブラリにとべるだけで便利すぎる
Avatar
Kishikawa Katsumi 3/4/2020 3:43 PM
JSとかはGitHub標準のやつでも定義元のリポジトリにいけないかな。さすがに無理か。
Avatar
依存関係といて取りに行って、、とかメンドイ
Avatar
Kishikawa Katsumi 3/4/2020 3:44 PM
OctoLinkerってChrome拡張があってそれを入れるとimport文から別リポジトリに飛べたりする。
3:44 PM
^ JSとかの話ですけど。
Avatar
なるほど
Avatar
Kishikawa Katsumi 3/4/2020 3:48 PM
作ってていまだに知らなかったことがあって、 xcrun はSandboxが有効のアプリからは実行できない。
Avatar
omochimetaru 3/4/2020 3:49 PM
ほお
Avatar
なんかswiftのreplもそうだけど、初回起動時に特別な許可を求めますよね (edited)
3:50 PM
デバッグ用のエンタイトルメントに入ってそうな何か (edited)
Avatar
Kishikawa Katsumi 3/4/2020 3:51 PM
なんかxcrunはどうやってもダメそうなんですよね。 SourceKit-LSPはxcrunを使ってるからContaining AppはSandBoxを外して、ExtensionはSandBoxあり(そうしないとExtensionとしてSafari側で有効にできない)、ExtensionからContaining AppにXPCでやり取りする、みたいにした。
Avatar
メンドイ
Avatar
omochimetaru 3/4/2020 3:52 PM
なるほど。
3:52 PM
セキュリティモデル的に正しそうな雰囲気はする。
Avatar
Kishikawa Katsumi 3/4/2020 3:53 PM
xcrunは基本的にパスを探すだけだと思うんですけど何で禁止なのかわからないんですよねえ。
Avatar
omochimetaru 3/4/2020 3:54 PM
xcrunのメインの機能は実行するほうだからじゃないですか?
3:54 PM
$ xcrun -sdk iphoneos lipo とか。
Avatar
Kishikawa Katsumi 3/4/2020 3:56 PM
でもxcrun以下の個別のコマンドはたぶんSandBoxでも実行できると思うんですよね。
Avatar
omochimetaru 3/4/2020 3:57 PM
lldbに特権が必要な気がする?
Avatar
xcrun互換の何かを作れば良い?
Avatar
Kishikawa Katsumi 3/4/2020 3:59 PM
xcrun互換の何かを作れば良い?
それはアリだと思いました。SourceKit-LSPの場合だと使われてるのはROOTSDKの場所を取ってるところだけだから、設定項目にしてそれを返すコマンドと差し替えられたらいいのかなと。
4:01 PM
swiftc関係ないけど、 Safari ExtensionでInjectできるJSはおそらくimportやrequre的なものが使えなくて、しょうがないからbrowserifyというのを使って1つのJSにまとめた。
Avatar
omochimetaru 3/4/2020 4:01 PM
僕はbrowserifyよりwebpackの方が好みです
Avatar
Kishikawa Katsumi 3/4/2020 4:02 PM
そもそもimportやrequreはNodeじゃないと使えないのかな?よくわかってない。
4:03 PM
どういう違いがあるんですか?
Avatar
omochimetaru 3/4/2020 4:03 PM
確かimportはめっちゃ新しいJSだとある?入った?ぐらいで、昔は基本的にバンドルするしかなかった
Avatar
ウェブの世界はちょっと調べていつもそっとじしちゃう
4:03 PM
来週くらいには違う名前のライブラリが出てるんだろうなあとか思うと。
Avatar
omochimetaru 3/4/2020 4:03 PM
browserifyの方が先に出たプロダクトで、nodejs向けのビルドをブラウザで動かすっていうのがコンセプトですけど
4:04 PM
webpackの方がその辺がこなれてきてから出てきたプロダクトで、 もうちょっとJSプロジェクトの配布用ビルドって観点で中立的な感じ
Avatar
Kishikawa Katsumi 3/4/2020 4:04 PM
来週くらいには違う名前のライブラリが出てるんだろうなあとか思うと。
キレッキレですね。🤣
(edited)
Avatar
webpackはcompactionとかCSSのJS化とか
Avatar
omochimetaru 3/4/2020 4:05 PM
まあ僕は両方触ったけど時間差が開いてるんで、webpackが良かった部分と、JS業界が発展した部分の差分があんまりはっきりわかってないです。
Avatar
色々入ってるポストプロセスパイプライン用で
Avatar
omochimetaru 3/4/2020 4:05 PM
そうですね、バンドル化だけじゃなくてそういうパッケージング?ビルド?パイプラインを全部見てる
Avatar
その気になれば自分で拡張してなんでもできる感がある
4:07 PM
Browsifyはつかったことないかも
Avatar
omochimetaru 3/4/2020 4:10 PM
Browserifyの頃はnodejs用とブラウザ用(bower)でパッケージセンター分けようみたいな話もありつつ nodejs用をブラウザで動かすために変換してくっつけて・・・とかだったのが、 結局webpackとか当たり前になってきて JavaScript module規格でライブラリを作ればnodeでもブラウザでも使えるってなって、 npmにまた統合された今日このごろ
4:11 PM
まあでももう組んであって動いてるならそのままでいいと思いますよ。 JS界はツールの使い方にこだわってるとめっちゃ時間食う
Avatar
Kishikawa Katsumi 3/4/2020 4:12 PM
Webの開発はめっちゃ大変ですよね。
Avatar
真理w
4:13 PM
でもこだわっちゃう
4:13 PM
たぶんパズル的な面白さがある
4:13 PM
環境にキモい制約が多いから。
Avatar
omochimetaru 3/4/2020 4:13 PM
たまに仕事で触れる程度だとやるたびに世界変わっててウケる。
4:14 PM
僕はそういうの好きなんでこだわってますけど・・・
Avatar
ツーリングたのしい
Avatar
Kishikawa Katsumi 3/4/2020 4:16 PM
node_modulesに触るときはあまり余計なことを考えないようにしています。
4:18 PM
今回も使ってるnode_moduleのインストールに別のコマンドを入れないといけなくて、npm installの中でそのコマンドを呼んでなんかしてるんですけど、全然わからなかった。
4:19 PM
npmで何かエラーになったら検索する以外のことができない。。。
Avatar
しかもエラーメッセージが役に立たない
4:20 PM
pipe brokenみたいな
😂 1
Avatar
Kishikawa Katsumi 3/4/2020 4:20 PM
キレッキレですね。
Avatar
なんか急にC++実装の深い部分が顔を出す感じが素敵
Avatar
omochimetaru 3/4/2020 4:21 PM
gemよりはいろいろうまく行きやすい印象
Avatar
rubyはわかっていればわかる
4:21 PM
わからないと地獄だと思う
Avatar
Kishikawa Katsumi 3/4/2020 4:21 PM
お、私は RubyGemsの方がまだなんとか、って感じ。
Avatar
omochimetaru 3/4/2020 4:21 PM
ネイティブライブラリの依存先のビルドが壊れたりしたときの追跡が大変
Avatar
Gemが環境変数とかで挙動変わるのがツーリングでしんどい点
4:22 PM
わかるスタンプがない
Avatar
omochimetaru 3/4/2020 4:22 PM
www
4:23 PM
絵文字リアクションは画像だしたもらえれば追加しますよ
Avatar
Kishikawa Katsumi 3/4/2020 4:24 PM
あと何だったかな。 あ、LSPが規定しているのはインターフェースとデータ構造だけで通信部分の決まりはない。
Avatar
トランスポートは好きにしてって事ですか?
Avatar
Kishikawa Katsumi 3/4/2020 4:25 PM
そういうことみたいです。
Avatar
Thrift的な
Avatar
omochimetaru 3/4/2020 4:25 PM
なるほど
Avatar
Kishikawa Katsumi 3/4/2020 4:25 PM
JSONRPCっていうからてっきりHTTPがいるんだと思ってたけど、SourceKit-LSPはパイプを使って標準入出力でやり取りする、、、口しか今のところないと思う。
Avatar
omochimetaru 3/4/2020 4:26 PM
へー スッキリしてて良いですね
Avatar
pipeをHTTPにする汎用コマンドって便利かな(curlか、それは。)
Avatar
Kishikawa Katsumi 3/4/2020 4:27 PM
たぶん便利ですね。やっぱりNSPipeで読める部分を読み出して、次を待って、ってするよりいつものReqest/Response で書けるならそれが良さそう。
Avatar
omochimetaru 3/4/2020 4:28 PM
ストリーム的なやつはないんですか?
4:28 PM
常にReq/Res?
4:29 PM
ストリーム的なやつというのはなんかしばらくしてから細切れにリアルタイムに結果が垂れ流されるようなやつとか。
Avatar
Kishikawa Katsumi 3/4/2020 4:30 PM
どうなんでしょう。over HTTPとかのはわからないですが、SourceKit-LSPはストリームを相手にしてるような感じですよ。
Avatar
omochimetaru 3/4/2020 4:30 PM
ふむ。それだと、HTTP化しづらくないですか? Websocketなら良さそう。
Avatar
Kishikawa Katsumi 3/4/2020 4:31 PM
メソッド(RESTでいうRequest)を呼んで、しばらくすると、応答が返ってきます。 それは直前のというわけじゃないからIDで区別します。
Avatar
めんどくさそう感ある
Avatar
Kishikawa Katsumi 3/4/2020 4:31 PM
それと1対1のとは別にログのレスポンスとか、通知的なものが返ってくる。
Avatar
omochimetaru 3/4/2020 4:32 PM
ログなるほど。
Avatar
Kishikawa Katsumi 3/4/2020 4:33 PM
長さによって一度に読み出せなかったりするから、結局ヘッダの情報を使ってカウントをしないといけなくて、それがやっぱりRestとかに比べると面倒ですねえ。
Avatar
omochimetaru 3/4/2020 4:35 PM
なるほど。
Avatar
Kishikawa Katsumi 3/4/2020 4:37 PM
SourceKit-LSPはいちおうROOTSDKのパスとかをちゃんと渡してあげるとUIKitの補完等も使えるっぽいです。
Avatar
Kishikawa Katsumi 3/5/2020 4:33 AM
悩んでたけどApp Storeで配布してるエディタでもSourceKit-LSP使えた方がいいからxcrun使ってるところは直してみよう。
Avatar
norio_nomura 3/8/2020 1:59 AM
xcrunがsandboxで使えないかは知らないけど、sourcekit-lspは依存してるsourcekitdがsandboxで使えないのは確か。sourcekittenswiftlintのHomebrewのボトル作成テストがsandbox下で動かなくて、回避コードを書いたことがある。
2:01 AM
手元でHomebrewのボトル作成テスト同等sandbox環境でxcrunを動かしてみたけど、ちゃんと動いた。
Avatar
Kishikawa Katsumi 3/8/2020 5:07 AM
あー、xcrunだけを回避してもダメかもしれないのですね。。
Avatar
Kishikawa Katsumi 3/8/2020 1:06 PM
1:06 PM
任意のリポジトリの任意のファイルに対して発動できるようになったので見てほしい。 (edited)
1:08 PM
もし、インストールしてテストに協力してくれるとか、なんやったらPR送ったりしてくれるっていう人がいたらリアクション🙋‍♂️付けてください。 今週中くらいをメドにコードを公開したり試せるような準備を考えています。 (edited)
🙋‍♂️ 2
🙏🏻 1
Avatar
🙋‍♂️ あんまり時間取れないかもですが… (edited)
🙏🏻 1
Avatar
Kishikawa Katsumi 3/9/2020 11:25 AM
とんでもない。助かります。
Avatar
すごい
11:12 PM
進化してる
11:13 PM
最近、sourcegraph で遊んでて、
11:13 PM
あんまりまだ理解してないけど、ウェブ側にあるといろいろ便利
Avatar
omochimetaru 3/12/2020 1:55 AM
大規模なソースコードを分析・閲覧する際に有用なのが、ソースコード専用の検索ツールだ。こういったツールは複数あるが、今回はGitリポジトリやGitHubなどのホスティングサービスとの連係機能を特徴とするオープンソースの検索ツール「Sourcegraph」を紹介する。 Webブラウザ上からGUIで操作できるソースコード検索ツール システム開発の現場において、クラ……
Avatar
それです
Avatar
Kishikawa Katsumi 3/12/2020 2:30 AM
おおー、これは便利そう。 このサイドバーにシンボルを出すのとかはLSPでもできるからマネしてみよう。
Avatar
Kishikawa Katsumi 3/14/2020 12:08 PM
12:09 PM
リポジトリ内の別のファイルに飛べるようになった。 (8秒目くらい〜)
12:10 PM
もうちょい整理したらAlpha版くらいになると思う。。。たぶん。
Avatar
Kishikawa Katsumi 3/14/2020 4:35 PM
4:36 PM
シンボルのリストを出してメソッドとかプロパティに飛べるようにした。 ソースコードの構造のアウトラインが捉えられるのでWebでコードを読むときに頭の負荷を軽減すると思う。
4:37 PM
とりあえずPoCは全部できたのであとはコードを整理して試してもらえる形にする。。。
Avatar
omochimetaru 3/14/2020 4:39 PM
GitHubの画面の両端にめっちゃ良い感じの余白あるんですねw
Avatar
Kishikawa Katsumi 3/14/2020 4:41 PM
拡張のために用意してくれてるのかな
Avatar
omochimetaru 3/14/2020 4:41 PM
一度見るとそうにしか見えないっすね。
😂 1
Avatar
Kishikawa Katsumi 3/14/2020 4:46 PM
Safari Extensionがだいぶ書けるようになったと思うけど、役に立つスキルなのかどうかかなり微妙だな。
Avatar
Kishikawa Katsumi 3/15/2020 8:51 PM
https://github.com/kishikawakatsumi/SourceKitForSafari @rintaro @tarunon ^ のリポジトリでソースコードとビルド済みバイナリを公開しました。 別のMacにコピーしてインストールしたら動いたのでバイナリインストールでも動くと思いますが、Xcodeから実行した方が安定して動いているように見えます。 (まだよくわからない。動かないときはExtension本体かXPCプロセスがクラッシュしている気がするけどSafari Extensionは挙動が確認しづらいので、何が起こっているのか解明できていない) 必要なファイルは全部リポジトリに含んでいるはずなので、Xcodeから単純にビルドして起動するとSafariに拡張が追加されると思います。たぶん。 (Xcodeから起動する場合はBundle IDとか編集しないといけないかも。。。) まあPoCのアルファ版という位置づけなのであまり快適に使えるようにはなっていません。。。 他の方もよかったら試してみてください。
SourceKitForSafari is a Safari extension for GitHub, that enables IDE features like go to definition, or documentation on hover. - kishikawakatsumi/SourceKitForSafari
8:52 PM
わからないことは聞いてもらえればある程度は答えられると思います。
8:53 PM
Chrome拡張も作ってみたいけど、そっちはまず最初の作り方がサッパリわからない。シェルコマンドのようなものを実行できるのかどうかも不明。
🙏 1
Avatar
できないはず
8:53 PM
バイナリはNPX作るんだったかな。
8:53 PM
NAPIだっけ?
8:54 PM
やった事あるけど記憶が曖昧
8:54 PM
なんか、sandboxの仕組みがあります
8:54 PM
NaClか
8:54 PM
全然違った
8:54 PM
NAPIはNetscapeのだ
Avatar
Kishikawa Katsumi 3/15/2020 8:55 PM
ありがとうございます。できないか〜。 そうすると、LSPの機能をサーバーサイドでやって結果を返すとかかなあ。
Avatar
と、お思ったらdeprecateされてる😂
8:55 PM
*思ったら
8:56 PM
wasmらしいです
8:56 PM
ローカルにTLSなサーバーたてて通信すれば良いのかな。
Avatar
Kishikawa Katsumi 3/15/2020 8:57 PM
Wasmか、一気に難しくなった。
8:58 PM
ローカルにTLSなサーバーたてて通信すれば良いのかな。
^ このアイデアは良さそうですね。Safari Extensionのときと同じ感じになる。
Avatar
たぶん普通のウェブサイトでできることの中で実現する必要がありそう。
Avatar
Kishikawa Katsumi 3/15/2020 9:00 PM
Safari拡張はそうするとだいぶ自由な仕組みなんですねえ。
9:01 PM
これかな?
9:02 PM
外部のプロセスと通信できるっぽい
Avatar
Kishikawa Katsumi 3/15/2020 9:03 PM
なんかできそうですね。 アプリを別途インストールするっていうのを利用者側にやってもらえばいいのかな。
Avatar
そうかも。
Avatar
Kishikawa Katsumi 3/15/2020 9:05 PM
JSはメッセージ送受信のところ以外はそのまま使えるし、意外とスッとできるかもしれない。。。?
Avatar
ブラウザの中で動く部分は共通で使えるかと。
9:06 PM
外となにかするのは特別なものが必要かなあ
Avatar
Kishikawa Katsumi 3/15/2020 9:09 PM
まずはChrome拡張の入門からですね。また来週やってみよう。どうもありがとうございます。
Avatar
sourcekit-lspパッケージへの参照がgit@になってる。httpsの方が良いと思う。 (edited)
Avatar
Kishikawa Katsumi 3/16/2020 12:14 AM
なるほどたしかに。変えときます。
Avatar
あと、グループコンテナ名がソースコード内にハードコードされてるのをなんとかしたいですね。
🙏 1
Avatar
Kishikawa Katsumi 3/16/2020 12:17 AM
あれハードコードしないことできるんですか?設定を取るAPIがあります?
12:18 AM
あ、違うか。他の人がビルドしたときに困ると言う話か。
Avatar
そう。
12:18 AM
source kit-lspはsandbox外だから動くけど。 (edited)
Avatar
Kishikawa Katsumi 3/16/2020 12:19 AM
それはなんか考えましょう。バンドルIDを変えるみたいに変数にするか、そもそもグループコンテナでデータ共有する必要はないからサンドボックス外のキャッシュディレクトリでもいいかも。
12:20 AM
作った当初はXPCじゃなくてファイルで本体アプリとやり取りしてた名残り。
Avatar
あと、とりあえず気づいたのはDocument Itemsの参照位置が1行ずれてるくらいかな。 (edited)
Avatar
Kishikawa Katsumi 3/16/2020 12:24 AM
あ、あれズレてるんですね😥私のバグか。。。SourceKitが返すのはゼロ始まりだから1足さないといけないのですね。 (edited)
Avatar
サンドボックス外のキャッシュディレクトリでもいいかも。
別途ローカルにチェックアウト済みのディレクトリを使えると良いかも?
(edited)
12:37 AM
ワーキングコピーと開いてるページが同じ状態とは限らないから無理か。
Avatar
Kishikawa Katsumi 3/16/2020 12:41 AM
カスタマイズできるのはアリと思います。 今の仕様にしているのは実装を簡単にするための制限なのでブランチとかもうまく扱えた方がいいし、PRのページでも機能させたい、とすると何らかの方法で指定してもらうことになる気がします。
Avatar
Kishikawa Katsumi 3/16/2020 12:49 AM
エクステンションはあまりリッチなUIを出せないから(ツールバーのポップアップだけ。)そこは難しいですね。
Avatar
norio_nomura 3/16/2020 1:07 AM
extensionとcontaining app間のやり取りって、shared resourcesくらいしか無いんだっけ。
Avatar
Kishikawa Katsumi 3/16/2020 1:15 AM
ないみたいですね。だいたい他のExtensionの制限に準じていて、Safari ExtensionはContaining Appと直接やり取りする、あるいは起こすインターフェースはないのでExtension内部のXPCとやり取りするよりも面倒な感じです。 最初はContaining Appは常に起きている前提で、Distributed Notificationをトリガーに、パラメータと戻り値は共有コンテナに一定のルールで書き込んでやり取りする、みたいにしてました。パフォーマンスとか取り回しにいろいろ難がありました。
Avatar
Kishikawa Katsumi 3/16/2020 1:28 AM
^ SPMのリポジトリURLと1行ずれる問題は直してPush/リリースしました。
1:31 AM
しかしSafariエクステンションはテストが書けるわけでもなし、リリースしたものが他の環境で動くかどうかはかなり難しいなあ。 デバッグも難しいのでなんか画面に挙動をフィードバックする仕組みを用意した方が良さそう。
Avatar
うごいたー!カスタムのsourcekit-lspのパスが指定できなくて、とりあえずソースいじってハードコードしたら動きました。
Avatar
Kishikawa Katsumi 3/16/2020 1:40 AM
sourcekit-lspのパスが指定できなくて
申し訳ないです、バグですね。設定周りはバグだらけだと思います😥
1:40 AM
や、でもそれなりに動いてるみたいでよかったです。
Avatar
とりあえず気づいたのは、https://github.com/Alamofire/Alamofire/blob/master/Source/MultipartFormData.swift#L105 とかで FileManager に飛ぶと、 GitHub 404 が表示されて、ローカルファイルに飛ばないのと、その後戻るとクラッシュし始めることぐらいです。 Precondition failed: tried to send message before calling start(messageHandler:): file /Users/rintaro/Library/Developer/Xcode/DerivedData/SourceKitForSafari-exmylkeuqkdqunbichifwiexymed/SourcePackages/checkouts/sourcekit-lsp/Sources/LanguageServerProtocolJSONRPC/JSONRPCConnection.swift, line 152
🙏 1
Avatar
Kishikawa Katsumi 3/16/2020 1:47 AM
あ、それは直さないといけないですね。リポジトリ外のファイル参照はいったん無視するようにしないと。。。
👍 1
Avatar
norio_nomura 3/16/2020 1:51 AM
https://github.com/kishikawakatsumi/SourceKitForSafari/blob/master/file:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSTask.h#L32みたいなパスを開こうとして404になりますね。 (edited)
Avatar
Kishikawa Katsumi 3/16/2020 1:56 AM
いったんリンクにするのをやめて、理想的にはファイルの場所とテキストの範囲が(取れる場合は)返ってきているので、リンクじゃなくてテキストを読んで返してポップアップとかに表示するのが良さそうですね。
Avatar
けどこれ素晴らしいですね。コードリーディングが捗りそう!
😊 1
Avatar
Kishikawa Katsumi 3/16/2020 2:27 AM
そうなんですよ。VSCodeとSourceKit-LSPで開くのがだいぶ簡単なのでかなり十分なのですが、Webブラウザだけでできるのは(もっとスムーズに動くと)利点がありそう、と思います。
Avatar
norio_nomura 3/16/2020 2:37 AM
あれ?SourceKit-LSPってC++のソースも対応してますよね。
Avatar
Kishikawa Katsumi 3/16/2020 2:40 AM
SourceKit-LSPは中でClangとSourceKitに分岐しててC++やObjCのコードも結果を返せるみたいですよ。
2:42 AM
リポジトリ外のファイルをリンクに変換してしまう問題はリンクにしない処置を入れました。
Avatar
norio_nomura 3/16/2020 2:49 AM
今はSourceKitForSafariはswiftのソースだけで動くように制限がかかってるのかな。 (edited)
Avatar
Kishikawa Katsumi 3/16/2020 2:52 AM
SourceKitForSafariはいったんSwiftのプロジェクトだけにしてます。まず結果が安定して返ってくるところまで行くのが結構大変だったので紛れを少なくしたかった。(結局原因はだいたいWebのParseがおかしくてカーソルと別の位置を送ってるとか、送ってるテキストが崩れてるとかだったのですが) なので https://github.com/kishikawakatsumi/SourceKitForSafari/blob/135783afefa81ea5c1362e05272f68414835f1dc/SourceKitService/LanguageServer.swift#L91 ^ のパラメータと、 あとURLからローカルファイルパスに変換してるところなどを変えると動くと思います。おそらく。
Avatar
norio_nomura 3/16/2020 2:54 AM
なるほど。
Avatar
Kishikawa Katsumi 3/16/2020 2:56 AM
もっと最初はimport UIKit のエラーが取れない、、、というところで結構苦しみました。
Avatar
omochimetaru 3/17/2020 9:59 AM
@rintaro この前教えてくれた -verify-apply-fixes でめちゃくちゃはかどってます。ありがとうございました 🙏
👍 1
Avatar
ソース読んでたらexpected-errorの謎の裏技みつけた func f(a) {} // expected-error {{unnamed parameters must be written with the empty name '_'}} \ // expected-error {{use of undeclared type 'a'}}
12:56 PM
バックスラッシュで終わっておくと @-1 が要らない・・・
Avatar
omochimetaru 3/21/2020 2:58 PM
コンパイラだけリビルドする良い方法ってありますか? 標準ライブラリのビルド時間が長いのでそっちはリビルドしたくない。 今は $ ninja swift でやってるけど、ブランチ切替時とか構成の変更がある時はダメな場合もありそうなので気になります。
Avatar
僕は普段は $ cmake --build ../build/Ninja-ReleaseAssert/swift-macosx-x86_64/ -- -j8 swift swift-ide-test $ utils/run-test --build-dir ../build/Ninja-ReleaseAssert/ --build=skip test/IDE みたいな感じです。
Avatar
omochimetaru 3/21/2020 3:05 PM
なるほど。cmakeから発火して、run-testはビルドを避けられるのか。
Avatar
cmake --build 通すことで、CMake で reconfigure が必要なときは自動で判断してくれるので、 ninja 直よりは良いかと思います。
Avatar
omochimetaru 3/21/2020 3:06 PM
reconfigureは自動判断なんですね。 build-scriptの--reconfigure はアレはなんで必要なんですか?
3:06 PM
そのほうがブランチ切り替え時に上手く動きそうですね>cmake --build
Avatar
理論上はいらないはずなんですけどね、CMakeLists.txt のバグだったりで自動検知がうまく動かないときがあるのだと思います。
Avatar
omochimetaru 3/21/2020 3:08 PM
理論上は要らないw
3:09 PM
じゃああれはなんか変だったらお祈りでつければ良い感じですかね
Avatar
僕は cmake --build するのは自分の変更の時だけです。update-checkout 後は一回はきちんとbuild-script でビルドする。
Avatar
omochimetaru 3/21/2020 3:10 PM
なるほど。基本的にはそうしてるんですけど、ちょっとmasterの挙動も調べたい・・・みたいな時があって。
Avatar
僕は --reconfigure は使ったことないですね何か変になったら良い機会と思って rm -rf でビルドディレクトリ消し去ります。
Avatar
omochimetaru 3/21/2020 3:11 PM
oh
3:11 PM
参考になります。
3:12 PM
あと最近、テスト回すのが早い事に気がついて、 --release-debuginfo を使うんですけど、 Swiftコンパイラの中をデバッグしたい事もあって、そのときは --release-debuginfo --debug-swift が必要で、
3:12 PM
この2系統を使ってるんですが、ちょっとめんどくさくて、
3:12 PM
そのあたりはどうしてます?
Avatar
僕は普段 -R で、debuginfo も無しで、printデバッグなので😅
Avatar
omochimetaru 3/21/2020 3:14 PM
-R は debuginfoなしの --release でしたっけ。
Avatar
はい。
Avatar
omochimetaru 3/21/2020 3:14 PM
やはり最強はprintデバッグなのか・・・ (edited)
Avatar
どうしてもデバッガ使いたいときだけ -R --debug-swift でビルドして、頑張りますが、普段からビルドしてないと当然時間かかりまくるので、最終手段ですね。
Avatar
omochimetaru 3/21/2020 3:16 PM
ぐえ〜
Avatar
けど、普段から普通にデバッガ使っている人もいるので、人それぞれだと思います。
Avatar
omochimetaru 3/21/2020 3:17 PM
llvm::Optional とか デバッガでうまく扱えなかったり地味に苦労する。 ふむ〜 わかりました。
👍 1
Avatar
Kishikawa Katsumi 3/22/2020 4:41 PM
4:41 PM
4:42 PM
UIをがんばって、GitHubみたいな動きにした。 あとSwift以外でも動作するようにしてみた。Objective-Cのプロジェクトで多少動くのを確認。 (edited)
Avatar
norio_nomura 3/23/2020 1:26 AM
少しXcodeデバッガ環境下で動かしてみた。 Safari起動時にSourceKit for Safariが対象とするページがアクティブだと、SafariExtensionHandlerが受け取ったinitializeを処理しきる前に別スレッドでdidOpenを受け取って、SourceKitServiceProxy内のconnection.resume()呼び出しが_xpc_api_misuseでクラッシュするパターンがよくある。 (edited)
Avatar
Kishikawa Katsumi 3/23/2020 1:40 AM
XPCの呼び出しは1本のキューで順次処理するようにしたらよさそうですか?
Avatar
norio_nomura 3/23/2020 1:57 AM
bundle.js側で同期とるのは面倒そうだから、その方が良さそう。
Avatar
Kishikawa Katsumi 3/23/2020 1:59 AM
Proxyクラスの処理は全部シリアルキューに載せるようにしてみます 🙏
Avatar
norio_nomura 3/23/2020 2:39 AM
クラッシュしなくなった。
2:45 AM
あと、macOSではEntitlementのApp Groupsはこんな感じのコードで実行時に取れるらしい。 if let task = SecTaskCreateFromSelf(nil), let groups = SecTaskCopyValueForEntitlement(task, NSString("com.apple.security.application-groups"), nil) as? [String] { print("App Groups:", groups) } (edited)
💯 1
Avatar
Kishikawa Katsumi 3/23/2020 3:18 AM
おおっ、とするとこれでハードコードしなくて済むようになるから、あとはプロジェクトのグループIDが勝手にその人のものになるようにしておけばビルドの問題も解決ですか?
Avatar
SourceKitForSafari is a Safari extension for GitHub, that enables IDE features like go to definition, or documentation on hover. - niw/SourceKitForSafari
3:19 AM
ビルド通っただけ
3:20 AM
特に何も考えずに置き換えただけだから多分動かない
3:20 AM
SourceKitForSafari is a Safari extension for GitHub, that enables IDE features like go to definition, or documentation on hover. - kishikawakatsumi/SourceKitForSafari
3:21 AM
このほうが見やすいのか
3:24 AM
com.がない箇所がある...
3:24 AM
なおした
Avatar
Kishikawa Katsumi 3/23/2020 3:24 AM
😻 直す箇所がわかるだけでもすごく助かります。
Avatar
まだ動いてない 😂
Avatar
Kishikawa Katsumi 3/23/2020 3:26 AM
TeamIdentifierPrefixはプロセス間で受け渡すより各自で取得するようにしたいっす
Avatar
Workspaceがuglyなので
3:26 AM
なんかきれいな実装してください...
Avatar
Kishikawa Katsumi 3/23/2020 3:27 AM
👍
Avatar
Kishikawa Katsumi 3/24/2020 1:19 AM
1:21 AM
Chrome Extensionも作った。Chromeの方がだいぶデバッグしやすい。ネイティブとの通信はSafariの方が楽。 https://github.com/kishikawakatsumi/SourceKitForSafari/pull/5
Avatar
Kishikawa Katsumi 3/24/2020 2:39 AM
すばらしい
😋 1
Avatar
これでおもちさんじゃなかった財布さん経由でswift変え放題
Avatar
omochimetaru 3/24/2020 2:48 AM
CIの発火なら任せて
Avatar
Kishikawa Katsumi 3/24/2020 9:49 AM
Browser extension、Webをparseする部分を直してほとんどのキーワードで正しく情報が取れるようになった。 いろいろ触った感じだと、SourceKit-LSPはまともなクライアントがあったら十分に実用できて、要するにVSCodeで使うとコードリーディングがめっちゃはかどると思う。 Xcodeが使えるならそれでいいけど、動作がヘビー級なので、サッと開いてコードジャンプを駆使して読み進めていくというのはVSCodeの方がたぶん便利。 作る方はStoryboardとかリファクタリングがないから苦しいけど、読む専用で考えるとVSCodeはだいぶいい勝負をするか上かもしれない。
Avatar
Storyboardなにそれおいしいのなのであんまり関係ない
3:33 AM
あれ使ってる人いるのかなあ
3:33 AM
っていつも思うんだけど、じつはメジャーなんだろうか...
Avatar
omochimetaru 3/25/2020 3:34 AM
ワイはXIB派。でもiOS勉強会とか見てると使ってる人たちは普通にたくさん居ますね。 (edited)
Avatar
storyboardはともかく、interface builderは優秀なAutolayoutのフロントエンドなので
Avatar
vscodeの汎用性の高さは目を見張るものがある
Avatar
xibは使いますね
Avatar
手で書かないんだ
Avatar
omochimetaru 3/25/2020 3:35 AM
コードレイアウトってことですか?
Avatar
そう
3:35 AM
autolayoutでもmanualでもどっちでもいいけど。
Avatar
omochimetaru 3/25/2020 3:35 AM
XIBだとビルドしないでも見た目が確認できるからXIB使ってますねえ
Avatar
コードをみると見た目が見える...
🤔 1
Avatar
omochimetaru 3/25/2020 3:36 AM
見た目確認用の仕組み(UIカタログ画面とか)とか作り混んだらコードレイアウトでも良いと思う。 (edited)
Avatar
基本的に全部StackViewで枠組み作るとか、それなりにキツい制約を入れておかないと
Avatar
omochimetaru 3/25/2020 3:36 AM
僕はIB上に寄せてって @IBDesignable をいろいろ練習しました。
Avatar
あっという間にぶっ壊れる経験が
Avatar
まったくそんなことはないんだけど
Avatar
omochimetaru 3/25/2020 3:36 AM
ww
Avatar
いいなぁ
Avatar
某巨大なアプリはxib一切使ってないんだけど
Avatar
omochimetaru 3/25/2020 3:37 AM
マジかあ〜 それはすごい
Avatar
ぶっ壊れたことはないし
Avatar
omochimetaru 3/25/2020 3:37 AM
異世界だ
Avatar
autolayoutもコードできれいにできてるけどなあ
3:37 AM
anchor以前は使ってなかったけど。
Avatar
ちょっと目を離すとすぐにAmbiguous吐かれていて、泣きながら治していた
Avatar
omochimetaru 3/25/2020 3:37 AM
標準の anchorメソッド? でも結構いい感じに書けますよね。
Avatar
そう。
Avatar
omochimetaru 3/25/2020 3:38 AM
iOS7だっけ8だっけ。
Avatar
9かな
Avatar
あれが出るまではマニュアルレイアウトだった。
3:38 AM
いまでも大部分そうだけど。
Avatar
omochimetaru 3/25/2020 3:38 AM
マニュアル?
Avatar
なんの魔法もつかってない。
Avatar
omochimetaru 3/25/2020 3:38 AM
CGRectを計算するコードを書くって意味ですか?
Avatar
layoutSubviewですね
3:39 AM
そうです
Avatar
omochimetaru 3/25/2020 3:39 AM
ワオ
Avatar
そういえば家庭くんが、コードレイアウトとxibでパフォーマンスに差が出るみたいな話をしていた
Avatar
めっちゃキャッシュしてる
Avatar
omochimetaru 3/25/2020 3:39 AM
AutoLayoutはまあ方程式解くし遅そう
Avatar
いや
3:39 AM
コードで書いたAutolayoutとxibで、後者のほうが優位に速い、だったかな
Avatar
omochimetaru 3/25/2020 3:39 AM
てかこれチャンネル違うな
Avatar
xibにコードでAutolayoutを足すのが遅い、だったか
Avatar
へー
3:40 AM
そうだった
3:40 AM
#uikit かな
3:40 AM
それはすごい遅そう
Avatar
vscodeに話戻すけど
3:42 AM
xcode他の言語に弱すぎて
3:42 AM
モノレポで複数言語がある場合、そういうツールに行きつきがち
3:42 AM
IntelliJかvscode
Avatar
Kishikawa Katsumi 3/25/2020 5:50 AM
XcodeはC、C++、ObjC、Obj C+とSwiftを使う分にはかなり最強だけど、、、
5:51 AM
VSCodeのカバー範囲はすごいですね。
5:51 AM
デフォルトの挙動の塩梅もいい
Avatar
cmakeに対応しててわりとちゃんと使えるのでninjaがいまいちなclionよりいいかもとか思ったり
6:04 AM
jsの世界ではデファクトっぽい感じだし
6:04 AM
xcodeは地味に辛い部分が多いんですよねえ...
6:04 AM
なによりリリースが遅い
6:05 AM
swiftもspmもそうだけどこのリリースサイクルはしんどい
Avatar
Kishikawa Katsumi 3/25/2020 6:08 AM
リリースが遅い
あーこれは同意ですねえ。
Avatar
omochimetaru 3/25/2020 6:09 AM
僕は機能性やリリースサイクルもXcodeに関してはあまり不満は無いしVSCodeより気に入ってるんですが、パッケージがでかすぎてダウンロードするのとXIPの解凍がだるいのだけは時代に即していないと思う。
Avatar
Kishikawa Katsumi 3/25/2020 6:10 AM
XIPはなんであれにこだわってるんでしょうねえ。
Avatar
omochimetaru 3/25/2020 6:10 AM
内部の差分コンポーネントとかだけ落としてくる感じにできないんかね。
Avatar
Kishikawa Katsumi 3/25/2020 6:10 AM
まったくメリットないと思うけど。
Avatar
omochimetaru 3/25/2020 6:10 AM
圧縮率の改善と署名の検証?をしているらしい?
Avatar
Kishikawa Katsumi 3/25/2020 6:11 AM
なんかXcodeがデルタアップデートできるようになった、って話もあった気がするけどいつの間にかフルダウンロードに戻ってた。
6:11 AM
圧縮率の改善と署名の検証?をしているらしい?
別にXIPが抜きん出てすぐれてるわけではないと思うんですよね。
Avatar
omochimetaru 3/25/2020 6:13 AM
体感では何もメリット感じないっすね。
Avatar
xipになったのは、某国でxcodeまがいが出回って
5:32 PM
code injectionが起こったから
5:32 PM
コンパイラが改造されてたらそりゃねえっていう話
Avatar
omochimetaru 3/25/2020 5:32 PM
え、やば
5:33 PM
でも不正版を入れるときはxip関係ないですよね?
Avatar
zip配布だった頃は
Avatar
Kishikawa Katsumi 3/25/2020 5:33 PM
意図してじゃなくて
Avatar
同じようなものが改造されてapple.comじゃないとこで配布されたりしてたんですよ
Avatar
Kishikawa Katsumi 3/25/2020 5:34 PM
意図せず改変されたXcodeを使ってビルドしたアプリが
Avatar
そゆこと
Avatar
Kishikawa Katsumi 3/25/2020 5:34 PM
なんらかの情報を改変元に送ってたとかそんな話だった
Avatar
omochimetaru 3/25/2020 5:34 PM
ああじゃあ、xipを解凍してる限り安心できるようになった、のが改善なのね
Avatar
だから一部分だけ配布って難しいんだと思う
Avatar
Kishikawa Katsumi 3/25/2020 5:35 PM
でもそれもXcodeが大きすぎてダウンロードに時間かかるから、回避してそっちを使う、みたいなのがメリットあったって話だから
Avatar
appleの秘密鍵が漏れない限りは
Avatar
Kishikawa Katsumi 3/25/2020 5:35 PM
どうかなあと。
Avatar
信頼していいっていう状況になった
5:35 PM
個人的にはxipでも10GBあっても構わないけれど
5:36 PM
せめて各月くらいではリリースして欲しい
5:36 PM
半年遅れで機能が使えるようになるとか
5:36 PM
時代に則してなさすぎる
Avatar
omochimetaru 3/25/2020 5:36 PM
ああーなるほど。不正版を変なドメインから落とす動機はそういうことなのか。
Avatar
あとはとなりのマシンからコピーしたりとかね (edited)
Avatar
Kishikawa Katsumi 3/25/2020 5:37 PM
Android Studioみたいにどんどんアップデートがきたらいいのかな。
Avatar
intellijとかvscode並にくると嬉しい
😆 1
5:38 PM
せめてアップストリームの変更は次の月くらいには使えるようになってて欲しいなあ
3:16 AM
ワイのパッチがリグレッションとして名指しされちゃったんだけど問題の詳細が結構面白い。
3:20 AM
public func expect<T>(_ expression: @autoclosure () -> T) -> T { print("First") return expression() } let x = expect { 1 } print("x: \(x)") // x: (Function) ↑trailing closureとautoclosureが連動すると、T が関数型に推論される。
Avatar
これは正しい気がするけど…
Avatar
omochimetaru 3/26/2020 3:25 AM
もし、↑が正しいとすると、 SR-12291自体、直すべきじゃないって事になると思うんだよな。
Avatar
ちょっとまってやで
Avatar
omochimetaru 3/26/2020 3:28 AM
俺がやっちゃったリグレッション自体は本質的にはこっち。
3:28 AM
func f(aa: () -> Int, bb: Int = 0, cc: Int = 0) { print(1) } func f(bb: Int = 0, cc: Int = 0, aa: () -> Int) { print(2) } f { 0 } // Xcode11.3 => 2 // master => ambiguous use of 'f'
Avatar
これはそうだね、前者はTrailingではない
Avatar
omochimetaru 3/26/2020 3:29 AM
いや、なんだけど、Pavelさんが前者のTrailingを先に実装してるんだよね、クロージャの後ろの引数(bb:)が一個の場合だけ。 (edited)
3:30 AM
で、俺はそれをN個に拡張した。(bb:cc:)が続けられるようになった。 (edited)
Avatar
ちなみにAutoclosureに関しては
Avatar
omochimetaru 3/26/2020 3:30 AM
↑の例で3引数なのはデフォルト引数2個以上が俺のパッチが関係してるからw
Avatar
本質的に func foo<T>(_ f: T) { print(T.self) } foo(1) foo { 1 } これと同じはずで
3:31 AM
あれ?
Avatar
omochimetaru 3/26/2020 3:31 AM
T から () -> T だね。
Avatar
今も同じ動きしてると思うぞ
Avatar
omochimetaru 3/26/2020 3:31 AM
今って?
Avatar
Xcode 11.4で
3:31 AM
おもちさんのパッチはまだ入ってないでしょ
Avatar
omochimetaru 3/26/2020 3:32 AM
入ってるかも、わからん。
Avatar
入ってないはず。(Swift 5.2 にはおもちさんの最近のCS変更は入ってない) (edited)
Avatar
omochimetaru 3/26/2020 3:32 AM
func f(aa: () -> Int, bb: Int = 0) { } f { 1 }
3:32 AM
↑これが通るならPavelさんのは入ってる
Avatar
@swift-4.2.4 public func expect<T>(_ expression: @autoclosure () -> T) -> T { print("First") return expression() } let x = expect { 1 } print("x: \(x)")
Avatar
First x: (Function)
Avatar
昔からそうだね
Avatar
omochimetaru 3/26/2020 3:32 AM
func f(aa: () -> Int, bb: Int = 0, cc: Int = 0) { } f { 1 } ↑ここまでだと俺のも入ってる
3:33 AM
ああ、AutoClosureはそう。
Avatar
本質的なリグレッションの方は、わからん。後ろの引数の数に対して複数回に拡張してOKなら、通らなくなるコードがあるのは仕方ない、と思える
Avatar
omochimetaru 3/26/2020 3:34 AM
ていうか、もし2個がだめで1個が良いとしても、
3:34 AM
1個のパターンで同じ問題が起きるんだな。
Avatar
そうだね
Avatar
omochimetaru 3/26/2020 3:37 AM
末尾でない引数にTCが割り当てられる時にペナルティを課すか、
3:37 AM
TCがAutoClosureに割り当てられる時にペナルティを課すか
Avatar
AutoClosureはTCにならない、が正解だと思うんだけど
Avatar
omochimetaru 3/26/2020 3:37 AM
どっちかで直せると思うけど、どっちの方法も別の壊れるケースが生じるよな。
Avatar
それは、T が () -> Int になるだけだと思う
Avatar
Pavelは Generic パラメータに 関数型を当てるののランクを下げるべきっていってますね。
Avatar
func foo(_ f: @autoclosure () -> Int) { } foo { 1 } これはコンパイルエラーなので。
Avatar
func foo<T>(_ f: T) { print(1) } func foo<T>(_ f: () -> T) { print(2) } foo { 1 } は Swift 5.2 だと Ambiguous だけど、2の方に解決されるべき。
Avatar
それはそうだと思います
Avatar
omochimetaru 3/26/2020 3:42 AM
@swift-5.1.5 func foo<T>(_ f: T) { print(1) } func foo<T>(_ f: () -> T) { print(2) } foo { 1 }
Avatar
exit status: 1 with stderr:<stdin>:3:1: error: ambiguous use of 'foo' foo { 1 } ^ <stdin>:1:6: note: found this candidate func foo<T>(_ f: T) { print(1) } ^ <stdin>:2:6: note: found this candidate func foo<T>(_ f: () -> T) { print(2) } ^
Avatar
なので、autoclosureは関係ない話題だと思う
Avatar
omochimetaru 3/26/2020 3:42 AM
@swift-5.0.3 func foo<T>(_ f: T) { print(1) } func foo<T>(_ f: () -> T) { print(2) } foo { 1 }
Avatar
exit status: 1 with stderr:<stdin>:3:1: error: ambiguous use of 'foo' foo { 1 } ^ <stdin>:1:6: note: found this candidate func foo<T>(_ f: T) { print(1) } ^ <stdin>:2:6: note: found this candidate func foo<T>(_ f: () -> T) { print(2) } ^
Avatar
omochimetaru 3/26/2020 3:43 AM
@rintaro
Pavelは Generic パラメータに 関数型を当てるののランクを下げるべきっていってますね。
↑issueスレッドでの発言は autoclosure における話だと思ったんですが、autoclosure関係なくってことですか?
Avatar
関係ないと思います。
Avatar
omochimetaru 3/26/2020 3:45 AM
meansで区切ってwhichはthat以下だけにかかってるのか。
3:46 AM
func foo<T>(_ f: T) { print(1) } func foo<T>(_ f: () -> T) { print(2) } func bar() -> Int { 1 } foo(bar) ようするにこういう事か
Avatar
今までambiguousであるので、これに優劣をつければ SR-12291 の例自体は既存コードを壊すこと無く解決するはずですが、
3:49 AM
おもちさんの最後のコメントの例はまた別の問題ですね。
Avatar
omochimetaru 3/26/2020 3:50 AM
そうなんすよね。
3:51 AM
() -> Int <bind> $T1() -> Int <bind> () -> $T2 に差を付けるのはアリなのかなぁ なんか思わぬケースで生じて別の問題が起きそうな気も
3:57 AM
今までがambiguousだから差を付けるのは下位互換・・・そうか・・・
Avatar
ただ、差を付けすぎていままで「より低かったもの」よりランク下げちゃうと思わぬ解決をしてしまう可能性はありそう。 (edited)
Avatar
omochimetaru 3/26/2020 3:59 AM
一番弱い新しいスコアをつければ問題ないけど場当たり的にそうやるのも設計が崩れそうだし難しい。
Avatar
いちおう具体例だしておくと (edited)
4:05 AM
@swift-5.1.5 func foo<T>(_ f: T) { print(1) } func foo<T>(_ f: () -> T, opt: Int = 1) { print(2) } func bar() -> Int { 1 } foo(bar) (edited)
Avatar
1
Avatar
omochimetaru 3/26/2020 4:06 AM
あれ?それはなんでだ・・・
4:06 AM
@swift-5.1.5 func foo<T>(_ f: T) { print(1) } func foo<T>(_ f: () -> T) { print(2) } func bar() -> Int { 1 } foo(bar)
Avatar
exit status: 1 with stderr:<stdin>:4:1: error: ambiguous use of 'foo' foo(bar) ^ <stdin>:1:6: note: found this candidate func foo<T>(_ f: T) { print(1) } ^ <stdin>:2:6: note: found this candidate func foo<T>(_ f: () -> T) { print(2) } ^
Avatar
デフォルト引数使うのにランキングのペナルティが科せられてる。
Avatar
omochimetaru 3/26/2020 4:07 AM
そうだったのか〜
4:11 AM
CSRankingのInputMatcherあたりかな
Avatar
omochimetaru 3/26/2020 8:50 AM
ソース互換性の維持のためRevertになった😇
😩 2
8:51 AM
このコミット戻すために最近のがいくつか剥がされていくっぽいな・・・
Avatar
Kishikawa Katsumi 3/27/2020 9:28 PM
swift-subcommand っていうルールで名前をつけたものをPATHの通ったところに置いておくと、 $ swift subcommand という形で呼び出せることを今さら知った。 https://github.com/apple/swift/blob/f34c97069a43aa2295c6a63627c15e224be6d30a/tools/driver/driver.cpp#L83-L122 ^ ここの処理がやってるんだと思う。 (edited)
9:29 PM
というのをこのパッケージを見て知りました。 https://github.com/kiliankoe/swift-outdated
Avatar
そうそう
12:08 AM
swiftpmのソースみててそれ思った
12:08 AM
gitに似てる
Avatar
Kishikawa Katsumi 3/28/2020 12:10 AM
そうなんですね。
12:12 AM
なるほどgitはサブコマンドのエコシステムが発達している https://github.com/tj/git-extras
12:12 AM
分かってる人にはなじみの仕組み、なんですね。
Avatar
シェルの alias ではダメだからちょっとうーんて気持ちがあった (edited)
12:14 AM
まあそれは仕組み上仕方のないことなのだけれど。
Avatar
ボットにもサブコマンド用の処理入れてます。 @swift-5.2.5 demangle ss5print9separator10terminatoryypd_S2StFfA0
Avatar
$ss5print_9separator10terminatoryypd_S2StFfA0_ ---> default argument 1 of Swift.print(_: Any..., separator: Swift.String, terminator: Swift.String) -> ()
Avatar
Kishikawa Katsumi 3/28/2020 12:48 AM
おお〜 👏
12:49 AM
便利
Avatar
omochimetaru 3/28/2020 5:50 AM
そうなんですよね swift-sh とかユーザーが勝手に作れるのはそれのおかげ
5:52 AM
ユーザーのタイプ数でいうとハイフンがスペースになるだけだから意味あるのか疑問だけど swiftコマンドにパラメータを与えるやつと、 コマンド自体が別れてるやつを区別しないで使えるところがいいところなのかな。
Avatar
$0 が swift になるのかな?確かめてないし、メリットもわからんけど
Avatar
omochimetaru 3/28/2020 6:03 AM
[omochi@omochi-iMacPro bin]$ clang -o swift-aaa aaa.c [omochi@omochi-iMacPro bin]$ ./swift-aaa [0] ./swift-aaa [omochi@omochi-iMacPro bin]$ swift aaa [0] /Users/omochi/Dropbox/bin/swift-aaa [omochi@omochi-iMacPro bin]$ swift aaa x y z [0] /Users/omochi/Dropbox/bin/swift-aaa [1] x [2] y [3] z [omochi@omochi-iMacPro bin]$ cat aaa.c #include <stdio.h> int main(int argc, char *argv[]) { for (int i = 0; i < argc; i++) { printf("[%d] %s\n", i, argv[i]); } return 0; }
6:03 AM
ならなかった。
6:03 AM
(最初シェルスクリプトで作ったら動かなかったからC言語で書いた)
Avatar
おもちさんじゃなくてさいふさんはswiftそのものなのにswiftじゃないまじっておもった
Avatar
omochimetaru 3/28/2020 6:10 AM
なんて??w
Avatar
おもちさん(実は財布さん)は Swift(コミッターなのでもうそれはSwift)そのもの(といっても過言ではない存在)なのに(テストにつかったコードがC言語で書かれてる)Swfitじゃない、本当っ?! って思った の意味 (edited)
🤯 1
💡 1
Avatar
omochimetaru 3/28/2020 6:15 AM
たしかに、Swiftで書いても検証できたか。 こういうシステムが関係するやつはCのほうが不安がない・・・
Avatar
Kishikawa Katsumi 3/30/2020 7:59 AM
https://twitter.com/esumii/status/315135694462939137 型システム入門はとりあえず全体の2〜3割を読んだらいいとのことだから気合を入れて読んでみようかな。
サポートサイトができたらジュンク堂トークのPDFも載ると思いますが、これだけは先に:型システム入門(TAPL)はとりあえず1,3,8,5,9,11章(&2章の必要な部分)と、あとは好きな章を読めば「読んだ」ことにしても良いと思います!(60%本気)
Avatar
omochimetaru 4/1/2020 8:56 AM
ParameterListParameterListInfoArrayRef<AnyFunctionType::Param>TupleType が微妙に違うものとしてバラバラに使われていて厳しい
Avatar
omochimetaru 4/2/2020 7:19 AM
Summary Diagnose label mismatch based on argument mapping which is used by type check in after repair stage Diagnose all out of order labels Diagnose label mismatch and out of order same time Spli...
7:20 AM
↑Committerになったはずなんだけどbotさんが動いてくれない・・・
Avatar
omochimetaru 4/3/2020 6:45 AM
-verify-apply-fixes を改良して、 func f(aa: Int, bb: Int) -> String { "f" } f(aax: 0, bb: 1)func f(aa: Int, bb: Int) -> String { "f" } f(aax: 0, bb: 1) // unexpected-error {{incorrect argument label in call (have 'aax:', expected 'aa:')}} に書き換える機能を実装しようと思ったんだけど
6:46 AM
let a = """ \(f(aax: 0, bb: 1)) """ ↑こういう入力が与えられると let a = """ \(f(aax: 0, bb: 1)) // unexpected-error {{...}} """ ↑になってしまって、元コードを壊してしまう(コメントじゃなくて文字列リテラルになってる)
6:48 AM
現状でも let a = "expected-error {{foo}}" ↑これをverify-apply-fixesするとぶっ壊れるしまあいっか・・・?
Avatar
verify でコードを実際に実行する事は稀だから、壊れないんじゃないかな。
7:08 AM
いずれにしても、apply-fixした後に手修正で行ずらせばいいので無問題だと思います!
Avatar
omochimetaru 4/3/2020 7:09 AM
まあ、verify-apply-fixesが自動ビルドに組み込まれてる部分はないし、いいのか
Avatar
omochimetaru 4/3/2020 9:04 AM
verifyのテスト、メタ的になっててわけわからなくてウケる
Avatar
omochimetaru 4/4/2020 3:24 PM
3:25 PM
class A: B {} class B: A {} ↑これのRequestダンプしたらクソデカ画像出た $ swift -frontend -typecheck a.swift -build-request-dependency-graph -output-request-graphviz req.graph
3:26 PM
$ dot -Tpng じゃ厳しいな、なんか良いツールあるんだろうか
Avatar
omochimetaru 4/5/2020 2:51 AM
pngでも画像は見れるんですけど
2:51 AM
一つのノードからめちゃくちゃたくさん子ノードが生えてたりして
2:51 AM
何がどうなってるのか構造の見通しがわるいから
Avatar
縦長にするやつと
Avatar
omochimetaru 4/5/2020 2:51 AM
なんかグリグリするエディタみたいなものでインタラクティブに見れたら良いなと思った
Avatar
なんかレイアウトのロジックでうまいぐあにやってくれるやつつかって
2:52 AM
svgにするとわりと快適にchromeとかでみられたし検索もできた
2:52 AM
けど
2:52 AM
ぐりぐりできるやつはあったらいいなあって思ってた
Avatar
omochimetaru 4/5/2020 2:52 AM
ふむふむ 検索はいいですね。
Avatar
なんか見つけたら教えて欲しい
Avatar
omochimetaru 4/5/2020 2:53 AM
jsonとかだと、ツリービューで畳み込みできたりとか
2:53 AM
するけど、
2:54 AM
一般のグラフに対してそういう高機能なビューワーってあんのかなあ?
Avatar
ちょっと探した限りはなかったんですよね
Avatar
omochimetaru 4/5/2020 3:03 AM
なるほど
Avatar
norio_nomura 4/5/2020 4:27 AM
こんなのを見つけてbrew cask install gephiしてみたけど、Javaで書かれてると気づいて起動する事なく削除した。 https://github.com/gephi/gephi
Gephi - The Open Graph Viz Platform. Contribute to gephi/gephi development by creating an account on GitHub.
😂 3
Avatar
omochimetaru 4/5/2020 5:00 AM
Javaだとなんかまずいですか
5:00 AM
ツールの系統としてはイメージしてたものっぽい
Avatar
norio_nomura 4/5/2020 7:02 AM
まずくないです。これを本当に必要とする人にとっては関係ない評価を、今これを必要としていない僕はしてしまいそうな気がしたので、使ってみるのをやめました。
7:05 AM
改めて自問自答してみると「Javaで作られたモノには、本当に自分が必要としている時にしか触れない様にしよう」と僕は考えている様です。今まで言語化してみた事はなかったですが。
Avatar
Javaのランタイムを追加することになって面倒くさくなって投げがち
Avatar
norio_nomura 4/5/2020 7:07 AM
最近のJava製アプリはJavaランタイムバンドルが主流じゃないですかね。Charles Proxyとか使ってるけど、随分前から別途ランタイムのインストールは不要です。 (edited)
Avatar
お、最近はそうなんですね
7:08 AM
1,2年前ぐらいはJavaランタイム入れろ→Macのデフォルトだとバージョンが古い→Oracleのサイト開いて… という感じで忌避する傾向にあった
Avatar
omochimetaru 4/5/2020 8:13 AM
ふむふむ
Avatar
JVMはライセンスがアレなので
5:01 PM
Oracleのはわりと使えない感じに。
5:02 PM
そういう理由もあってJVMはバンドルされてるが通常で、それも OpenJDK ベースがほとんどな感じですね
Avatar
omochimetaru 4/5/2020 5:05 PM
Oracleのライセンス方針が変わった件と関係するやつですね。最近うちの会社でもちょうどそのあたりを調べたりしてました。
Avatar
あぶなくて使えない感じ
5:13 PM
サービスではあたりまえだけど、開発用も何言われるかわからん
Avatar
omochimetaru 4/5/2020 5:14 PM
OpenJDKで全部なんとかする
Avatar
会社はjvmヘビーなので自分とこのビルドつかってるけど
5:14 PM
個人でもアレな感じ。
Avatar
omochimetaru 4/5/2020 5:16 PM
無料で入れられるけどビジネスで使うなら課金してね系は
5:16 PM
うっかりライン超えそうなのでやりづらいですよね
Avatar
なんくせいくらでもつけられるから... Oracleは前科がいっぱいあるんで
Avatar
omochimetaru 4/5/2020 5:16 PM
Xcodeみたいに課金してなければストア向けビルドできないとか仕組みがひいてあるほうが
5:16 PM
安心感はある
Avatar
何も信用できない
Avatar
omochimetaru 4/5/2020 5:17 PM
オラクルが信用できないのはそうw
Avatar
ところで gephi はどうなんですかね
Avatar
omochimetaru 4/5/2020 5:19 PM
まだ試してないです
5:19 PM
RequestEvaluator見ようと思って書いたけど結局他のところ見始めた
Avatar
omochimetaru 4/5/2020 5:21 PM
graphvizはちょいちょい出てくるからまたでかいグラフと出会ったらやってみる
Avatar
おー、dotファイル読めるな
5:22 PM
でかいやつどこかにあったかな...
5:30 PM
なんかブラウズできる感じではなくて、グラフをフィルターしたりしてビジュアルつくれる感じ...?
Avatar
omochimetaru 4/5/2020 5:31 PM
ふむ
Avatar
ちなみにこれは某プロジェクトのxcconfigファイルの依存関係図
Avatar
omochimetaru 4/5/2020 5:31 PM
マジかw
Avatar
ビジュアルがきもいね
Avatar
omochimetaru 4/5/2020 5:32 PM
複雑なビルドだ
Avatar
触った感じ求めてたのとは違う感じ
5:35 PM
dotをきれいにビジュアライズしたり解析したりしてきれいなグラフを作るのには使えそう
Avatar
omochimetaru 4/5/2020 5:35 PM
なるほど。
Avatar
JVM / JDK 自前ビルドは気合入ってるなぁ
Avatar
いろいろパッチが入ってるオレオレJVMですね
omomuki 1
Avatar
omochimetaru 4/6/2020 7:45 AM
This PR improve {{none}} fix-it verifier. Currently, it means that no fix-it is expected. I improve it to mean that no more fix-it is expected when use it with normal fix-it verifier at same time. ...
Avatar
omochimetaru 4/14/2020 1:57 AM
cmakeが作るターゲット情報の中にincludeされていないヘッダーが含まれていないために
1:57 AM
Xcodeが検索する時に、検索対象がプロジェクトだと、一部のヘッダーが検索に含まれないのが困る (edited)
1:58 AM
検索対象をディレクトリにすれば動くけど、これはこれで重いし余計なものが出てくる気がする
Avatar
omochimetaru 4/14/2020 2:07 AM
含まれてるやつは単に include/swift/IRGen とかに入ってるヘッダーが含まれているのか・・・
2:10 AM
Xcodeがprojectに含まれないけどファイルツリーには存在して#include されるものを、プロジェクトツリーペインで表示しないという仕様が問題なのかなあ 不便で仕方ない
Avatar
MacでPCL(Point Cloud Library)のサンプルをcmakeからビルドしようとしたときに次のようなエラーが大量発生したので原因を調べてみました。 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath:313:9: error: no member named 'signbit' in the global namespace using ::signbit; ~~^ /Appli...
12:46 PM
ビルドできなくなって、これを参考にhomebrewで入れたものを全部消したら直った
12:46 PM
最近imagemagickを入れたのが怪しいと思ってる(依存がめっちゃ多い)
Avatar
omochimetaru 5/18/2020 3:13 PM
[ FAIL ] StringDeconstructTests.deconstruct cocoa これで落ちるのなんだろう・・・
Avatar
ここあ
Avatar
omochimetaru 5/18/2020 4:23 PM
Stringの中身がNSStringでCocoa APIを使うときのテストケースっぽいやつに落ちる
4:29 PM
そういえば最近のSwiftはそのへんなんかバグってるんだった。
4:29 PM
調べてないや。思い出した。
4:29 PM
copyしないと死ぬやつ。
Avatar
omochimetaru 5/18/2020 4:29 PM
Avatar
releaseしすぎだったら
4:30 PM
それかもしれない
4:30 PM
全く関係ないかもしれない
Avatar
omochimetaru 5/18/2020 4:35 PM
To avoid crash, it uses optional binding. Resolves half: https://bugs.swift.org/browse/SR-12577 Test case fail as usual, but it will be improved so that detailed output can be obtained. Example: [ ...
4:35 PM
validation-testもクラッシュするんだけど
4:35 PM
https://bugs.swift.org/browse/SR-12577 直ってると思うって言われたところで
4:36 PM
うーんきれいなmasterでもっかい試してみるか。
Avatar
きれいなmaster w
4:36 PM
きれいなジャイアンを思い出した
Avatar
omochimetaru 5/18/2020 4:39 PM
いまcatalina 10.15.4 beta 1だから10.15.5 beta4にアップグレードすれば直るかもしれない
Avatar
omochimetaru 5/18/2020 5:52 PM
だめだ2件とも発生する
5:55 PM
@Yuta Saito masterのvalidation-test通る? commit 0c403fe766c7bb9c85bda3a9e64d37a8c02e0909 (HEAD -> master, origin/master, origin/HEAD) Author: Eric Miotto <1094986+edymtt@users.noreply.github.com> Date: Mon May 18 08:14:59 2020 -0700
6:12 PM
よくわからんけど報告だけした
Avatar
@omochimetaru 作業中のブランチでやったのできれいな環境じゃないんですけど、同じところでfailしました。 ブランチの分岐元のコミットはこれです。 commit 8aceb038587961345a49ade56f280c27b5bb4a67 Merge: 30b5fd52e8f 97e32abc3c6 Author: Artem Chikin <achikin@apple.com> Date: Wed May 13 06:17:26 2020 -0700 Merge pull request #31716 from artemcm/UnlabeledKeypathFix [Type-checker] Improve diagnostic for keypath used without 'keyPath:' label
Avatar
@Yuta Saito おおさんくす StringDecomposeのほう? validation-testのStringUTF8のエラーはでない?
Avatar
StringDecomposeのほうです
Avatar
ふむ validation-testの方もみてほしい bugsのほうで、今は治ってるっしょ?って聞かれててむかついてる
Avatar
はーい
12:10 AM
うお、なぜかLLVMのビルドからやり直しになったw
Avatar
えー
12:10 AM
WebAssembly target uses absolute pointers, as explained by @kateinoigakukun on Swift Forums: It&#39;s due to the design of WebAssembly and LLVM support. If LLVM supports substruction relocatio...
12:10 AM
面白い注文来たね
Avatar
あー、これは
12:16 AM
やっぱりそうだよな〜って感じの注文ですね
Avatar
綺麗に畳み込む上で良さそう
12:16 AM
なるほど思った
Avatar
現状ポインタサイズとかもテンプレートで管理されてる
Avatar
うむ
Avatar
maxさんが頑張ってくれる
Avatar
家庭くんはLTOですか
Avatar
ですね
12:29 AM
maxさんはアップストリームにパッチを投げつつFoundationのwasmビルドを頑張ってくれてます
Avatar
あれ、それはまだできてないんだっけ
12:30 AM
バイナリサイズ凄いことになりそう
Avatar
なんかBlocksRuntimeのビルドに手こずってるみたいでした。
Avatar
なんだっけそれDispatchとは別?
12:33 AM
コンテキストをキャプチャできるラムダ式
Avatar
↑リンク開けぬ
Avatar
Blocks are a non-standard extension added by Apple Inc. to Clang's implementations of the C, C++, and Objective-C programming languages that uses a lambda expression-like syntax to create closures within these languages. Blocks are supported for programs developed for Mac OS X...
Avatar
あーこれかー
12:36 AM
ObjCは使ってないけどこれは使ってんのか・・・
Avatar
CoreFoundationがこれまみれなんですよね
Avatar
知らなかった なるほど・・・
12:37 AM
CoreFoundationをC ベースで再実装する必要ってあったんかねぇ
12:37 AM
全部Swiftでやればいいのに。
Avatar
あれ、これってイチから全部再実装したんでしたっけ
12:39 AM
てっきりApple内部のCoreFoundationをオープンにしたのかと思ってた
Avatar
あーDarwinOSSから引っ張ってるのか
12:39 AM
そういうことかあ
Avatar
でもビルドできたとしてもやっぱりバイナリサイズなんですよね
Avatar
やっぱLTOが今アツイな
Avatar
いやー、Foundationはきつい…
Avatar
逆にWASM側が
12:43 AM
クロスドメイン共有ライブラリを
12:43 AM
発達させて解決しないのかなぁ
12:44 AM
Swiftに限った話ではなく、ゲームエンジンのWeb書き出しとかも同じ問題あるよね
Avatar
まーそうですねー
Avatar
JSはブラウザにランタイムが事前配布されててズル
Avatar
一応dynamic linkingの話も出てるんですけど、キャッシュの前に議論しないと行けないことが多すぎて多分そこまで辿り着いてなさそう。
Avatar
なるほど
Avatar
JSはズルいのか。。
Avatar
特別扱い
12:48 AM
そういえば、昔chromeにdartが載りかけたことがあったな
Avatar
ほー
Avatar
dart懐かしい
Avatar
dartがでてきた頃の昔話
12:48 AM
フラッターで生き返るとは思わなかった
Avatar
Flutter on Webで一周回ってきた感
Avatar
うむー
Avatar
確かに
12:49 AM
JSみたいな再発見がおこることはあるのかなあ。
Avatar
再発見とは?
Avatar
JSってGoogleがWeb2.0の時代に再発見した感じ
Avatar
ああ
Avatar
あの時代は猫も杓子もFlashだった
Avatar
それまでは結構、ブラウザの差とか気にしたし、JS無効のユーザとかもあって
12:51 AM
わりとJSに頼りすぎないのが作法でしたよね
Avatar
そうそう、見捨てられた遺構だった感じ
Avatar
グーグルが無茶し始めたらみんなそれでいいじゃんってなった
Avatar
GmailとかGoogle Mapsのインパクトは大きかったと思う。
Avatar
そうですね〜
Avatar
アプリケーションありきだけど、本当に再発見だったよなあって思う。
Avatar
googlemapは凄かった
Avatar
全然知らない時代だ
Avatar
昔話です。
Avatar
JSONPとか面白かった
12:54 AM
なんだそりゃみたいなトリック
Avatar
ほぼハック
Avatar
JSONPはギリギリつかったことある
12:54 AM
@omochimetaru StringUTF8Tests.Contiguous Access でコケました
Avatar
@Yuta Saito やったー!報告しておいてくれー
12:55 AM
もしかしてマシン環境が日本語だとバグるのかな?
12:56 AM
誰も踏まないのおかしいよな?
Avatar
そんな
Avatar
validation-testのほうは報告したの4/12だよ
12:57 AM
これまで誰もCIとかで踏んでないのおかしいじゃん。
12:59 AM
俺と家庭君のマシンだけ他のswiftc開発者と違うところがあるとしたらそのくらいではって考えてた
1:02 AM
ちなみにtest StringDecompositionのほうはテストケースが作られたのが24日前
Avatar
System Language変えると色々壊れるからやりたくないなぁ
Avatar
omochimetaru 5/19/2020 1:04 AM
@niw さんもやってみませんか ビルドとテスト
1:05 AM
報告thanks
1:05 AM
そっちはCatalina正規版か
Avatar
Catalinaベータ特有の話ではなさそう
Avatar
omochimetaru 5/19/2020 1:06 AM
よかった。ベータの民だったからそこは気になってたw
Avatar
やるかあ
1:06 AM
でもいま晩ご飯つくってるから
1:07 AM
30分後くらいに
Avatar
omochimetaru 5/19/2020 1:07 AM
あざます
Avatar
master だよね
1:13 AM
build中
1:13 AM
ごはんもbuild中
Avatar
並列ビルドだ
Avatar
omochimetaru 5/19/2020 1:15 AM
$ utils/update-checkout --scheme master $ utils/build-script --release --validation-test --jobs 32 ↑詳しければお好みで良いですがそうじゃなかったらこんな感じが良いと思います (jobsのところはお好み)
Avatar
ごはんのbuildの方が早かったな...
1:28 AM
cacheが効いてる
Avatar
omochimetaru 5/19/2020 1:28 AM
cashが効くとビルドが要らないところが似てるな
Avatar
got a fatal error
1:38 AM
sigh
Avatar
omochimetaru 5/19/2020 1:39 AM
同じところですか?
1:40 AM
I think something different
1:40 AM
it's in sourcekit
Avatar
omochimetaru 5/19/2020 1:41 AM
あ、それ、俺も踏んだやつかも
1:41 AM
cmathのヘッダーがめちゃくちゃ出てます?
Avatar
yeah that's it
1:41 AM
is it something related to cmake/brew?
Avatar
omochimetaru 5/19/2020 1:42 AM
それです。↑昨日の21:46に書き込んだやつ
Avatar
みてくる!
Avatar
omochimetaru 5/19/2020 1:42 AM
消しまくって [omochi@omochi-iMacPro swift (master=)]$ brew list clang-format cmake gettext git ninja pcre2 にしたら直った。
1:43 AM
imagemagick, ffmpeg, cocoapods, carthage を消した どれが犯人かわからない (edited)
Avatar
時間がPDTだからわからないw
1:43 AM
えー、それは大変面倒
Avatar
omochimetaru 5/19/2020 1:43 AM
MacでPCL(Point Cloud Library)のサンプルをcmakeからビルドしようとしたときに次のようなエラーが大量発生したので原因を調べてみました。 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath:313:9: error: no member named 'signbit' in the global namespace using ::signbit; ~~^ /Appli...
1:43 AM
これ。
1:43 AM
ですよね〜
1:44 AM
@Yuta Saito 家庭君の brew list 見たい。 (edited)
Avatar
そもそもcmakeを使わずに自前でビルドコマンドを書けばいいという説。。
1:44 AM
🤔
Avatar
omochimetaru 5/19/2020 1:44 AM
まあこの記事で参考になったのは
1:45 AM
brewで入れるやつがシステムワイド(これもbrew)のcmakeに副作用を与える
1:45 AM
って知見が得られたという点だけっす
Avatar
なるほど
Avatar
omochimetaru 5/19/2020 1:45 AM
考えもしなかったから結構助かった
Avatar
$ brew list|wc -l 122
1:45 AM
つらい (edited)
Avatar
omochimetaru 5/19/2020 1:45 AM
brew list -1 かな?
1:46 AM
パイプだと-1か。
Avatar
いぇs
1:46 AM
cmake関係か、、
Avatar
omochimetaru 5/19/2020 1:46 AM
個人的に怪しかったのはimagemagickですけど、依存パッケージが大きいからどれなのかわからない
Avatar
cmake 3.17.2?
Avatar
omochimetaru 5/19/2020 1:47 AM
$ cmake --version cmake version 3.17.2 CMake suite maintained and supported by Kitware (kitware.com/cmake).
Avatar
$ find /usr/local -name 'cmake*' -type d|awk -F '/' '{print $5}'|sort|uniq cmake harfbuzz leptonica libxml2 msgpack qt sdl2 snappy
1:48 AM
うーん...?
Avatar
omochimetaru 5/19/2020 1:48 AM
おお、その探し方賢い
Avatar
彼らに見覚えありますか
1:49 AM
qtあやしい
Avatar
omochimetaru 5/19/2020 1:49 AM
sdl2も
Avatar
前ビルドできて今できないその間にいれた
1:49 AM
消すか
Avatar
omochimetaru 5/19/2020 1:49 AM
コピペして全消ししたから何が入ってたかわからんなあ
1:50 AM
shell historyからももう見切れちゃった
Avatar
全部消してもダメやん
Avatar
omochimetaru 5/19/2020 1:52 AM
リビルドが必要かも・・・?
Avatar
依存関係ぶっこわれたから入れ直す、、
Avatar
omochimetaru 5/19/2020 1:53 AM
build-script ... --clean
Avatar
ええ、、
1:53 AM
cmakeレベルであれってことか
Avatar
clean and try again...
Avatar
アイスは美味しい食べ物
2:18 AM
buildは終わらない
Avatar
qt と sdl2ではなかったことだけはわかった
2:29 AM
くっ
Avatar
/usr/local/lib/cmake を隠せばいいのか?
Avatar
あー、最近同じの踏んだ気がする… (edited)
2:39 AM
どうしたんだっけな…
Avatar
お。
Avatar
その時は急ぎでビルドしないといけなかったから先にincludeされてた MacOSX10.15.sdk をリネームして無理やりビルド通した気がする…
Avatar
ええっ (edited)
Avatar
omochimetaru 5/19/2020 2:48 AM
ww
Avatar
リネームしてたやつを戻したら再現したw
Avatar
cmakeぇ
Avatar
omochimetaru 5/19/2020 2:55 AM
家庭君もbrew空にするしかない・・・
Avatar
sourcekitまできた...
3:05 AM
どきどき
3:06 AM
あーだめだー
Avatar
sccache使うとイテレーション早く回せますよ
3:07 AM
2分くらいでビルドできる
Avatar
おお
Avatar
brewで色々入ってて何が原因かわからん…
Avatar
-- Found LibEdit: /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include (found version ".")
3:12 AM
これかなあ
3:13 AM
brewなのかなあ...?
Avatar
それだけCommandLineTools見てるんですよね
Avatar
そう。
3:13 AM
なんでやねん
3:13 AM
homebrewがcltつかってるからだと思うけれど。
3:14 AM
kateinoigakuくんさんに倣ってrenameした...
Avatar
ww
Avatar
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 5/19/2020 3:20 AM
$ brew list -1 の出力結果を全部 $ brew uninstall に突っ込むんや
Avatar
pkgconfigつかってんのかあ
3:20 AM
それかも
3:20 AM
cmake/modules/FindLibEdit.cmake
3:22 AM
$ pkg-config --cflags libedit -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/editline
3:22 AM
つらい
Avatar
omochimetaru 5/19/2020 3:22 AM
なるほど
Avatar
いた! /usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig/10.15/libedit.pc
Avatar
omochimetaru 5/19/2020 3:22 AM
libedit?
Avatar
brewがcltをつかってる→brewにpkg-configがはいってる→pkg-configがlibeditをcltのなかで見つけてくる
3:23 AM
そんな感じきっと。
3:23 AM
pkg-config消せばいいのかも。
3:23 AM
あるいは、cmake/modules/FindLibEdit.cmake をパッチする
3:24 AM
-Dでlibeditのincdir渡すとかでもいいのかも
3:24 AM
3:24 AM
本題のtest
Avatar
/usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig/10.15/libedit.pc を隠したらビルドできた
3:28 AM
テストは全部走らせると長いのでこれがおすすめです ./utils/run-test --build-dir ../build/Ninja-ReleaseAssert/swift-macosx-x86_64 test/stdlib/StringDeconstruction.swift
Avatar
Testing Time: 8.12s Expected Passes : 1
3:29 AM
Testing Time: 900.47s ******************** Failing Tests (2): Swift(macosx-x86_64) :: Python/update_checkout.swift Swift(macosx-x86_64) :: Python/python_lint.swift Expected Passes : 12961 Expected Failures : 26 Unsupported Tests : 220 Unexpected Failures: 2
3:30 AM
結局全部走った
Avatar
おー
Avatar
ちなみにmacOSは英語
Avatar
omochimetaru 5/19/2020 3:30 AM
Pythonのエラーはなんだ、python3?
Avatar
printenv LANG en_US.UTF-8
3:30 AM
Yes
3:30 AM
pythonはなんかpython
Avatar
omochimetaru 5/19/2020 3:30 AM
システムにpython3入ってるとその2つでコケる気がする
Avatar
The flake8 and flake8-import-order Python packages are required for linting, but these were not found on your system. You can install these using: python -m pip install flake8 python -m pip install flake8-import-order For more help, see http://flake8.pycqa.org.
Avatar
omochimetaru 5/19/2020 3:31 AM
あ〜それか。
Avatar
******************** TEST 'Swift(macosx-x86_64) :: Python/update_checkout.swift' FAILED ******************** Script: -- : 'RUN: at line 8'; /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python /Users/niw/Documents/Projects/apple/swift/utils/update_checkout/run_tests.py -- Exit Code: 1
3:31 AM
あとこれ
3:31 AM
パスがばれた
Avatar
そうするとlanguageが原因説が高いですね…
Avatar
omochimetaru 5/19/2020 3:34 AM
言語設定説来た?w (edited)
Avatar
まじかー
3:35 AM
terminal日本語にしてためそうか?
3:36 AM
正解w
3:37 AM
失敗したw
Avatar
omochimetaru 5/19/2020 3:37 AM
えw
3:37 AM
そんな簡単に試せるんですか
Avatar
ja プライマリにするとだめ
Avatar
omochimetaru 5/19/2020 3:37 AM
ウオオ
Avatar
[ FAIL ] StringDeconstructTests.deconstruct cocoa StringDeconstructTests: Some tests failed, aborting UXPASS: [] FAIL: ["deconstruct cocoa"] SKIP: [] To debug, run: $ /Users/niw/Documents/Projects/apple/build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/test-macosx-x86_64/stdlib/Output/StringDeconstruction.swift.tmp/a.out --stdlib-unittest-in-process --stdlib-unittest-filter "deconstruct cocoa" -- Command Output (stderr): -- /Users/niw/Documents/Projects/apple/swift/test/stdlib/StringDeconstruction.swift:22:7: warning: variable 'stackTrace' was never mutated; consider changing to 'let' constant var stackTrace = stackTrace.pushIf(showFrame, file: file, line: line) ~~~ ^ let /Users/niw/Documents/Projects/apple/build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/test-macosx-x86_64/stdlib/Output/StringDeconstruction.swift.script: line 1: 71979 Abort trap: 6 /usr/bin/env DYLD_LIBRARY_PATH='/Users/niw/Documents/Projects/apple/build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/lib/swift/macosx' LD_LIBRARY_PATH='/Users/niw/Documents/Projects/apple/build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/lib/swift/macosx:' SIMCTL_CHILD_DYLD_LIBRARY_PATH='/Users/niw/Documents/Projects/apple/build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/lib/swift/macosx' /Users/niw/Documents/Projects/apple/build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/test-macosx-x86_64/stdlib/Output/StringDeconstruction.swift.tmp/a.out -- ******************** Testing Time: 4.66s ******************** Failing Tests (1): Swift(macosx-x86_64) :: stdlib/StringDeconstruction.swift Unexpected Failures: 1 ERROR: command terminated with a non-zero exit status 1, aborting
Avatar
omochimetaru 5/19/2020 3:37 AM
それや!
Avatar
omochimetaru 5/19/2020 3:37 AM
草 やった〜
Avatar
すごい
Avatar
うそーん
Avatar
これの上下入れ替えるだけでダメ
Avatar
omochimetaru 5/19/2020 3:38 AM
@niw ↑ここに再現手順報告してもらえます・・・?
Avatar
おk
Avatar
CoreFoundationの中のICUがシステム言語を見てるってことか?
Avatar
あれ、これがこれ?
Avatar
bugsに上がってるのはvalidation-test/stdlib/StringUTF8.swift の方だ
Avatar
そっちやってみるか
Avatar
omochimetaru 5/19/2020 3:40 AM
こっち?
3:40 AM
ああ、すいません FAIL: ["deconstruct cocoa"] は SR-12835ですね
Avatar
どっちもだめだね
3:41 AM
同じ原因
3:41 AM
コメントしておくよ
Avatar
ほんとだenをプライマリにした途端通るようになった
Avatar
便利
Avatar
jaプライマリやめよ
3:49 AM
貴重なバグシグナルが
3:49 AM
おもちさんだけに...
Avatar
omochimetaru 5/19/2020 3:52 AM
ひどい
3:52 AM
逃げるな
Avatar
おもちさんだけがさいごのとりで
Avatar
がんばってください
Avatar
がんばってください
Avatar
omochimetaru 5/19/2020 3:53 AM
😂
3:58 AM
@niw 報告ありがとうございました!
😋 1
Avatar
windows向けCI壊れるとマージできないやんけ〜
12:40 AM
'S:/jenkins/workspace/swift-PR-windows/icu-64_2/lib64/icuuc.lib', needed by 'lib/swift/windows/x86_64/swiftCore.lib', missing and no known rule to make it
Build step 'Execute Windows batch command' marked build as failure
12:40 AM
ICUくん・・・
Avatar
@swift-ci Please smoke test Windows で再度実行してみてください。
Avatar
ほい!
12:44 AM
やりました ビルド壊れっぽいと思ったけど、調子悪いだけ系なのか
Avatar
他の bot では見てないので、一時的な物かもしれず。再度失敗したり他でも見たら教えてください
12:46 AM
IRGen/framepointer_arm64.sil が壊れてるのは既知
Avatar
なるほど。ちょっと他の見てて通ってるからそんな気がしはじめてた
12:46 AM
りんたろーさんってターミナルは英語ですか?
Avatar
ですねー。英語です。
Avatar
日本人だけがふむバグがあるらしい↑
12:47 AM
やっぱそうかあ
Avatar
深く追えてないですが、これってテストだけの問題ですか?それとも実コードでも問題出るはず? (edited)
Avatar
あー、その視点でチェックしてなかったです
12:50 AM
Stringの内部の表現をチェックしてたと思うけど、それがpublic apiに影響あるかどうか?
Avatar
locale によって isFastUTF8 の結果が異なる可能性がある?
Avatar
そうです
12:52 AM
withContiguousStorageIfAvailableって
12:52 AM
public apiだった気がする
12:52 AM
でもif available が前提条件をどう持つかによるのかな ダメなこともあるって常に想定する必要があるやつならセーフかも
12:53 AM
いやでもそれならテストケースがおかしいことになるから
12:53 AM
やっぱダメか?
Avatar
入力値に対して結果の保証をしないという選択をするなら、セーフ扱いになりそうですね。
Avatar
関数名のIfAvailableに込められた想い次第。
Avatar
うむ。来週あたりに担当チームに聞いてみます。
Avatar
おお、ありがとうございます!
12:57 AM
いまいつもtestが一個コケるから気持ち悪くてw
Avatar
とりあえず纏めて聞いてみます!
Avatar
omochimetaru 5/23/2020 1:38 AM
歯医者行ってました。 validationは普段はかけてないから1個で、validationもかけたら2個です。
👍 1
Avatar
omochimetaru 5/23/2020 1:45 AM
お、ここまで来た Failing Tests (1): Swift(windows-x86_64) :: IRGen/framepointer_arm64.sil
Avatar
関係ないエラーなのでマージしちゃってもいいと思いますよ。
Avatar
omochimetaru 5/23/2020 1:49 AM
そうします〜
Avatar
omochimetaru 5/23/2020 4:51 AM
ありゃ、 IRGen/framepointer_arm64.sil が Mac OS X でも落ちてて、 機械的にブロックされててマージできない・・・
4:51 AM
Split lines as they has only one expectation at object_literals_osx.swift, object_literals_ios.swift. It helps to review changes of diagnostics in future. This patch changes only line breaking of t...
4:54 AM
31987のマージをとりあえず待とう。 (edited)
Avatar
omochimetaru 5/23/2020 8:31 AM
31987が別のエラーでwinで落ちてるな これは長そうだ
Avatar
https://bugs.swift.org/browse/SR-12577 https://bugs.swift.org/browse/SR-12835 については 状況のシェアをお願いしたら "Will do!" って返ってきたのでそのうち JIRA に何らかアップデートあると思います。
😄 1
Avatar
will do
Avatar
omochimetaru 5/27/2020 4:08 PM
今は Swift(linux-x86_64) :: Runtime/linux-fatal-backtrace.swift が落ちてるみたいだな
5:57 PM
rdarをREQUIREに付けて実行外すのか、おしゃれ
Avatar
omochimetaru 5/29/2020 5:42 AM
This PR implements the syntax proposed in SE-0279, allowing an initial unlabeled trailing closure to be followed by an arbitrary number of labeled-closure postfixes. swift-syntax: apple/swift-synta...
😅 1
5:42 AM
acceptされた0279、PR見たら 👎 が6つも付いてた 😅
Avatar
👍 より👎 が多い😅 そして、 Reviewer が rintaro さんだ。
Avatar
omochimetaru 5/29/2020 5:48 AM
Rintaro先生は最近はXcodeのコード補完とかだから、この機能の開発もバリバリ関わっている
5:48 AM
(rejectされたバージョンのマルチ末尾クロージャの実装もしてた
Avatar
なるほど。
Avatar
omochimetaru 5/29/2020 5:50 AM
+1つけて6:6にしておいたw
👍 2
😅 1
Avatar
Yes, I agree it's a pain point. swift-driver has some instructions for dropping the new Swift driver into Xcode builds, but they're a little hard to follow. Further integration of swift-driver into the toolchain will make it easier. Doug
12:24 AM
このスレのおかげで最近ポコポコ出てたやつの全体像がわかった
Avatar
いままでswiftコンパイラビルドしたときにXcode ProjectのSchemeにswiftがなくて、なにか間違えてたと勘違いして何度もやりなおしてたんだけど、swift-frontend に変わっているのね。。。。kateiくんとの話ともやっとつながった
4:18 PM
これ気づかずに何十回もswiftコンパイラビルドし直してた(Edit Schemeのはなし) (edited)
Avatar
このdiscordでもちょくちょく話題に上がってたぽいしもう浦島太郎すぎる
Avatar
treastrain / Tanaka.R 12/25/2020 10:50 AM
失礼します。数日前から Raspberry Pi 4 Model B (armv7l) で Swift コンパイラのビルドを試しているところです。 Raspberry Pi に入れている microSD カードが 32GB のため、/swift/utils/build-script --release でビルドを試みています。 不足していると言われたライブラリを加えながら /swift/utils/build-script --release を実行しているところですが、どうしても -- armv7 ICU i18n INCLUDE: ICU_I18N_INCLUDE_DIRS-NOTFOUND -- armv7 ICU i18n LIB: ICU_I18N_LIBRARIES-NOTFOUND -- armv7 ICU unicode INCLUDE: ICU_UC_INCLUDE_DIRS-NOTFOUND -- armv7 ICU unicode LIB: ICU_UC_LIBRARIES-NOTFOUND と言われてしまい CMake Generate step failed. となってしまいます。
10:50 AM
@kateinoigakukun なるほど… っと……… あああああああああああああああああああああ
10:50 AM
sudo apt-get install icu-devtools libicu-dev で ICU はすでに入っているはずなのですが、何か見落としていると思われる点はありませんでしょうか。
Avatar
お、icu入れるだけじゃ駄目だったんですね
10:55 AM
pkgconfigでicu探してるはずなので、pkg-config icu-uc --libs で見つからなければ.pcがちゃんとした場所に入ってないとかがありそう
👀 1
Avatar
treastrain / Tanaka.R 12/25/2020 10:55 AM
そうだったんですよ /swift/utils/build-script --help を見ると android-armv7 では icu のパスを指定できそうな雰囲気を感じたのですが、linux-armv7 は違うんでしょうか…
Avatar
アンドロイドはクロスコンパイルしないといけないのでシステムのpkgconfigに依らない方法を提供するために手でパスを指定してたはず。。
👍 1
Avatar
treastrain / Tanaka.R 12/25/2020 10:57 AM
$ pkg-config icu-uc --libs -licuuc -licudata
11:01 AM
/swift/utils/build-script --release の結果はこのようになっています https://gist.github.com/treastrain/53ca52112bbc17aa90c234590179a819
Raspberry Pi 4 Model B (armv7l) で Swift コンパイラのビルドを試しているが、ICU が見つからないと言われてしまう - gist:53ca52112bbc17aa90c234590179a819
Avatar
ICUのパスがキャッシュされてる気がするのでCMakeCacheを消してもう1回試してもらっていいですか?
11:05 AM
build/Ninja-ReleaseAssert/swift-linux-armv7/CMakeCache.txt です
Avatar
treastrain / Tanaka.R 12/25/2020 11:06 AM
わかりました build/Ninja-ReleaseAssert/swift-linux-armv7/CMakeCache.txt を削除して /swift/utils/build-script --release してみます。
💪 1
Avatar
treastrain / Tanaka.R 12/25/2020 11:14 AM
-- armv7 ICU i18n INCLUDE: -- armv7 ICU i18n LIB: -- armv7 ICU unicode INCLUDE: -- armv7 ICU unicode LIB: のように見事 -NOTFOUND と表示されなくなり、実行が始まりました…! https://twitter.com/treastrain/status/1342427924603883521
Avatar
やったー
Avatar
treastrain / Tanaka.R 12/25/2020 11:15 AM
このまま見守ってみます。ありがとうございます 🙇‍♂️ 🙇‍♀️
Avatar
イエーイ 🙌
11:17 AM
NOT FOUNDがキャッシュ変数に入っちゃうのはビルドスクリプトがちょっと不親切だ…
Avatar
まじか
Avatar
treastrain / Tanaka.R 12/25/2020 11:30 AM
build/Ninja-ReleaseAssert/swift-linux-armv7/CMakeCache.txt の差分 (全6枚中前4枚)
Avatar
ほー
Avatar
お、ビンゴだったっぽい。
Avatar
てかなぜラズパイでswiftcというチャレンジングをしてるんですか
👀 1
11:31 AM
めっちゃきになる
Avatar
treastrain / Tanaka.R 12/25/2020 11:34 AM
ちなみに CMAKE_CXX_COMPILER:PATHCMAKE_CXX_COMPILER:STRING になったり… という変化もありました https://twitter.com/treastrain/status/1342433382949552128
build/Ninja-ReleaseAssert/swift-linux-armv7/CMakeCache.txt の差分 なぜかここ「CMAKE_CXX_COMPILER」「CMAKE_C_COMPILER」の PATH が STRING に変わったけど、これはどうしてだろう…?
11:36 AM
大学学部の卒業研究で Raspberry Pi + C++ のコーディングをしているのですが、「これ Swift で書いたらどうなるんだろう…?」という興味からビルドしています^^; https://github.com/uraimo/buildSwiftOnARM こちらを使っていたのですが、Swift 5.1.5 になってしまうので、せっかくなら 5.3 系を使いたいなぁ… と。
All you need to build Swift on a RaspberryPi or other ARM boards, updated to Swift 5.1.5 - uraimo/buildSwiftOnARM
Avatar
おお、研究からの好奇心。めっちゃえらい
Avatar
treastrain / Tanaka.R 12/25/2020 11:39 AM
🙇 ただ研究室で Swift 書いているのは私だけなので、卒業後に残すためにも C++ も書かないといけないという状況です^^;
Avatar
Kishikawa Katsumi 12/25/2020 11:48 AM
Raspberry PiでSwift使えると便利だと思うっす。持ち歩けるし。 ただ私ならクロスビルドにしてビルド自体はMacとかパワーのあるマシンでやるかも。
👏 1
Avatar
arm64のLinuxがあるご家庭ならクロスコンパイルが一番速そう
11:51 AM
arm macならdockerで上手いことクロスビルドできるのかな
Avatar
Kishikawa Katsumi 12/25/2020 11:52 AM
クロスビルドの問題を解決していく方が大変な気もする。時間かかるだけで素直にビルドできる方が結局は早いかも。。。
11:52 AM
クロスビルドで依存関係を揃えるのがね。。。大変そう。
Avatar
Raspbianのdockerイメージがあれば…
Avatar
Kishikawa Katsumi 12/25/2020 11:59 AM
あ、Raspbianか。OSはUbuntu入れてるものだと思って話してました。
Avatar
Raspberry PiってUbuntu動くんですね。それを知りませんでした 😲
Avatar
Kishikawa Katsumi 12/25/2020 12:11 PM
私は操作に慣れてるからUbuntu入れるんすけど結構選べるっぽい。
Avatar
よりどりみどり 😋
Avatar
treastrain / Tanaka.R 12/25/2020 2:08 PM
放っておいていたら失敗していました… https://twitter.com/treastrain/status/1342472168093884416
あれ… Raspberry Pi 4 Model B (armv7l) での Swift コンパイラのビルド、失敗……
Avatar
Avatar
Kishikawa Katsumi
あ、Raspbianか。OSはUbuntu入れてるものだと思って話してました。
treastrain / Tanaka.R 12/25/2020 2:13 PM
いまは Raspberry Pi OS (32-bit) を使っています。
Avatar
アドレスがアラインされてなくてtagged pointerが使えない?
Avatar
treastrain / Tanaka.R 12/25/2020 4:05 PM
なるほど…?
Avatar
treastrain / Tanaka.R 12/25/2020 4:22 PM
もう一度 /swift/utils/build-script --release を実行してみて、 0. Program arguments: /home/treastrain/Developer/Libraries/swift-source/build/Ninja-ReleaseAssert/swift-linux-armv7/bin/swift-frontend……… 1. Swift version 5.3-dev (LLVM bcee1b98f3b26c5, Swift dbcf7fe1bf76226) 2. Contents of /tmp/sources-c177c7: ………… 3. While evaluating request TypeCheckSourceFileRequest(source_file "/home/treastrain/Developer/Libraries/swift-source/swift/stdlib/public/core/KeyPath.swift") 4. While type-checking 'AnyKeyPath' (at /home/treastrain/Developer/Libraries/swift-source/swift/stdlib/public/core/KeyPath.swift:37:8) 5. While evaluating request SemanticMembersRequest(Swift.(file).AnyKeyPath@/home/treastrain/Developer/Libraries/swift-source/swift/stdlib/public/core/KeyPath.swift:37:14) 6. While type-checking protocol conformance to 'Hashable' (at /home/treastrain/Developer/Libraries/swift-source/swift/stdlib/public/core/Hashable.swift:104:8) for type 'AnyKeyPath' (declared at [/home/treastrain/Developer/Libraries/swift-source/swift/stdlib/public/core/KeyPath.swift:37:8 - line:193:1] RangeText="class AnyKeyPath: Hashable, _AppendKeyPath { ………… 7. While evaluating request AbstractGenericSignatureRequest(NULL, {τ_0_0}, {τ_0_0 : AnyKeyPath, τ_0_0 : Hashable}) <unknown>:0: error: unable to execute command: Aborted <unknown>:0: error: compile command failed due to signal 6 (use -v to see invocation) となってしまいました。 https://gist.github.com/treastrain/fa9b507b3a66ed578108b8a6c5330a0d (edited)
Raspberry Pi 4 Model B (armv7l) で Swift コンパイラのビルドを試しているが、「swift/stdlib/public/core/KeyPath.swift」でコケているように見える - gist:fa9b507b3a66ed578108b8a6c5330a0d
Avatar
Raspberry Pi 4 Model B (armv7l) で Swift コンパイラのビルドを試しているが、「swift/stdlib/public/core/KeyPath.swift」でコケているように見える - gist:fa9b507b3a66ed578108b8a6c5330a0d
Avatar
swift::Typeswift::LayoutConstraintNumLowBitsAvailable が実態にそぐわない値になっているっぽい動きなんですけど、それ以上はよくわからない‥
1:24 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
1:25 AM
あーなるほどわかった
1:26 AM
TypeとLayoutConstraintの実態はポインタを持つ構造体なんですけど、https://github.com/apple/swift/blob/949b0c0cc3632b0c278a33a4022dd280cf31215a/include/swift/AST/Type.h#L211
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
1:27 AM
32bitアーキテクチャだとポインタが4バイトでアライメントされるから
下位3ビットがTagged pointer向けに確保されてる
これを満たすことができない
(edited)
👀 1
Avatar
6:35 AM
32bit swiftは死んだの
Avatar
コンパイラが動かないだけなのでSwiftプログラムは動く
Avatar
昔対応してなかったっけ?
6:36 AM
ムム
6:36 AM
あー
6:36 AM
コンパイラが64ビットコードなのね
6:36 AM
クロスコンパイルはできるけどホスト32bitはダメなのか
👀 1
Avatar
そうそう
Avatar
でも4月ぐらいに
6:37 AM
ジョーダンがmac os9で動かしてなかった?
Avatar
あーエイプリルフールのやつ
6:38 AM
あれはコンパイラも動いてたのかな…? ランタイムライブラリをSwiftで書き直してるのは見たんですけど。
Avatar
あれもクロスコンパイルだったのか、、
Avatar
Kishikawa Katsumi 12/26/2020 7:40 AM
Raspberry Pi OSも一応ベータ版だけど64bit版あるみたい。でもUbuntu入れた方が簡単じゃないかな。 あと試行錯誤はRaspberry Pi上でやるよりもDocker使ってパワーのあるマシンでやった方が良さそう。
👀 1
7:40 AM
Ubuntuでもいいし、Raspberry Pi OSもDockerで動くっぽいし。
Avatar
大学学部の卒業研究で Raspberry Pi + C++ のコーディングをしているのですが、「これ Swift で書いたらどうなるんだろう…?」という興味からビルドしています^^;
7:51 AM
これに関しては岸川さんに同意ですね
7:51 AM
その目的のためならubuntuにした方が話が早そう
Avatar
Kishikawa Katsumi 12/26/2020 8:06 AM
で、Ubuntu入れるならSwiftはビルドする必要はなくて依存関係だけaptで入れてビルド済みのバイナリをダウンロードか、そもそもDocker使えばいいと思う。Docker使うならOSはLinuxならなんでもいいからUbuntu入れる必要もないかも。
Avatar
treastrain / Tanaka.R 12/26/2020 9:49 AM
みなさんありがとうございます。 実は Raspberry Pi OS (64-bit, beta) での Swift の動作経験はありました。
9:49 AM
卒業研究の中では Raspberry Pi Camera Module v2 がどうしても必要で、現行の Raspberry Pi OS (64-bit, beta) ではこれに非対応となっているため、32-bit の方で Swift コンパイラを試そうとしていたところでした。
9:50 AM
Raspberry Pi on Ubuntu の方はまだ試していなかったので、これからやってみようと思います。
Avatar
Kishikawa Katsumi 12/26/2020 10:05 AM
なるほどねえ。Camera ModuleはUbuntuでも動くっぽい情報があるので動いたらその方が良さそう。 (けっきょくある程度試行が必要ですね。。。😅
✅ 1
Avatar
treastrain / Tanaka.R 1/10/2021 8:45 AM
こんばんは。以前は Raspberry Pi での Swift コンパイラのビルドについて大変お世話になりました。またもう一度、みなさんのお力添えをいただきたくメッセージさせていただきます。 あれから結局、Raspberry Pi には Ubuntu 20.04.1 LTS (64bit) を入れ、Swift 5.3.2 を導入しました。 その上で swift package init --type executable で Swift と C++ の混合プロジェクトを作成し、C++ 側のコードから OpenCV を使用しようとしているのですが、「OpenCV 側のクラスが未定義」というエラーが返ってきてしまいビルドすることができずに困っています。 C++ 単体での OpenCV の利用の場合、 $ clang++ main.cpp -I/usr/local/include/opencv4 -lopencv_core でビルド・実行できるため、 $ swift run -Xcxx=-I/usr/local/include/opencv4 -Xcxx=-lopencv_core としてみたのですが、どうにもビルドできずに困っています。 オプションの指定の仕方が間違っていたり、何か別な方法があったりするでしょうか。 (edited)
Avatar
-lみたいなリンカオプションは-Xlinkerで渡さないと行けない気がします (edited)
Avatar
treastrain / Tanaka.R 1/10/2021 8:48 AM
$ swift run -Xcxx=-I/usr/local/include/opencv4 -Xlinker=opencv_core のような感じでしょうか
Avatar
そうですねー
Avatar
treastrain / Tanaka.R 1/10/2021 8:57 AM
ありがとうございます。試してみたのですが opencv_core が無いというエラーが返ってきてしまいました。C++ のみの場合で $ clang++ main.cpp -I/usr/local/include/opencv4 -lopencv_core は成功するのですが、この -lswift build-Xlinker では何か違いはありますか。 $ swift run -Xcxx=-I/usr/local/include/opencv4 -Xlinker=opencv_core /usr/bin/ld.gold: エラー: opencv_core を開けません: そのようなファイルやディレクトリはありません Sources/CXXWrapper/sources/cxx_lib.cpp:16: error: undefined reference to 'cv::Mat::Mat()' Sources/CXXWrapper/sources/cxx_lib.cpp:17: error: undefined reference to 'cv::Mat::~Mat()' 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) [3/4] Linking OpenCVSwiftCXX (edited)
Avatar
Avatar
treastrain / Tanaka.R
$ swift run -Xcxx=-I/usr/local/include/opencv4 -Xlinker=opencv_core のような感じでしょうか
あ、ちゃんと良く見てなかったです。 🙇 -Xlinker=-lopencv_core ですね
👀 1
Avatar
treastrain / Tanaka.R 1/10/2021 9:01 AM
$ swift run -Xcxx=-I/usr/local/include/opencv4 -Xlinker=-lopencv_core /usr/bin/ld.gold: エラー: -lopencv_core が見つかりません Sources/CXXWrapper/sources/cxx_lib.cpp:16: error: undefined reference to 'cv::Mat::Mat()' Sources/CXXWrapper/sources/cxx_lib.cpp:17: error: undefined reference to 'cv::Mat::~Mat()' 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) [5/6] Linking OpenCVSwiftCXX
9:03 AM
「opencv_core を開けません」から「-lopencv_core が見つかりません」に変化しましたが、解消できませんでした…。
Avatar
たぶん libopencv_core.so/usr/local/lib にインストールされてると思うので、 -Xlinker=-L/usr/local/lib も付けないとだめかな?
🙇 1
Avatar
treastrain / Tanaka.R 1/10/2021 9:18 AM
ありがとうございます!無事にビルドすることができました!! $ swift build -Xcxx=-I/usr/local/include/opencv4 -Xlinker=-L/usr/local/lib -Xlinker=-lopencv_core -Xlinker=-lopencv_imgproc -Xlinker=-lopencv_imgcodecs …省略
👏 1
Avatar
あと、pkgconfigを使っているのであればSwiftPM側にpkgconfigサポートがあるので、 .systemLibrary(...) をPackage.swiftに記述すれば swift build のオプション群は必要なくなると思います https://github.com/apple/swift-package-manager/blob/main/Documentation/PackageDescription.md#methods-5
The Package Manager for the Swift Programming Language - apple/swift-package-manager
Avatar
treastrain / Tanaka.R 1/10/2021 9:29 AM
なるほど…!OpenCV をビルドするときに OPENCV_GENERATE_PKGCONFIG を ON にし忘れた(はず)なので、pkg-config を使う方法は初めから考えていませんでした。ですがこの方法も試してみたいと思います 🙇
👍 1
Avatar
@swift-5.1.5 @swift-5.2.5 print(f("a")) let dict: [String: String] = [:] func f(_ s: String) -> String { dict[s] ?? s } // print(f("a")) // ここだとOK
Avatar
exit status: 1 with stderr:<stdin>:1:7: error: use of unresolved identifier 'f' print(f("a")) ^
Avatar
exit status: 11 with stderr:Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret - -disable-objc-interop -I /Libraries/.build/x86_64-unknown-linux-gnu/debug -I /Libraries/.build/checkouts/SwiftBacktrace/Sources/CSwiftBacktrace/include -I /Libraries/.build/checkouts/SwiftBacktrace/Sources/Clibunwind/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOSHA1/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOHTTPParser/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOAtomics/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOWindows/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIODarwin/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOLinux/include -module-cache-path /Libraries/.build/x86_64-unknown-linux-gnu/debug/ModuleCache -D DEBUG -Xcc -fmodule-map-file=/Libraries/.build/checkouts/SwiftBacktrace/Sources/CSwiftBacktrace/include/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/checkouts/SwiftBacktrace/Sources/Clibunwind/include/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux-gnu/debug/CNIOSHA1.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux-gnu/debug/CNIOHTTPParser.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux-gnu/debug/CNIOAtomics.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/checkouts/swift-nio/Sources/CNIOWindows/include/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux-gnu/debug/CNIODarwin.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux-gnu/debug/CNIOLinux.build/module.modulemap -module-name main -lLibraries 1. Swift version 5.2.5 (swift-5.2.5-RELEASE) 2. While running user code "<stdin>" /usr/bin/swift[0x50d8054] /usr/bin/swift[0x50d5b00] /usr/bin/swift[0x50d8320] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f6a4d396390] /usr/lib/swift/linux/libswiftCore.so($sSD8_Variant
Avatar
これってバグですか? 仕様? (edited)
9:48 AM
クラッシュしてるのはコンパイラですね 勘違い
Avatar
omochimetaru 7/9/2021 5:28 AM
swift % wc -l lib/AST/RequirementMachine/*.{h,cpp} 4415 total swift % wc -l lib/AST/GenericSignatureBuilder.cpp 9006 lib/AST/GenericSignatureBuilder.cpp ... does this mean I'm half way done?
5:28 AM
Motivation The GenericSignatureBuilder is used for four purposes: Answering queries against already-built signatures, such as &quot;compute canonical type&quot; and &quot;type conforms...
5:29 AM
例のジェネリクス解決が根本的に壊れてる問題の対応、 RequirementMachineってプロジェクトでやってるっぽい
Avatar
これシュッと解決するもんなんですか
5:30 AM
stdlibの型定義とか色々治さなきゃいけないだろうし後方互換性保つの難しいのではという感覚がある
Avatar
omochimetaru 7/9/2021 5:30 AM
元々の実装が、バグってるけど既存を解けるって状態を
5:31 AM
今まで解けなかったやつも解ける良い実装に置き換えるのであれば大丈夫そう
5:31 AM
本質的には計算不可能性が出現するっていう話があったけど、 そっちについては
The -requirement-machine-depth-limit and -requirement-machine-step-limit
↑こんなオプションが生えてるし、探索を諦めるようになるんじゃないか
Avatar
stdlibの型宣言が、今のバグに合わせた解になってるのは、また別の話になるのかな
5:31 AM
探索諦めるなら今のままかな
Avatar
omochimetaru 7/9/2021 5:32 AM
というより、今までの実装が、stdlibの実装を解けるようにチューニングされてるから
5:32 AM
stdlibの実装はそのままで良さそう
Avatar
順番が逆か
Avatar
omochimetaru 7/9/2021 5:32 AM
そうそう。
5:32 AM
コンパイラが落ちるコードが現れる→コンパイラを直す ってのを何回かやっていたとの話
5:33 AM
でも、いつまでたってもコーナーケースが無限に出てきて、よく考えたら解けない場合があるンゴねってなったっぽい
5:33 AM
探索空間の間違った方に進むと一生解けなくて、 ルートによっては収束するみたいなやつだから難しそうだけど
5:34 AM
幅優先的に、複雑性が低いところから巡回していけばなんとかなるんじゃないだろうか
Avatar
omochimetaru 7/23/2021 8:43 AM
error: Multiple commands produce '/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/llvm-macosx-x86_64/include/llvm/Support': 1) CreateBuildDirectory /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/llvm-macosx-x86_64/include/llvm/Support 2) That command depends on command in Target 'llvm_vcsrevision_h' (project 'LLVM'): script phase “Generate include/llvm/Support” warning: duplicate output file '/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/llvm-macosx-x86_64/include/llvm/Support' on task: PhaseScriptExecution Generate include/llvm/Support /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/llvm-macosx-x86_64/include/llvm/Support/LLVM.build/Release/llvm_vcsrevision_h.build/Script-7FD889A2C0CC1336ED00F240.sh (in target 'llvm_vcsrevision_h' from project 'LLVM') ** BUILD FAILED **
8:44 AM
うーんビルドできない
Avatar
omochimetaru 7/23/2021 8:51 AM
Build Preparation Build task concurrency set to 30 via user default IDEBuildOperationMaxNumberOfConcurrentCompileTasks note: Using new build system note: Building targets in parallel note: Planning build note: Analyzing workspace note: Constructing build description note: Build preparation complete error: Multiple commands produce '/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/llvm-macosx-x86_64/include/llvm/Support': 1) CreateBuildDirectory /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/llvm-macosx-x86_64/include/llvm/Support 2) That command depends on command in Target 'llvm_vcsrevision_h' (project 'LLVM'): script phase “Generate include/llvm/Support”
8:51 AM
--xcode だと駄目なのかな
8:53 AM
swift-5.4.2-RELEASE だめ swift-5.4.1-RELEASE だめ
8:59 AM
swift-5.4-RELEASE だめ あれえ〜
9:01 AM
error: using unsupported Xcode version: Xcode 12.5 Build version 12E262 Install one of: 12.2 beta 3 (12B5035g) 12.2 Release Candidate (12B5044c) 12.2 (12B45b) 12.3 (12C33) 12.4 (12D4e) 12.5 beta 3 (12E5244e)
9:01 AM
一応12.4でやってみるか
Avatar
omochimetaru 7/23/2021 9:25 AM
note: Using new build system note: Building targets in parallel note: Planning build note: Constructing build description Build system information error: Multiple commands produce '/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Debug/lib/libBlocksRuntime.dylib': 1) Target 'BlocksRuntimeStub-macosx-arm64' has link command with output '/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Debug/lib/libBlocksRuntime.dylib' 2) Target 'BlocksRuntimeStub-macosx-arm64e' has link command with output '/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Debug/lib/libBlocksRuntime.dylib' 3) Target 'BlocksRuntimeStub-macosx-x86_64' has link command with output '/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Debug/lib/libBlocksRuntime.dylib'
9:25 AM
同じようなエラーが違うところで出た
9:26 AM
複数ターゲットで重複してる感じだからこれは86だけにしたいな
Avatar
darwin-support-archsみたいなオプションがbuild-scriptにあったはず
Avatar
omochimetaru 7/23/2021 9:27 AM
--build-stdlib-deployment-targets BUILD_STDLIB_DEPLOYMENT_TARGETS A space-separated list that filters which of the configured targets to build the Swift standard library for, or "all". --swift-darwin-supported-archs ARCHS Semicolon-separated list of architectures to configure on Darwin platforms. If left empty all default architectures are configured. --swift-darwin-module-archs ARCHS Semicolon-separated list of architectures to configure Swift module-only targets on Darwin platforms. These targets are in addition to the full library targets.
9:27 AM
このへんか
Avatar
あーそれです
Avatar
omochimetaru 7/23/2021 9:28 AM
なんかいっぱいあるな・・・
Avatar
swift-darwin-supported-archsだ
9:30 AM
ビルド時間短縮するためにいつもこれ付けてました。 --swift-darwin-supported-archs=x86_64
Avatar
omochimetaru 7/23/2021 9:30 AM
macos- なくていいのか
9:30 AM
swift/utils/build-script --xcode --release --debug-swift --swift-darwin-supported-archs x86_64 --jobs 30 --clean
9:30 AM
もっかいやってみよう
Avatar
omochimetaru 7/23/2021 9:56 AM
5.4 だと調べたい内容がマージされてねえ。
Avatar
--debug-swift だと Generate\ stdlib/public/core/OSX/x86_64/Swift.o の遅さヤバいなあ
Avatar
結局いろいろハマってたのは SKIP_XCODE_VERSION_CHECK してたのがよくなくて
10:26 AM
Xcode12.4なら大丈夫みたいだ
10:26 AM
Xcode12.5は全然駄目っぽい
Avatar
omochimetaru 8/17/2021 4:53 PM
Hi Everyone, I've been working on SR-14273 for the last little bit. I've gotten to the point of having a working proof of concept (See this github branch: GitHub - gmittert/swift at upstream_runtimevw) and I'm hoping to get some feedback from the community so I can begin stabilizing and hopefully upstreaming the work. Many thanks to @Arnold who...
4:53 PM
このスレッドでValueWitness関数をバイトコード化するプロジェクトが公開されてる
4:54 PM
従来は型のコンパイル時にその型のValueWitness関数(copy, assign, destroy...)も生成してVWTに入れていたけど
4:55 PM
これは型ごとに関数を生成するのでコードサイズが大きくなってしまうし、
4:55 PM
ジェネリックな型の場合はフィールドのコピーとかするときにジェネリックパラメータの実際のメタタイプを取得する呼び出しが発生して重い
4:56 PM
そこでValueWitness関数を共通化して、型ごとにValueWitness ByteCodeを生成して、 その共通関数はByteCodeを読み取って実行する方式に変更する
4:57 PM
作業してる投稿主のGwenさんは、型のレイアウト情報をエンコードしたものをByteCodeとして使用しようとしているけど、
4:59 PM
Joe Groffさんがその設計にツッコミを入れていて、 trivialでないフィールドの存在位置だけを示せば良いと言ってる あとなんかオペコードみたいな仕組みにして、 enumのextra inhabitant関連では条件チェックして読み飛ばすオペコードとかを定義したらどうかとか。
5:00 PM
また、ジェネリック型も実行時には真の型を持ってるので、 ArcheTypeを示すByteCodeにするんじゃなくて、 その真の型に応じたByteCodeを生成してしまう事で、 ValueWitness実行時のランタイム関数呼び出しなどが無くせるという話も出てる
5:02 PM
また、これができると「同じVWByteCodeを持つ」型同士でValueWitnessTableを共有できるようになって、
5:02 PM
型が違ってもバイトレベルでは同じように扱える型を共通化できるようになる。
Avatar
かなり良いアプローチですね。これは期待できる
Avatar
omochimetaru 8/17/2021 5:04 PM
このタイミングにしてはなかなかド派手な変更だし、 ジェネリック型が入り組んでるときのコピーとかdestroyって結構重かったので、そこは効きそう
Avatar
たしかにVW関数はデカイんですよね
5:05 PM
ValueWitness実行時のランタイム関数呼び出しなどが無くせる
これ記述見つけられなかったんですけどどこらへんですか?
Avatar
omochimetaru 8/17/2021 5:06 PM
Instead of trying to represent generic parameters and resilient types indirectly, have you tried instantiating the layout bytecode for generic and resilient types when their metadata is instantiated? Another benefit of a bytecode representation is that we can generate new ones at runtime, and one of the big performance sinks for unspecialized code is deeply-nested unspecialized value witness calls through many layers of generic or resilient type expansion. We could instead flatten all of that indirection at metadata instantiation time.
Avatar
ああ、無くせるのはスペシャライズされてないメタタイプの取得か
Avatar
omochimetaru 8/17/2021 5:08 PM
many layers of generic or resilient type expansion を flatten at metadata instantiation time と読んだ
5:09 PM
VW ByteCodeのレベルだとコンパイル後の実行時であってもspecializeしたByteCodeを生成できる」と言い換えれると思う (edited)
Avatar
ふむふむ
Avatar
omochimetaru 8/17/2021 5:11 PM
ジェネリックなケースだとめっちゃ効きそうだけど、素朴に参照型一個持ってるみたいなケースだと遅くなりそうな気もするんだけどどうなんだろう
Avatar
バイトコードインタプリタをライブラリごとに静的にリンクして、OS同梱のランタイムのABIに露出させないみたいな話も出てるな
Avatar
omochimetaru 8/17/2021 5:12 PM
うん。そうしとけばしばらく仕様変更しながらアップグレードしていけるので
5:12 PM
この話、「ValueWitnesTableにVWFunctionが入ってる」のレベルだとABIが壊れないのがすげえと思った。
Avatar
関数になってて助かった
Avatar
omochimetaru 8/17/2021 5:13 PM
関数テーブルまでが仕様だから関数の実装は全く違うものにできる・・・
Avatar
Avatar
omochimetaru
ジェネリックなケースだとめっちゃ効きそうだけど、素朴に参照型一個持ってるみたいなケースだと遅くなりそうな気もするんだけどどうなんだろう
そのへんのトレードオフの境界は気になりますねぇ。まあ実際に図ってみるしか無い
Avatar
omochimetaru 8/17/2021 5:15 PM
まあそうか。 それにあれか、境界が明らかに下回るケースは従来どおり生成してしまうっていう手もありか。
Avatar
そうそう。インライン展開する関数の数の境界値みたいな (edited)
👆 1
Avatar
omochimetaru 8/17/2021 5:17 PM
基本事前コンパイルでネイティブバイナリを吐くSwiftに後付でこういうVMっぽいモジュールが入る話が出てくるの面白い。
Avatar
おもしろい
Avatar
新しいマシンでswiftcビルドしてて、なぜかインクリメンタルビルド遅いな〜と思ってログ見たら、swiftが入ってなかったせいでビルドの度に2-stageブートストラップすることになってた
11:44 AM
そりゃ遅いわけだという
Avatar
標準ライブラリのビルド?
Avatar
./SwiftCompilerSources のモジュール達
Avatar
ああ、optimizerとかのやつがそう整理されたんだ 読んでみよう
Avatar
omochimetaru 5/30/2022 9:05 AM
Condenses the -enable-experimental-cxx-interop and -enable-cxx-interop into the same flag. I spoke with @zoecarver about helping contribute to the cxx-interop project and this seemed like a good st...
9:05 AM
いろいろ見てたけどcxx-interop結構進んでて、フラグからexperimentalも外されそうとしてた
9:06 AM
壮大なテーマだしメリットはあるだろうけどAppleが頑張ってる動機はなんだろう
Avatar
アプリ作る側としては「Objective-C++を捨てたい」って気持ちがあるので、プリインストールアプリとか作ってる部署が求めてるとかは考えられそうですよね。 (実際どうなのか…)
Avatar
omochimetaru 5/30/2022 9:21 AM
ああ〜 なるほど。
9:22 AM
Objective-C じゃなくて、 Objective-C++のコード資産がある場合確かにそうですね
Avatar
SwiftUIの裏側のどこかもスタックトレース的に C++ っぽかった気がするしいろいろ Apple 自身も使いたさそうなシチュエーション持ってそう
Avatar
omochimetaru 5/30/2022 9:51 AM
SwiftUIそうなのか
Avatar
ランタイム情報舐めてるので。
9:52 AM
@Stateとかその辺
9:52 AM
そのへんでランタイムライブラリとコードを共有してるはず
Avatar
omochimetaru 5/30/2022 9:52 AM
ランタイムのC++ ABIをそのままC++経由で読み取ってるの?
Avatar
おそらく
Avatar
omochimetaru 5/30/2022 9:53 AM
ひょえ〜
Avatar
ABI/Metadata.hとかは使いまわしてるんじゃないかなぁ
Avatar
omochimetaru 5/30/2022 9:53 AM
まあ〜再実装するよりはそのほうがいいか
Avatar
あとC++ interopが欲しいシナリオ、Swiftcのセルフホストとか
Avatar
omochimetaru 5/30/2022 9:54 AM
段階的移行するならそれは必要だよね。でもセルフホストはそれ自体は労力の割に価値は大きくないみたいな昔の記述があるので。 (edited)
Avatar
まー、セルフホストまではしなくても、今のSILOptimizerをSwiftで書き直すみたいなのとか。
Avatar
libSwiftは実際進んでるしモチベーションあるのかな。
10:06 AM
コンパイラをSwiftで書くことのメリットとして、 Swiftに関心があるけどC++は詳しくない人がコントリビュートできるようになるというのがあるけど
10:07 AM
オプティマイザとか結構高難易度だから、取り組めるような人はC++も知ってる、って事が多そうであまり効果なさそうに思う
Avatar
あとはパーサも一部Swift実装に委譲されてるんですよ
10:07 AM
最近のRegexまわり
Avatar
すでに経験豊富なコンパイラチームの人たちが、Swiftで書けたらもっと開発しやすいってのはあるんかな
Avatar
Avatar
Yuta Saito
あとはパーサも一部Swift実装に委譲されてるんですよ
えっ、そうなんだ アーキテクチャややこしそう
Avatar
これはコンパイラの一部としてリンクされるけど、別リポジトリでSwiftPMパッケージとして開発が進んでる https://github.com/apple/swift-experimental-string-processing
An early experimental general-purpose pattern matching engine for Swift. - GitHub - apple/swift-experimental-string-processing: An early experimental general-purpose pattern matching engine for Swift.
Avatar
標準ライブラリとの関係はどうなってんだ?
10:09 AM
string-processingが標準ライブラリに依存してて・・・
10:09 AM
そもそもSwift から使うユーザー向けのRegex APIの部分はいいとして (edited)
10:09 AM
正規表現リテラルのパースは
10:10 AM
syntaxの解釈と衝突するから鶏卵問題になりそうな。
Avatar
なので、フルのコンパイラ+stdlibをゼロからビルドするのには何ステージかあるんですよ
Avatar
標準ライブラリとStringライブラリの実装してるSwiftコードが正規表現リテラルを含んでいなければいいのか、な (edited)
Avatar
細かいビルド時間がビルドの最後に表示されるようになってた --- Build Script Analyzer --- Build Script Log: /home/katei/ghq/work.katei.dev/swiftwasm-source/host-build/.build_script_log Build Percentage Build Duration (sec) Build Phase ================ ==================== =========== 50.9% 1838.55 linux-x86_64-llvm-build 29.9% 1079.17 linux-x86_64-swift-build 4.6% 166.47 Building swiftpm 3.3% 117.58 Building sourcekitlsp 2.1% 76.49 Installing swiftpm 2.0% 72.1 Building earlyswiftdriver
Avatar
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
12:35 AM
最近 [Freestanding] で task-to-thread model 向けの修正というのがされていて
12:35 AM
内容としてはconcurrency系の機能を無効にしてるだけ?に見えるんだけど
12:36 AM
task-to-thread modelがなんなのかわからなくて気になっている
12:36 AM
コード書いてる rokhinipさんは プロフィールが
Kernel and Runtime @apple
となっているので、
12:37 AM
macOS内部にSwift使おうとしてるんだろうか?
Avatar
task-to-thread model は一般的な概念というよりフリースタンディング環境向けに標準ライブラリをビルドする場合の分岐を指す造語な気がします. 以下の各コミットメッセージの 2 行目以下を読むと task-to-thread model がどういうものかという定義が書いてありましたよ.(すでに読まれていらっしゃるかもしれませんが) https://github.com/apple/swift/pull/59726/commits (edited)
Add a new task-to-thread concurrency model for use by freestanding, and disable task creation, global actors, MainActor, and custom executors there.
Avatar
task-to-threadってすごくわかりにくい名前ですよね。最初libdispatchでスケジューリングするんじゃなくてTaskごとにThread割り当てるのかなと思ってました。 (edited)
5:00 PM
実際は非同期なAPIが無い環境、つまりasyncな関数だったとしても中断せずに関数の最後まで1回の実行で到達することが保証できる環境で、syncなコンテキストからasync関数をlibdispatchにスケジューリングせず、今のスレッドでインラインに実行する、という感じだと思ってます。 (edited)
5:02 PM
このコミット面白い https://github.com/apple/swift/pull/59726/commits/34c08b834495b0c691bfc128a469fc61dc3894a4 public static func runInline(_ body: () async throws -> Success) rethrows -> Success (edited)
5:03 PM
Secure EnclaveでSwiftを動かしてるという話が今年のWWDCであったので、その辺のプロジェクトで使われてるんじゃないかなぁと推測 (edited)
Avatar
Avatar
kebo
task-to-thread model は一般的な概念というよりフリースタンディング環境向けに標準ライブラリをビルドする場合の分岐を指す造語な気がします. 以下の各コミットメッセージの 2 行目以下を読むと task-to-thread model がどういうものかという定義が書いてありましたよ.(すでに読まれていらっしゃるかもしれませんが) https://github.com/apple/swift/pull/59726/commits (edited)
omochimetaru 9/20/2022 9:14 PM
ありがとうございます
Avatar
Avatar
Yuta Saito
実際は非同期なAPIが無い環境、つまりasyncな関数だったとしても中断せずに関数の最後まで1回の実行で到達することが保証できる環境で、syncなコンテキストからasync関数をlibdispatchにスケジューリングせず、今のスレッドでインラインに実行する、という感じだと思ってます。 (edited)
omochimetaru 9/20/2022 9:17 PM
おお,そういうことか。 つまりTaskがスレッドに対応して、awaitが同期的な待機になるのか。
9:18 PM
async awaitがまだ計画しかなかったときに、その方法で擬似的にasync awaitスタイルをライブラリ実装したデモを見たけど、それと同じloweringをするわけだ
Avatar
omochimetaru 10/5/2022 6:39 AM
Via Xcode: utils/build-script --skip-build-benchmarks \ --skip-ios --skip-watchos --skip-tvos --swift-darwin-supported-archs "$(uname -m)" \ --sccache --release-debuginfo --swift-disable-dead-stripping \ --xcode
6:40 AM
久々に見たら難しくなってた
Avatar
https://forums.swift.org/t/compiling-swift-generics-part-i/60898 Slava 先生による Swift Generics 実装解説書 (edited)
Way back in 2016 I wrote a couple of (now mostly outdated) blog posts talking about how types and declarations are represented in the compiler, and at the time I promised a third installment which would discuss generics. A few of you have asked me about this over the years... Well, I finally got around to starting a write up about how generics ...
Avatar
おお
Avatar
SE-0283のタプルのEquatable conformanceのやつ、トラブってrejectされたままのやつ何があったのか調べてるんだけど
1:08 PM
Azoyさんがタプル Equatable のために実装した Builtin Conformance のコンセプトが、SE-0283実装がrevertされたにも関わらず、現在再導入されていて
1:09 PM
1:10 PM
A tuple type is Sendable when its element types are Sendable
1:10 PM
タプルのSendable Conformanceを導入するために復活していた
1:11 PM
言われてみれば必要だな感がある (edited)
Avatar
復活したのはコンパイラ側だけか
Avatar
Avatar
Yuta Saito
復活したのはコンパイラ側だけか
あ〜そういうことか、Sendableはmarker protocolだから、ランタイムにconformanceが要らない?
Avatar
ぽい
1:14 PM
IRGenもランタイムにもBuiltinProtocolConformanceの痕跡は残ってないですね
Avatar
実行時に動的に Sendable かどうか判定するようなコードって書けるんだっけ? (edited)
Avatar
@swift-5.7.3 func takeAny(_ v: Any) { print(v is Sendable) } class Box {} takeAny(1) takeAny(Box())
Avatar
Avatar
Yuta Saito
@swift-5.7.3 func takeAny(_ v: Any) { print(v is Sendable) } class Box {} takeAny(1) takeAny(Box())
exit status: 1 with stderr:<stdin>:2:11: warning: 'is' test is always true print(v is Sendable) ^ <stdin>:2:11: error: marker protocol 'Sendable' cannot be used in a conditional cast print(v is Sendable) ^
Avatar
protocol P { } struct S<T> {} extension S: P where T: Sendable {} func main(a: Any) { ... }
Avatar
Avatar
Yuta Saito
@swift-5.7.3 func takeAny(_ v: Any) { print(v is Sendable) } class Box {} takeAny(1) takeAny(Box())
普通にAnyからisでいいか。 (edited)
Avatar
warning: 'is' test is always true
嘘ワーニングだ
Avatar
<stdin>:2:11: warning: 'is' test is always true <stdin>:2:11: error: marker protocol 'Sendable' cannot be used in a conditional cast ↑2行で矛盾してて凄いな
1:18 PM
@swift-5.7.3 protocol P { } struct S<T> {} extension S: P where T: Sendable {} func main(_ a: Any) { if let p = a as? any P { print(1) } else { print(2) } } main((1, 2))
Avatar
Avatar
omochimetaru
@swift-5.7.3 protocol P { } struct S<T> {} extension S: P where T: Sendable {} func main(_ a: Any) { if let p = a as? any P { print(1) } else { print(2) } } main((1, 2))
exit status: 1 with stderr:<stdin>:3:1: error: conditional conformance to non-marker protocol 'P' cannot depend on conformance of 'T' to non-marker protocol 'Sendable' extension S: P where T: Sendable {} ^ <stdin>:5:10: warning: value 'p' was defined but never used; consider replacing with boolean test if let p = a as? any P { ~~~~^~~~ ~~~ is
Avatar
おおー
Avatar
おー なるほど conditional conformance の条件部分にもコンパイル時点で使えないから、実行時には判定するロジックを記述できないわけだ (edited)
Avatar
extension S: Sendable where T: Sendable なら実行時に見えるコンフォーマンス作らないからOKというわけか
Avatar
@swift-5.7.3 struct S<T> {} extension S: Sendable where T: Sendable {}
Avatar
Avatar
omochimetaru
@swift-5.7.3 struct S<T> {} extension S: Sendable where T: Sendable {}
no output
Avatar
conditional conformance to non-marker protocol 'P' cannot depend on conformance of 'T' to non-marker protocol 'Sendable'
1:20 PM
↑これ英文間違ってない?
1:21 PM
最後のところ marker protocol 'Sendable' じゃないのか?
Avatar
間違ってそう
Avatar
ここでやりたいルールはおそらく マーカープロトコルに準拠する条件ならマーカープロトコル準拠を使っていいが、 ノンマーカープロトコル(通常のプロトコル)に準拠する条件として、マーカープロトコル準拠を使うことはできない、 だよね。 (edited)
Avatar
https://github.com/apple/swift/pull/36070 ここで実装したっきり間違ってそうだな
Make both Error and CodingKey conform to ConcurrentValue, so that thrown errors always conform to ConcurrentValue. Downgrade (to warnings) and ConcurrentValue-related diagnostics that are triggered...
1:24 PM
一通り調べ終わったらPR出してみようかな
1:28 PM
Sendable、ギリギリのところで実現してるなあ
1:28 PM
SE-0283はcompatibilityフックの実現で問題があったみたいなんだけど
1:29 PM
Sendable判定は実行時にできないということは、その問題は先送りにされてるんだな。 SendableができてるならEquatableもいけるんじゃないかと思ったけど。
Avatar
バックデプロイ問題なんでしたっけ
1:32 PM
確かそんな話あった気がするけど全然覚えてないな‥
1:33 PM
最後のコメントが、それに関するコメントなんだよね
Avatar
あー、思い出した
Avatar
実行時には、OSの提供する関数をまず探して、見つからなかったらバイナリに埋め込んだ関数を使う、って挙動にしてね、今はそうなってないっすね、って話かと思う
Avatar
コンフォーマンスが静的に参照される場合に備えて、コンフォーマンスはリンク時にシンボル参照できる必要があって、
1:38 PM
古いランタイムはそのシンボルを持っていないので、compat静的ライブラリがシンボルを提供するんだけど、compatライブラリをリンクしたバイナリと新しいランタイムの組み合わせのとき、すでにシンボルが静的リンク時に解決されてしまっているので、実行時にランタイム側のシンボルを見に行かないんだ
Avatar
ふむふむ、なるほど
1:43 PM
通常のランタイム関数と違うのは、コンフォーマンス定義メタデータを、実行前に静的に解決する状況があるところか
Avatar
ですね
Avatar
コンフォーマンス定義メタデータの中に入ってる(?)、実際のrequirement functionへのポインタを、 compat libraryが提供する実装では、新しい実装を探してきてポインタを置き換える実装にしておく、とかはできないのかな?
Avatar
なので、古いランタイムをサポートするバイナリを作るときは常に swift_conformsToProtocol を使って取得するようにするとかかなぁ
Avatar
Avatar
omochimetaru
コンフォーマンス定義メタデータの中に入ってる(?)、実際のrequirement functionへのポインタを、 compat libraryが提供する実装では、新しい実装を探してきてポインタを置き換える実装にしておく、とかはできないのかな?
ctorで差し替えるのはありかも
Avatar
Avatar
Yuta Saito
ctorで差し替えるのはありかも
初回呼び出し時に置き換えるイメージだったけど、まあロード時でもいいか。
Avatar
あー、PLT的なのをSwift側で独自に持つ (edited)
Avatar
PLTって何?
Avatar
Procedure Linkage Tableっていう遅延動的リンクのための機構ですね
Avatar
PLTとGOTが何だったか今までに何回も検索したので, 忘れないよう自分なりにまとめておくことにしました. TL;DR PLTとGOTは共有ライブラリ関数
1:54 PM
PLTはGOTの対応するエントリが示すアドレスへジャンプする.初回の呼び出し時は, PLTにあるリロケーション処理のアドレスが設定されている.
あ、そうそう、こういうイメージだった
Avatar
合ってた ✌️
Avatar
これ、初回呼び出しで動的リンクをした後は、解決されたアドレスをGOTに保存して、PLTはGOTを参照する処理に差し替えるって話になっているけど
1:57 PM
解決されたアドレスをいきなりPLTに書き込んじゃえば2回目以降のジャンプを1段減らせないのかな? PLTはシングルトンではない・・・? (edited)
Avatar
あれ、そこ2段のままなんでしたっけ、1段になる認識でした
Avatar
2回目以降の呼び出し 実行ファイルがPLT内のエントリを呼ぶ. PLTはGOTが示す共有ライブラリの関数へジャンプする.
このブログを読んでるだけだけど、そう見える
Avatar
そこまで実装に踏み込んで調べたこと無いんで分からないけど、GOTのエントリがPLTのスタブから実態に差し替わるんじゃなかったかなぁ
Avatar
ldはglibcからputsのアドレスを解決した後,そのアドレスをputs@got.pltに書き込みま す.その後,glibcのputs本体にジャンプします. 2回目のputsの呼び出しでputs@got.pltの中身を調べると,下記の通り, puts本体のアドレスが設定されていることがわかります.
いや、後半の詳細な解説の中身を読むと、1段になったように読めるな
(edited)
2:01 PM
最初の解決時に一度GOTを経由するのはあれか、動的リンカの責務をそこで一回切ってるのかな? (edited)
Avatar
そうですね、GOTとPLTを作るところまでは静的リンカのお仕事 (edited)
Avatar
PLTとは関係なく、 dlsym とかを直接使う場合もあるから。
Avatar
dlsym を使う場合はどうなるんだっけ
Avatar
dlopen したときに動的リンカが動作してGOTを更新してくれて、 dlsym は GOTのエントリを返り値として返すのかなと想像した
2:05 PM
例えば puts を 自力で dlopen するようなコードを書いていた場合、 自力のdlopenと、コンパイラが生成したPLT経由のputsの呼び出しの2つの初期化経路が存在していて
2:06 PM
動的リンカの仕事としてはGOTにアドレスを書き込むところまででインターフェースが切れてれば、 どっちの経路から先に動的リンクしても、 後続の経路での動的リンクのフェーズでは処理がスキップできてうまく動いて良いのかなと思った (edited)
Avatar
あー、なるほどー、そういう見方が
2:09 PM
.dynamic セクションにシンボル名とGOTオフセットの対応情報が入ってるらしい
2:13 PM
その後色々あってGOTエントリへのポインタがdlsymで返ってそう https://github.com/bminor/musl/blob/8f9259450aa43a6fd539e428e61e2961b725fbae/ldso/dynlink.c#L2275 (edited)
Avatar
dlopenって結構ユーザーレベルコードで書かれてるんだな
2:22 PM
普通にファイルとしてopenして、fd取ってreadで読んで struct dso にマップしていくのか じゃあ普通に動的ライブラリのバイナリレイアウトを読んでるだけなのか
2:24 PM
シンボル取ってくるところも別に一度読み込んだバイナリのデータ構造を触るだけか
Avatar
そうですね、そのへんは全部ユーザランドで済んでるんですよね
Avatar
めっちゃ意外だった もっとOSの力が要るのかと
2:27 PM
/* Search for the name to see if it's already loaded */ for (p=head->next; p; p=p->next) { if (p->shortname && !strcmp(p->shortname, name)) { return p; } }
2:28 PM
static struct dso ldso; static struct dso *head, *tail, *fini_head, *syms_tail, *lazy_head; static char *env_path, *sys_path;
2:28 PM
2回読み込まない仕組みも、static変数で作ったグローバル変数の head とか tail でリストにしてあって、そこから探すだけ・・・
Avatar
OSの力が居るのはメモリ空間の確保とローダの起動までだったはず。
2:29 PM
すごい素朴だ
2:30 PM
いやでもこれmuslなんで、glibcだともっと難しいことやってるかも (edited)
Avatar
なるほど
2:34 PM
実装眺めてたら素朴に自力でdlopenやらでハックするのも全然ありだなという気持ちになった
Avatar
Sendableの話から随分遠くまできたなw
2:37 PM
他のcompatライブラリもdlsymで新しいランタイムの実装の有無チェックしてるんで、アリな気がする
Avatar
タプルのEquatable等のために、いろんなメタデータをアセンブリ (asm) で直接構築してるのはなぜなんだっけ・・・ Swift.Int とかのメタデータと何が違うんだ? (edited)
Avatar
まあコンパイラでそういうコードを吐くようにすればいい、というのも手なんですが、stdlibビルドするときにしか使われないパスを入れるのはなぁ
Avatar
例えば Swift.IntEquatable に対するconformanceは stdlib には含まれてない?
Avatar
含まれている
Avatar
ああ、違うか、それは入力がSwiftで書かれた記述なのか
Avatar
へい
Avatar
既存の実装は Swiftのコードを変換していろいろあって IRGen のところでメタデータをバイナリとして出力する仕組みで、
Avatar
一般のタプル(個数や型に依存しない)に対してコンフォーマンスを生成しないといけないけど、Swift上の宣言表現が無い (edited)
Avatar
tuple conformanceはその入力に当たる概念をSwiftで書く文法が無いのか
3:13 PM
ただ、アセンブリで書く場合、 #if defined(__arm__) " .section __DATA, __nl_symbol_ptr, non_lazy_symbol_pointers\n" #elif defined(__i386__) " .section __IMPORT, __pointers, non_lazy_symbol_pointers\n" #endif (edited)
3:14 PM
こういう感じで、ターゲットアーキテクチャを気にして分岐しまくってるけど、
3:15 PM
IRGenコードがSwiftコード由来のメタデータを吐く部分ってこういうの気にする必要あるんだっけ?
Avatar
基本的にはLLVMが面倒見てくれるので必要無いが、ちょこちょこある
Avatar
なるほど
3:17 PM
LLVM-IR層で切り替えてくれる部分の恩恵が得られるし、多少のちょこちょこしたやつは、IRGenライブラリにいろんなヘルパーが既にありそうに思うんだよな (edited)
Avatar
コンフォーマンスを作るのはコンパイラに任せてしまって、Tuple.==のwitness methodの実装だけC++で書くのはありだと思う
3:19 PM
でもなんでCでコンフォーマンスのデータ構造表現できないんだっけな
Avatar
静的リンク時にrelative pointerの計算をさせたりするから? (edited)
3:21 PM
" .globl " TUPLE_HASHABLE_CONF "\n" " .p2align 2\n" TUPLE_HASHABLE_CONF ":\n" // This is an indirectable relative reference to the GOT entry for the // Hashable protocol descriptor. " .long " INDIRECT_RELREF_GOTPCREL(HASHABLE_DESCRIPTOR_SYMBOL) "\n" // 769 is the MetadataKind::Tuple " .long 769\n" // This indicates that we have no witness table pattern. We use a generic // witness table for builtin conformances. " .long 0\n" (edited)
3:22 PM
// 64 bit arm MachO #if defined(__aarch64__) #define INDIRECT_RELREF_GOTPCREL(SYMBOL) SYMBOL "@GOT - . + 1" (edited)
3:22 PM
こういうのがCで書いた定数としては表現できない
Avatar
struct ProtocolConformance { int f0; }; void *TupleEquatable_witness_method(void); static struct ProtocolConformance TupleEquatable = { .f0 = (void *)&TupleEquatable - (void *)TupleEquatable_witness_method, };
3:24 PM
これcompile-time constantじゃないのかー foo.c:8:9: error: initializer element is not a compile-time constant .f0 = (void *)&TupleEquatable - (void *)TupleEquatable_witness_method, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated.
3:24 PM
いや、セクション跨いでるからそりゃそうか
Avatar
その発想面白いな
3:26 PM
C言語にlink timeのセマンティクスがあれば良かったのか
Avatar
位置独立でリードオンリーなデータをコードセクションに配置できるという知識がコンパイラにあればw
3:28 PM
当然 __attribute__ ((section ("__TEXT, __const"))) みたいなのを付けてもコンパイラはcompile-time constantとみなしてくれない 🥲
Avatar
asm文は、LLVM-IRは書けないの?
Avatar
たしか書けなかった気がする
Avatar
そうかあ
Avatar
アセンブリだとターゲット依存すぎるし、Cだと制約が強いし、中間が。。。
Avatar
絶妙にやりづらいんだなあ
Avatar
Way back in 2016 I wrote a couple of (now mostly outdated) blog posts talking about how types and declarations are represented in the compiler, and at the time I promised a third installment which would discuss generics. A few of you have asked me about this over the years... Well, I finally got around to starting a write up about how generics ...
Avatar
omochimetaru 11/8/2022 5:40 PM
なんか圏論みたいだな〜と思いながら読んでたら圏論が出てきた 置換表を射とするジェネリックシグネチャの圏が構成できるそうです
5:40 PM
圏論がでてきた
Avatar
読み終わった。まだ Part 1: Nuts and Bolts しか書かれてなかった。 (edited)
12:27 AM
Part 1はコンパイラ内部のコンポーネントや概念を説明していて、Part 2ではもうちょっと踏み込んだアルゴリズムとかを説明して、Part 3で Requirement Machine の解説がなされる予定っぽい。
12:29 AM
英語はわりとやさしいんだけど内容が難しくて何言ってるかわからないところも多かったのでコンパイラソースの方を見ていこうと思う
6:01 PM
ValueWitnessFunctionを型ごとにコード生成する代わりに、 共通の万能関数を一つ用意して、その関数に、型のレイアウト情報をエンコードした type layout string を流し込むことで、Value Witnessを実現するアイデアの実装
6:05 PM
↑なんか文字読んでそれに応じた開放処理をやってるあたり
6:05 PM
resilientな場合は型のmangle名が入ってて、swift_getTypeByMangledNameInContext でmetatypeをロードして処理してる。
6:06 PM
実行時性能が少し落ちる代わりにコードサイズを小さくする選択肢を提供できるとのこと
6:12 PM
これある意味ちょっとしたスクリプト処理系がランタイムに入ってるようなもので、面白い
Avatar
いやーエグいなーこれ TypeDecl::getDeclaredInterfaceType()TypeDecl::getInterfaceType() -> getMetatypeInstanceType()InterfaceTypeRequest::evaluate()MetatypeType::get(NominalTypeDecl::getDeclaredInterfaceType()) (edited)
8:29 PM
TypeDeclはinterface typeを剥がす動作をしてるのに、 Interface Type Requestを挟んで、 NominalTypeDeclはdeclared interface typeをラップする動作に反転してるし、 NominalTypeDeclはTypeDeclを継承しているのに、 virtualメソッドじゃないから同名だけど特に関係なく実装されている
8:30 PM
lib/AST は全然 virtual 見かけないし、基本的に仮想関数呼び出しは使ってないっぽいな
Avatar
この前の Sendableのエラーメッセージがおかしいやつ https://discord.com/channels/291054398077927425/472019265369669634/1034818940762861619 パッチ出して直った https://github.com/apple/swift/pull/61990
Current: protocol P { } struct S<T> {} extension S: P where T: Sendable {} // Conditional conformance to non-marker protocol 'P' cannot depend on conformance of 'T' to non-mar...
Avatar
generic signatureの設計的なところはわかったが、実際にtype checkする時にどういう手順で評価していくのかがよくわからないなあ
8:21 PM
型推論との兼ね合いもよくわからない
8:22 PM
全ての部分式にcontextual generic signatureが存在している?
8:24 PM
式に付随してるsignatureはスキーマの方で、applyされてる方はsubstituionか?うーんよくわからない
Avatar
TypeBase::getContextSubstitutionMap これか? あー式のtypeから一意に復元できるんかな。
Avatar
omochimetaru 12/8/2022 9:07 AM
GenericParamList が outerParameters をチェーンできるようになっていて、 ネストしたジェネリック型のextensionのみにおいて利用するらしいんだけど、 なんでそんなものが必要になるのかがいまいち読んでてもわからない
9:08 AM
ExtensionDeclから 拡張対象の NominalTypeDecl に飛べるんだから同じようにできないのかな
Avatar
omochimetaru 12/8/2022 5:04 PM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
5:04 PM
swift compiler内部のswift実装の中でcxx interop使われてた。
12:16 PM
これ面白かった。 我々に身近な arm64 が難しいって書いてあって何かと思ったら、 ジャンプ先が遠い時のサンクを挿入するその操作自体がアドレススペースをズラすので、それでサンクが届かなくなる場合があるらしくて、たしかに難しいわ。
12:19 PM
それにしても、moldのターゲット依存コードの行数の少なさは凄まじいですね。かなりきれいな設計になってそう。
Avatar
おー、arm64はそういう複雑さをリンカに押し付けてるのかー
Avatar
Avatar
Yuta Saito
おー、arm64はそういう複雑さをリンカに押し付けてるのかー
リンカー(やコンパイラ)と処理系の設計のトレードオフがあるの面白いね
12:24 PM
どっちかをシンプルにするにはどっちかが複雑になる
Avatar
ISAが複雑さを吸収してほしい
12:26 PM
(つまり自分で考える必要のある範囲外に押し付けたいだけ。。)
Avatar
ハードウェアは変更が効かないし、事前にソフトウェアで頑張れる部分が多いほうが改良の余地が大きいし全体としては効率的なんだろうな
12:28 PM
ソフト側だけ面倒見てる人が大変なのはそれはそう
Avatar
そうですねぇ。
12:31 PM
しかしrelocationの仕組みはもう少しどうにかならないのかなぁ。
Avatar
アーキテクチャごとにいろいろあってカオスだね
Avatar
各々が欲しい機能をいれてカオスになってるリスト https://github.com/rui314/mold/blob/339b1b470433048073c871de6cb2912e078701de/elf/elf.h#L376-L1217
Avatar
一個のアーキテクチャでもかなりカオスだな
Avatar
x64 もアドレスジャンプ届かない範囲あるのか
Avatar
x64にはないんじゃない?
Avatar
相対ジャンプだと即値に32bitしか取れないんで、クソデカ実行ファイルならありうる?
Avatar
あ、arm64 か。そして x64 も理屈上は届かないこともあるのか
Avatar
Avatar
Biacco42
あ、arm64 か。そして x64 も理屈上は届かないこともあるのか
記事に書いてあるのはarm64は命令が32bit固定だから、1命令では32bit空間でジャンプできないという話やね(2命令使う) (edited)
Avatar
RISC だとまぁ固定長だからそれはそう
12:51 PM
とはいえ未だにモダンなアーキテクチャでもジャンプ一発で行けないは残ってるんだなぁ
12:51 PM
命令語長くなるとやっぱり命令デコーダがデカくなるから無理なのかな…
Avatar
まあマーケット的にはarmが勝ったよね。
12:54 PM
スマホで勝ったのは電力効率が一因だから可変命令長アーキテクチャは微妙なんじゃないかなあ (edited)
12:55 PM
RISC-Vはarmの次と言われてるけど、ジャンプも工夫があるようで面白いね
ジャンプ先が1命令で到達可能だったら、リンクは2命令を1命令に書き換えるルールになっており、Range Extension Thunkとはある意味逆。
naruhodo 1
Avatar
おー、書き換えて後ろにnopを挿入?
Avatar
それか全部ズレるのか?記事だけではわからず
1:01 PM
As this transformation may delete bytes (and thus invalidate references that are commonly resolved at compile-time, such as intra-function jumps), code generators must in general ensure that relocations are always emitted when relaxation is enabled.
1:01 PM
なるほどー、本当に1命令消してズラしてしまうらしい。
naruhodo 1
1:03 PM
コンパイラが作るオブジェクトファイルが相対位置を焼き込んでいる場合、削除によって相対位置がずれるけど、このLinker Relaxationというリンカによるsimplificationが有効な場合ではコンパイラはコンパイル時に決定可能な相対オフセットであっても再配置レコードを発行するらしい。
1:04 PM
これは賢い
Avatar
omochimetaru 1/25/2023 1:05 PM
コード生成側で縮む事に備えるのね
Avatar
全然関係ないけどasciidocで書かれてるんだ
Avatar
A problemtic code. GitHub Gist: instantly share code, notes, and snippets.
9:18 PM
本日の発見
9:19 PM
block を inout するといろいろおかしくなる (Swift 5.8 だとランライムでクラッシュ、Swift 5.9 だと assertion crash) Swift 5.7 は大丈夫だったっぽい
Avatar
こんなシンプルなので壊れるのがまだ残ってるんですね
Avatar
前はクラッシュしなかったから、むしろ増えたのかも。
Avatar
// function_ref closure #2 in f() %16 = function_ref @$s1a1fyyFyyyczXEfU0_ : $@convention(thin) @substituted <τ_0_0> (@inout τ_0_0, @guaranteed String) -> () for <() -> ()> // user: %18 retain_value %14 : $String // id: %17 %18 = partial_apply [callee_guaranteed] [on_stack] %16(%14) : $@convention(thin) @substituted <τ_0_0> (@inout τ_0_0, @guaranteed String) -> () for <() -> ()> // users: %22, %19 %19 = mark_dependence %18 : $@noescape @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <() -> ()> on %14 : $String // user: %21 %20 = class_method %6 : $Box<() -> ()>, #Box.mutate : <T> (Box<T>) -> ((inout T) -> ()) -> (), $@convention(method) <τ_0_0> (@noescape @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <τ_0_0>, @guaranteed Box<τ_0_0>) -> () // user: %21 %21 = apply %20<() -> ()>(%19, %6) : $@convention(method) <τ_0_0> (@noescape @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <τ_0_0>, @guaranteed Box<τ_0_0>) -> () dealloc_stack %18 : $@noescape @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <() -> ()> // id: %22 release_value %14 : $String // id: %23 release_value %14 : $String // id: %24 strong_release %6 : $Box<() -> ()> // id: %25
5:49 AM
Swift 5.8だと、%14 = inout のブロックに渡してる s が2回 release されることでクラッシュですね... SIL の時点でおかしい (edited)
Avatar
blockにretainされなきゃいけないから、releaseは1回だけしか呼んではいけないはず...
Avatar
SwiftParserについてキャッチアップ中ですが、swiftc内ではParseに関してもうC++ではなくSwiftParserの実装を使ってるで合ってますか?swiftcのParserでは #if SWIFT_SWIFT_PARSER のフラグでSwiftParser+ASTGenを使い分けてるけど、Macroのテストでは REQUIRES: swift_swift_parser で常に使ってるように見えるので。C++のParser.cpp等は念のためか特定の用途のために残してるのかな。 (edited)
Avatar
現状コンパイルのメインのパーサーは元々の C++ (lib/Parse) です。マクロの展開が要求されたときに SwiftParserがオンデマンドで走ってSwiftSyntax ツリーとしてパースされ、マクロの実装に渡すようになってます。なので libParse と SwiftParser の両方が走るので効率悪いです。当然将来的には SwiftParser で libParse を置き換えて SwiftParser に統一することを目指してます。
5:47 AM
テストでの REQUIRES: swift_swift_parser は SwiftParser が有効になっている時にだけ実行されるテストで、フラグがある通り全てのビルドで有効になっているわけではありません。具体的には Linux, Windows など Darwin 以外では様々な理由で有効にできていません。 (edited)
5:47 AM
なので現状 Linux, Windows では SwiftParser が必要な機能であるマクロは使えないです。
Avatar
回答ありがとうございます!そしたら認識逆でした。さっき過去ログ読んでるときにLinuxでマクロ使えないの見たけどそれ関連ですか。 (edited)
5:51 AM
libParseとSwiftParserはコードの2重管理してるんですか?libParseの直近の最新変更が3ヶ月前なので、新しいコードはSwiftParserに足して本格稼働するまで実行だけlibParseかなと勘で思いました。 (edited)
Avatar
はい、絶賛2重管理してますよ。libParse も SwiftParser もアクティブに更新してます。 https://github.com/apple/swift/commits/main/lib/Parse https://github.com/apple/swift-syntax/commits/main/Sources/SwiftParser
Avatar
それは大変だ... ただ移行期間は仕方なしですね。
Avatar
Swift における reference count コストってどれくらいなんだろう。
11:26 PM
Objective-C なら objc_msgSend() のコストがめっちゃ高いとかで無視できるレベルだったけど、Swift だとそうでもないとかあるのかな。
11:26 PM
アプリケーションの規模には影響うけるだろうけれど。
Avatar
omochimetaru 7/10/2023 2:39 AM
関数呼び出しとCAS命令1発分ぐらいという理解
Avatar
ARCがめっちゃ賢くて最適化すると結構なretain/releaseが消えるとかあるのかな
2:40 AM
(SwiftのARCの実装わかってない)
Avatar
omochimetaru 7/10/2023 2:40 AM
実行時は無いけどコンパイル時に消す最適化はいろいろあるみたいですね
Avatar
やはり。
Avatar
omochimetaru 7/10/2023 2:41 AM
SILでいうと copy_value のオペランドが参照型の時 strong_retainstrong_release が生えて、その後最適化で冗長なやつは消える (edited)
👀 1
Avatar
なるほど
Exported 2,262 message(s)
Timezone: UTC+0