LLVM参考手册之标识(二)
标识符
LLVM 标识符分为两种基本类型:全局标识符和局部标识符。全局标识符(函数、全局变量)以‘@’字符开头。局部变量(寄存器名称、类型)以'%'字符开头。除此之外,标识符还有三种不同的格式类用于不同的目的:
1. 命名值(给值取了名字,可以理解为变量名称)通过其前缀表示为一串字符。例如,%foo, @DivisionByZero, %a.really.long.identifier。这种命名值的实际正则表达式是%@][-a-zA-Z$._][-a-zA-Z$._0-9]*
。需要在标识符名称中使用其他字符的标识符可以用引号括起来。
2.使用“\xx”转义特殊字符,其中 xx 是该字符的 ASCII 代码(十六进制表示)。通过这种方式,任何字符都可以用于名称值,即使是引号本身也不例外。“\01”前缀可用于全局值以抑制混淆问题的发生。
3.未命名的值用其前缀表示为无符号数值。例如:%12、@2、%44。
4.常量 。对应章节 Constants
LLVM 要求值以前缀开头有两个原因:编译器无需担心与保留字的名称冲突,而且保留字集合可能在未来扩展而不会带来任何副作用。此外,未命名标识符允许编译器快速生成临时变量,而无需避免符号表冲突。
保留关建字与其他语言保留的关键字十分相似。有不同操作码的关键字(例如“add”、"bitcast"、“ret”等),原类型名称的关键字(例如“void”、“i32”等)以及其他关键字。这些保留字不会与变量名称冲突,因为它们没有以前缀字符('%' 或 '@')开头。
LLVM的代码(使用8乘以整型变量):
简单的方法:
%result = mul i32 %X, 8
复杂点的方法:
%result = shl i32 %X, 3
更加复杂的方法:
%0 = add i32 %X, %X ; yields i32:%0 %1 = add i32 %0, %0 ; yields i32:%1 %result = add i32 %1, %1
将 %X 乘以 8 的这种方式说明了 LLVM 的几个重要词法特征:
1. 注释用“;”分隔,并持续到行尾。
2. 当计算的结果未分配给具有名称的值时,将创建未命名的临时变量。
3. 未命名的临时变量按顺序编号(使用递增计数器,每个函数从 0 开始)。请注意,基本块和未命名的函数参数也包括在此编号中。例如,如果入口基本块没有指定标签名称并且所有函数参数都已命名,则它将获得编号 0。
它还展示了我们在本文档中遵循的惯例。在展示指令时,我们将在指令后面添加一个注释,定义产生的值的类型和名称。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?