応用問題として、Passに関係ある話題を演習としておいておきます
応用課題: コンパイラにPassを登録しよう。ついでにコンパイラにオプションつけよう
さて、このWaiWaiOptimizer
ですが、一つ問題があります。私達がsil-opt
をSchemeに追加したようにswift
のSchemeを追加してswiftc
をビルドしても、今の段階でそのswiftc
からWaiWaiOptimizer
が呼ばれることはありません。
では、swiftcからSILOptimizerのフェーズでWaiWaiOptimizer
が呼ばれるようにしてください。
ただし、制約をつけます。
-
Guaranteed Passes
の一つとしてPipelineに登録してください。(Hint: PassであるAllocBoxToStack
クラスがどのように使われているかをソースコードをたどりながら見るとわかる) - swiftcの自作オプションでTriggerをするようにしてください。(Hint: 本物の
AssumeSingleThreaded
クラスの実装を参照)- オプションがOFFでもPassが呼ばれても大丈夫ですが、その時は
run
で即return
するなどして最適化しないようにしてください。
- オプションがOFFでもPassが呼ばれても大丈夫ですが、その時は
Hintを踏んでればだいたい解けますし、HintのことをやっているとちょっとだけPass関係のソースコードの渡り方を知ることができます。
事前準備で行ったsil-opt
同様、新しくswift
のSchemeを追加してswiftc
をビルドしてください。
ビルドされたswiftc
はsil-opt
と同じディレクトリにビルドされます。
問題が終わったら?
問題をテストしてください。テストの方法は以下のコマンドで可能です。
# swiftディレクトリにいる前提
$ ../build/Xcode-DebugAssert/swift-macosx-x86_64/Debug/bin/swiftc [作ったオプション] 適当なswiftコードへのパス.swift -Xllvm -sil-print-pass-name
-Xllvm -sil-print-pass-name
オプションを付けると最適化のときに通ったパスが表示されます。
以下、出力の例です。(-waiwai-optionという名前のオプションを追加したときの例)
ここに、その中にWaiWaiOptimizer
という名前が出てきたら成功です。
$ ../build/Xcode-DebugAssert/swift-macosx-x86_64/Debug/bin/swiftc -waiwai-option waiwai.swift -Xllvm -sil-print-pass-name
Run module pass #0, stage Guaranteed Passes, pass 0: SILGenCleanup (silgen-cleanup)
Start function passes at stage: Guaranteed Passes
Run #1, stage Guaranteed Passes, pass 1: DiagnoseInvalidEscapingCaptures (diagnose-invalid-escaping-captures), Function: main
Run #2, stage Guaranteed Passes, pass 2: DiagnoseStaticExclusivity (diagnose-static-exclusivity), Function: main
Run #3, stage Guaranteed Passes, pass 1: DiagnoseInvalidEscapingCaptures (diagnose-invalid-escaping-captures), Function: $s4zeroAASiyF
Run #4, stage Guaranteed Passes, pass 2: DiagnoseStaticExclusivity (diagnose-static-exclusivity), Function: $s4zeroAASiyF
... # 成功すれば、WaiWaiOptimizerが呼ばれている旨が出てくる