LLVM汇编语言指导手册之标识符简介

2023-11-03

标识符(Identifier)

LLVM的标识符以两种基本的类型存在:全局的和局部的。全局标识符(函数,全局变量)以'@'字符开始。局部标识符(寄存器名字,类型)以‘%’字符开始。另外,还有三种不同的标识符格式,各有自己的用途:

    1.指定的(即自己定义的)变量被表示为一个字符串加上他们的前缀。例如,%foo,@DivisionByZero,%a.really.long.identifier。实际使用的正则表达式是‘[%@][a-zA-Z$._][a-zA-Z$._0-9]’。一些特殊的字符,譬如xx对16进制字符来说是ASCII码,使用时可以这样用“\xx”。这样,任意字符都可以在指定值中使用,甚至引用它们自己。

     2.未命名的变量(我理解为ir中的临时变量)被表示为一个无符号数字加上前缀。譬如:%12,@2,%44。

     3.常数,后面会有介绍。

LLVM要求所有的变量前面都以% 或@前缀,原因有二:编译器不需要担心与LLVM的保留字产生名字冲突,未来LLVM可以对保留字集进行扩展。另外,未命名的标识符允许编译器迅速提出一个临时变量而不需要考虑避免符号表冲突。

LLVM的保留字与其他语言的保留字相似。有针对不同操作码的关键字('add','bitcast','ret',etc...),有针对原始类型名的关键字('void','i32',etc....)等等。这些保留字不会与变量名字冲突,因为这些保留字没有一个是以% 或@为开始。

下面有一个LLVM代码例子,把整型变量'%X'乘以8:

简单的方式:

%result=mul I32  %X,8

另一种方式:

%result=shl i32  %X,i8 3

困难的方式:

add i32 %X, %X                   ;yields{i32}:%0

add i32 %0, %0                   ;yields{i32}:%1

%result=add I32 %1,%1

最后一把%X乘以8的方式说明了LLVM的几个很重要的词法特征:

   1.注释以';'开始,直到行尾。

    2.当计算结果没有被指定为一个变量的值时,就会有临时变量被创建。

    3.临时变量是数字有序的。

这也规定了我们后序文档的习惯。当要举例说明指令的时候,我们将在指令后面带上注释(用来定义类型和产生变量的名字)。注释以斜体字表示。

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM汇编语言指导手册之标识符简介 的相关文章

