関数型言語である F# に基づく言語の llvm フロントエンドを開発しています。関数型言語は、変数ではなく、値の概念に一致します。F# は、いわゆる「可変値」による変数もサポートしており、値を追跡する %llvm.dbg.declare() としてモデル化できます。しかし、値を追跡する方法がわかりません。値は alloca によって作成されるのではなく、単なる値であり、変更されません。そして、例はすべて、この不変値の概念を持たない C などの命令型言語での実装を示しています。関数型スタイル言語のデバッグ情報に関する提案やヒントはありますか?
1 に答える
0
SSA 値については、@llvm.dbg.value()
の代わりに使用します@llvm.dbg.declare
。最初に、ローカル値のメタデータを の場合と同じように定義する必要があります。@llvm.dbg.declare
以下では、 として定義されていると仮定し!4
ます。LLVM IR は次のようになります。
%x = ...
call void @llvm.dbg.value(metadata !{ i32 %x }, i64 0, metadata !4)
mem2reg がデバッグ情報を変換する方法を説明するhttp://nondot.org/sabre/LLVMNotes/DebugInfoVariableInfo.txtからこの情報を取得しました。これは現在の LLVM の慣行に関しては古くなっている可能性があるため、alloca
s とを使用して IR を記述@llvm.dbg.declare
し、mem2reg パスを実行して、SSA に変換されたときにデバッグ情報がどのように変化するかを確認できます。
于 2013-09-20T15:31:03.717 に答える