Поддержка LLVM JIT для кэширования скомпилированного вывода

Я пытаюсь увидеть, как избежать компиляции LLVM JIT каждый раз и использовать кэшированную копию. Я вижу, что LLVM имеет ObjectCache поддержка генерации кода из модуля, но чтобы получить модуль из файла или строки кода, его нужно скомпилировать и пройти различные этапы оптимизации. Каков наилучший способ сделать это?

  1. Кэшируйте окончательный объект изображения в некоторый файл и сначала ищите файл, и попробуйте разобрать и попытаться создать ExecutionEngine с изображением, чтобы можно было выполнить (получить указатель на функцию и вызвать ее)

  2. Сохраните промежуточный результат компиляции и оптимизации кода - то есть запишите модуль в некоторый файл (например, используя 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.

Я надеюсь, что это помогает.

Другие вопросы по тегам