有没有办法从llvm反序列化一个类型,即i32
并返回llvm::Type*
?
就像这样:
std::string llstring = "i32*";
llvm::Type* lltype = xxxxxxx(llstring);
因为LLVM类型非常简单,所以编写自己的类型很容易,但我知道必须存在,因为llvm-as
之类的工具存在,而且显然必须解析类型。
我已经对解析代码进行了一些挖掘,并且看起来似乎很容易使用它们的解析器,因为你需要首先从我能看到的构建一个llvm :: LLLex类。加载.ll.
源文件时使用的解析器似乎是here。据我所见,它完全嵌入在他们的代码中,并且是在无法访问的私有文件中(不在include目录中)。
一个可以工作的黑客就是使用该函数生成一些IR并解析它并从中获取类型:
std::string IR = "@G = external global " + llstring;
auto module = llvm::parseAssemblyString(IR, ...);
llvm::Type* lltype = llvm::getNamedValue("G")->getType();
我有什么遗失的吗?如果他们在llvm::Type
中提供a print
function,那么接下来似乎是一个基本的内置类型解析器,因为这不依赖于上下文(根据我的理解)。