• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LOFLY
终其一生,编织快乐
博客园    首页    新随笔    联系   管理    订阅  订阅

LLVM参考手册之标识(二)

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。

  它还展示了我们在本文档中遵循的惯例。在展示指令时,我们将在指令后面添加一个注释,定义产生的值的类型和名称。

posted @ 2023-06-19 09:03  编织快乐  阅读(143)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3