如何在llvm模块中修改结构类型?

时间:2016-11-13 21:55:03

标签: llvm llvm-c++-api

我需要更新llvm模块中某些结构中属性的地址空间。通过使用适当的新结构类型将单个结构类型克隆为新类型,可以非常简单地进行更新。它确实需要以递归方式将该方法应用于任何子结构,但工作正常。

但我的挑战是如何在模块中更新此结构的用法?我看到了两个挑战:

  • 没有明显的方法可以查询哪些Values正在使用旧的结构类型?
  • 可能有指针类型,也使用旧类型,所以我需要搜索那些,不知何故,可能通过详尽地搜索我遇到的每个指针类型?

1 个答案:

答案 0 :(得分:0)

我不完全确定你想要实现的目标,但我认为我可以解决你的问题,假设你正在谈论类似于ConstantStruct的事情。

  1. 您可以分别使用Value的成员函数Value::uses()Value::users ()轻松查询所有用户或用户。它返回一个iterator_range,您可以使用它来循环它们。但是,如果您只想用旧的结构替换旧的结构,那么您只需要Value::replaceAllUsesWith (Value *V)。这适用于LLVM中的任何Value
  2. 如果您自己存储了指向旧结构的指针,那么这些指针确实会失效,因为您可能需要一致地更新它们。但是,调用replaceAllUsesWith函数确保在LLVM方面,指向结构的指针仍然有效。这意味着如果在使用上述方法替换所有用途后再次查询模块,则不必担心获取指向旧结构的指针。