總結

棄用現有的 asm! 巨集(macro),並提供一個名為 llvm_asm! 的相同巨集(macro)。功能開關也從 asm 重新命名為 llvm_asm 。 與 asm! 不同的是, llvm_asm! 不打算成為穩定版。

動機

這個變更將 asm! 巨集(macro)釋放了,使它可用於內嵌組合語言項目組新設計的 asm! 巨集(macro), 同時為現在使用 asm! 的使用者提供一個簡單的方法來保持程式碼的正常運作。

對尚未支援新的 asm! 巨集(macro)的架構,在(nightly 版本)上執行內嵌組合語言可能會有用。

教學式解說

Rust 團隊目前正在重新設計 asm! 巨集(macro)。您應該將所有使用 asm! 的程式碼都替換為 llvm_asm! ,以避免程式碼在實施新的 asm! 巨集(macro)時毀壞。

技術文件式解說

編譯器內所有對 asm! 的參考都將改參考 llvm_asm!asm! 將變成一個單純(已棄用)的 macro_rules! ,它會重新導到llvm_asm!。 棄用警告將告知使用者 asm! 將來的語義會作改變,並邀請他們使用 llvm_asm! 來替代。llvm_asm! 巨集(macro)將由 llvm_asm 功能開關來把控。

缺點

此變更可能需要人為變更兩次程式碼:首先變更為 llvm_asm! ,然後再實施新的 asm! 巨集(macro)。

原理及替代方案

我們可以跳過棄用期,並同時執行重新命名新的 asm! 巨集(macro)。 總之用 Rust(nightly 版本)保證能一次破壞大量程式碼,就無需任何過渡期。

先驅技術

D 語言也支援兩種形式的內嵌組合語言。first one 提供用於內嵌組合語言的嵌入式 DSL,它可以在不用 Clobber 情況下直接存取範圍內的變數,但只能在x86和x86_64的架構上使用。 second one 是 LLVM 內部內嵌組合語言句法的 RAM 介面,但它只適用於 DSL 的後端架構。

未解決問題

未來展望

當下執行的會在 new asm! macro 被執行後替換掉,這會破壞那些尚未轉換 llvm_asm! 的程式碼。 由於運算元分隔符將從 : 更改為 , ,所以不會有靜默的錯誤編譯,新的 asm! 巨集(macro)會出現語法錯誤,來保證現有 asm! 的任何呼叫都會失敗,