5

在 LLVM 中,我们有LLVMContext,它是存储单元,我们有llvm::Module,它是构建新符号(函数和类型)的地方。

我的问题是;用于编译单元的正确 llvm 抽象是什么?是Module?还是这实际上意味着更大的范围,即:共享库目标

在我看来,编译单元必须满足全有或全无的结果;它要么编译所有内容而没有错误,要么存在错误并且需要在 CU 中的任何符号可用之前对其进行修复和重新构建。在我看来,这是编译单元应该代表什么的定义

如果模块是 CU 的正确抽象,我如何将其他(正确编译的)Module对象中的符号呈现给即将构建的新模块,以便它能够找到那些?我需要添加声明还是有其他加速方法?

指向相关行clang会很有帮助

4

2 回答 2

5

Module 是编译单元的正确抽象。您可以将模块链接在一起以从那里进行整个程序分析。

于 2012-03-24T19:24:07.290 回答
4

这是一个正在进行的尝试来回答我自己的问题:

该类llvm::Linker能够获取多个模块并返回一个包含现有模块中所有符号的复合模块。完成链接并创建复合模块后,我仍然不清楚有关输入模块所有权的规则是什么。

在任何情况下,该类都应该允许您采用增量路径来增长模块。假设您正在尝试实现 REPL,这意味着您将新符号添加到全局命名空间:

REPL 的大纲如下:

  • 在 REPL 中编写一些函数
  • 将函数编译为单个模块,称其为“基础”
  • 在 REPL 中编写更多函数
  • 在新模块中编译新函数
  • 如果新功能模块编译成功,将“base”和新模块链接到一个新模块中,称之为“base.2”
  • 冲洗并重复

    如果您按名称替换符号或函数,您希望旧符号看到符号的覆盖版本。因此,当您定义一个新函数时,您需要确保getOrInsertFunction在现有的“基本”模块以及新模块中调用您的函数。

于 2012-04-01T15:08:40.997 回答