У меня следующий LLVM IR хочет использовать printf для отображения значения% arrayidx.
%arrayidx = getelementptr inbounds float, float* %A, i64 %0
%1 = load float, float* %arrayidx, align 4
То есть результат должен быть:
%arrayidx = getelementptr inbounds float, float* %A, i64 %0
%2 = zext i64 %0 to i32
%call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i64 0, i64 0), i32 %2)
%1 = load float, float* %arrayidx, align 4
Итак, я написали следующий проход LLVM:
Builder.SetInsertPoint(&BB);
Value *str = Builder.CreateGlobalStringPtr(StringRef("The index is %d\n"));
std::vector<Value*> args;
Value* idx = I->getOperand(1);
Value* idx32 = Builder.CreateIntCast(idx, Builder.getInt32Ty(), true);
args.push_back(str);
args.push_back(idx32);
Value* call_inst = Builder.CreateCall(ptf, args, "tmp");
Но я получил следующую ошибку:
opt: /llvm-6.0/include/llvm/Support/Casting.h:255: typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) [with X = llvm::Function; Y = llvm::Constant; typename llvm::cast_retty<X, Y*>::ret_type = llvm::Function*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
Кто-нибудь может помочь с этим? Спасибо.