如何获得 LLVM 中两条指令之间的距离?
Posted
技术标签:
【中文标题】如何获得 LLVM 中两条指令之间的距离?【英文标题】:How can I get the distance between two instructions in LLVM? 【发布时间】:2019-10-30 03:25:38 【问题描述】:我正在开发一种工具,该工具将使用 LLVM 将多个错误注入源代码。我需要将错误注入到开始指令中,然后在某些指令之后注入指令。如何获得两条指令之间的距离(使用指令计数)?是否有任何方便的功能可以实现,或者唯一的方法是迭代该块内的所有指令以及该块的后续指令?
【问题讨论】:
给定两个指令迭代器,您可能可以在它们上使用std::distance()
。
谢谢,但这不是我想要的。我真正想要的是 IR 级别的两条指令之间执行最少的指令数。
【参考方案1】:
如果您只需要基本块中指令之间的距离,则需要对基本块中的每条指令进行迭代。例如。查看每条指令是如何迭代的:https://github.com/llvm-mirror/llvm/blob/2c4ca6832fa6b306ee6a7010bfb80a3f2596f824/lib/Analysis/CodeMetrics.cpp#L121
for (const Instruction &I : *BB)
// Skip ephemeral values.
if (EphValues.count(&I))
continue;
// Special handling for calls.
if (isa<CallInst>(I) || isa<InvokeInst>(I))
ImmutableCallSite CS(&I);
...
如果您想测量基本块之间的指令之间的距离,它会稍微复杂一些。这将要求使用每个基本块的 DFS 访问数。使用 DFS 编号以及指令相对于其基本块的位置可用于获得一些距离概念。
【讨论】:
以上是关于如何获得 LLVM 中两条指令之间的距离?的主要内容,如果未能解决你的问题,请参考以下文章