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

时间:2015-09-23 12:43:45

标签: 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 = 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);
}

我要定义几十个外部函数,是否有一些简单的方法来定义它们,以及如何定义它们?

我想&#34;包括&#34; C头(或LLVM IR文件.ll)到模块。但是,我无法找到如何做到这一点的任何例子......

1 个答案:

答案 0 :(得分:2)

创建一个空的C源并包含您需要的每个头,然后使用clang -S -emit-llvm将其编译为LLVM IR。此源将包含标头中每个函数的声明。现在使用llc -march=cpp out.ll,它将生成调用LLVM API以生成给定IR的C ++源代码。您可以将此代码复制粘贴到您的程序中。

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