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

LLVM- How to get function by function's real/original name

本文关键字:函数 原始 获取 真实 何通过 LLVM-      更新时间:2023-10-16

最近,我使用llvm在llvm-ir中插入呼叫指令。问题是,如果我有一个名为 add的函数,则我将使用getFuntion(string)找到它,因为ir may _Z3addv_中的add()。我知道IR中的所有fucntion都有一个新名称,但是我不知道新名称是什么。

  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;
......

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

您可以从LLVMCore重复使用Mangler

这是用法的示例:

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

libstdc 有一个不错的删除库,只需包括 cxxabi.h那么您可以更改Function *call = m->getFunction("_Z3addv");

to

int status; Function *call = m->getFunction(abi::__cxa_demangle("_Z3addv"), nullptr, nullptr, &status);