LLVM - 链接问题

cap*_*ane 11 c linker llvm

我正在为Timber语言编写LLVM代码生成器,当前的编译器会发出C代码.我的问题是我需要从生成的LLVM文件中调用C函数,例如编译器有一个实时垃圾收集器,我需要调用函数来通知何时在堆上分配新对象.我不知道如何将这些函数与生成的LLVM文件链接起来.

代码生成是通过生成.ll文件然后手动编译它们来完成的.

我试图从LLVM调用外部函数,但我没有运气.在示例中,我发现只调用C标准函数,如"puts"和"printf",但我想调用一个>自制函数.我被卡住了.

Jay*_*rod 12

我假设您正在编写LLVM转换,并且您希望将对外部函数的调用添加到转换后的代码中.如果不是这种情况,请编辑您的问题并提供更多信息.

在从LLVM代码调用外部函数之前,需要为其插入声明.例如:

virtual bool runOnModule(Module &m) {
    Constant *log_func = m.getOrInsertFunction("log_func",
                                               Type::VoidTy,
                                               PointerType::getUnqual(Type::Int8Ty),
                                               Type::Int32Ty,
                                               Type::Int32Ty,
                                               NULL);
    ...
}
Run Code Online (Sandbox Code Playgroud)

上面的代码声明了一个log_func返回void 的函数,它接受三个参数:一个字节指针(字符串)和两个32位整数.getOrInsertFunction是一种方法Module.

要实际调用该函数,您必须插入一个CallInst.有几种静态Create方法.


小智 5

通常使用llvm-as编译LLVM程序集文件:

llvm-as *.ll
Run Code Online (Sandbox Code Playgroud)

将bitcode文件编译为.s汇编语言文件:

llc *.bc
Run Code Online (Sandbox Code Playgroud)

GCC他们使用运行时库:

gcc *.s runtime.c -o executable
Run Code Online (Sandbox Code Playgroud)

如有必要,在真实的makefile,共享库等中替换.你明白了.