无法获取LLVM pass中调用指令调用的函数名
Unable to get the names of the functions called by call instructions in LLVM pass
所以我要做的就是获取调用指令调用的函数的名称:
这是我的简单代码:
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-isyst em /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-编译目录 /home/danish/Desktop/Owl/llvm/llvm-3.4/lib/Transforms/SyncProf/testing/masstree-beta-master -ferror-limit 19 -fmessage-length 80 -fvisibility-inlines-hidden -mstackrealign -fobjc-运行time=gcc -fdiagnostics-show-选项 -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
解析器在文件末尾
每函数优化
运行 在函数 '@_Z9test_jsonv' 上传递 'Skeleton Pass'
clang:错误:无法执行命令:分段错误(核心已转储)
clang: error: clang frontend command failed due to signal (use -v 查看调用)
Ubuntu clang 版本 3.4-1ubuntu3 (tags/RELEASE_34/final)(基于 LLVM 3.4)
目标:i386-pc-linux-gnu
线程模型:posix
clang:注意:诊断消息:请向 http://bugs.debian.org/ 提交错误报告,并包括崩溃回溯、预处理源和相关的 运行 脚本。
clang:注意:诊断信息:
请将以下文件附加到错误报告中:
预处理的源代码和关联的 运行 脚本位于:
clang:注意:诊断消息:/tmp/test_atomics-128b00.cpp
clang:注意:诊断信息:/tmp/test_atomics-128b00.sh
clang:注意:诊断信息:
make: *** [test_atomics.o] 错误 254
当我添加 ->getName()
部分以检索函数名称时出现此错误。
求助!
是的,我认为你是对的!我添加了这个空检查并且它起作用了: Function *func = cast(&(*BI))->getCalledFunction(); if(func != NULL) errs()
所以我要做的就是获取调用指令调用的函数的名称: 这是我的简单代码:
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-isyst em /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-编译目录 /home/danish/Desktop/Owl/llvm/llvm-3.4/lib/Transforms/SyncProf/testing/masstree-beta-master -ferror-limit 19 -fmessage-length 80 -fvisibility-inlines-hidden -mstackrealign -fobjc-运行time=gcc -fdiagnostics-show-选项 -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
解析器在文件末尾
每函数优化
运行 在函数 '@_Z9test_jsonv' 上传递 'Skeleton Pass' clang:错误:无法执行命令:分段错误(核心已转储) clang: error: clang frontend command failed due to signal (use -v 查看调用) Ubuntu clang 版本 3.4-1ubuntu3 (tags/RELEASE_34/final)(基于 LLVM 3.4) 目标:i386-pc-linux-gnu 线程模型:posix clang:注意:诊断消息:请向 http://bugs.debian.org/ 提交错误报告,并包括崩溃回溯、预处理源和相关的 运行 脚本。 clang:注意:诊断信息:
请将以下文件附加到错误报告中: 预处理的源代码和关联的 运行 脚本位于: clang:注意:诊断消息:/tmp/test_atomics-128b00.cpp clang:注意:诊断信息:/tmp/test_atomics-128b00.sh clang:注意:诊断信息:
make: *** [test_atomics.o] 错误 254
当我添加 ->getName()
部分以检索函数名称时出现此错误。
求助!
是的,我认为你是对的!我添加了这个空检查并且它起作用了: Function *func = cast(&(*BI))->getCalledFunction(); if(func != NULL) errs()