0

我正在尝试“解析” 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为 each 以尝试遍历 [3 X i8],以获得“DS”(因为 StringRef 或 std::string 会很好),但我不能。我如何解析这个结构?

感谢您的任何帮助 !

4

1 回答 1

0

通过将 caa 转换为ConstantDataArray然后使用它来解决它,getAsString()这给了我确切的“DS”。

于 2013-03-04T15:40:29.247 回答