首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用llvm::IRBuilder Create Add/Sub/Mul/Div?

llvm::IRBuilder是LLVM库中的一个类,用于在LLVM中生成IR(Intermediate Representation)代码。IRBuilder类提供了一些方法来创建不同类型的指令,包括Add(加法)、Sub(减法)、Mul(乘法)和Div(除法)。

要使用llvm::IRBuilder创建Add/Sub/Mul/Div指令,可以按照以下步骤进行:

  1. 创建LLVM上下文(Context)和模块(Module):
代码语言:txt
复制
llvm::LLVMContext context;
llvm::Module module("my_module", context);
  1. 创建函数(Function)和基本块(BasicBlock):
代码语言:txt
复制
llvm::FunctionType* funcType = llvm::FunctionType::get(llvm::Type::getVoidTy(context), false);
llvm::Function* func = llvm::Function::Create(funcType, llvm::Function::ExternalLinkage, "my_function", module);
llvm::BasicBlock* entryBlock = llvm::BasicBlock::Create(context, "entry", func);
  1. 创建IRBuilder对象并设置插入点(Insertion Point):
代码语言:txt
复制
llvm::IRBuilder<> builder(context);
builder.SetInsertPoint(entryBlock);
  1. 使用IRBuilder的Create方法创建Add/Sub/Mul/Div指令:
代码语言:txt
复制
llvm::Value* op1 = llvm::ConstantInt::get(llvm::Type::getInt32Ty(context), 10);
llvm::Value* op2 = llvm::ConstantInt::get(llvm::Type::getInt32Ty(context), 5);

llvm::Value* addResult = builder.CreateAdd(op1, op2, "add_result");
llvm::Value* subResult = builder.CreateSub(op1, op2, "sub_result");
llvm::Value* mulResult = builder.CreateMul(op1, op2, "mul_result");
llvm::Value* divResult = builder.CreateSDiv(op1, op2, "div_result");

在上述代码中,我们首先创建了两个操作数op1和op2,然后使用IRBuilder的CreateAdd、CreateSub、CreateMul和CreateSDiv方法分别创建了加法、减法、乘法和除法指令。每个指令都返回一个llvm::Value对象,表示指令的结果。

  1. 打印生成的IR代码:
代码语言:txt
复制
module.print(llvm::outs(), nullptr);

以上代码将打印生成的IR代码到标准输出。

需要注意的是,上述代码只是一个简单的示例,实际使用时可能需要更多的代码来完善函数的定义、操作数的获取和指令的使用。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云计算服务:https://cloud.tencent.com/product
  • 腾讯云函数计算:https://cloud.tencent.com/product/scf
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云数据库:https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网:https://cloud.tencent.com/product/iot
  • 腾讯云移动开发:https://cloud.tencent.com/product/mad
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Android 逆向】x86 汇编 ( add sub mul div 数值运算指令 | xor not sal sar shl shr 位运算指令 )

文章目录 一、add / sub / mul / div 数值运算指令 二、xor / not / sal / sar / shl / shr 位运算指令 总结 一、add / sub / mul /...div 数值运算指令 ---- 数值运算指令 : 数值运算指令有 2 个操作数 , 操作完毕后 , 结果写回到操作数 1 中 ; add : 加法运算指令 , 运算结果存储到操作数 1 中 ;...sub : 减法运算指令 , 运算结果存储到操作数 1 中 ; mul : 乘法运算指令 , 运算结果存储到操作数 1 中 ; div : 除法运算指令 , 运算结果存储到操作数 1 中 ; 二、xor...出栈指令 , pushf , popf , pushd , popd , pushad , popad , pusha , popa ret , retn 返回指令 , set 设置目标值指令 add..., sub , mul , div 数值运算指令 xor , not , shl , shr , sal , sar , rol , ror , rcl , rcr 位运算指令

1.2K10

llvm入门教程-Kaleidoscope前端-3-代码生成

