【发布时间】:2014-02-20 01:14:10
【问题描述】:
llvm::User(例如指令)的操作数是 llvm::Values。
mem2reg 传递后,变量在SSA form,与原始源代码对应的名称丢失。 Value::getName() 只为某些东西设置;对于大多数作为中介的变量,它没有设置。
instnamer 传递可以运行以提供所有变量名称,例如 tmp1 和 tmp2,但这并不能捕获它们最初的位置来自。这是原始 C 代码旁边的一些 LLVM IR:
我正在构建一个简单的 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 中确定原始变量(或命名常量名)?调试器必须能够做到这一点,那我该怎么做呢?
【问题讨论】:
-
你用哪个程序来创建这么好的代码集 |来源对比?
-
@JackL。我自己很快就写好了。它只是一个 javascript 画布。当有人为价值提供人类可读的名称ver 获得 500 分时,我什至可能会发布它的提示提示 ;)
-
@Will 你最终发布了你的比较工具吗?我怀疑这对很多人来说都非常有用。
-
@ransford 不怕。而且,可悲的是,从中间名到 SSAnum,我也从未如此接近过。我的项目遇到了其他困难,例如 LLVM 不保留指针,据我了解,这让很多人想要精确的 GC 和移植到 VLIW 等:(
标签: compiler-construction clang llvm debug-symbols llvm-ir