Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 执行失败,值::getName和值::HasName(LLVM)_C++_Clang_Llvm - Fatal编程技术网

C++ 执行失败,值::getName和值::HasName(LLVM)

C++ 执行失败,值::getName和值::HasName(LLVM),c++,clang,llvm,C++,Clang,Llvm,我正在做一个程序来列出所有.ll文件的函数调用 这是我的密码: 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

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

这是我的密码:

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";
                ...
                ...

问题似乎是当我调用getName()函数时,它调用了hasName(),最后一个函数给出了错误,但我不明白为什么,也不知道如何解决如果调用是通过函数指针进行的间接调用,
getCalledFunction()
可能返回null。我查看了你的IR文件,电话如下所示:

%14 = call i32 (i32, { double, double }*, ...) bitcast (i32 (...)* @__alignx to i32 (i32, { double, double }*, ...)*)(i32 16, { double, double }* %13)

调用目标是一个位广播常量表达式,因此这可能是问题所在。您可以改为使用
getCalledValue()
——在本例中,它将返回一个表示比特广播的
ConstantExpr
,您可以尝试使用
stripPointerCasts()
获取函数本身。

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

%14 = call i32 (i32, { double, double }*, ...) bitcast (i32 (...)* @__alignx to i32 (i32, { double, double }*, ...)*)(i32 16, { double, double }* %13)

调用目标是一个位广播常量表达式,因此这可能是问题所在。您可以改为使用
getCalledValue()
——在本例中,它将返回一个表示比特广播的
ConstantExpr
,您可以尝试使用
stripPointerCasts()
获取函数本身。

哇,感谢您的帮助,现在使用getCalledValue()修复了它。我从llvm开始,但我无法修复它。再次感谢!哇,谢谢你的帮助,现在使用getCalledValue()修复了它。我从llvm开始,但我无法修复它。再次感谢!