Identifiers 标识符

    @ 全局
% 局部 后接字符串 命名量 @name %name
无符号数字 未命名量 @42 %42 类型系统 void 空类型
<type> * 指针类型
<returntype> (<parameter list>) 函数类型
< <# elements> x <elementtype> > 向量类型
[<# elements> x <elementtype>] 数组类型
{ <type list> } 普通结构体类型
<{ <type list> }> 打包结构体类型
metadata 元数据类型
label 标签类型
token 词元类型 类型系统(例子) void 空
i32 * 指针
i32 (i32) 函数
<5 x i32> 向量
[5 x i32] 数组
{ i32, i32, i32 } 普通结构体
<{ i32, i32, i32 }> 打包结构体 元数据 ; 未命名元数据节点
; 用于被命名元数据引用
!0 = !{!"zero"}
!1 = !{!"one"}
!2 = !{!"two"} ; 命名元数据
!name = !{!0, !1, !2} !name --- !0
|-- !1
|-- !2 模块层次内联汇编 module asm "内联汇编代码" Target Triple target triple = "x86_64-amd64-freebsd" First Class Types 第一类型
Single Value Types 单值类型
只在寄存器里头有效 Integer Type 整数类型 iN ;N为比特数 (通用描述) i1 一个比特整数
i32 32为整数 Floating-Point Types 浮点类型 half - 16位浮点值
float - 32位浮点值
double - 64位浮点值
fp128 - 128位浮点值
x86_fp80 - 80位浮点值
ppc_fp128 - 128位浮点值 模块结构
程序由模块组成,每个模块都是输入程序的翻译单元。
Hello, world 模块 ; 定义字符串常量作为全局常量
@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00" ; 外部声明的 puts 函数
declare i32 @puts(i8* nocapture) nounwind ; main 函数的定义
define i32 @main() { ; i32()*
; [13 x i8] 转换到 i8...
%cast210 = getelementptr [13 x i8], [13 x i8]* @.str, i64 0, i64 0 ; 调用 puts 函数,将字符串写入 stdout
call i32 @puts(i8* %cast210)
ret i32 0
} ; 命名元信息
!0 = !{i32 42, null, !"string"}
!foo = !{!0} 指令参考
========= Terminator Instructions
指示当前块完成后,执行哪个块。
终结指令典型的产生一个 void 值:他们影响控制流,而不是值。(invoke指令是一个例外) ret 返回
br 二元条件分支/无条件转移
switch 多条件分支
indirectbr
invoke 普通/带异常调用
resume 抛出异常?
catchswitch 捕获异常
catchret
cleanupret
unreachable 不可到达(无语义) Binary Operations add 加
fadd 浮点加
sub 减
fsub 浮点减
mul 乘
fmul 浮点乘
udiv 无符号整数除
sdib 带符号整数除
fdiv 浮点除
urem 无符号整数求余
srem 带符号整数求余
frem 浮点数求余 运算\类型 无符号整数 带符号整数 浮点数
+ add fadd
- sub fsub
* mul fmul
/ udiv sdiv fdiv
% urem srem frem Bitwise Binary Operations shl 左移
lshr 逻辑右移
ashr 算数右移
and 与
or 或
xor 异或 Vector Operations extractelement 取出元素
insertelement 插入元素
shufflevector Aggregate Operations extractvalue 取出值
insertvalue 插入值 Memory Access and Addressing Operations alloca 分配内存
load 从内存加载
store 储存到内存
fence
cmpxchg
atomicrmw 自动修改内存
getelementptr 获取 aggregate(集合) 数据结构的子成员地址 Coversion Operations 这个类型为转换指令(强制类型转换|铸造casting)
都取一个单一运算对象和一个类型。
对运算对象提供一系列位转换。 trunc .. to 截断转换
zext .. to 零扩展转换
sext .. to 符号位扩展转换
fptrunc .. to 浮点截断转换
fpext .. to 浮点扩展
fptoui .. to 浮点转无符号整数
fptosi .. to 浮点转带符号整数
uitofp .. to 无符号整数转浮点
sitofp .. to 带符号整数转浮点
ptrtoint .. to 指针转整数
inttoptr .. to 整数转指针
bitcast .. to 位模式转换(重新解释,不改变任何二进制位)
addrepacecast .. to 地址空间转换 Other Operations icmp 整数比较
fcmp 浮点数比较
phi φ 节点
select 条件值选择
call 简单函数调用
va_arg 可变参数
landingpad
catchpad
cleanuppad

LLVM 中间代码归纳的更多相关文章

  1. WebAssembly学习(一):认识WebAssembly

    WebAssembly作为一门新兴起的技术,在 JavaScript 圈非常的火!人们都在谈论它多么多么快,怎样怎样改变 Web 开发领域,被各大巨头所推广,这篇文章对其做一个简单的了解认识,本文非原 ...

  2. [转帖]几张图让你看懂WebAssembly

    几张图让你看懂WebAssembly https://www.jianshu.com/p/bff8aa23fe4d     (图片来源:giphy.com) 编者按:本文由明非在众成翻译平台上翻译. ...

  3. [OC] 理解Bitcode:一种中间代码

    Tip:参考资料 理解Bitcode:一种中间代码 (内容从该博客摘录的.本随笔摘录些简要内容.) App Distribution Guide – App Thinning (iOS, watchO ...

  4. LLVM和GCC的区别

    最近在Mac OS X Mountain Lion下用Xcode进行开发,发现在编译选项里有如下所示的这两种编译器:一个是Apple LLVM compiler 4.2,另外一个是LLVM GCC 4 ...

  5. 理解Bitcode:一种中间代码

    原文网址: http://www.cocoachina.com/ios/20150818/13078.html 今天试着用Xcode 7 beta 3在真机(iOS 8.3)上运行一下我们的工程,结果 ...

  6. 编译器:gcc, clang, llvm

    clang Clang是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言.传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd) ...

  7. RenderScript on LLVM笔记

    Android 为何引入 Render Script: 3D 可移植  ( 直接用 opengl 也能够移植呀?) 性能 易用性 ( 让 opengl 难入门的人,用 Render Script ?) ...

  8. LLVM和GCC的区别(LLVM提供了模块化的编译模块,非常有利于重用,以前的编译器都没有做到这一点)

    最近在Mac OS X Mountain Lion下用Xcode进行开发,发现在编译选项里有如下所示的这两种编译器:一个是Apple LLVM compiler 4.2,另外一个是LLVM GCC 4 ...

  9. iOS开发系列-LLVM、Clang

    LLVM LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展. 我们可以认为LLVM是一个完整 ...

随机推荐

  1. Solving ordinary differential equations I(nonstiff problems),exercise 1.1

    Solve equation $y'=1-3x+y+x^2+xy$ with another initial value $y(0)=1$. Solve: We solve this by using ...

  2. 新年在家学java之基础篇--循环&数组

    因为“野味肺炎”的肆虐,过年被迫宅家只能吃了睡.睡了吃.这么下次只能长膘脑子空空,不如趁此机会重新学习java基础,为日后做铺垫~ 循环结构: 几种循环:for(::),while(){},do{}w ...

  3. Q_Go2

    一.变量 1.1 变量的概念 变量是计算机语言中存储数据的抽象概念.变量的功能是存储数据.变量通过变量名访问. 变量的本质是计算机分配的一小块内存,专门用于存放指定数据,在程序运行过程中该数值可以发生 ...

  4. UUID与时间戳

    /** * 32位去除'-'的UUID */ public static String getUUID() { String uuid = java.util.UUID.randomUUID().to ...

  5. Template设计模式

    template英文名叫模板,在这个模式中,主要的角色有AbstractClass(抽象类)和ConcreteClass(具体类),这里举例如下; 将一段字符或者字符串循环显示5次: 首先定义抽象类, ...

  6. PostgreSQL 安装之 CentOS 7 x64 RPM 安装

    PostgresQL 安装环境 一.CentOS 7 安装 1. 环境说明 CentOS7 PosgreSQL 11.2 2. 在线安装 到目前为止(2019-08-10),CentOS7 默认携带了 ...

  7. Java虚拟机内存划分

    Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区.这些区域有不同的特性,起不同的作用.它们有各自的创建时间,销毁时间.有的区域随着进程的启动而创建,随着进程结束而销毁,有的 ...

  8. MAC地址和IP地址是否缺一不可

    答案是肯定的,我们来具体分析: 在网络传输的过程中,第一次将信息从A端发往B端时,首先在A端需要将信息从应用层开始到物理层进行逐层封装,到达B端后再从物理层到应用层进行逐层分用解包,最后拿到信息. 信 ...

  9. mysql挖掘与探索--表操作命令 1

    1.登录数据库>mysql -u root -p 数据库名称 2.查询所有数据表>show tables; 3.查询表的字段信息>desc 表名称; 4.1添加表字段 alter t ...

  10. Redmine it!

    redmine插件开发简介 最稳妥的学习应该是先看官方文档,官方还给了一个具体的插件开发教程,不过如果一步不差按照教程敲代码,其实会发现还是有些问题的,需要稍稍改动. 这里,我自己编写了一个简单的插件 ...