簡體   English   中英

LLVM 使用指令不是指令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM