2011-08-22 83 views
3

我试图理解LLVM程序的高层结构。 我在书中读到“程序是由模块组成的,每个模块都对应于translation unit”。有人可以更详细地解释我以上内容以及模块和翻译单元(如果有)之间的不同之处。 我也有兴趣知道当翻译单元启动并完成调试信息编码时哪部分代码被调用?LLVM翻译单元

回答

1

翻译单位是语言标准术语。例如,这是从C(c99 iso草案)

5.1概念模型; 5.1.1翻译环境; 5.1.1.1程序结构

一个C程序不需要全部同时翻译。该程序的文本以本国际标准中称为源文件(或预处理文件)的单位保存为 。一个 源文件以及所有通过预处理 指令#include包含的标题和源文件被称为预处理转换单元。在预处理之后,预处理翻译单元被称为翻译单元

于是,翻译单元是预处理后的单源文件(file.c)(所有#include d *.h文件实例化,所有宏被扩展,所有的意见会被跳过,文件准备符号化)。

翻译单元是一个编译单元,因为它在连接步骤之前不依赖任何外部资源。所有标题都在TU内。

术语模块未在语言标准中定义,但它在更深的翻译阶段指的是translation unit

LLVM把它描述为:http://llvm.org/docs/ProgrammersManual.html

模块类代表存在于LLVM方案的顶层结构。 LLVM模块实际上是原始程序的翻译单元或由链接程序合并的多个翻译单元的组合。

Module类跟踪函数列表,GlobalVariables列表和SymbolTable。此外,它还包含一些有用的成员函数,可以使常用操作变得简单。

关于你的问题,这部分:

我也有兴趣知道哪部分代码被称为翻译单元开始时并完成调试信息的编码?

这取决于如何使用LLVM。 LLVM本身是一个库,可以以各种方式使用。

对于clang/LLVM(C/C++编译器构建在libclang和LLVM上)预处理阶段后创建的翻译单元。它将被解析成AST,然后解析成LLVM程序集并保存在Module中。

对于教程示例,这里是一个创建模块http://llvm.org/releases/2.6/docs/tutorial/JITTutorial1.html

+2

来给你的答案多一点细节:“翻译单位”是从* C *语言标准,在其他编译语言也使用的一个术语。术语“模块”在LLVM中用于大致相同的概念。 –