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

この時点から、「DS」を取得するために [3 X i8] を反復処理するために、すべてにキャストしようとしましたenum llvm::Value::ValueTyが (StringRef または std::string が適切であるため)、できません。この構造を解析するにはどうすればよいですか?

助けてくれてありがとう!

4

1 に答える 1

0

caaをに変換してConstantDataArrayから使用することで解決し、getAsString()正確に「DS」が得られました。

于 2013-03-04T15:40:29.247 に答える