我正在为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,共享库等中替换.你明白了.
| 归档时间: |
|
| 查看次数: |
4902 次 |
| 最近记录: |