LLVM Callinst函数如何获取(真实)名称?

LLVM Callinst function how to get (real)Name?


我有一个对象 callInst.How 我可以使用函数的真实名称而不是 IR 代码中的名称?如果我 运行 这个代码在我的通行证中([​​=11=] post 在另一个问题中)

StringRef get_function_name(CallInst *call)
{
Function *fun = call->getCalledFunction();
if (fun) 
    return call->getName(); 
else
    return StringRef("indirect call");
}    

这给我 IR 代码的名称(例如 call、call1、call2)。我想要 callInst 的真实名称(printf、foo、main)。

有什么想法吗?

非常感谢

你得到的是函数的错位名称。您必须对其进行分解才能取回 "real" 名称。我假设您正在处理 linux 并使用 clang 生成您的 IR(因为您的问题上有 clang 标签)。在 linux 上,您可以使用

#include <iostream>
#include <memory>
#include <string>
#include <cxxabi.h>
using namespace std;

inline std::string demangle(const char* name) 
{
        int status = -1; 

        std::unique_ptr<char, void(*)(void*)> res { abi::__cxa_demangle(name, NULL, NULL, &status), std::free };
        return (status == 0) ? res.get() : std::string(name);
}

int main() {
    cout << demangle("mangled name here");
    return 0;
}

分解函数的名称。

作为对@Michael Haidl 回答的补充,boost 通过构造 boost::typeindex::type_id_with_cvr.

demangled 名称提供了更好的表示
type_index ti = type_id_with_cvr<int&>();
std::cout << ti.pretty_name();  // Outputs 'int&' 

详情见tutorial

但请记住,这仅用于调试目的,因为不能保证 LLVM IR names 与 font-end 源代码相同,并且一些 internal 函数名称是甚至允许被剥夺。

它比 demangled 的逻辑更简单 etc.I 只是打印 callinst 的名称而不是真正的 calledfunction 的值。

StringRef get_function_name(CallInst *call)
{
Function *fun = call->getCalledFunction();
if (fun) 
    return fun->getName(); //here i would take fun and not call! 
else
    return StringRef("indirect call");
}    

现在一切正常!with

errs()<<fun->getName().str()<<"\n";

我会实名的! 谢谢回复...我希望我能帮助其他人解决同样的问题...