Соединение LLVM код JIT к статическим библиотекам LLVM?

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

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

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

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

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

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

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

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

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

Таким образом:

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

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

16
задан inflector 10 May 2010 в 22:14
поделиться

3 ответа

  1. Да, мы можем! В зависимости от версии LLVM, которую вы используете, существуют различные вызовы API. вам понадобится llvm::getBitcodeModuleProvider на 2.5.
  2. Самый простой способ вызова C++ функций - создать функцию (llvm::Function::Create), используя флаг llvm::Function::ExternalLinkage, а затем addGlobalMapping, чтобы она указывала на вашу C++ функцию.
14
ответ дан 30 November 2019 в 22:31
поделиться
  1. Я так думаю.
  2. Это сложно. Вам нужно соответствовать C++ ABI функций, к которым вы обращаетесь, и убедиться, что сгенерированный код использует те же структуры данных, классы, расположение и т.д. (через эквивалент заголовочных файлов). У C++ ABI довольно много нюансов и проблем с переносимостью. Возможно, прототипом для начала послужит взаимодействие с C. clang сейчас имеет ограниченную поддержку C++.
3
ответ дан 30 November 2019 в 22:31
поделиться

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

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

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

1
ответ дан 30 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: