c – LLVM演员说明

前端之家收集整理的这篇文章主要介绍了c – LLVM演员说明前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有使用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&C++相关文章