c++ - 在 C++ 程序中编译 C++ 函数

标签 c++ llvm jit

考虑以下问题,

C++ 程序可能会发出 C++ 函数的源代码,例如,假设它将创建一个包含以下内容的字符串:

std::vector<std::shared_ptr<C>> get_ptr_vec()
{
    std::vector<std::shared_ptr<C>> vec;
    vec.push_back(std::shared_ptr<C>(new C(val1)));
    vec.push_back(std::shared_ptr<C>(new C(val2)));
    vec.push_back(std::shared_ptr<C>(new C(val3)));
    vec.push_back(std::shared_ptr<C>(new C(val4)));
    return vec;
}

val1 等的值将在程序创建上述源字符串时在运行时确定。这个源将被写入一个文件,比如 get_ptr_vec.cpp

然后另一个 C++ 程序需要读取这个源文件,编译它,调用 get_ptr_vec 函数并获取它返回的对象。有点像 JIT 编译器。

有什么办法可以做到这一点吗?我认为一种解决方法是使用一个脚本来编译文件,将其构建到共享库中。而第二个程序可以通过dlopen获取函数。但是,是否可以跳过这个并让第二个程序编译文件(不调用 system)。请注意,第二个程序在编译时将无法看到此源文件。事实上,第一个程序可能会发出数千个这样的小源文件。

为了提供一些背景知识,第一个程序将构建一个表达式树,并通过遍历后序来序列化树。树的每个节点都有一个写入文件的字符串表示。第二个程序将读取这个序列化树节点的列表,并且需要能够将这个字符串列表重建为一个 C++ 对象列表(稍后我可以从这个列表重建树)。

我认为 LLVM 框架可能在这里提供一些东西。有人可以给我一些指示吗?不需要完整的答案,我只是从某个地方开始。

最佳答案

您可以使用 clang 编译生成的代码并发出 LLVM 位码(-emit-llvm 标志)。然后,将您的程序与读取位码文件和 JIT 的 LLVM 部分静态链接。最后,获取已编译的位码并对它们运行 JIT,这样它们就可以在您的程序的地址空间中使用。

关于c++ - 在 C++ 程序中编译 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767346/

相关文章:

c++ - 具体对接框架

ubuntu - LLVM compiler-rt 是否安装在我的 Ubuntu 14.04 上

linker - 链接器是否更喜欢 .so 文件而不是 .a 文件?

python - 从 numba jitted 函数调用非 jitted 函数

C++/LLVM : Runtime code generation and STL container

node.js - 如何在后续的 Node 运行中重用 V8 JIT 优化?

c++ - C++ 类命名空间中的 C 函数调用

c++ - 使用 SCons 构建外部代码树

c++ - WinHttpSetOption() 设置 TLSv1.2 失败,错误代码为 ERROR_INTERNET_INCORRECT_HANDLE_TYPE

optimization - 我如何查看 LLVM 的 opt 使用了哪些优化过程?