llvm::User
(比如指令)的操作数是llvm::Value
。
在mem2reg pass之后,变量以SSA form形式存在,并且它们的名称与原始源代码相对应的名称已经丢失。对于大多数变量(即中介变量),Value :: getName()
未设置。
instnamer pass可以被运行以给所有变量命名,例如tmp1和tmp2,但这并不反映它们最初来自哪里。下面是一些LLVM IR和原始C代码:
我正在构建一个简单的HTML页面来可视化和调试我正在进行的一些优化工作,并且我希望将SSA变量显示为namever符号,而不仅仅是临时的instnamer名称,以提高可读性。
我通过类似以下命令行的clang获取我的LLVM IR:
clang -g3 -O1 -emit-llvm -o test.bc -c test.c
在IR中存在对llvm.dbg.declare
和llvm.dbg.value
的调用;如何将它们转换为原始源代码名称和SSA版本号?
那么,我如何从llvm::Value
中确定原始变量(或命名常量名称)? 调试器必须能够做到这一点,那么我该怎么办?