我试图“解析”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]
}
从这一点开始,我试图强制转换到每个enum llvm::Value::ValueTy
以尝试迭代[3 X i8],以获得“DS”(作为StringRef或std :: string会很好) ), 但是我不能。我如何解析这个结构?
感谢您的帮助!
答案 0 :(得分:0)
通过将caa转换为ConstantDataArray
然后使用getAsString()
来解决这个问题,而这正是“DS”。