【问题标题】:llvm : CallGraphNode giving incorrect function Namellvm : CallGraphNode 给出不正确的函数名称
【发布时间】:2017-07-13 07:02:01
【问题描述】:

我正在尝试遍历 llvm 中的调用图。在调用图中获得节点后,我会尝试打印与该调用图节点对应的函数名称以及引用数。

结果: 1)函数名始终为空字符串。 2)引用的数量总是一个随机数。 3)同样被调用的函数名也是一个空字符串。

代码: bool runOnModule(llvm::Module &M) 覆盖 {

    CallGraph cg = CallGraph(M);
    cg.dump();// this is correct. It is printing the expected the call graph

    for ( CallGraph::const_iterator itr = cg.begin(), ie = cg.end() ; itr != ie; itr++)
    {
       if (itr->second != nullptr)
       {
            itr->second->dump();
            errs()<<"-----------CGN---------\n";
            CallGraphNode *cgn = itr->second.get();



            if(const Function* fptr = cgn->getFunction())
            {
                errs()<<"Number of references are"<<cgn->getNumReferences()<<"\n";

                errs()<<fptr->getName()<<"\n";


                if(cgn->operator[](0) != nullptr)
                {

                    if(cgn->operator[](0)->getFunction() != nullptr)
                    {
                        errs()<<cgn->operator[](0)->getFunction()->getName()<<"\n";
                    }

                 }
              }
         }
   }

}

【问题讨论】:

    标签: llvm llvm-ir call-graph


    【解决方案1】:

    尝试添加 -DNDEBUG 编译标志。我有同样的问题,它有帮助。 如果您使用的是 cmake,您可以在 CMakeLists 文件中添加以下行:

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG")
    

    【讨论】:

    • 非常感谢..它解决了我的问题。你在哪里找到的?
    • 我是从我的主管那里学到的 :) 据我了解,您需要使用此标志编译源代码以与 llvm 兼容。该标志基本上禁用断言。如果您使用从源代码构建的 llvm,则不需要这个。
    • 但是我使用的是从源代码本身构建的 llvm...:)
    • 可能是我们有不同的编译标志。我有一个 CallGraph 的例子,它与从源代码编译的 llvm 一起工作得很好。但是当我尝试在另一台安装了 llvm 的机器上运行这个示例时,遇到了同样的问题。
    • 我不需要这个标志,我使用这个命令编译了应用程序LLVM_6.0/bin/clang -O0 -c -emit-llvm test_cg.c 但是,程序的最后一部分导致错误。具体来说,这个条件语句if(cgn-&gt;operator[](0) != nullptr)范围内的代码。即使使用该标志 -DNDEBUG 编译后,我仍然收到相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多