首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行失败的值::getName和Value::HasName (LLVM)

执行失败的值::getName和Value::HasName (LLVM)
EN

Stack Overflow用户
提问于 2017-03-28 21:54:48
回答 1查看 397关注 0票数 0

我正在做一个程序来列出.ll文件的所有函数调用。

这是我的代码:

代码语言:javascript
复制
void foo (const Module *M) {
    for (const Function &F : *M) {
        for (const BasicBlock &BB : F) {
            for (const Instruction &I : BB) {
                // CallInst: represents a function call
                if (dyn_cast<CallInst>(&I)) {
                    StringRef name = dyn_cast<CallInst>(&I)->getCalledFunction()->getName();
                    std::cout << name.str() << "\n";
                ...
                ...

问题出现在第7行。

当我的程序使用我的所有测试文件时,没有问题,但是当我用这个文件进行测试时,会出现以下错误:

代码语言:javascript
复制
#0 0x0000000000427d10 llvm::sys::PrintStackTrace(llvm::raw_ostream&) /ubuntu/llvm/llvm-3.9.0.src/lib/Support/Unix/Signals.inc:402:0
#1 0x00000000004280af PrintStackTraceSignalHandler(void*) /ubuntu/llvm/llvm-3.9.0.src/lib/Support/Unix/Signals.inc:470:0
#2 0x0000000000426157 llvm::sys::RunSignalHandlers() /ubuntu/llvm/llvm-3.9.0.src/lib/Support/Signals.cpp:44:0
#3 0x0000000000427557 SignalHandler(int) /ubuntu/llvm/llvm-3.9.0.src/lib/Support/Unix/Signals.inc:256:0
#4 0x00007fbde269c390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
#5 0x000000000040b402 llvm::Value::hasName() const /ubuntu/llvm/llvm-3.9.0.src/include/llvm/IR/Value.h:233:0
#6 0x000000000040afa7 buildFunctionsCallMap[abi:cxx11](llvm::Module const*) /foo/PrintCallingFunctions.cpp:50:0
#7 0x000000000040b168 printCallingFuntions(llvm::Module const*) /foo/PrintCallingFunctions.cpp:75:0
#8 0x00000000004070bf main ...../main.cpp:76:0
#9 0x00007fbde15f3830 __libc_start_main /build/glibc-9tT8Do/glibc-2.23/csu/../csu/libc-start.c:325:0
#10 0x0000000000406bb9 _start (../../../build/bin/foo+0x406bb9)
Stack dump:
0.  Program arguments: ../../../build/bin/foo QLA_D3_c1_veq_V_dot_V.ll

问题似乎是当我调用getName()函数时,它调用了hasName(),而最后一个函数给出了错误,但是我不明白为什么,也不知道该怎么解决。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-29 00:29:00

如果调用是通过函数指针进行的间接调用,则getCalledFunction()可能返回null。我查看了您的IR文件,调用如下所示:

代码语言:javascript
复制
%14 = call i32 (i32, { double, double }*, ...) bitcast (i32 (...)* @__alignx to i32 (i32, { double, double }*, ...)*)(i32 16, { double, double }* %13)

调用目标是一个位转换常量表达式,所以这很可能是问题所在。您可以使用getCalledValue() --在本例中,它将返回一个表示位转换的ConstantExpr,您可以尝试使用stripPointerCasts()来获取函数本身。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43080634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档