以下是代码的摘录:
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的最好/最快的方法.
总结以上是内存溢出为你收集整理的c – LLVM演员说明全部内容,希望文章能够帮你解决c – LLVM演员说明所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)