LLVM每日谈之二十 Everything && Clang driver

作者:史宁宁(snsn1984)

最近在读<Getting Started with LLVM Core Libraries>,这是读的第一本LLVM的书,很多地方虽然讲的是自己知道的东西,但是也给人耳目一新的感觉,让人感觉之前有些不确定的东西,或者没有联系起来的知识点一下子贯通了,那感觉非常酸爽。

1.先谈谈题目里的Everything。

LLVM每日谈之十六中,曾经提到过:Everything is a value.主要讲的是重要的LLVM IR的C++类都是Value的子类,同时在对IR的具体操作中,因为LLVM IR使用的是SSA,所以可以把很多的东西直接看成Value,并且也可以当做Value去操作,这样就很方便了。我觉的这句话非常经典,是属于点睛之笔的一句话,理解了这句话,有种豁然开朗,境界猛一下提升的感觉。具体内容可以去参照LLVM每日谈之十六。

在读<Getting ...>这本书的时候,遇到了另外一个Everything:Everything is a lib.这句话同样的经典,同样的高境界。之前我根据源码结构,自己推测LLVM整个架构下的所有产品基本上都是按照库的形式去组织代码的,甚至有的工具在是一个工具的同时,也是一个库。这句话证实了我的看法,LLVM的源码是按照库的形式去组织的。这对理解整个LLVM的源码,有很大的帮助,虽然只是一个架构方面的知识,但是可以让人对架构的理解提升不少。

所以:

Everything is a lib.

Everything is a value.

2. Clang driver。

Clang是LLVM框架下面的一个前端,这是无需置疑的。但是很多人容易忽略Clang driver,这个方面之前我也有过考虑,也是从读<Getting ...>这本书彻底的理清楚了。把LLVM作为编译器使用的时候,命令行使用的“clang”其实并不是前端Clang,而是指的是Clang driver;前端Clang在命令行使用的时候一般是“Clang cc1”.Clang driver不仅仅调用了前端Clang,同时还调用了LLVM Core,并且应为LLVM没有自己的Linker的缘故,在编译的最后阶段,还调用了系统的linker。LLVM的linker产品lld仍然在开发中。

所以如果把前端Clang和Clang driver分清楚,就好像分清楚了LLVM Core和LLVM框架一样,不同的概念指代的是不同范围的东西。如果不搞清楚,那么对之后的学习和工作,会造成很多的困扰。

所以:

Clang driver是一个驱动,一个包含编译全部阶段的驱动,不同于前端Clang。

时间: 2024-10-06 19:49:53

LLVM每日谈之二十 Everything && Clang driver的相关文章

LLVM每日谈之二十二 llvm-config工具的使用

作者:史宁宁(snsn1984) llvm-config作为LLVM的一个工具,是非常有用的,官方文档(http://llvm.org/docs/CommandGuide/llvm-config.html)关于它的介绍如下: llvm-config makes it easier to build applications that use LLVM. It can print the compiler flags, linker flags and object libraries neede

每日算法之二十八:Longest Valid Parentheses

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring. For "(()", the longest valid parentheses substring is "()", which has length = 2. Another example is &

每日算法之二十五:Divide Two Integers

Divide two integers without using multiplication, division and mod operator. 不使用乘法.除法和求模运算求两个数相除. class Solution { public: long long internalDivide(unsigned long long dividend,unsigned long long divisor) { if(dividend<divisor) return 0; int result =

每日算法之二十二:Swap Nodes in Pairs

Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify the values in the list, on

每日算法之二十六:Substring with Concatenation of All Words

变相的字符串匹配 给定一个字符串,然后再给定一组相同长度的单词列表,要求在字符串中查找满足以下条件的起始位置: 1)从这个位置开始包含单词列表中所有的单词,且每个单词仅且必须出现一次. 2)在出现的过程中不能出现其他的干扰单词. 3)出现的位置可能有多个. 4)单词的出现顺序不做要求. 下面是一个例子: S:"barfoothefoobarman" L:"foo","bar" 位置0是出现位置,:两个单词均出现仅出现一次,且没有干扰.同样位置9也

每日算法之二十九:Search in Rotated Sorted Array

在一个经过旋转后的有序数组中查找一个目标元素. Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1.

每日算法之二十:Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 给出数字n,求

LLVM每日谈之十九 LLVM的第一本系统的书(英文)

作者:史宁宁(snsn1984) LLVM终于有了一本系统的书了--<Getting Started with LLVM Core Libraries>.这本书号称是LLVM的第一本书,但是据说日本早就有两本日文的关于LLVM的书,这个了解的不多.不过可以肯定的是,这本书是英文表述的第一本书. 这本书的覆盖范围很广,从简单的如何安装LLVM一直到各个部分的介绍,以及如何使用这些部分去创建自己的工具,都有所介绍.对于想使用LLVM去创建自己的工具的人,完全是够用的,而且是非常不错的一本书.这也是

LLVM每日谈之十九 LLVM的第一本系统的书&amp;lt;Getting Started with LLVM Core Libraries&amp;gt;

作者:史宁宁(snsn1984) LLVM最终有了一本系统的书了--<Getting Started with LLVM Core Libraries>. 这本书号称是LLVM的第一本书,可是据说日本早就有两本日文的关于LLVM的书,这个了解的不多. 只是能够肯定的是,这本书是英文表述的第一本书. 这本书的覆盖范围非常广,从简单的怎样安装LLVM一直到各个部分的介绍,以及怎样使用这些部分去创建自己的工具,都有所介绍. 对于想使用LLVM去创建自己的工具的人.全然是够用的,并且是非常不错的一本书