4

我正在尝试查看如何避免每次都进行 LLVM JIT 编译并使用缓存副本。我看到 LLVMObjectCache支持从模块生成代码,但是要从文件或代码字符串中获取模块,需要对其进行编译并经过不同的优化过程。最好的方法是什么?

  1. 将最终图像对象缓存到某个文件并首先查找文件,然后尝试解析并尝试ExecutionEngine使用图像创建以便可以执行(获取函数指针并调用它)

  2. 保存代码编译和优化的中间输出——即将模块写入某个文件(例如,使用转储)并尝试读取它(解析 IR)。然后使用ObjectCache此模块生成代码的支持。

选项(2)似乎是两个步骤,可能比(1)更糟糕,但(1)是正确的方法吗?

4

1 回答 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();

您可以获取此代码并将其插入您的 customObjectCache中,然后将对象缓存提供给 JIT 引擎。

我希望它有所帮助。

于 2018-01-05T10:47:52.060 回答