Kaleidoscope:LLVM IR的代码生成 第三章绪论 欢迎阅读“使用LLVM实现语言”教程的第3章。本章介绍如何将第2章中构建的抽象语法树转换为LLVM IR。...请注意,在LLVM IR中,所有常量都是唯一的,并且都是共享的。为此,API使用了“foo::get(.)”习惯用法,而不是“new foo(..)”或“foo::create(..)”。...IRBuilder知道插入新创建的指令的位置,您只需指定要创建的指令(例如,使用CreateFAdd)、要使用的操作数(这里是L和R),并可选择为生成的指令提供名称。...LLVM instructions有严格的规则约束:例如,Add instruction的左运算符和右运算符必须具有相同的类型,并且Add的结果类型必须与操作数类型匹配。...使用; llvm::Module使用; llvm::IRBuilder使用;

1.3K20

为什么人人都该懂点LLVM

指令 这是一个写成人类可读文本的LLVM中间表示的指令的例子。 %5= add i32 %4,2 这个指令将两个32位整数相加(可以通过类型i32推断出来)。...IRBuilder用于构造代码。它有一百万种方法来创建任何你可能想要的指令。 为把新指令缝进代码里,我们需要找到所有它被使用的地方,然后当做一个参数换进我们的指令里。...这一节将会给你展示如何写一个运行时库,它可以将所有二元操作的结果记录下来,而不仅仅是闷声修改值。...debug 技巧》,包括如何用GraphViz绘制控制流图; John Regehr在评论中提到把软件搭在LLVM上的缺点:API不稳定性。.../Linux/2013-04/82660.htm 如何创建本地的LLVM SVN镜像库 http://www.linuxidc.com/Linux/2013-03/80162.htm

1.5K00

llvm入门教程-Kaleidoscope前端-9-添加调试信息

(PS:初步翻译文档放在github上了,需要可自取,也欢迎提PR共同完善) Kaleidoscope:添加调试信息 第九章引言 欢迎阅读“使用LLVM实现语言”教程的第9章。...但是,如果出现问题怎么办,您如何调试您的程序呢? 源代码级别调试使用格式化数据来帮助调试器将二进制代码和计算机状态转换回程序员编写的源代码。在LLVM中,我们通常使用称为DWARF格式。...DWARF发射设置 与IRBuilder类类似,我们有一个DIBuilder类,它帮助构建LLVMIR文件的调试元数据。与IRBuilderLLVM IR 1:1对应,但名称更好听。...使用它确实需要您比熟悉IRBuilder和Instruction名称时更熟悉Dwarf术语,但是如果您通读Metadata Format]上的通用文档,应该会更清楚一些。...首先,当我们为名为Kaleidoscope的语言生成编译单元时,我们使用了C语言中的常量,这是因为调试器不一定理解它无法识别的语言的调用约定或缺省ABI,并且我们在LLVM代码生成中遵循C ABI,所以它是最接近准确的

70140

使用 LLVM 实现一门简单的语言

/IR/Function.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/LegacyPassManager.h..., APFloat(val_)); } 在 LLVM IR 中,所有常量都是唯一且共享的,所以使用 get 而不是 new/create。...使用内存保存临时变量的性能比较低,可以使用 mem2reg 优化,使用寄存器存放变量: // Promote allocas to registers. g_fpm->add(createPromoteMemoryToRegisterPass.../toy 11 编译生成目标文件 LLVM 支持跨平台编译,可使用“target triple”的字符串指定体系结构,其形式为---。...LLVM 中,通常使用 DWARF 格式,一种表示类型、源位置和变量位置的紧凑编码。 与 IRBuilder 类似,DIBuilder 可以为 LLVM IR 文件构建 debug 元数据。

2.4K20

原 有一个demo想开去,程序员在写cod

x - y; };             Mul mul = delegate(int x, int y) { return x * y; };             Div div = delegate...(add(5,6));             sayResult(sub(5,6));             sayResult(mul(5,6));             sayResult(div..., submuldiv });             sayResult(Caculate[0](5, 6)); 很明显代码的长度增加了,多了新的数据成员,在对效率要求不是那么严格的代码中,牺牲代码的长度来换取更好的结构...但是list中的索引方式不便于使用,假如这个程序集被引用,并不能从单纯的数字上看出什么来。严格的顺序也会增加出错的几率。...("add", add);             Cacular.Add("sub", sub);             Cacular.Add("mul", mul);             Cacular.Add

54660
领券