[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的关系和如何选择不是本文要 ...
 
随机推荐
- Tornado 高并发源码分析之六---异步编程的几种实现方式
			
方式一:通过线程池或者进程池 导入库futures是python3自带的库,如果是python2,需要pip安装future这个库 备注:进程池和线程池写法相同 from concurrent.fut ...
 - Educational Codeforces Round 45 (Rated for Div. 2)
			
A bracket sequence is a string containing only characters "(" and ")". A regular ...
 - Maven 国内源
			
maven的仓库好慢的说,还是配置一个国内的源吧.推荐aliyun 在maven/conf/settings.xml 文件里配置mirrors的子节点,添加如下mirror <mirror> ...
 - Ceph基本情况介绍
			
Ceph基本情况的介绍 Ceph是一个分布式存储软件. 它支持用3种方式存储数据,分别是:对象存储.块设备存储.分布式文件系统存储. Ceph最初的目标是做一个分布式文件系统,直到现在这个目标也不能算 ...
 - POJ 3169 C - Layout
			
题意 有n头奶牛从1到n编号,按照编号顺序站成一排,有可能有多头奶牛站在同一个坐标上.一些奶牛互相喜欢,所以他们的距离不能大于某个距离,一些奶牛互相讨厌,所以他们的距离不能小于某个距离,请计算如果可能 ...
 - =面试题:java面试基本方向 背1  有用 项目二技术学完再看
			
一.Java基础 1. 集合框架A)集合中泛型优点? 将运行期的ClaasCastException 转到编译期异常. 泛型还提供通配符 1)HashMap---允许一个键为null,允许多个值为n ...
 - 28. LAST() 函数
			
LAST() 函数 LAST() 函数返回指定的字段中最后一个记录的值. 提示:可使用 ORDER BY 语句对记录进行排序. SQL LAST() 语法 SELECT LAST(column_nam ...
 - AIO和NIO的理解
			
AIO: AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成,可以继续做 另外的事情,等I/O操作完成,内核会通过函数回调或者信号机制通知用户进程.这样很大程度提高了 ...
 - cbv+resful+APIView源码分析
			
CBV源码分析 1概念:什么是cbv和fbv 已经什么是API class bass View ---基于类的视图 function bass View ---基于函数的视图 API(Applicat ...
 - Open Message Queue  集群问题
			
nohup ./imqbrokerd -tty -name myBroker -port 7677 -javahome /opt/omae/jdk1.7.0_45 -cluster 192.168.2 ...