На основе Калейдоскоп а также Калейдоскоп с MCJIT Уроки, у меня есть код для создания модуля и функции и вызова его с помощью MCJIT. Функция нуждается в прототипе:
auto ft = llvm::FunctionType::get(llvm::Type::getInt32Ty(Context), argTypes, false);
Тем не менее, пример охватывает только Double в качестве параметров и возвращаемых значений (в приведенном выше примере используется int). Чтобы сделать что-то продвинутое, вам нужно передать такие вещи, как классы и контейнеры.
Как вы используете существующие классы C ++ в модуле?
Конечно, вы можете ссылаться на любую библиотеку, которую хотите, но вам нужно объявить прототипы функций, чтобы использовать их. Если в API библиотеки есть классы, как вы их объявляете?
Я хочу что-то вроде этого:
auto ft = llvm::FunctionType::get(llvm::Type::getStructTy("class.std::string"), argTypes, false);
где class.std :: string был импортирован из string.h.
API LLVM имеет только примитивные типы. Вы можете определить структуры для представления классов, но это слишком сложно сделать вручную (и не переносимо).
Способ сделать это может состоять в том, чтобы скомпилировать класс в битовый код и прочитать его в модуль, но я хочу избежать временных файлов, если это возможно. Также я не уверен, как извлечь тип из модуля, но это должно быть возможно. Я попробовал это в файле заголовка одного из моих классов (я переименовал файл заголовка в файл cpp, иначе clang превратился бы в предварительно скомпилированный заголовок .gch), и результат был просто константой … может быть, он был оптимизирован? Я попробовал это на файле cpp, и это привело к 36000 строк кода …
Потом я нашел эта страница. Вместо использования LLVM API, я должен использовать Clang API, потому что Clang, как компилятор, может скомпилировать код в модуль. Затем я могу использовать API LLVM с импортированными модулями. Это правильный путь? Любой работающий исходный код приветствуется, потому что потребовалось вечно только для того, чтобы заставить вызов функции работать (учебники устарели, а документация скудна).
Задача ещё не решена.
Других решений пока нет …