Генерация двоичного кода (разделяемой библиотеки) из встроенного LLVM в переполнении стека

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

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

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

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

Варианты, которые я изучаю:

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

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

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

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

    12

    Решение

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

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

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

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

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

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

    3

    Другие решения

    Других решений пока нет …

    По вопросам рекламы [email protected]