【问题标题】:how to get function base name from managled function name using llvm ItaniumDemangle api如何使用 llvm ItaniumDemangle api 从受管理的函数名称中获取函数基名称
【发布时间】:2021-03-25 16:11:35
【问题描述】:

我正在编写一个 llvm pass,我需要一个函数的基本名称,例如,

修改后的名称是 ZSt3minIfERKT_S2_S2

解构后的名字是 float const& std::min(float const&, float const&)

但我需要基本名称,即 min

我已经看到一些 llvm API 定义在 -

#include "llvm/Demangle/Demangle.h"
#include <cxxabi.h>
#include "llvm/Demangle/ItaniumDemangle.h"

但我无法正确使用它。任何帮助表示赞赏

【问题讨论】:

  • 这能回答你的问题吗? Unmangling the result of std::type_info::name。这个具体问题是关于类型名称的,但它包含很多信息,应该可以为函数做同样的事情。
  • 另外,您是否尝试过__func____FUNCTION__ 宏?还不够吗?
  • 我已经看到了,没有发现任何有用的东西

标签: c++ llvm


【解决方案1】:

Clang 的 ItaniumPartialDemangler 能够做到这一点,前提是您的名字是使用 Itanium ABI 损坏的。 https://llvm.org/doxygen/Demangle_8h.html

ItaniumPartialMangler 能够从重命名的名称中检索属性,类似于 AST 节点。

我相信您特别要寻找的功能是https://llvm.org/doxygen/structllvm_1_1ItaniumPartialDemangler.html#a2effd15853bfffbeec4d08451f1fa81c

一个示例 sn-p 演示此函数的用法:

#include "llvm/Demangle/Demangle.h"
#include "llvm/Support/raw_ostream.h"

int main() {
    const char* mangled = "_ZSt3minRKfS0_";
    size_t Size = 1;
    char *Buf = static_cast<char *>(std::malloc(Size));

    llvm::ItaniumPartialDemangler Mangler;
    if (Mangler.partialDemangle(mangled)) {
        llvm::errs() << "Failed to demangle name";
        return 1;
    }

    char* Result = Mangler.getFunctionBaseName(Buf, &Size);

    llvm::outs() << "Result: " << Result << "\n";
}

【讨论】:

  • 是的,就是这个功能,但是我无法正确调用它,也没有在llvm中找到任何参考用途。您有任何使用该 getFunctionBaseName 函数的示例代码吗?
  • 我已经用代码示例更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
相关资源
最近更新 更多