我有一个对象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)的真实名称。
有什么想法吗?
非常感谢
答案 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回应...我希望我帮助其他人解决同样的问题...