Я пишу свой собственный язык в LLVM и использую внешние функции C из стандартных и пользовательских. Теперь я добавляю объявления, используя классы C++ для LLVM IR. Как это:
void register_malloc(llvm::Module *module) {
std::vector<llvm::Type*> arg_types;
arg_types.push_back(Type::getInt32Ty(getGlobalContext()));
FunctionType* type = FunctionType::get(
Type::getInt8PtrTy(getGlobalContext()), arg_types, false);
Function *func = Function::Create(
type, llvm::Function::ExternalLinkage,
llvm::Twine("malloc"),
module
);
func->setCallingConv(llvm::CallingConv::C);
}
void register_printf(llvm::Module *module) {
std::vector<llvm::Type*> printf_arg_types;
printf_arg_types.push_back(llvm::Type::getInt8PtrTy(getGlobalContext()));
llvm::FunctionType* printf_type =
llvm::FunctionType::get(
llvm::Type::getInt32Ty(getGlobalContext()), printf_arg_types, true);
llvm::Function *func = llvm::Function::Create(
printf_type, llvm::Function::ExternalLinkage,
llvm::Twine("printf"),
module
);
func->setCallingConv(llvm::CallingConv::C);
}
Я собираюсь определить десятки внешних функций, есть ли простой способ их определить и как?
Я думаю о «включении» заголовка C (или файла LLVM IR .ll) в модуль. Но я не мог найти ни одного примера, как это сделать...
include
; для удобства взгляните на мой предыдущий ответ на другой вопрос, специально дляprintf_prototype
. - person Hongxu Chen   schedule 24.09.2015clang -S -emit-llvm
для компиляции заголовков, а затем использовать CPPBackend для создания кода C++, который создает эти определения. - person arrowd   schedule 24.09.2015