考虑以下问题,
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框架可能在这里提供一些东西。有人可以给我一些指示吗?没必要一个完整的答案,只是让我开始。
答案 0 :(得分:1)
您可以使用clang编译生成的代码并发出LLVM bitcode(-emit-llvm
标志)。然后,将程序与读取bitcode文件和JIT的LLVM部分静态链接。最后,使用编译的bitcode并在它们上运行JIT,这样它们就可以在程序的地址空间中使用。