LLVM Programmer's Mannual---阅读笔记

 文档地址:

http://llvm.org/docs/ProgrammersManual.html 

该文档的主要目的:

该文档主要介绍了LLVM源码的一些重要的类和接口,并不打算解释LLVM是什么,LLVM怎么工作,LLVM代码是什么样的。这个文档主要是面对那些已经了解了LLVM基础,并且对转化、分析和控制LLVM代码有兴趣的人。

重要的和使用的API

The isa<>, cast<> and dyn_cast<> templates

The LLVM source-base makes extensive use of a custom form of RTTI. 

RTTI (Run-Time Type Identification)

isa<>:

The isa<> operator works exactly like the Java "instanceof" operator. It returns true or false depending on whether a reference or pointer points to an instance of the specified class.

cast<>:

The cast<> operator is a "checked cast" operation. It converts a pointer or reference from a base class to a derived class, causing an assertion failure if it is not really an instance of the right type.

dyn_cast<>:

The dyn_cast<> operator is a "checking cast" operation. It checks to see if the operand is of the specified type, and if so, returns a pointer to it (this operator does not work with references). If the operand is not of the correct type, a null
pointer is returned.

Passing strings(the StringRef and Twine classes)

Instead, many LLVM APIs use a StringRef or a const Twine& for
passing strings efficiently.

The StringRef class

The StringRef data type represents a reference to a constant string (a character array and a length) and supports
the common operations available on std:string, but does not require heap allocation.

The Twine class

The Twine class is an efficient way for APIs
to accept concatenated strings.

The DEBUG() macro and -debug option
The Statistic class & -stats option
The "llvm/ADT/Statistic.h" file provides a class named Statistic that is used as a unified way to keep track of what the LLVM compiler is doing and how effective various optimizations  are. It is useful to see what optimizations are contributing to making a
particular program run faster.

Turning an iterator into a class pointer (and vice-versa)

Instead of dereferencing the iterator and then taking the address of the result, you can simply assign the iterator to the proper pointer type and you get the dereference and address-of operation as a result of the assignment (behind the scenes, this is a result
of overloading casting mechanisms). It's also possible to turn a class pointer into the corresponding iterator, and this is a constant time operation (very efficient).

Iterating over def-use & use-def chains
Function *F = ...;

for (Value::use_iterator i = F->use_begin(), e = F->use_end(); i != e; ++i)
  if (Instruction *Inst = dyn_cast<Instruction>(*i)) {
    errs() << "F is used in instruction:\n";
    errs() << *Inst << "\n";
  }

Instruction *pi = ...;

for (User::op_iterator i = pi->op_begin(), e = pi->op_end(); i != e; ++i) {
  Value *v = *i;
  // ...
}

总结一下:
其实这个文档的目的比较简单,就是介绍一些常用的API和类。虽然在用的时候会发现,这些介绍的东西在LLVM所有的类和API中就是九牛一毛,但是有总胜于无。在实际的编码过程中,只能依赖的就是源码。所以,读源码是必不可少的。

时间: 2025-01-02 00:42:57

LLVM Programmer's Mannual---阅读笔记的相关文章

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1. 设置应用程序环境 define("ENVIRONMENT", "development"); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch

谷歌Borg论文阅读笔记(一)——分布式架构

传说中,Borg之前号称是Google内部和PageRanking相提并论的同等重量级的东西.现在公布了篇论文,读了一部分,还是有些地方没理解. 求讨论. Borg简介: Borg的作用是:提供一个标准任务规格语言,集成名字服务,实时任务监控,以及工具来分析和模拟系统行为. Google内部的集群管理系统调用都是用Borg来admits(准入),schedules(调度),starts,restarts,Borg还监控所有Google所有范围运行的应用. Borg的好处: 隐藏资源管理和故障处理

Apache Spark源码走读(一)Spark论文阅读笔记&amp;Job提交与运行

<一>Spark论文阅读笔记 楔子 源码阅读是一件非常容易的事,也是一件非常难的事.容易的是代码就在那里,一打开就可以看到.难的是要通过代码明白作者当初为什么要这样设计,设计之初要解决的主要问题是什么. 在对Spark的源码进行具体的走读之前,如果想要快速对Spark的有一个整体性的认识,阅读Matei Zaharia做的Spark论文是一个非常不错的选择. 在阅读该论文的基础之上,再结合Spark作者在2012 Developer Meetup上做的演讲Introduction to Spa

Kryo简介及代码阅读笔记

更新:2012-08-01 版本 2.16长时间运行可能会导致OOM,版本2.18有bug,不能正确序列化map和collection. 真是悲剧,所用的每一个版本都有bug.不过从代码来看,作者有时的确比较随便..测试用例也少..(比起msgpack少多了) ======================================== Kryo官方网站:https://code.google.com/p/kryo/ 优点:     速度快!见https://github.com/eisha

Apache Storm源码阅读笔记&amp;OLAP在大数据时代的挑战

 <一>Apache Storm源码阅读笔记 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两

谷歌Borg论文阅读笔记(二)——任务混部的解决

总算又往下读了一部分.Google的Borg论文中,前面部分讲的都是Borg的架构.后面有讲了一些资源隔离,安全隔离等的技术方案和策略. 主机层面的资源隔离,都是由是Borglet来操纵的. Google的混部情况: Google几乎所有的机器都是混部的,在一台机器上,可能运行着不同jobs的tasks.根据论文中所说,Google的50%的机器运行了9个甚至更多的tasks.90%的机器运行着25个tasks,达到4500个线程. 因此,Google有完善的隔离技术来保证task之间不相互影响

多模态小组阅读笔记精选 | 每周一起读 #7

本期精读文章 An Empirical Study of Language CNN for Image Captioning 文章来源 https://arxiv.org/abs/1612.07086 推荐理由 本篇论文提出了用 CNN 模型来对单词序列进行表达,该 CNN 的输入为之前时刻的所有单词,进而可以抓住对生成描述很重要的历史信息.其中总体架构如下图所示: 该模型主要由四部分组成,用于图像特征提取的 CNN_I,用于自然语言建模的 CNN_L,用于结合 CNN_I 和 CNN_L 信息

php中get_adjacent_post函数PHP源码阅读笔记

这个函数是wordpress里的一个函数,作用是获取相邻的POST文章. 函数并不大,有效代码大概只有70行左右,但是里面包含的知识不少,所以专门用一篇文章来解释一下. get_adjacent_post函数的源码位于wp-includes/link-template.php中. 我会通过"//roc:"在引出源码阅读笔记. /**  * Retrieve adjacent post.  *  * Can either be next or previous post.  *  * @

知识图谱小组阅读笔记精选 | 每周一起读 #6

本期精读文章 Neural Relation Extraction with Selective Attention over Instances 论文链接 https://aclweb.org/anthology/P/P16/P16-1200.pdf 推荐理由 本文为清华刘知远老师组里的工作,使用了 attention 去衡量关系抽取的时候当前句子和当前关系的匹配程度,比较好的删选了远程监督候选句子中和当前关系无关的句子,从而提高了性能. 知识图谱小组阅读笔记精选 >>>karis&l