LLVM-如何通过函数的真实/原始名称获取函数

qc1*_*1iu 6 c++ llvm clang

最近,我使用llvm在LLVM-IR中插入call指令。问题是,如果我有一个名为 的函数add,我无法使用 getFuntion(string) 找到它,因为 IR 中的 add() 可能会_Z3addv_。我知道IR中的所有功能都有一个新名称,但我不知道新名称到底是什么。

  Module *m = f->getParent();
  IRBuilder<> builder(m->getContext());
  Function *call = m->getFunction("add");
  // call is NULL.
  std::vector<Value *> args;
  ......



Module *m = f->getParent();
IRBuilder<> builder(m->getContext());
Function *call = m->getFunction("_Z3addv");
// call is not NULL.
std::vector<Value *> args;
......
Run Code Online (Sandbox Code Playgroud)

如何使用其原始名称找到该函数?

Ale*_*sov 6

您可以重复使用Mangler来自LLVMCore.

这是一个用法示例:

std::string mangledName;
raw_string_ostream mangledNameStream(mangledName);
Mangler::getNameWithPrefix(mangledNameStream, "add", m->getDataLayout());
// now mangledName contains, well, mangled name :)
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚尝试过这个,但似乎不起作用。`mangledName` 包含未损坏的名称。 (4认同)