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

时间:2015-01-20 12:24:06

标签: c++ function clang llvm


我有一个对象callInst.How我可以采用函数的真实名称,而不是IR代码中的名称?如果我在我的传递中运行此代码(Useless在另一个问题中发布)

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)的真实名称。

有什么想法吗?

非常感谢

3 个答案:

答案 0 :(得分:2)

你得到的功能的错误名称。你必须对其进行解码以获得“真实”的名称。我假设您正在使用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;
}

取消函数的名称。

答案 1 :(得分:1)

对@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不能保证与字体结束源代码相同,甚至允许一些internal函数名称被剥夺了。

答案 2 :(得分:0)

它比解码的逻辑更简单等。我只是打印了callinst的名称,而不是真正的被调用函数的值。

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");
}    

现在一切都好了!用

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

我将采取真实姓名! thnx回应...我希望我帮助其他人解决同样的问题...