如何轻松地向LLVM模块添加声明?

如何轻松地向LLVM模块添加声明?,llvm,llvm-ir,llvm-c++-api,Llvm,Llvm Ir,Llvm C++ Api,我正在用LLVM编写自己的语言,并使用std和custom的外部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 = Functio

我正在用LLVM编写自己的语言,并使用std和custom的外部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);
}
void寄存器\u malloc(llvm::Module*Module){
std::向量arg_类型;
arg_types.push_back(Type::getInt32Ty(getGlobalContext());
FunctionType*type=FunctionType::get(
类型::getInt8PtrTy(getGlobalContext()),arg_类型,false);
函数*func=函数::创建(
类型,llvm::Function::ExternalLinkage,
llvm::Twine(“malloc”),
模块
);
func->setCallingConv(llvm::CallingConv::C);
}
无效寄存器\u printf(llvm::Module*Module){
std::向量printf_arg_类型;
printf_arg_types.push_back(llvm::Type::getInt8PtrTy(getGlobalContext());
llvm::FunctionType*打印类型=
llvm::FunctionType::get(
llvm::Type::getInt32Ty(getGlobalContext()),printf_arg_类型,true);
llvm::Function*func=llvm::Function::Create(
printf_类型,llvm::Function::ExternalLinkage,
llvm::Twine(“printf”),
模块
);
func->setCallingConv(llvm::CallingConv::C);
}
我将定义数十个外部函数,有没有简单的方法来定义它们,以及如何定义它们


我考虑将C头文件(或LLVM IR file.ll)包含到模块中。但是我找不到任何示例如何做到这一点…

创建一个空的C源代码并包含您需要的每个头文件,然后使用
clang-S-emit LLVM
将其编译为LLVM IR。此源将包含来自头的每个函数的声明。现在使用<代码> LLC-MULTIOR= CPP OUT。LL ,它将产生C++源,调用LLVM API生成给定的IR。您可以将此代码复制粘贴到程序中


确保在LLVM构建期间启用了cpp后端。

我猜没有
包含
;为了方便起见,特别是对于<代码> Prtff原型原型,可以使用<代码> CLAN-S发射LVVM <代码>来编译“头”,然后使用CPP后端生成产生这些定义的C++代码。如何将声明从LLVM文件添加/加载到模块?是否有方法在模块过程中添加/加载声明,而不是在文件开头复制和粘贴代码?我有一个需要注入外部函数调用的过程。由于现在没有
cpp
后端,剩下的唯一方法是编译为位代码,并使用
parseIRFile
将其加载到过程中。