2017-11-16 8 views
0

私は次の行を持っている:llvmでは、コール内の関数のビットキャストはどのような "タイプ"ですか?この機能にアクセスするには?私のLLVM IRコードで

%tmp = call i32 @decf1(void (i8*)* bitcast (void (%a_type*)* @decf2 to void (i8*)*), i8 %x3, i8* @external_type) 

を私はプログラム的a_typedecf2を抽出しようとしていますが、私はそれらへのアクセスを取得しないように見えます。

bool runOnFunction(Function &F) override { 
errs() << "Initializing Test pass\n"; 

for (BasicBlock &BB : F) { 
    for (Instruction &I : BB) { 
    // New Instruction 
    errs() << "\n\n" 
      << "=====================\n" 
      << "- - - - - - - - - - -\n" 
      << "NewInstruction:\n"; 
    I.dump(); 
    errs() << "\n"; 

    // New Operands 
    errs() << "- - - - - - - - - - -\n" 
      << "Operands:\n"; 
    for (Use &U : I.operands()) { 
     errs() << "Type: "; 
     U->getType()->print(errs()); 
     errs() << "\n"; 
     errs() << "Name: " << U->getName() << "\n"; 
    } 
    errs() << "\n"; 
} 

このパスでは、キャストを含む命令の次の出力が表示されます。

===================== 
- - - - - - - - - - - 
NewInstruction: 
    %tmp = call i32 @decf1(void (i8*)* bitcast (void (%a_type*)* @decf2 to void (i8*)*), i8 %x3, i8* @external_type) 

- - - - - - - - - - - 
Operands: 
Type: void (i8*)* 
Name: 
Is Instruction: No 
Is Function: No 

Type: i8 
Name: x3 
Is Instruction: Yes 
      %x3 = mul i8 %x2, %x2 
Is Function: No 

Type: i8* 
Name: external_type 
Is Instruction: No 
Is Function: No 

Type: i32 (void (i8*)*, i8, i8*)* 
Name: decf1 
Is Instruction: No 
Is Function: Yes 
     Is Declaration: Yes 

最初に印刷されたオペランドは、ビットキャストと関係があります。 ビットキャストとそれがキャストしているオペランド/タイプ/機能を取得するにはどうすればよいですか?

答えて

0

Value::stripPointerCasts()は、キャストをdecf2にする方法はFunction *と思われます。

ここからa_typeを取得する方法についてさらに詳しく説明する必要があります。

関連する問題