LLVM IR の一部を「解析」しようとしています。より正確には、
@.str = private unnamed_addr constant [3 x i8] c"DS\00", section "llvm.metadata"
「DS」を手に入れたい。それは、バイトコード全体で取得できる単一の場所です。私は持っている :
...
Value *VV = cast<Value>(LD100->getOperand(1)->getOperand(0));
errs()<<"\n VV "<<*(VV)<<"\n";
RESULT : VV @.str = private unnamed_addr constant [3 x i8] c"DS\00", section "llvm.metadata"
if(VV->getValueID() == Value::GlobalVariableVal){
GlobalVariable* FD = cast<GlobalVariable>(VV);
Value *VVV = cast<Value>(FD->getOperand(0));
errs()<<"\n VVV "<<*(VVV)<<"\n";
RESULT : VVV [3 x i8] c"DS\00"
if(VVV->getValueID() == Value::ConstantDataArrayVal){
ConstantArray *caa = (ConstantArray *)VVV;
errs()<<"\n "<<(caa->getNumOperands())<<"\n";
errs()<<"\n "<<*(caa->getType())<<"\n";
RESULT : 0
[3 x i8]
}
この時点から、「DS」を取得するために [3 X i8] を反復処理するために、すべてにキャストしようとしましたenum llvm::Value::ValueTy
が (StringRef または std::string が適切であるため)、できません。この構造を解析するにはどうすればよいですか?
助けてくれてありがとう!