LLVM支持JIT缓存编译输出

4
我想知道如何避免每次进行LLVM JIT编译并使用缓存副本。我看到LLVM支持ObjectCache用于从模块生成代码,但是要从文件或代码字符串获取模块,则需要对其进行编译并经过不同的优化处理过程。最佳方法是什么?
  1. 将最终的图像对象缓存到某个文件中,并首先查找该文件,尝试解析并尝试使用该图像创建ExecutionEngine,以便执行(获取函数指针并调用它)
  2. 保存代码编译和优化的中间输出,即将模块写入某个文件(例如,使用dump),并尝试读取它(解析IR)。然后使用ObjectCache支持从此模块生成代码。
选项(2)似乎有两个步骤,并且可能比(1)更差,但是(1)是正确的方法吗?

请问您能否再明确一下您想要实现的目标是什么?在第一个选项中,您混合了目标代码和位码,这两者是不同的东西。您想要缓存什么?目标文件(机器码)还是位码文件(LLVM IR)? - AlexDenisov
最好是生成目标文件(机器码),这样我们就不需要编译和生成机器码了。因此,第一个选项似乎无效 - 或者是否有可用的API来转储目标代码(在这里会很有用)? - Aana
1个回答

3

假设您已经拥有一个 ObjectFile 实例,您可以将其写入磁盘:

std::string cacheName("some_name.o");
std::error_code EC;
raw_fd_ostream outfile(cacheName, EC, sys::fs::F_None);
outfile.write(object.getBinary()->getMemoryBufferRef().getBufferStart(),
              object.getBinary()->getMemoryBufferRef().getBufferSize());
outfile.close();

然后您可以从磁盘上读取它:

std::string cacheName("some_name.o");

ErrorOr<std::unique_ptr<MemoryBuffer>> buffer =
  MemoryBuffer::getFile(cacheName.c_str());

if (!buffer) {
  // handle error
}

Expected<std::unique_ptr<ObjectFile>> objectOrError =
  ObjectFile::createObjectFile(buffer.get()->getMemBufferRef());

if (!objectOrError) {
  // handle error
}

std::unique_ptr<ObjectFile> objectFile(std::move(objectOrError.get()));

auto owningObject = OwningBinary<ObjectFile>(std::move(objectFile),
                                             std::move(buffer.get()));
auto object = owningObject.getBinary();

你可以将这段代码复制并插入到你的自定义 ObjectCache 中,然后将对象缓存提供给 JIT 引擎。
希望对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接