LLVM 核心类简明示例 : llvm::Value && llvm::Type && llvm::Constant

llvm核心类位于 include/llvm/IR中,用以表示机器无关且表现力极强的LLVM IR。

llvm::Value

llvm::Value则是这其中的重中之重,它用来表示一个具有类型的值。它是类图如下:

llvm::Argument,llvm::BasicBlock,llvm::Constant,llvm::Instruction这些很重要的类都是它的子类。

llvm::Value有一个llvm::Type*成员和一个use list。后者可以跟踪有哪些其他Value使用了自己,我们可以使用下面的迭代器对它进行访问:

  • unsigned use_size() 返回有多少Value使用它
  • bool use_empty() 是否没有Value使用它
  • use_iterator use_begin() 返回use list的迭代器头
  • use_iterator use_end() 返回尾
  • User *use_back() 返回use list的最后一个元素
int main() {
Value* val1 = ConstantFP::get(theContext, APFloat(3.2));
if (val1->use_empty()) {
std::cout << "no one use it\n";
}
system("pause");
return 0;
}

llvm:Type

前者顾名思义表示一个类型。可以通过Value::getType()获取到这个llvm::Type*,它有一些is*()成员函数可以判断是下面哪种类型:

  enum TypeID {
// PrimitiveTypes - make sure LastPrimitiveTyID stays up to date.
VoidTyID = 0, ///< 0: type with no size
HalfTyID, ///< 1: 16-bit floating point type
FloatTyID, ///< 2: 32-bit floating point type
DoubleTyID, ///< 3: 64-bit floating point type
X86_FP80TyID, ///< 4: 80-bit floating point type (X87)
FP128TyID, ///< 5: 128-bit floating point type (112-bit mantissa)
PPC_FP128TyID, ///< 6: 128-bit floating point type (two 64-bits, PowerPC)
LabelTyID, ///< 7: Labels
MetadataTyID, ///< 8: Metadata
X86_MMXTyID, ///< 9: MMX vectors (64 bits, X86 specific)
TokenTyID, ///< 10: Tokens // Derived types... see DerivedTypes.h file.
// Make sure FirstDerivedTyID stays up to date!
IntegerTyID, ///< 11: Arbitrary bit width integers
FunctionTyID, ///< 12: Functions
StructTyID, ///< 13: Structures
ArrayTyID, ///< 14: Arrays
PointerTyID, ///< 15: Pointers
VectorTyID ///< 16: SIMD 'packed' format, or other vector type
};

比如这样:

int main() {
Value* val1 = ConstantFP::get(theContext, APFloat(3.2));
Type* t = val1->getType(); if (t->isDoubleTy()) {
std::cout << "val1 is typed as double(" << t->getTypeID() <<")\n";
}
system("pause");
return 0;
}

除此之外llvm::Type还有很多成员函数,详细请参见http://llvm.org/doxygen/classllvm_1_1Type.html

多说一句,我们还可以对 llvm::Value 进行命名

  1. bool hasName() const
  2. std::string getName() const
  3. void setName(const std::string &Name)

llvm::Constant

llvm::Constant表示一个各种常量的基类,基于它派生出了ConstantInt 整型常量,ConstantFP 浮点型常量,ConstantArray 数组常量,ConstantStruct 结构体常量:

int main() {
// 构造一个32位,无符号的整型值,值为1024
APInt ci = APInt(32, 1024);
ConstantInt* intVal = ConstantInt::get(theContext, ci);
std::cout << "bit width:" << intVal->getBitWidth()
<< "\nvalue:" << intVal->getValue().toString(16, false); system("pause");
return 0;
}

[llvm] LLVM 核心类简明示例 : llvm::Value && llvm::Type && llvm::Constant的更多相关文章

  1. Spring Security——核心类简介——获得登录用户的相关信息

    核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和Authenti ...

  2. 从字节码和JVM的角度解析Java核心类String的不可变特性

    1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...

  3. cesium核心类Viewer简介

    1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...

  4. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

  5. Hibernate核心类用法-使用Transaction管理事务

    一个典型的事务应该使用下面的形式 在创建完Session对象后即使用beginTransaction()启动事务 从此开始直到commit()之间的代码 都会处于同一个事务中 这两个函数之间所有的数据 ...

  6. 理解Lucene索引与搜索过程中的核心类

    理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.ƒDirectory.ƒAnalyzer.ƒDocument.ƒField 1.IndexWriter IndexWr ...

  7. android的消息处理有三个核心类:Looper,Handler和Message。

    android的消息处理机制(图+源码分析)——Looper,Handler,Message   作为 一名android程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设 ...

  8. codeigniter框架扩展核心类---实现前台后台视图的分离

    1. 扩展核心类,主要作用就是扩展系统现在的功能. 为前台增加独立的视图文件夹: a. 自定义路径常量 :在application ->config/  constants.php中增加 /*m ...

  9. Activiti源码分析(框架、核心类。。。)

    http://jiangwenfeng762.iteye.com/blog/1338553 Activiti是业界很流行的java工作流引擎,关于Activiti与JBPM5的关系和如何选择不是本文要 ...

随机推荐

  1. Android Studio 配置模拟器AVD存放路径(默认在c盘,解决c盘空间不够问题)

    Android Studio 安装之后,默认的会给我们创建一个 Nexus 的模拟器, 这个模拟器的镜像文件放在了 C:\Users\Administrator\.android  中 其中的avd文 ...

  2. java tcp socket实例

    java tcp socket实例 2011-04-20 13:58 2364人阅读 评论(1) 收藏 举报 socketjavatcpthreadserverclass package com.ne ...

  3. T-SQL 理解SQL SERVER中的分区表(转)

    转载来源一定要明显:  http://www.cnblogs.com/CareySon/archive/2011/12/30/2307766.html 而且这个大神对于数据库方面的文章非常棒 强烈推荐 ...

  4. java基础之匿名内部类

    内部类: 概述: 类里边还有一个类, 里边那个类叫内部类, 外边那个类叫外部类. 分类: 成员内部类: 定义在成员位置的内部类. 局部内部类: 定义在局部位置的内部类. 格式: new 类名或者接口名 ...

  5. 02-nginx信号量

    刚才完了nginx的编译,nginx的编译还是挺简单的.控制nginx:重启.关闭.只有孤零零的一个二进制文件nginx 通过信号来控制它,Linux操作系统进程与进程之间通过信号来通信.荷兰的一位计 ...

  6. PCL 编程多个点云合成

    博客转载自:https://blog.csdn.net/sunboyiris/article/details/72636809 pcl::PointCloud<pcl::PointXYZRGBA ...

  7. Sublime Text notes

    1. 设置在窗口右下方显示文件的编码,在user preferences里加上以下的配置 2.设置用新标签页打开新文件而不是用新窗口打开,将以下配置改为false(默认为true)

  8. You-need-to-know-css

    半透明边框 背景知识: background-clip <div class="main"> <input id="pb" type=&quo ...

  9. C#request和response的中文乱码问题

    request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码:   ...

  10. linux 首次登陆与线上求助

    开始下达指令概念 上述指令详细说明如下:1. 一行指令中第一个输入的部分绝对是『指令(command)』或『可执行文件案(例如批次脚本,script)』2. command 为指令的名称,例如变换工作 ...