Подтвердить что ты не робот

Связывание LLVM JIT-кода с Static LLVM-библиотеками?

Я занимаюсь внедрением кросс-платформенного приложения (Mac OS X, Windows и Linux), которое будет проводить много анализа интенсивных аналитических данных. Основная часть механизма анализа будет написана на С++ по соображениям скорости, при этом пользовательский механизм сценариев взаимодействует с механизмом тестирования С++. Я хочу написать несколько интерфейсов для скриптов, чтобы подражать другому популярному программному обеспечению с существующими большими пользовательскими базами. Первым фронтом будет язык сценариев, похожий на VisualBasic.

Я думаю, что LLVM будет идеально подходит для моих нужд. Производительность очень важна из-за огромного объема данных; для получения ответа может потребоваться несколько часов или дней для запуска одного теста. Я полагаю, что использование LLVM также позволит мне использовать единое внутреннее решение, в то время как я реализую разные интерфейсы для разных вкусов языка сценариев с течением времени.

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

В предыдущей реализации аналогичной коммерческой системы тестирования, которую я написал, я построил быстрый интерпретатор, который легко взаимодействовал с библиотекой тестирования, потому что он был написан на С++ и напрямую связан с библиотекой движков тестирования. Обратные вызовы от кода сценария к тестированию объектов библиотеки включали перевод между форматами со значительными накладными расходами.

Мне кажется, что с LLVM я мог бы реализовать обратные вызовы в С++ напрямую, чтобы я мог заставить скриптовый код работать почти так, как если бы он был написан на С++. Аналогично, если весь код был скомпилирован в формат байт-кода LLVM, кажется, оптимизаторы LLVM могут оптимизировать границы между языком сценариев и кодом ядра тестирования, написанным на С++.

Я не хочу, чтобы каждый раз составлял модуль тестирования. В идеале я хотел бы JIT компилировать только код сценария. Для небольших тестов я пропустил некоторые проходы оптимизации, а для больших тестов я бы выполнил полную оптимизацию во время ссылки.

Так возможно ли это? Могу ли я предварительно скомпоновать механизм тестирования файлу объекта .o или .a, а затем связать код сценария с помощью JIT?

Наконец, в идеале, я хотел бы, чтобы код сценария реализовал определенные методы в качестве подклассов для определенного класса С++. Таким образом, механизм тестирования С++ будет видеть только объекты С++, в то время как код установки JIT скомпилировал скриптовый код, который реализовал некоторые из методов для объектов. Похоже, что если бы я использовал алгоритм правильного определения имени, было бы относительно легко настроить генерацию LLVM для языка сценариев, чтобы он выглядел как вызов метода С++, который затем можно было бы связать с механизмом тестирования.

Таким образом, этап компоновки будет проходить в двух направлениях: вызовы с языка сценариев в объекты объекта тестирования для извлечения информации о ценах и информации состояния теста и вызовов из механизма тестирования методов некоторых конкретных объектов С++, где код был предоставлен не из С++, но с языка сценариев.

Вкратце:

1) Могу ли я связать файлы precompiled (.bc,.o или .a) как часть компиляции JIT, процесс генерации кода?

2) Могу ли я связать код, используя процесс в 1) выше, таким образом, что я могу создать код, который действует так, как если бы все было написано на С++?

4b9b3361

Ответ 1

  • Да, мы можем! В зависимости от версии LLVM вы используете различные вызовы API. вам понадобится llvm:: getBitcodeModuleProvider на 2.5.
  • Самый простой способ вызвать функции С++ - создать функцию (llvm:: Function:: Create), используя флаг llvm:: Function:: ExternalLinkage, а затем addGlobalMapping, чтобы он указывал на вашу С++-функцию.

Ответ 2

  • Я так считаю.
  • Это волосатое. Вам необходимо сопоставить С++ ABI с функциями, которые вы вызываете, и нужно убедиться, что сгенерированный код использует те же структуры данных, классы, макет и т.д. (Через эквивалент файлов заголовков). С++ ABI имеет множество нюансов и проблем с переносимостью. Возможно, прототип с первым взаимодействием с C. clang имеет ограниченную поддержку для С++ прямо сейчас.

Ответ 3

1) Вы можете загружать и связывать файлы .bc, файлы .o, если они были скомпилированы в архив .so, должны быть загружаемыми, а символы в них должны быть доступны.

2) Пока вы не хотите делать ужасные вещи с помощью обратных вызовов, вы, вероятно, можете просто пройти стандартные указатели функций C и выполнить обратные вызовы указателями функций. Вы также можете делать некоторые другие вещи, но иметь дело с попыткой определить объекты или шаблоны С++ или функции-члены вызова, не будучи компилятором С++, вы не хотите делать.

вы должны знать С++ ABI, вы должны знать о целевой платформе, вы должны знать всевозможные вещи, вы должны быть компилятором С++ для генерации кода, который похож на С++. Имя mangler - одна из самых раздражающих частей.