[llvm] LLVM 核心类简明示例 : llvm::Value && llvm::Type && llvm::Constant
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 进行命名
- bool hasName() const
- std::string getName() const
- 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的更多相关文章
- Spring Security——核心类简介——获得登录用户的相关信息
核心类简介 目录 1.1 Authentication 1.2 SecurityContextHolder 1.3 AuthenticationManager和Authenti ...
- 从字节码和JVM的角度解析Java核心类String的不可变特性
1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...
- cesium核心类Viewer简介
1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- Hibernate核心类用法-使用Transaction管理事务
一个典型的事务应该使用下面的形式 在创建完Session对象后即使用beginTransaction()启动事务 从此开始直到commit()之间的代码 都会处于同一个事务中 这两个函数之间所有的数据 ...
- 理解Lucene索引与搜索过程中的核心类
理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWr ...
- android的消息处理有三个核心类:Looper,Handler和Message。
android的消息处理机制(图+源码分析)——Looper,Handler,Message 作为 一名android程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设 ...
- codeigniter框架扩展核心类---实现前台后台视图的分离
1. 扩展核心类,主要作用就是扩展系统现在的功能. 为前台增加独立的视图文件夹: a. 自定义路径常量 :在application ->config/ constants.php中增加 /*m ...
- Activiti源码分析(框架、核心类。。。)
http://jiangwenfeng762.iteye.com/blog/1338553 Activiti是业界很流行的java工作流引擎,关于Activiti与JBPM5的关系和如何选择不是本文要 ...
随机推荐
- 12-EasyNetQ之消息版本控制
为了能够支持消息版本控制,你需要确保这个必要的组件已配置.最简单的实现是这样的: var bus = RabbitHutch.CreateBus("host=localhost", ...
- MySQL与SQLServer的update left join语法区别
需求: 表A 字段 A_ID, A_NAME, B_ID 表B 字段 B_ID, B_NAME 需求把A的所有A_NAME更新为相应的B的 B_NAME. mysql做法: UPDATE A LEFT ...
- Spring总结五:小结 使用spring访问servlet
使用spring访问servlet 首先先建一个web项目,并在pom.xml中引入依赖包:spring-context和jsp servlet相关包,以及tomcat插件 其次建一个spring的配 ...
- 2018 Spring Single Training B (uva 572,HihoCoder 1632,POJ 2387,POJ 2236,UVA 10054,HDU 2141)
这场比赛可以说是灰常的水了,涨信心场?? 今下午义务劳动,去拿着锄头发了将近一小时呆,发现自己实在是干不了什么,就跑到实验室打比赛了~ 之前的比赛补题补了这么久连一场完整的都没补完,结果这场比完后一小 ...
- MAT(Memory Analyzer tool)使用
当线上环境出现OOM/内存泄漏了,怎么办? 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,配置-XX:+HeapDumpOnOutOfMemoryError, 当出现OOM时,分析dum ...
- Centos里没有lsb_release
查看Centos操作系统版本,输入指令 lsb_release -a 报无此命令 解决办法,安装lsb_release 1.执行指令:yum install -y redhat-lsb 2.安装完毕后 ...
- Hadoop完全分布式环境搭建(二)——基于Ubuntu16.04设置免密登录
在Windows里,使用虚拟机软件Vmware WorkStation搭建三台机器,操作系统Ubuntu16.04,下面是IP和机器名称. [实验目标]:在这三台机器之间实现免密登录 1.从主节点可以 ...
- ubuntu开启ssh
SSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudo apt-ge ...
- 23.NULL 函数
SQL ISNULL().NVL().IFNULL() 和 COALESCE() 函数 请看下面的 "Products" 表: P_Id ProductName UnitPrice ...
- 关于instanceof测试遇到的问题
今天上上课 用 instanceof关键字来判断某个对象是否属于某种数据类型.报错 代码如下 package cn.lijun.demo3; import cn.lijun.demo.Person; ...