简体   繁体   English

llvm无法迭代[3 x i8]

[英]llvm cannot iterate a [3 x i8]

I am trying to "parse" a part of LLVM IR. 我正在尝试“解析” LLVM IR的一部分。 More exactly, from 更确切地说,来自

@.str = private unnamed_addr constant [3 x i8] c"DS\00", section "llvm.metadata"

I want to get "DS". 我想得到“ DS”。 It is the single place in the whole bytecode from where I can get it. 它是整个字节码中我可以得到的唯一位置。 I have : 我有 :

...
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]
    }

From this point, I tried to cast to every enum llvm::Value::ValueTy in order to try to iterate through [3 X i8], in order to get "DS" (as a StringRef or std::string would be nice), but I cannot. 从这一点出发,我试图转换为每个enum llvm::Value::ValueTy ,以便尝试遍历[3 X i8],以获得“ DS”(作为StringRef或std :: string会很好), 但是我不能。 How I can parse this structure? 我如何解析这种结构?

Thank you for any help ! 感谢您的任何帮助 !

通过将caa转换为ConstantDataArray然后使用getAsString()来解决它,该方法恰好为我提供了“ DS”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM