使用LLVM存储指令中的地址创建另一个

时间:2013-04-28 14:55:52

标签: llvm

我正在使用LLVM来获取商店指令并将其替换为另一个指令,以便我可以采取类似的方式

store i64 %0, i64* %a

并将其替换为

store i64 <value>, i64* %a

我用过

llvm::Value *str = i->getOperand(1);

获取我的旧指令正在使用的地址,然后我创建一个新的商店(我是当前的指令位置,所以这个商店将在我正在更换的商店之前创建)

StoreInstr *store = new StoreInst(value, str, i);

然后我删除了我用

替换的商店
i->eraseFromParent();

但是我收到了错误: 删除时:i64% 在销毁Def后仍然使用:存储i64,i64 *%a 以及断言“使用空”&amp;&amp;当值被销毁失败时,使用保留。

我怎么能绕过这个?我想创建一个存储指令然后使用LLVM的ReplaceInstWithInst,但我找不到一种方法来创建存储指令而不给它一个插入自己的位置。我也不是100%会解决我的问题。

我会在我的商店更换之前添加,我匹配一条指令i,然后在执行i-&gt; eraseFromParent之前得到我需要的值,所以我不确定这是否是我问题的一部分;我假设eraseFromParent将i移动到以下存储指令。

1 个答案:

答案 0 :(得分:1)

eraseFromParent从封闭的基本块中删除一条指令(因此,从封闭的函数中删除)。它不会移动到任何地方。以这种方式擦除指令而不首先处理它的使用将使您的IR格式不正确,这就是您收到错误的原因 - 就好像您从以下C片段中删除了第1行:

1   int x = 3;
2   int y = x + 1;

显然你会在剩下的行上出错,x的定义现在已经丢失了!

ReplaceInstWithInst可能是将一条指令替换为另一条指令的最佳方法。您不需要为新指令提供插入位置:只需将指令保留为NULL(或者更好,省略参数),它将创建一个悬空指令,然后您可以将其放置在任何您想要的位置。 / p>

由于上述原因,顺便说一下,ReplaceInstWithInst调用的关键方法是Value::replaceAllUsesWith,这可以确保您不会在IR中留下缺失值。