C LLVM链接问题

C LLVM链接问题,c,linker,llvm,C,Linker,Llvm,我正在为Timber语言编写一个LLVM代码生成器,当前编译器发出C代码。我的问题是,我需要从生成的LLVM文件调用C函数,例如,编译器有一个实时垃圾收集器,我需要调用函数来通知何时在堆上分配新对象。我不知道如何将这些函数与生成的LLVM文件链接 代码由generate.ll文件生成,然后手动编译这些文件 我试图从LLVM调用一个外部函数,但运气不好。在示例中,我发现只调用了C标准函数,如“puts”和“printf”,但我想调用一个>自制函数。我卡住了 我假设您正在编写LLVM转换,并且希望将

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

代码由generate.ll文件生成,然后手动编译这些文件

我试图从LLVM调用一个外部函数,但运气不好。在示例中,我发现只调用了C标准函数,如“puts”和“printf”,但我想调用一个>自制函数。我卡住了


我假设您正在编写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);
    ...
}
上面的代码声明了一个函数
log_func
,该函数返回void并接受三个参数:一个字节指针(字符串)和两个32位整数<代码>getOrInsertFunction是一种方法


要实际调用该函数,必须插入一个。有几种静态的创建方法。

通常使用LLVM编译LLVM程序集文件,如下所示:

llvm-as *.ll
将位代码文件编译为.s汇编语言文件:

llc *.bc
将它们与运行库一起放入:

gcc *.s runtime.c -o executable

如有必要,在real makefiles、共享库等中替换。你知道了。

< P>我把你的问题解释为“如何实现C或C++中的运行库,以便我的语言编译成LLVM?”< /P> 正如Jonathan Tang所详述的,一种方法是将编译器的输出从LLVM IR转换为位代码再转换为程序集,并让vanilla
gcc
根据运行时源(或对象文件)链接程序集


另一种可能更灵活的方法是使用
llvm gcc
将运行时本身编译成llvm位代码,然后使用
llvm ld
将编译器中的位代码与运行时的位代码链接起来。然后可以使用
opt
重新优化此位码,使用
llvm dis
转换回IR,使用
lli
直接解释此位码(这将仅在llvm是根据
libffi
构建的情况下起作用),或者使用
llc
编译成程序集(然后使用香草
gcc
编译成本机二进制).

您的意思是,您试图直接在LLVM IR中编写代码,但无法拨打电话,还是说您正在使用LLVM编译代码,但遇到了问题?这正是我刚才想用LLVM解决的问题,谢谢!