无法获取LLVM中调用指令调用的函数名称

时间:2017-01-14 06:26:14

标签: clang llvm clang++ llvm-clang llvm-ir

所以我要做的就是获取调用指令调用的函数的名称: 这是我的简单代码:

for(Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
                {
            for(BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE; ++BI){
                if(isa<CallInst>(&(*BI)) ) {
                        StringRef fname = cast<CallInst>(&(*BI))->getCalledFunction()->getName();
                  }
     }
}

这是令人讨厌的错误:

0 libLLVM-3.4.so.1 0x40f8150f llvm :: sys :: PrintStackTrace(_IO_FILE *)+ 47

1 libLLVM-3.4.so.1 0x40f8177f

2 libLLVM-3.4.so.1 0x40f812ec

3 0x40022400 __kernel_sigreturn + 0

4 libLLVM-3.4.so.1 0x40899c74 llvm :: Value :: getName()const + 20

5 SkeletonPass.so 0x40027786

堆栈转储: 0.程序参数:/ usr / bin / clang -cc1 -triple i386-pc-linux-gnu -emit-obj -disable-free -disable-llvm-verifier -main-file-name test_atomics.cc -mrelocation-model pic -pic-level 2 -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu pentium4 -target-linker-version 2.24 -momit-leaf-frame-pointer -g -coverage-file / home / danish / Desktop / Owl / llvm / llvm-3.4 / lib / Transforms / SyncProf / testing / masstree-beta-master / test_atomics.o -resource-dir /usr/bin/../lib/clang/3.4-dependency -file .deps / test_atomics.d -MT test_atomics.o -sys-header-deps -MP -include config.h -D NDEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D NDEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D NDEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /usr/lib/llvm-3.4/include -I /usr/lib/llvm-3.4/include -I / usr / lib / llvm-3.4 / include -internal-isystem / usr / include // c ++ / 4.8 -internal-isystem /usr/include//c++/4.8/i386-linux-gnu -internal-isystem /usr/include//c++/4.8/backward -internal-isystem / usr / include // i386- linux-gnu / c ++ / 4.8 -internal-isystem /usr/bin/../lib/gcc/i686-linux-gnu/4.8/../../../../include/c++/4.8 -internal -isystem /usr/bin/../lib/gcc/i686-linux-gnu/4.8/../../../../include/c++/4.8/i686-linux-gnu -internal-isystem / usr / bin /../ lib / gcc / i686-linux-gnu / 4.8 /../../../../ include / c ++ / 4.8 / backward -internal-isystem /usr/bin/../ lib / gcc / i686-linux-gnu / 4.8 /../../../../ include / i686-linux-gnu / c ++ / 4.8 -internal-isystem / usr / local / include -internal-isystem / usr / bin /../ lib / clang / 3.4 / include -internal-externc-isystem /usr/bin/../lib/gcc/i686-linux-gnu/4.8/include -internal-externc-isystem / usr / include / i386-linux-gnu -internal-externc-isystem / include -internal-externc-isystem / usr / include -O3 -Woverloaded-virtual -Wcast-qual -W -Wall -std = c ++ 11 -fdeprecated-macro -fdebug-compilation-dir /home/danish/Desktop/Owl/llvm/llvm-3.4/lib/Transforms/SyncProf/te sting / masstree-beta-master -ferror-limit 19 -fmessage-length 80 -fvisibility-inlines-hidden -mstackrealign -fobjc-runtime = gcc -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp - load /home/danish/Desktop/Owl/llvm/llvm-3.4/Release+Asserts/lib/SkeletonPass.so -o test_atomics.o -x c ++ test_atomics.cc

  1. 文件末尾的解析器

  2. 按功能优化

  3. 跑步&#39;骷髅通行证&#39; on function&#39; @_ Z9test_jsonv&#39; clang:错误:无法执行命令:分段错误(核心转储) clang:错误:clang frontend命令因信号失败(使用-v查看调用) Ubuntu clang版本3.4-1ubuntu3(标签/ RELEASE_34 / final)(基于LLVM 3.4) 目标:i386-pc-linux-gnu 线程模型:posix clang:注意:诊断消息:请向http://bugs.debian.org/提交错误报告,并包括崩溃回溯,预处理源和关联的运行脚本。 clang:注意:诊断信息:

  4. 请将以下文件附于BUG报告中: 预处理的源和相关的运行脚本位于: clang:注意:诊断消息:/tmp/test_atomics-128b00.cpp clang:注意:诊断消息:/tmp/test_atomics-128b00.sh clang:注意:诊断信息:

    make:*** [test_atomics.o]错误254

    当我添加->getName()部分以检索函数名称时,会出现此错误。 帮助!

1 个答案:

答案 0 :(得分:1)

是的,我认为你是对的!我添加了这个空检查并且它起作用:Function * func = cast(&amp;(* BI)) - &gt; getCalledFunction(); if(func!= NULL)errs()&lt; getName();谢谢@IsmailBadawi!

相关问题