LLVM:函数使用(常量转换)从何而来?

LLVM: Where does function usage (constant value cast) come from?

我的目标是将原始函数的所有 call/invoke 指令替换为新函数的 call/invoke 指令。 有时会有一个额外的用法,我不知道该怎么做。

调查我是运行以下模块pass:

bool ControlFlowDiversity::runOnModule(Module &M) {
  for (Function& f : M) {
    DEBUG(dbgs() << f.getName() << ", uses: " << f.getNumUses());
    DEBUG(dbgs() << ", hasAddressTaken: " << f.hasAddressTaken() << "\n");
    // DEBUG(dbgs() << "hasMetadata: " << f.hasMetadata() << "\n");
    for (auto i = f.use_begin(), e = f.use_end(); i != e; ++i) {
      i->dump();
    }
  }
  return false;
}

[test1.c]

void x();
int main() { x(); }
void x() { }

[test2.c]

void x() { }
int main() { x(); }

[输出1]

main, uses: 0, hasAddressTaken: 0
x, uses: 1, hasAddressTaken: 0
  call void @x()

[输出2]

x, uses: 2, hasAddressTaken: 1
  call void @x()
void (...)* bitcast (void ()* @x to void (...)*)
main, uses: 0, hasAddressTaken: 0

额外的使用从何而来?这是一个Constant(演员表)。
地址存储在一些metedata/table中吗?它有什么用?
当我替换用法时,我必须用新常量替换常量还是可以简单地删除它?
转储模块完全符合我的预期。它不包含额外用法的迹象。

常量使用只有在您明确要求时才会被清理 - 它们实际上是垃圾收集而不是立即清理。

http://llvm.org/docs/doxygen/html/classllvm_1_1Constant.html#a50d0911852017f2168de329f53d8568d

只需调用此函数,您就会发现用法已被删除。