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

简介: 作者:史宁宁(snsn1984)最近在读,这是读的第一本LLVM的书,很多地方虽然讲的是自己知道的东西,但是也给人耳目一新的感觉,让人感觉之前有些不确定的东西,或者没有联系起来的知识点一下子贯通了,那感觉非常酸爽。

作者:史宁宁(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 cc1”也指的不是前端Clang,而指的是Clang编译器,这其中不仅包含了前端Clang,还包含了LLVM Core部分等。Clang driver不仅仅调用了前端Clang,同时还调用了LLVM Core,并且应为LLVM没有自己的Linker的缘故,在编译的最后阶段,还调用了系统的linker。LLVM的linker产品lld仍然在开发中。

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

所以:

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

目录
相关文章
|
自然语言处理 JavaScript 前端开发
详解 clang-format 配置选项(基于 clang 8.0.0)
基于 clang 8.0.0 详解 clang-format 中涉及 C/C++ 配置选项的含义,跳过不相关的语言配置选项如 Java, Objective-C, JavaScript。
3163 0
|
编译器 C语言 Windows
windows下在QT里调用ffmpeg库处理音频视频数据时,出现error missing -D__STDC_FORMAT_MACROS 错误的解决方法(MINGW32编译器)。
windows下在QT里调用ffmpeg库处理音频视频数据时,出现error missing -D__STDC_FORMAT_MACROS 错误的解决方法(MINGW32编译器)。
585 0
windows下在QT里调用ffmpeg库处理音频视频数据时,出现error missing -D__STDC_FORMAT_MACROS 错误的解决方法(MINGW32编译器)。
|
Linux C++ iOS开发
七天LLVM零基础入门(Linux版本)------第一天
作者:snsn1984 开篇语: 学习LLVM的过程是一个漫长而艰巨的过程,需要大量的时间和精力。不仅仅如此,开始的过程也不轻松。一个好的开始就是成功的一半。
1318 0
|
C语言 C++ 数据库管理
ODB(C++ ORM)用Mingw的完整编译过程
用mingw官方的GCC4.7.2编译libodb后,并用odb compiler对hello示例生成odb的"包裹"代码,编译链接总是不能通过,下面是编译example/hello报错的信息如下: libodb-sqlite-2.
1852 0
|
Unix Linux C语言
《UNIXLinux程序设计教程》一1.5 示例程序和编译环境
本节书摘来自华章出版社《UNIXLinux程序设计教程》一 书中的第1章,第1.5节,作者:赵克佳 沈志宇,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1386 0
|
Linux
LLVM每日谈之二十三 LLVM/Clang编译Linux内核资料
作者:史宁宁(snsn1984) 之前有朋友问到这个问题,是否有使用LLVM/Clang编译Linux内核的,随手找了一些相关资料,在这里贴出来,与大家共享。 网址:http://llvm.
1840 0
|
SQL 数据库 Python
Python3 ORM hacking
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Python3 ORM hacking # 说明: # 之前分析了一个Python2 ORM的源代码,这次分析一个Python3的源代码,在写法上 # 还是又挺大的区别的。
966 0
|
开发工具 git Perl
gentoo prefix重生(llvm/clang)
gentoo prefix重生(llvm/clang) 前天手贱,更新了mac上gentoo prefix的perl,然后发现git svn无法使用。更新perl其他组件的时候,遇到了一堆问题。 特别是subversion1.8,在gcc-apple下已经无法编译了。 gentoo prefi
4168 0