Связывание llvm jit Code в статические библиотеки LLVM?

StackOverflow https://stackoverflow.com/questions/2806046

  •  25-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

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

В итоге:

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

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

Это было полезно?

Решение

  1. Да мы можем! В зависимости от версии LLVM вы используете, есть разные вызовы API. Вам понадобится LLVM :: GetBitCodeModuleProvider на 2.5.
  2. Самый простой способ вызовов функций C ++ состоит в том, чтобы создать функцию (функцию LLVM :: :: Create) с использованием флага LLVM :: Функция :: exwardAnlinkage, а затем AddGlobalmapping, чтобы сделать его указывать на вашу функцию C ++.

Другие советы

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

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

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

Вы должны знать C ++ Abi, вы должны знать о платформе, которую вы ориентируетесь, вы должны знать все виды вещей, вы эффективно должны быть компилятора C ++ для генерации кода, похожего на C ++. Название Mangler является одной из самых раздражающих деталей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top