LLVM IR和C/C++函数相互调用时的注意事项
2015-03-07 19:25
1171 查看
已下叙述,主要针对LLVM 3.6。
一、从C/C++调用LLVM IR函数
主要有两种办法。
1、通过llvm::ExecutionEngine::runFunction()调用。
存在的问题:可以直接调用llvm::Function,但目前LLVM项目没有实现参数传递,只提供了接口,因此我们只能调用无参函数。
2、通过llvm::ExecutionEngine::getPointerToFunction()即时编译为本机代码,并获得一个指向C函数的void
*指针。然后,可以将其转换为合适的C/C++函数指针,进行调用。
存在的问题:LLVM指令被编译为ELF格式,而不是COFF格式,导致在Windows平台加载时错误"Incompatible
object format"。
为解决这一问题,需要在系统三元组(Triple)后加“-elf”。参见:http://comments.gmane.org/gmane.comp.compilers.llvm.devel/82330。
二、从LLVM IR调用C/C++函数
主要有三种办法。
1、将被调用函数声明为动态链接导出函数,LLVM自动在执行时解析并调用。
这是官方“标准”的做法。
存在的问题:windows平台可执行文件中的函数一般不会被导出,不能通过这一机制解析。
解决办法是,通过llvm::sys::DynamicLibrary::AddSymbol()显示注册函数。LLVM在查找外部函数时,首先查找通过AddSymbol注册的函数,然后才通过系统调用查找可执行文件或动态链接库中的符号。
2、通过llvm::ExecutionEngine::addGlobalMapping()将被调用的C/C++函数指针注册为LLVM中的全局变量。
这样做的好处是,被调用函数不需要声明为动态链接库的导出函数,只要知道函数指针就可以。
存在的问题:MCJIT对addGlobalMapping的支持不完善,实际运行时会报错。参见:http://llvm.1065342.n5.nabble.com/Weird-problems-on-calling-an-external-function-from-MCJIT-on-Windows-mingw-td67478.html。
解决办法同1,通过AddSymbol()来实现。
3、通过自定义的内存分配器来直接解析函数。
原理同addGlobalMapping类似,这一方法我没有验证,有空可以试验一下。
一、从C/C++调用LLVM IR函数
主要有两种办法。
1、通过llvm::ExecutionEngine::runFunction()调用。
存在的问题:可以直接调用llvm::Function,但目前LLVM项目没有实现参数传递,只提供了接口,因此我们只能调用无参函数。
2、通过llvm::ExecutionEngine::getPointerToFunction()即时编译为本机代码,并获得一个指向C函数的void
*指针。然后,可以将其转换为合适的C/C++函数指针,进行调用。
存在的问题:LLVM指令被编译为ELF格式,而不是COFF格式,导致在Windows平台加载时错误"Incompatible
object format"。
为解决这一问题,需要在系统三元组(Triple)后加“-elf”。参见:http://comments.gmane.org/gmane.comp.compilers.llvm.devel/82330。
二、从LLVM IR调用C/C++函数
主要有三种办法。
1、将被调用函数声明为动态链接导出函数,LLVM自动在执行时解析并调用。
这是官方“标准”的做法。
存在的问题:windows平台可执行文件中的函数一般不会被导出,不能通过这一机制解析。
解决办法是,通过llvm::sys::DynamicLibrary::AddSymbol()显示注册函数。LLVM在查找外部函数时,首先查找通过AddSymbol注册的函数,然后才通过系统调用查找可执行文件或动态链接库中的符号。
2、通过llvm::ExecutionEngine::addGlobalMapping()将被调用的C/C++函数指针注册为LLVM中的全局变量。
这样做的好处是,被调用函数不需要声明为动态链接库的导出函数,只要知道函数指针就可以。
存在的问题:MCJIT对addGlobalMapping的支持不完善,实际运行时会报错。参见:http://llvm.1065342.n5.nabble.com/Weird-problems-on-calling-an-external-function-from-MCJIT-on-Windows-mingw-td67478.html。
解决办法同1,通过AddSymbol()来实现。
3、通过自定义的内存分配器来直接解析函数。
原理同addGlobalMapping类似,这一方法我没有验证,有空可以试验一下。
相关文章推荐
- 转(Dlite)LLVM IR和C/C++函数相互调用时的注意事项
- .NET工程中以 C 和 C++ 两种方式编译时,函数调用注意事项
- iOS项目中调用C/C++库中的函数注意事项
- C#调用C++函数的注意事项
- iOS项目中调用C/C++库中的函数注意事项
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题
- java中调用Matlab的函数+注意事项
- C++ 与“类”有关的注意事项总结(四):静态类成员 和 静态成员函数
- 简单C++调用lua函数及C++和lua相互函数调用小例子
- 关于c++多重继承下的函数调用注意的问题
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题
- .mm文件中调用.m文件中函数的注意事项
- C++与C进行相互函数调用,extern关键词的妙用
- 48讲 函数调用深入理解 函数使用注意事项①
- C函数和C++函数相互调用
- 在LLVM的C语言编译器中内联纯汇编函数的注意事项
- 日记:VB调用C++ DLL注意事项
- OTL调用存储过程/函数及注意事项
- C/C++混合编程,实现C/C++间的函数相互调用详解
- OTL调用存储过程/函数及注意事项