我将 LLVM-C API 用于编译器项目,需要将目标代码从 IR 发送到内存缓冲区。我知道 JIT 可以做到这一点,但是生成的代码将使用不同的参数执行多次,因此静态编译一次而不是每次 JIT 编译更有意义。
我想要的是一个目标代码缓冲区,然后我可以设置可执行文件,可能通过使用mmap
(但如果有更简单的方法,请告诉我),然后运行。
我发现这个函数LLVMTargetMachineEmitToMemoryBuffer
似乎可以完成我需要的第一部分,但它需要一个现有的 LLVM 内存缓冲区类型才能写入。据我所知,我想要LLVMCreateMemoryBufferWithRange
这个,它需要一个指针char
和一个大小。但是现在我需要知道要提前写入多少字节LLVMTargetMachineEmitToMemoryBuffer
才能为它提供正确的缓冲区,因为它从任意 IR 生成目标代码可能是任意大的,所以我觉得我在这里采取了错误的方法,但我我不确定该怎么做。
如何使用 LLVM 的 API 实现这一点?