Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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 LLVM指令的使用不是指令_C_Clang_Ocaml_Llvm_Llvm Ir - Fatal编程技术网

C LLVM指令的使用不是指令

C LLVM指令的使用不是指令,c,clang,ocaml,llvm,llvm-ir,C,Clang,Ocaml,Llvm,Llvm Ir,我在这里看到一篇关于“使用指令不是指令”错误的帖子,我遇到了类似的问题,但没有一个好的理由 我使用moe()编写LLVM来构建编译器,我的问题基本上可以归结为三行: let pointer=L.build\u alloca float\u t(“reg”)builder在L.dump\u值(指针)中; 让test=L.build_存储(L.const_float_t 32.3)指针生成器在L.dump_值中(test); 让loaded=L.build\u加载指针(“reg”)生成器在L.dum

我在这里看到一篇关于“使用指令不是指令”错误的帖子,我遇到了类似的问题,但没有一个好的理由

我使用moe()编写LLVM来构建编译器,我的问题基本上可以归结为三行:

let pointer=L.build\u alloca float\u t(“reg”)builder在L.dump\u值(指针)中;
让test=L.build_存储(L.const_float_t 32.3)指针生成器在L.dump_值中(test);
让loaded=L.build\u加载指针(“reg”)生成器在L.dump\u值中(加载);
我在这里做的基本上是使用alloc在内存中获得一些空间,然后将32.3的值存储到该空间中,并尝试将其加载回我在内存中分配的位置

就LLVM而言,它看起来相当不错,因为在dump_模块输出之后,我得到如下结果:

align 8  %reg = alloca double, align 8 
store double 3.230000e+01, double* %reg, align 8
%x13 = load double, double* %reg, align 8
这正是我想要的——我甚至编写了一个类似的C程序来测试它,它在LLVM中做了一些非常类似的事情

但是,当我运行我的程序时,我得到以下错误:

Use of instruction is not an instruction!
 %x13 = load double, double* %reg, align 8
这似乎真的没有道理。我进一步检查了错误,它似乎是由LLVM源代码中的几行代码引起的:

     if (Instruction *Used = dyn_cast<Instruction>(U.getUser()))
       Assert(Used->getParent() != nullptr,
              "Instruction referencing"
              " instruction not embedded in a basic block!",
              &I, Used);
     else {
       CheckFailed("Use of instruction is not an instruction!", U);
       return;
     }
   }
if(指令*Used=dyn\U cast(U.getUser())
断言(已使用->getParent()!=nullptr,
“指令引用”
“未嵌入基本块的指令!”,
&一、 使用);
否则{
检查失败(“指令的使用不是指令!”,U);
回来
}
}
这似乎意味着如果说明书上没有父母,就会发生这种情况,但我不确定为什么会发生这种情况


任何帮助都将不胜感激

LLVM有常量和指令。常量是12,但也包括函数和全局变量(具有常量地址)。指示是涉及某种行动的东西

常量可以使用常量(例如,常量的初始化器可以引用其他常量)。指令可以使用常量(例如,可以存储到全局变量)。指令可以使用指令(例如,您可以从作为指令结果的地址加载)

但常量不能使用指令


当断言的代码查看
%x13=load double,double*%reg
时,
User
变量指向操作数(
%reg
),操作数的父对象是加载指令。我不知道它在断言时指向什么,但无论返回什么,都不是指令,使用的都是指令。

LLVM有常量和指令。常量是12,但也包括函数和全局变量(具有常量地址)。指示是涉及某种行动的东西

常量可以使用常量(例如,常量的初始化器可以引用其他常量)。指令可以使用常量(例如,可以存储到全局变量)。指令可以使用指令(例如,您可以从作为指令结果的地址加载)

但常量不能使用指令


当断言的代码查看
%x13=load double,double*%reg
时,
User
变量指向操作数(
%reg
),操作数的父对象是加载指令。我不知道它在断言时指向什么,但是无论
->getParent()
返回什么都不是指令,正在使用的都是指令。

什么是
%x12
?你能转储它吗?啊,是的,很抱歉,忘记粘贴了,应该是“%reg”,而不是%x12——要调试它,请进入调试器,转到失败的断言并运行
U.getUser()->dump()
。问题不在于
%reg
操作数,而在于
%x13
的用户。这里@arrowd所说的正是我想做的。什么是
%x12
?你能转储它吗?啊,是的,很抱歉,忘记粘贴了,应该是“%reg”,而不是%x12——要调试它,请进入调试器,转到失败的断言并运行
U.getUser()->dump()
。问题不在于
%reg
操作数,而在于
%x13
的用户。这里@arrowd所说的正是我想做的。您好,感谢您的回复;我不太清楚你的意思——你是说当我调用
%x13=load double,double*%reg
时,父指令是load。这就是我们刚才调用的加载指令吗?还是别的什么?比如,我可以展示更多的代码来识别问题吗?我告诉你,LLVM代码中提到的父级不是指令的父级(你似乎相信),而是操作数的父级。它之所以断言,是因为属于非指令的操作数使用指令。啊,好的,我明白了——那么,有没有一种方法可以从本质上创建属于指令的操作数,并通过在内存中分配空间,在该空间中放置一个常数来完成我在这里试图完成的任务,然后将内存中的常数加载到另一个寄存器?这应该是可能的。听起来好像错误在别处。。。我怀疑它并不是在抱怨这三条线。尝试精确地检查User->getParent()是什么。大多数LLVM对象允许您在调试器中调用->dump()。请更新!正如您所说,我能够修复它,getParent()断言失败了,这是因为我实际上是如何处理%x13的。因此,对于其他有类似问题的人,请确保您正确使用了在%x13中返回的内容——这里也有很好的解释:您好,谢谢您的回复;我不太清楚你的意思——你是说当我调用
%x13=load double,double*%reg
时,父指令是load。这就是我们刚才调用的加载指令吗?还是别的什么?那里有什么