0

dbgメタデータを使用して変数定義の行番号などを取得する方法に従いましたか?ローカル変数(アロカ)の行番号定義を取得するために、これは正常に機能します。しかし、グローバルについても同じことが必要です。そこで、 http://llvm.org/docs/doxygen/html/DbgInfoPrinter_8cpp_source.html#l00062findDbgGlobalDeclare()からメソッドをハックしようとしました。ただし、バイトコードに何も含まれていないため、抽出するdbg情報がありません。を使用してターゲットコードをコンパイルします。私のバイトコードからのいくつかのサンプル:llvm.dbg.gvclang++ -O0 -g -emit-llvm Test.cpp -c -o Test.bc

@r = global i32 3, align 4
%4 = load i32* @r, align 4, !dbg !942
...
%a = alloca i32, align 4
%1 = load i32* %a, align 4, !dbg !939

しかし、私は持っています:

!924 = metadata !{i32 786484, i32 0, null, metadata !"r", metadata !"r", metadata !"", metadata !841, i32 19, metadata !56, i32 0, i32 1, i32* @r} ; [ DW_TAG_variable ] [r] [line 19] [def]

!0間接的に依存していて、があります!llvm.dbg.cu = !{!0}

ありがとうございました !

4

2 に答える 2

1

はい、!llvm.dbg.cu今が正しい場所です。ソースレベルのデバッグ ドキュメントからの引用:

コンパイル単位記述子は、特定のコンパイル単位で宣言されたオブジェクトのルート コンテキストを提供します。ファイル記述子は、このコンテキストを使用して定義されます。これらの記述子は、名前付きメタデータ !llvm.dbg.cu によって収集されます。これらは、サブプログラム、グローバル変数、および型情報を追跡します。

具体的には、「グローバル変数記述子」を参照してください。

あなたが見つけたコードは、まだdragoneggによって生成されている古いメタデータノードをサポートするためのものであるため、リーダーは下位互換性のためにそれらをサポートします。新しい LLVM コードは を生成し!llvm.dbg.cuます。

于 2013-02-28T13:28:21.103 に答える
0

手順は次のとおりです。

1. NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.cu");

次に、目的のグローバル宣言までメタデータ ノード チェーンに入ります。

2. DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
3. DIDescriptor DIGG(cast<MDNode>(NMD->getOperand(NMD->getNumOperands()-1)));
4. DIDescriptor DIGF(cast<MDNode>(DIGG->getOperand(0)));
5. Value* VV = cast<Value>(DIGF->getOperand(i));
6. DIDescriptor DIGS(cast<MDNode>(VV));

この時点で、次のことを行います。

7. DIGS->getOperand(j) 

and check http://llvm.org/docs/SourceLevelDebugging.html#c-c-front-end-specific-debug-information for all the fields you desire.

于 2013-03-06T09:03:15.263 に答える