随机推荐

  • docker安装golang

    这里写目录标题 下载golang的Docker镜像 使用Golang镜像 下载golang的Docker镜像 docker search golang 查询Golang的镜像信息 选择使用第一个 执行命令 docker pull docke
  • [Android]ProgressBar进度条

    ProgressBar ProgressBar是进度条控件 ProgressBar的应用场景很多 比如用户登录时 后台发送请求 以及进行等待服务器返回信息等一些比较耗时的操作 这个时候如果没有提示 用户可能会以为程序崩溃了或手机死机了 会大
  • C++容器篇,list容器

    C 容器篇 list容器 1 list的介绍和使用 1 1 list的介绍 list的参考文档 list是C 的容器之一 其本质是双向链表 它是可以在常数时间复杂度内进行插入和删除的序列式容器 list和forword list非常相似 其
  • stm32实现json格式传输/ cjson使用

    cjson是一个开源的C文件 可以实现用C语言生成json格式数据 目录 步骤1 准备工作 步骤2 cjson函数简单讲解 步骤3 一个例子 生成json格式数据 步骤1 准备工作 在keil里添加cjson c和cjson h cjson
  • linux下生成高强度密码的四大神器

    导读 安全是一个大的话题 给服务器设置一个高强度的密码是非常重要的 你可能会疑惑一个高强度的密码究竟是什么样的呢 怎么才能生成一个那样的密码呢 不用担心下面我们将介绍 4 种简单方法让你在 Linux 中生成一个高强度密码 1 在 Linu
  • CentOS 6和CentOS 7的磁盘空间清理

    收集整理了一些在CentOS 6或者CentOS 7服务器中 快速清理磁盘空间的方法 首先 必须先安装yum utils工具组件 yum y install yum utils 1 删除日志文件 find var name log size
  • Struts2+Spring3+Mybatis3开发环境搭建

    本文主要介绍Struts2 Spring3 Mybatis3开发环境搭建 Struts和Spring不过多介绍 MyBatis 是支持普通 SQL 查询 存储过程和高级映射的优秀持久层框架 MyBatis 消除了几乎所有的 JDBC 代码和
  • [开源之美] nanomsg -- 进程间通讯

    认识 nanomsg 这个项目 源于项目内部分享 实际分析和使用一段时间之后 确实觉得项目beautiful 先附上Git地址 nanomsg Git下载地址 nanomsg 的编译 编译很简单 没有其他第三方依赖 根据Git上编译文档可以
  • linux 格式化含义,RMAN备份FORMAT格式中%a的含义

    Oracle文档对 a的描述是 a Specifies the activation IDofthedatabase rman备份并保存 查询 a RMAN gt backup tablespace users format home or
  • Unity使用NavmeshObstacle解决多人寻路终点堵塞问题以及解决NavmeshObstacle打开抖动(瞬移)问题

    不知道为什么 就这个东西 国内各大论坛和网站就是搜不到 最终还是得谷歌 太过基础的就不讲了 问题一 在unity使用navmeshAgent进行多人寻路设置同一个终点后 所有角色都会向对应位置寻路 当前面单位到达后后面单位会一直无法到达导致
  • kiki's game

    http acm hdu edu cn showproblem php pid 2147 Problem Description Recently kiki has nothing to do While she is bored an i
  • Python 全栈系列217 Nginx负载均衡MongoAgent

    说明 虽然不想在完成量化系统的构建前再去分叉搞别的东西 但是在批量计算指标时需要频繁的使用MongoAgent 而这个服务只能做成单线程异步的 所以计算60万次指标需要2 3天时间 考虑到之后可能会有重刷的情况 所以我想还是给MongoAg
  • 被监督写博客-Day7

    今天在ctftime上找了比赛 但是吧 不太行 只能等着明天结束后的wp了 回归刷题日常 题目一 极客大挑战 2019 HardSQL 说真的 真的不喜欢SQL注入的题 打开题目后又是熟悉的界面 看了wp说是报错注入 学习一下两个函数 up
  • jmeter windows 安装指导

    软件安装 Windows安装 软件下载 进入官网 http jmeter apache org 直接下载zip包 下载后直接解压 eg我的解压路径如下 D Program Files apache jmeter 5 5 bin jdk安装
  • 用C++进行设计模式解析和实现

    http c chinaitlab com special sjms Index html 用C 进行设计模式解析和实现
  • 【精】HDFS的HA系列(一)--- 背景、架构

    本文作为HDFS HA系列的第一篇文章 主要简单描述一下HDFS HA的产生背景和整体架构 同时也会对后续系列文章要讲解的内容列出一个大致提纲 一 Hadoop HA背景 单点故障 英语 single point of failure 缩写
  • RabbitMQ快速实战与集群架构详解

    RabbitMQ 1 MQ介绍 1 1 什么是MQ 为什么要用MQ 1 2 MQ的优缺点 1 3 几大MQ产品特点比较 2 Rabbitmq安装 2 1 实验环境 2 2 版本选择 2 3 安装Erlang语言包 2 4 安装RabbitM
  • FFT算法实现

    关于FFT算法的原理这里就不多说了 具体参考有关书籍 DFT与FFT运算量的比较 N点DFT的运算量 复数乘法 复数加法 一个X k N N 1 N个X k N点DFT N N N N 1 N点FFT的运算量 复数乘法 复数加法 N个X k
  • 单片机毕业设计 NodeMCU使用mpu6050惯性传感器

    文章目录 1 简介 MPU6050传感器 引脚连接 相关代码 6 最后 1 简介 Hi 大家好 学长今天向大家介绍 NodeMCU如何使用mpu6050惯性传感器 MPU6050传感器 MPU6050传感器是一个集成了6轴运动跟踪装置的模块
  • LLVM汇编语言指导手册之标识符简介

    标识符 Identifier LLVM的标识符以两种基本的类型存在 全局的和局部的 全局标识符 函数 全局变量 以 字符开始 局部标识符 寄存器名字 类型 以 字符开始 另外 还有三种不同的标识符格式 各有自己的用途 1 指定的 即自己定义