2013-03-04 39 views
0

我試圖「解析」LLVM IR的一部分。更確切地說,從llvm無法迭代[3 x i8]

@.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×6-18]迭代,爲了得到「DS」(作爲StringRef或的std :: string會很好),但我不能。我如何解析這個結構?

謝謝你的幫助!

回答

0

通過將caa轉換爲ConstantDataArray,然後使用getAsString()來解決這個問題,它給了我完全「DS」。