为什么要学习LLVM?
适当的站在巨人的肩膀上,可以事半功倍。这并不能成为自己固步自封的借口,常走在SDK的边缘,造IDE,各种轮子。
当中除了工作还有参杂着自己的一些兴趣,存在即更好的探究这个世界。
我先阐述一下clang和llvm的关系。clang是隶属于llvm的子项目,在C/C++体系中常用的编译器。这是连载系列的文章,在后面了解LLVM中可能会直接提及clang,不要怀疑。clang 其实就是llvm 框架的衍生物,LLVM是框架。clang是实例。
遇到一个懊恼的问题,大概一两个月了,C++文件怎样映射到Memory中?之前耳闻C++语法树,后面又接触Python,js,中的一些 key value 数据结构,现在大致猜测所谓的C++ 到 汇编中间必定存在一个解释器,而这个解释器必定存在一些 由顶而下的数据结构。
观其现象:gcc 预处理,编译,汇编,链接。这都是熟知的过程,然而为什么要分为四个阶段?这四个过程到底从一个cpp文件变成.bin或者执行程序的?在这背后肯定有强大的体系支撑。希望通过接触LLVM和Clang的框架能够学习到领先世界开源先驱的一些思维。我们应该围绕着cpp文件内容也就是数据流的处理进行整个Clang分析。
先标记一下 Clang 主页 这里有成套的框架结构介绍。
依赖环境
Get the required tools:
我安装的工具如下
python3.6.5 |
vs2019 |
读者请自动屏蔽差异,其他软件包随意装到时候出问题再说,我预装过这些东西也懒得换了。
一切安装就绪
拉取源码工程,打开cmd 执行命令
漫长的等待期.........,下载超级慢一下午下载了 20%
我们可以先上github看看源码树 https://github.com/llvm/llvm-project.git
这是clang的子项的工程目录
官文git目录介绍
The LLVM Core libraries provide a modern source- and target-independent optimizer, along with code generation support for many popular CPUs (as well as some less common ones!) These libraries are built around a well specified code representation known as the LLVM intermediate representation ("LLVM IR"). The LLVM Core libraries are well documented, and it is particularly easy to invent your own language (or port an existing compiler) to use LLVM as an optimizer and code generator.
该LLVM内核库提供一个现代化的源代码与目标无关的优化,随着 代码生成支持许多流行的CPU(以及一些不太常见的!),这些包都是围绕着建立以及指定被称为LLVM中间表示的代码表示(“LLVM IR”)。LLVM核心库已有详细记录,并且发明您自己的语言(或移植现有编译器)以使用LLVM作为优化器和代码生成器特别容易 。
Clang is an "LLVM native" C/C++/Objective-C compiler, which aims to deliver amazingly fast compiles (e.g. about 3x faster than GCC when compiling Objective-C code in a debug configuration), extremely useful error and warning messages and to provide a platform for building great source level tools. The Clang Static Analyzer is a tool that automatically finds bugs in your code, and is a great example of the sort of tool that can be built using the Clang frontend as a library to parse C/C++ code.
Clang是一个“LLVM原生”C / C ++ / Objective-C编译器,旨在提供惊人的快速编译(例如,在调试配置中编译Objective-C代码时比GCC快3倍),非常有用的错误和警告消息, 并且提供构建优秀源代码工具的平台。该 锵静态分析是一种工具,自动查找代码中的错误,并且是那种工具,可以使用锵前端的库来解析C / C ++代码生成的一个很好的例子。
The LLDB project builds on libraries provided by LLVM and Clang to provide a great native debugger. It uses the Clang ASTs and expression parser, LLVM JIT, LLVM disassembler, etc so that it provides an experience that "just works". It is also blazing fast and much more memory efficient than GDB at loading symbols.
该LLDB项目建立在由LLVM和Clang的提供提供了极大的机调试库。它使用Clang AST和表达式解析器,LLVM JIT,LLVM反汇编程序等,以便提供“正常工作”的体验。在加载符号时,它也比GDB快速且内存效率更高。
The libc++ and libc++ ABI projects provide a standard conformant and high-performance implementation of the C++ Standard Library, including full support for C++11 and C++14.
在libc中++和 的libc ++ ABI项目提供了一个标准的符合性和高性能执行的C ++标准库,包括C ++ 11和C ++ 14的全力支持。
The compiler-rt project provides highly tuned implementations of the low-level code generator support routines like "__fixunsdfdi" and other calls generated when a target doesn't have a short sequence of native instructions to implement a core IR operation. It also provides implementations of run-time libraries for dynamic testing tools such asAddressSanitizer, ThreadSanitizer, MemorySanitizer, andDataFlowSanitizer.
该compiler-rt 项目提供了高度调整,如“低级别的代码生成器支持例程的实现__fixunsdfdi ”等产生的通话时目标不具有本地指令的短序列来实现核心IR操作。它还为动态测试工具(如AddressSanitizer, ThreadSanitizer,MemorySanitizer和 DataFlowSanitizer)提供了运行时库的实现 。
The OpenMP subproject provides an OpenMP runtime for use with the OpenMP implementation in Clang.
该OpenMP的子项目提供的OpenMP与在锵的OpenMP实现使用运行时间
The polly project implements a suite of cache-locality optimizations as well as auto-parallelism and vectorization using a polyhedral model.
该polly项目实现用多面体模型一套高速缓存局部性优化的以及自动并行和矢量化。
The libclc project aims to implement the OpenCL standard library.
该libclc项目旨在实现的OpenCL标准库
The klee project implements a "symbolic virtual machine" which uses a theorem prover to try to evaluate all dynamic paths through a program in an effort to find bugs and to prove properties of functions. A major feature of klee is that it can produce a testcase in the event that it detects a bug.
该klee项目实现了一个“象征性的虚拟机”,它采用一个定理证明,试图评估在努力发现问题和证明的功能性,通过程序中的所有动态路径。klee的一个主要特性是它可以在检测到错误时生成测试用例。
The SAFECode project is a memory safety compiler for C/C++ programs. It instruments code with run-time checks to detect memory safety errors (e.g., buffer overflows) at run-time. It can be used to protect software from security attacks and can also be used as a memory safety error debugging tool like Valgrind.
该SAFECode 项目是C / C ++程序的存储器编译器的安全性。它通过运行时检查来检测代码,以便在运行时检测内存安全错误(例如,缓冲区溢出)。它可用于保护软件免受安全攻击,也可用作Valgrind等内存安全错误调试工具。
The LLD project is a new linker. That is a drop-in replacement for system linkers and runs much faster.
该LLD项目是一个新的链接。这是系统链接器的直接替代品,运行速度更快。
其中有
libunwind、llgo、parallel-libs、pstl、clang-tools-extra、debuginfo-tests、未被提及
带lib应该是提供的标准库文件项
debuginfo-tests 测试文件夹
clang-tools-extra clang其他外部工具
pstl、llgo、parallel-libs 暂不得知
经过一夜下载好了...
下图是下载的目录结构
这里我用vs2019打开,优先构建llvm(x64-release)
因为我需要用到 clang 所以clang的选项我勾选上
这是我的安装目录,编译好的东西将会在这个文件夹下。
因为clang 依赖 llvm 所以这里需要先编译llvm,clang 的CMakeLists.txt将用到 llvm安装的cmakeconfig.txt,下面编译clang 你将对这个问题有相应的理解
这里选择clang目录下的CMakeLists.txt,然后配置release版本,刚才我们编译了llvm 这里需要选择llvm安装目录,他讲依赖着两个配置项 不然提示会包LLVMConfig.cmake找不到之类提示让的错误,需要你配置llvm安装目录
选中CMakeLists.txt右键 依次选择为clang生成缓存、生成、安装
最终生成目录如下
其中bin目录如下
各个文件将不再解释 基本上所有的编译器都有这些东西。
至此clang toolchain 编译完毕。下一步我将对我所关心的内容进行源码解析。