Поддержка LLVM JIT для кэширования скомпилированного вывода
Я пытаюсь увидеть, как избежать компиляции LLVM JIT каждый раз и использовать кэшированную копию. Я вижу, что LLVM имеет ObjectCache
поддержка генерации кода из модуля, но чтобы получить модуль из файла или строки кода, его нужно скомпилировать и пройти различные этапы оптимизации. Каков наилучший способ сделать это?
Кэшируйте окончательный объект изображения в некоторый файл и сначала ищите файл, и попробуйте разобрать и попытаться создать
ExecutionEngine
с изображением, чтобы можно было выполнить (получить указатель на функцию и вызвать ее)Сохраните промежуточный результат компиляции и оптимизации кода - то есть запишите модуль в некоторый файл (например, используя dump) и попытайтесь прочитать его (разбор IR). затем используйте
ObjectCache
поддержка генерации кода из этого модуля.
Вариант (2) кажется двухэтапным и, вероятно, хуже, чем (1), но является ли (1) правильным решением?
1 ответ
Учитывая, что у вас есть экземпляр 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.
Я надеюсь, что это помогает.