我有使用fadd添加的ConstantInt和ConstantFP值.但是,我无法将ConstantInt转换为fadd将接受的浮点数.
以下是代码的摘录:
Value* left = ConstantInt::get(Type::getInt64Ty(getGlobalContext()),12,true); Value* right = ConstantFP::get(Type::getFloatTy(getGlobalContext()),11.6); Instruction* cast = CastInst::Create(Instruction::SIToFP,left,left->getType(),"",currentBlock()); left = cast->getOperand(0); BinaryOperator::Create(Instruction::FAdd,right,currentBlock());
currentBlock()返回BasicBlock.在尝试为此生成操作码之后,LLVM抱怨它无法添加这两个值,因为它们不相同.
我对LLVM很新,所以如果这段代码毫无意义,我会接受任何建议.
解决方法
我对这些事情的常用方法是看看Clang生成了什么 – LLVM IR和C API调用(C后端).您可以使用
online instance来简化.所以,编译这个C代码:
float foo(int a,float b) { return a + b; }
给我这个LLVM IR:
define float @foo(i32 %a,float %b) #0 { entry: %conv = sitofp i32 %a to float %add = fadd float %conv,%b ret float %add }
这是重新创建它所需的C API调用:
// Function: foo (func_foo) { Function::arg_iterator args = func_foo->arg_begin(); Value* int32_a = args++; int32_a->setName("a"); Value* float_b = args++; float_b->setName("b"); BasicBlock* label_entry = BasicBlock::Create(mod->getContext(),"entry",func_foo,0); // Block entry (label_entry) CastInst* float_conv = new SIToFPInst(int32_a,Type::getFloatTy(mod->getContext()),"conv",label_entry); BinaryOperator* float_add = BinaryOperator::Create(Instruction::FAdd,float_conv,float_b,"add",label_entry); ReturnInst::Create(mod->getContext(),float_add,label_entry); }
您可以自由调整输入C代码(即用常量替换变量等)并查看Clang / LLVM发出的内容.当您对IR和API不太熟悉时,这是找到绕过IR和API的最好/最快的方法.