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

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

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

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

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

Я изучаю следующие варианты:

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

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

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

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


    person Sanjit    schedule 09.04.2014    source источник
    comment
    Я не эксперт в этом, но, возможно, llvm.org/ docs / tutorial / LangImpl4.html # add-a-jit-compiler помогает.   -  person godfatherofpolka    schedule 09.04.2014
    comment
    спасибо за ссылку. Да, я думаю, что встроенный jit - еще один вариант. Мне было интересно, можем ли мы реализовать интерфейс C ++ в коде JIT и вернуть указатель на реализацию производного класса из JIT в вызывающее приложение C ++?   -  person Sanjit    schedule 09.04.2014
    comment
    Если языки сценариев, такие как AngelScript или Lua (точнее LuaJit), недостаточно быстры для ваших целей, я предлагаю изучить OpenCL. Он позволяет компилировать вычислительный код, написанный на C / C ++, во время выполнения. Вы можете легко настроить свои вычислительные ядра, просто используя препроцессор C. Большинство компиляторов OpenCL внутренне используют LLVM, так что вы получите всю его мощь, не связываясь с множеством технических деталей. В качестве последнего бонуса вы можете легко попробовать запустить свой код на графическом процессоре, хотя вы можете ограничиться процессором, если хотите.   -  person stgatilov    schedule 29.11.2015
    comment
    @stgatilov: OpenCL накладывает серьезные ограничения. Придется распространять исходный код, никаких шаблонов C ++ (если я правильно помню) ...   -  person Russell Greene    schedule 01.12.2015


    Ответы (1)


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

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

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

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

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

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

    person AngelBaltar    schedule 02.05.2014
    comment
    llc - это ассемблер / компилятор, а не компоновщик. Он производит вывод .asm или .obj. Он не создает загружаемых библиотек (.dll или .so). - person Sean; 16.05.2014
    comment
    Спасибо, Шон, за комментарий, он проясняет мой вопрос. Встроенный JIT - лучший вариант, который я нашел до сих пор. - person Sanjit; 19.06.2014