Генерировать двоичный код (разделяемую библиотеку) из встроенного LLVM в С++

Я работаю над высокопроизводительной системой, написанной на С++. Этот процесс должен быть способен понять сложную логику (правила) во время выполнения, написанную на простом языке, разработанном для этого приложения. У нас есть два варианта:

  • Интерпретировать логику - запустить встроенный интерпретатор и создать динамический вызов функции, который при приеме данных на основе интерпретируемой логики работает с данными

  • Скомпилируйте логику в динамический общий файл plugin.so, используйте dlopen, dlsym для загрузки плагина и функции логической логики во время выполнения

Вариант 2 выглядит действительно привлекательным, поскольку он будет оптимизирован машинным кодом, будет работать намного быстрее, чем встроенный интерпретатор в этом процессе.

Параметры, которые я изучаю:

  • написать компиляцию метода компиляции (строковая логика, список и ошибки, список и предупреждения)
  • здесь логика ввода - это строка, содержащая логический код в нашем пользовательском языке
  • он генерирует llvm ir, возвращаемое значение метода компиляции возвращает строку ir
  • написать метод ссылки bool link (строка ir, имя файла строки, список и ошибки, список и предупреждения)
  • для метода ссылок я искал документацию llvm, но мне не удалось выяснить, есть ли возможность написать такой метод.

Если я прав, LLVM IR преобразуется в байт-код LLVM или код сборки. Затем либо LLVM JIT используется для запуска в режиме JIT, либо для использования GNU Assembler используется для генерации собственного кода.

Можно ли найти функцию в LLVM, которая это делает? Было бы намного лучше, если бы все было сделано из кода, а не с помощью системной команды из С++, чтобы вызывать "как" для генерации файла plugin.so для моего требования.

Пожалуйста, дайте мне знать, знаете ли вы, каким образом я могу генерировать собственный двоичный код общей библиотеки из моего процесса во время выполнения.

Ответ 1

llc, который является инструментом llvm, который выполняет LLVM-IR для преобразования двоичного кода. Я думаю, что это все, что вам нужно.

В принципе, вы можете создать свой LLVM IR так, как хотите, а затем вызвать llc через ваш IR.

Вы можете вызвать его из командной строки, или вы можете перейти к реализации llc и узнать, как это работает в ваших собственных программах.

Вот полезная ссылка:

http://llvm.org/docs/CommandGuide/llc.html

Надеюсь, это поможет.