【发布时间】:2012-09-21 16:24:38
【问题描述】:
通常如果你想修改 LLVM IR,你需要写一个 pass。但是,如果更高级别的工具可以为您提供帮助,有时自己编写通行证是一种矫枉过正的做法。
例如,有人可能希望记录程序中的每个load 和store。为此,他需要注入执行日志记录的代码。现在如果有更高级别的工具,它可以提供回调给我们写我们想要的东西。因此,在这种情况下,例如,它可以为我们提供OnLoad 和OnStore 函数,我们可以填充这些函数来告诉工具在每次加载和存储时要做什么。这种工具存在吗?
所以基本上我想要类似于动态二进制检测工具提供的东西,但它适用于 LLVM,用于编译时代码注入。
【问题讨论】:
-
您是否检查了现有的 LLVM API,如果是,您发现缺少什么?我记得 LLVM API 足够强大,可以在几行代码中完成类似的操作,尽管我从未使用过它。
-
它们确实足够强大,但我仍然认为如果存在更高级别的工具,可以更轻松地完成一些任务。例如,在这种情况下,使用它们正在加载或存储的地址记录每个加载和存储,虽然可以通过编写 pass 来完成,但当然不会像通过简单地实现 OnLoad 和告诉工具做什么那么简单OnStore 功能。使用工具做到这一点会容易 10 倍。
-
这可以在 LLVM IR 的文本表示上使用一点 grep-fu 或 sed-fu 轻松完成。或者,更好的是,使用 LLVM API 编写 30 行 C++。
-
是的,用不支持模式匹配的语言编写这样的通行证并不是很愉快的体验。您可能想尝试 OCaml 或 Haskell 绑定。
-
请小心你所做的事情:为每个加载/存储发出额外的代码是可怕的膨胀,你可以只计算每个基本块的加载/存储,并在输入块时更新数字。