我试图了解如何每次都避免使用LLVM JIT编译并使用缓存副本。我看到LLVM对模块的代码生成有ObjectCache
支持,但是要从文件或代码字符串中获取模块,需要对其进行编译并进行不同的优化传递。最好的方法是什么?
将最终图像对象缓存到某个文件并首先查找该文件,然后尝试解析并尝试使用该图像创建ExecutionEngine
以便可以执行(获取指向函数的指针并调用它)
保存代码编译和优化的中间输出 - 即将模块写入某个文件(例如,使用dump)并尝试读取它(解析IR)。然后使用ObjectCache
支持从该模块生成代码。
选项(2)似乎有两个步骤,可能比(1)差,但是(1)是正确的方法吗?
答案 0 :(得分:2)
假设您有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引擎。
我希望它有所帮助。