LLVM语言参考手册之标识符、类型与常量
参考网站:LLVM语言参考手册
摘要
LLVM是基于静态单赋值(SSA)的表示形式。之所以为单赋值,每个名字在SSA中仅被赋值一次。它可提供类型安全性,低级操作,灵活性并能清晰地表示“所有”高级语言的功能。它是在LLVM编译策略的所有阶段中使用的通用代码表示形式。
LLVM代码表示以三种不同的形式来使用:作为内存中的编译器IR,作为磁盘上的位代码表示(适用于即时编译器的快速加载)以及作为人类可读的程序集语言表示。这使LLVM可以为有效的编译器转换和分析提供强大的中间表示,同时提供调试和可视化转换的自然方法。LLVM的三种不同形式都是等效的。
1 标识符
两种基本类型:全局和本地。全局标识符(函数、全局变量)用’@‘字符开头;本地标识符(寄存器名称、类型)用’%'字符开头。
此外,还有三种不同的标识符格式:
- 命名值以带有前缀的字符串表示。例如%foo,@DivisionByZero, %a.really.long.identifier。实际使用的正则表达式为“ [%@][-a-zA-Z.][−a−zA−Z._][-a-zA-Z.][−a−zA−Z._0-9]*”。在名称中需要其他字符的标识符可以用引号引起来。可以使用"\xx"wherexx是十六进制字符的ASCII码对特殊字符进行转义。这样,任何字符都可以用在名称值中,甚至可以用引号引起来。该"\01"前缀可用于全局值以抑制重整。
- 未命名的值以带有前缀的无符号数字表示。例如%12,@2,%44。
- 常量。
LLVM要求值以前缀开头有两个原因:编译器无需担心带有保留字的名称冲突,并且将来可以扩展保留字的集合而不会带来任何损失。此外,未命名的标识符使编译器可以快速提出一个临时变量,而不必避免符号表冲突。
LLVM中的保留字与其他语言中的保留字非常相似。有一些关键字用于不同的操作码(“,add”,“ bitcast,”ret等),原始类型名称(“,void”,“i32等等”)等。这些保留字不能与变量名冲突,因为它们都不以前缀字符(’%‘或’@’)开头。
2 类型
LLVM类型系统是中间表示形式的最重要特征之一。类型化使许多优化可以直接在中间表示上执行,而不必在转换之前对另一方面进行额外的分析。
2.1 空类型(void type)
不代表任何值且没有大小
2.2 函数类型(function type)
由返回类型和形参类型列表组成。
2.3 first class type
该类型的值是唯一可以通过指令生成的值。
2.3.1 single value types
(1) integer type:为所需的整数类型指定任意位宽度
examples:
i32 表示一个32位整数
i1942652表示一个超过1百万的超级大整数
(2) floating-point types
Type | Description |
---|---|
half | 16-bit floating-point value |
bfloat | 16-bit “brain” floating-point value (7-bit significand). Provides the same number of exponent bits as float, so that it matches its dynamic range, but with greatly reduced precision. Used in Intel’s AVX-512 BF16 extensions and Arm’s ARMv8.6-A extensions, among others. |
float | 32-bit floating-point value |
double | 64-bit floating-point value |
fp128 | 128-bit floating-point value (113-bit significand) |
x86_fp80 | 80-bit floating-point value (X87) |
ppc_fp128 | 128-bit floating-point value (two 64-bits) |
(3) x86_mmx type:表示保存在x86机器上的MMX寄存器中的值。
x86_mmx
(4) pointer type:用于指定内存位置,指针用于引用内存中的对象
<type>*
examples:
[4 x i32]* 指的是指向4个i32值的数组的指针
(5) 向量类型(vector type)
向量类型是表示元素向量的简单派生类型
Syntax:
< <# elements> x <elementtype> > ; Fixed-length vector
< vscale x <# elements> x <elementtype> > ; Scalable vector
examples:
<4 x i32>表示4个32位整数值向量
<vscale x 4 x i32>表示4个32位整数值的倍数的向量
2.3.2 label type
表示代码标签
Syntax:
label
2.3.3 token type
若一个值与一条指令相关,但该值的所有用法均无法掩盖该指令,即可使用token type。
Syntax:
token
2.3.4 metadata type
表示嵌入的元数据
Syntax:
metadata
2.3.5 aggregate types
聚合类型是可以包含多个成员类型的派生类型的子集。
(1) array type
数组类型是一个非常简单的派生类型,它在内存中按顺序排列元素。
Syntax:
[<# elements> x <elementtype>]
examples:
[40 x i32]表示40个32位整数值的数组
[3 x [4 x i32]]表示34的32位整数值的数组
[12 x [10 x float]]表示1210的单精度浮点值数组
(2) structure type
结构类型用于表示内存中数据成员的集合。
Syntax:
%T1 = type { <type list> } ; Identified normal struct type
%T2 = type <{ <type list> }> ; Identified packed struct type
若结构是“压缩”结构,这表示结构的对齐是一个字节,并且元素之间没有填充。在非压缩结构中,字段类型之间的填充是按照模块中DataLayout字符串的定义插入的。
examples:
{ i32, i32, i32 }表示3个32位整数值的3倍。
<{ i8, i32 }>表示大小为5字节的压缩结构。
(3) opaque structure type
不透明结构类型用于表示没有指定主体的命名结构类型。
Syntax:
%X = type opaque
%52 = type opaque
3 常量
3.1 简单常量(Simple Constants)
- Boolean constants:true/false
- Integer constants:如4
- Floating-point constants:如3.4
- Null pointer constants:如null
- Token constants:如none
3.2 Complex Constants
- Structure constants:类似于结构类型定义的符号表示,如{i32 4,float 3.8}
- Array constants:类似于数组类型定义的符号表示,如[i32 5,i32 7]
- Vector constants:类似于向量类型定义的符号表示,如< i32 42, i32 11, i32 74, i32 100 >
- Zero initialization:将任何类型的值初始化为零,包括标量和聚合类型
- Metadata node:没有任何类型的常量元组
3.3 Global Variable and Function Addresses
全局变量和函数的地址总是隐式有效的(链接时间)常量。当使用全局标识符时,这些常量被显式引用,并且总是具有指针类型。
3.4 Undefined Values
字符串“undef”可以在任何需要常量的地方使用,并指示值的用户可能接收到未指定的位模式。Undefined Values可以是任何类型(除了“label”或“void”)并且可以在允许常量的任何地方使用。
3.4 Poison Value
错误操作的结果。
3.5 Well-Defined Values
某个值没有未定义位也没有有毒位,则该值定义良好。若聚合数据或向量的元整定义良好则其也定义良好。
3.6 Addresses of Basic Blocks
“blockaddress”常量计算指定函数中指定基本块的地址,并且始终具有i8*类型。
3.7 DSO Local Equivalent
“dso_local_equivalent”常量表示一个函数,该函数在功能上等价于给定的函数,但总是在当前链接单元中被定义。
3.8 Constant Expressions
常量表达式可将涉及其他常量的表达式用作常量。常量表达式可以是任何first class类型,并且可以涉及任何没有副作用的LLVM操作(例如,不支持load和call)。
一些常量表达式的语法:
- trunc (CST to TYPE)
- zext (CST to TYPE)
- sext (CST to TYPE)
- fptrunc (CST to TYPE)
- fpext (CST to TYPE)
- fptoui (CST to TYPE)
- fptosi (CST to TYPE)
- uitofp (CST to TYPE)
- sitofp (CST to TYPE)
- ptrtoint (CST to TYPE)
- inttoptr (CST to TYPE)
- bitcast (CST to TYPE)
- addrspacecast (CST to TYPE)
- getelementptr (TY, CSTPTR, IDX0, IDX1, …), getelementptr inbounds (TY, CSTPTR, IDX0, IDX1, …)
- select (COND, VAL1, VAL2)
- icmp COND (VAL1, VAL2)
- fcmp COND (VAL1, VAL2)
- extractelement (VAL, IDX)
- insertelement (VAL, ELT, IDX)
- shufflevector (VEC1, VEC2, IDXMASK)
- extractvalue (VAL, IDX0, IDX1, …)
- insertvalue (VAL, ELT, IDX0, IDX1, …)
- OPCODE (LHS, RHS)
LLVM语言参考手册之标识符、类型与常量相关推荐
- python - references 之 python语言参考手册目录
python 语言参考手册 官方文档link: https://docs.python.org/zh-cn/3/reference/index.html 目录 1. 概述 1.1. 其他实现 1.2. ...
- cc++语言参考手册_C ++值类别快速参考:第2部分
c&c++语言参考手册 ← Go to Part 1 ← 转到第1部分 将参数传递给函数 (Passing parameters to a function) When passing par ...
- c语言初始化字符串 函数 manment,nesC语言参考手册.doc
nesC语言参考手册 1 简介 nesC 是对 C 的扩展 ,它基于体现 TinyOS 的结构化概念和执行模型而设计. TinyOS 是为传感器网络节点而设计的一个事件驱动的操作系统,传感器网络节点拥 ...
- LLVM language 参考手册 翻译停止相关
再翻译LLVM language 参考手册的时候,个人感觉很多东西都不是很懂,因此打算学习完编译原理后再去继续研究翻译,多有不便望见谅 转载于:https://www.cnblogs.com/kiri ...
- Python语言参考手册
Python语言参考手册 3 数据模型 3.3 特殊的方法名称 3.3.2 自定义属性获取 3 数据模型 3.3 特殊的方法名称 3.3.2 自定义属性获取 可以通过定义下列方法来自定义(使用.分配或 ...
- 金仓数据库 KingbaseES SQL 语言参考手册 (11. SQL语句:ABORT 到 ALTER INDEX)
11. SQL语句:ABORT 到 ALTER INDEX 本章描述各种类型的SQL语句,由于类型较多,将按字母顺序排列分组.这是第一组SQL语句. 包含以下章节: SQL语句类型 SQL语句各章节是 ...
- 金仓数据库 KingbaseES SQL 语言参考手册 (13. SQL语句:ALTER SYNONYM 到 COMMENT)
13. SQL语句:ALTER SYNONYM 到 COMMENT 本章包含以下SQL语句: ALTER SYNONYM ALTER SYSTEM ALTER TABLE ALTER TABLESPA ...
- nesC 1.1 语言参考手册 (1)
1 简介 nesC 是对 C 的扩展 [2] ,它基于体现 TinyOS 的结构化概念和执行模型而设计 [1] . TinyOS 是为传感器网络节点而设计的一个事件驱动的操作系统,传感器网络节点拥有非 ...
- nesC 1.1 语言参考手册(2)
7 配置 配置是通过连接.配线,建立与其他组件的连接: configuration-implementation: implementation { component-listopt connect ...
- nesC 语言参考手册
1 简介 nesC 是对 C 的扩展 ,它基于体现 TinyOS 的结构化概念和执行模型而设计. TinyOS 是为传感器网络节点而设计的一个事件驱动的操作系统,传感器网络节点拥有非常有限的资源 ( ...
最新文章
- Java数据类型及变量作业_day02、Java变量与数据类型
- Oracle VS DB2 数据类型
- 提供《华容道与数据结构》代码供测试
- Ubuntu 14.04 登陆界面循环问题解决
- go使用反射reflect获取变量类型
- springcloud----负载均衡--Ribbon与LoadBalance
- 计算机基础- -认识汇编
- (~最新合集~)计算机网络谢希仁第七版 第五章课后答案
- Codeforces 1291 Round #616 (Div. 2) C. Mind Control(超级详细)
- N Queen(代码、分析、汇编)
- PHP日期、时间戳相关的小程序
- vPlayer 模块Demo
- 新手小白~千元左右新手入门值得推荐的十款吉他
- createCriteria的用法
- 下暴你的硬盘 超多游戏下载 不爆你找我! (二)
- STM32复位与时钟、定时器
- int 到底是什么
- 输入半径,求正五边形的面积
- Compile failed; see the compiler error output for details. 解决
- Kinect摄像头简介
热门文章
- 【Spring-tx】事务逻辑
- mybatis-plus更新问题 全量更新、只更新部分属性
- eclipse无法访问sun.misc.Unsafe类的解决办法
- Hibernate一对多双向、单向
- 《ANTLR 4权威指南》——第2章 纵 观 全 局 2.1 从ANTLR元语言开始
- Educational Codeforces Round 20 C. Maximal GCD
- Swift 再等等?我的答案是:快上车
- 你的服务器安全么?--服务器防渗透(1)
- @objc private 定义函数
- HDU-1042 N!