LLVM不能迭代a [3 x i8]

llvm cannot iterate a [3 x i8]

本文关键字:i8 不能 迭代 LLVM      更新时间:2023-10-16

我正试图"解析"LLVM IR的一部分。更确切地说,从

@.str = private unnamed_addr constant [3 x i8] c"DS0", 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"DS0", 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"DS0"
    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会很好),但我不能。如何解析这个结构?

感谢您的帮助

通过将caa转换为ConstantDataArray,然后使用getAsString()来精确地给出"DS"