美文网首页LLVM
llvm学习日记六:LLVM IR 在内存中的模块

llvm学习日记六:LLVM IR 在内存中的模块

作者: 鸣人的大哥 | 来源:发表于2019-11-11 17:12 被阅读0次

参考书:《Getting Started with LLVM Core Libraries》

LLVM IR 内存表示:

1. 内存中的 IR 表示更接近目前的LLVM语法,关于IR头文件位于目录include/llvm/IR,下边是一些重要的类:

  • Module类:可以理解为一个源文件读进内存中就是一个module,module包含所有数据和函数。它声明了Module::iterator,可以通过 begin() and end() 来拿到它
  • Function类:显而易见是函数类,使用isDeclaration() 判断是否是函数声明,使用getArgumentList()获取函数参数列表,举例:
 for (Function::iterator i = function. begin(), e = function.end(); i != e; ++i)
{
//something
}
  • BasicBlock 类:一个函数包含多个基础块,一个基础块包含多条指令(instructions)。
    每一个基础块一定由 terminator instruction 结尾(跳转指令或者返回指令);
    函数的第一个基础块是入口,叫做 entry,一定不是其他分支指令的目标。
  • Instruction 类:是LLVM IR 执行的最小单元,可以通过这些方法 isAssociative(), isCommutative(), isIdempotent(), or isTerminator() 判断,使用getOpcode() 可以知道指令的实际功能,返回值是llvm::Instruction 提前定义好的一个枚举类型。

2. 其他功能强大的类:Value and User接口,一个继承Value 的类意味着定义了一个可以在其他地方使用的结果,而一个继承User 的类意味着这个实体使用了一个或多个Value接口;Function and Instruction 即是Value的子类也是User的子类,而BasicBlock 还是Value的子类。下边来深入理解一下:

  • Value 类:
    定义了use_begin() 和 use_end() 方法,可以遍历Users,所以可以很容易获取def-use 链;
    使用 getName() 获取名字;
    任何一个LLVM value 都是唯一的定义;
    方法replaceAllUsesWith(Value *) 可以全局替换所有value的使用,这是SSA的一个优点,可以很轻松的进行指令替换和速度优化。
  • User 类:
    定义了方法op_begin() 和 op_end()可以快速获取value的接口和使用,他表示了use-def链。

相关文章

  • llvm学习日记六:LLVM IR 在内存中的模块

    参考书:《Getting Started with LLVM Core Libraries》 LLVM IR 内存...

  • LLVM

    Mac安装llvm 软链接相应工具(未列出的可以自己去找一下): C转LLVM IR LLVM IR转bitcod...

  • LLVM官方教程Kaleidoscope 3

    参考 Kaleidoscope: Code generation to LLVM IR 1. 前言 在之前的文章中...

  • LLVM IR

    LLVM Intermediate Representation,链接 LLVM 前端和后端的桥梁,与编程语言和运...

  • 代码混淆

    LLVM编译过程: 预处理,词法分析,token,语法分析,AST,代码生成,LLVM IR,优化,生成,汇编代码...

  • Impala中 LLVM 的交叉编译、调用过程

    [TOC] 本文主要介绍通过gen_ir_descriptions.py引入的 LLVM IR 函数(交叉编译)。...

  • 浅谈LLVM

    何为LLVM 在LLVM的官网(https://llvm.org/[https://llvm.org/])中写到T...

  • LLVM IR介绍

    官方链接 标识符 LLVM的标识符有两类:全局标识符和局部标识符。全局标识符以符号@开头,局部标识符由符号%开头。...

  • llvm cookbool 1.3 生成llvm IR

    本文展示如何把c语言源码编译成llvm ir。 编写代码 multiply.c 执行命令: 输出 multiply...

  • LLVM基础(IR简介&CFG图生成&可视化)

    LLVM IR LLVM 提供了一个详细的汇编语言表示(参阅 参考资料 获取相关的链接)。在开始编写我们之前讨论的...

网友评论

    本文标题:llvm学习日记六:LLVM IR 在内存中的模块

    本文链接:https://www.haomeiwen.com/subject/bpwdbctx.html