現在、私は任意のプログラムのグローバル変数とフィールド変数のロードとストアのアクセスを識別するツールを開発中です。さらに、アクセスされた変数は、ソースレベルの名前/識別子によって識別される必要があります。 これを達成するために、診断中のプログラムのソースコードをデバッグ情報付きのLLVM IRにコンパイルします。これまでのところ、生成されたメタデータノードには、望ましいソースレベル識別子が含まれています。ただし、一部のLLVM IR識別子とメタデータの情報との接続を確立できません。例えばLLVM IR:メタデータノードで変数を識別する
、クラスのsaticメンバー考える: "_ZN12TestClass6NumberE @" であることを私は知っている。この制御例では
@_ZN12TestClass6NumberE = external global i32, align 4
...
!15 = !DIDerivedType(tag: DW_TAG_member, name: "Number", scope: !"_ZTS12TestClass", file: !12, line: 5, baseType: !16, flags: DIFlagPublic | DIFlagStaticMember)
:対応LLVM IRは、このようになります
class TestClass {
public:
static int Number;
};
を「番号」の識別子。しかし、一般的にどのIR識別子がどのメタデータに対応しているかを知ることができません。
誰かが私を助けることができますか?