[英]LLVM Use Of Instruction Is Not An Instruction
我在這里看到一篇關於“使用指令不是指令”錯誤的帖子,我遇到了類似的問題,但沒有充分的理由。
我正在使用 moe ( https://llvm.moe/ocaml/Llvm.html ) 編寫 LLVM 來構建編譯器,我的問題基本上歸結為 3 行:
let pointer = L.build_alloca float_t ("reg") builder in L.dump_value(pointer);
let test = L.build_store (L.const_float float_t 32.3) pointer builder in L.dump_value(test);
let loaded = L.build_load pointer ("reg") builder in L. dump_value(loaded);
我在這里所做的基本上是使用 alloc 在 memory 中獲取一些空間,然后將 32.3 的值存儲到該空間,並嘗試將其加載回我在 memory 中分配的位置。
LLVM 明智,它看起來相當不錯,因為在 dump_module、output 之后,我得到了這樣的東西:
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;
}
}
這似乎暗示如果指令沒有父母,就會發生這種情況,但我不確定為什么會這樣。
非常感謝這里的任何幫助!
LLVM 有常量和指令。 常量是諸如 12 之類的東西,還有函數和全局變量(具有常量地址)。 指令是涉及某種行動的事物。
常量可以使用常量(例如,常量的初始化器可以引用其他常量)。 指令可以使用常量(例如,可以存儲到全局變量中)。 指令可以使用指令(例如,您可以從作為指令結果的地址加載)。
但是常量不能使用指令。
當斷言代碼查看%x13 = load double, double* %reg
時, User
變量指向操作數 ( %reg
),並且操作數的父級是加載指令。 我不知道它在斷言時指向什么,但無論->getParent()
返回什么都不是指令,而正在使用的就是一個指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.