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

时间:2017-05-03 18:17:50

标签: 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框架可能在这里提供一些东西。有人可以给我一些指示吗?没必要一个完整的答案,只是让我开始。

1 个答案:

答案 0 :(得分:1)

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