c – LLVM演员说明

c – LLVM演员说明,第1张

概述我有使用fadd添加的ConstantInt和ConstantFP值.但是,我无法将ConstantInt转换为fadd将接受的浮点数. 以下是代码的摘录: Value* left = ConstantInt::get(Type::getInt64Ty(getGlobalContext()), 12, true);Value* right = ConstantFP::get(Type::getF 我有使用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的最好/最快的方法.

总结

以上是内存溢出为你收集整理的c – LLVM演员说明全部内容,希望文章能够帮你解决c – LLVM演员说明所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1242854.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存