經過六個月的開發
LLVM 10.0 中的新功能包括對 C++ 概念的支援、不再將 Clang 作為單獨的進程運行、支援 Windows 的 CFG(控制流防護)檢查以及對新 CPU 功能的支援。
- 添加了對“
概念 ”,一個 C++ 模板擴展,將包含在下一個標準中,代號為 C++2a(由 -std=c++2a 標誌開啟)。
概念可讓您定義一組模板參數要求,這些要求在編譯時限制可以接受為模板參數的參數集。這些概念可用於避免在範本內使用的資料類型的屬性與輸入參數的資料類型屬性之間的邏輯不一致。範本
概念 EqualityComparable = 需要(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - 預設情況下,停止啟動執行編譯的單獨進程(“clang -cc1”)。現在編譯已在主進程中完成,“-fno-integrated-cc1”選項可用於恢復舊的行為。
- 新的診斷模式:
- 「-Wc99-designator」和「-Wreorder-init-list」警告不要在 C++ 模式下使用 C99 初始值設定項,因為它們在 C99 中正確但在 C++20 中不正確。
- “-Wsizeof-array-div” - 捕捉諸如“int arr[10];”之類的情況…sizeof(arr) / sizeof(short)…」(應該是「sizeof(arr) / sizeof(int)」)。
- 「-Wxor-used-as-po」 - 警告不要使用結構,例如在可能與求冪 (2^16) 混淆的運算中使用「^」(xor)運算子。
- “-Wfinal-dtor-non-final-class” - 警告未以「final」說明符標記的類,但具有帶有「final」屬性的析構函數。
- 「-Wtautological-bitwise-compare」是一組警告,用於診斷位元運算和常數之間的同義反覆比較,以及識別將位元 OR 運算應用於非負數的始終為真比較。
- 「-Wbitwise-conditional-parentheses」警告將邏輯運算子 AND (&) 和 OR (|) 與條件運算子 (?:) 混合時出現的問題。
- 「-Wmisleading-indentation」類似於 GCC 中的同名檢查,它警告縮排表達式,就好像它們是 if/else/for/while 區塊的一部分,但實際上它們不包含在該區塊中。
- 當指定“-Wextra”時,啟用“-Wdeprecated-copy”檢查,警告有關建構函數的使用
具有顯式析構函數定義的類別中的“移動”和“複製”。 - “-Wtautological-overlap-compare”、“-Wsizeof-pointer-div”、“-Wtautological-compare”、“-Wrange-loop-analysis”檢查已擴展。
- 預設情況下停用“-Wbitwise-op-parentheses”和“-Wlogic-op-parentheses”檢查。
- 在 C 和 C++ 程式碼中,僅允許在陣列中進行指標算術運算。 「-fsanitize=pointer-overflow」模式下的未定義行為清理程序現在可以捕獲向空指標添加非零偏移量或在從非空指標中減去整數時創建空指標等情況。
- 「-fsanitize=implicit-conversion」(隱式轉換清理程序)模式適用於識別位元大小小於「int」類型的類型的遞增和遞減操作的問題。
- 在向量化中預設選擇 x86 目標架構時“-march=skylake-avx512”、“-march=icelake-client”、“-march=icelake-server”、“-march=cascadelake”和“-march=cooperlake”程式碼已停止使用512 位元zmm 暫存器,除了原始程式碼中的直接指示之外。原因是執行 512 位元操作時 CPU 頻率會降低,這會對整體效能產生負面影響。要更改新行為,提供了選項“-mprefer-vector-width=512”。
- 「-flax-vector-conversions」標誌的行為與 GCC 類似:禁止整數和浮點向量之間的隱式向量位元轉換。為了消除這個限制,建議使用標誌
“-flax-vector-conversions=all”是預設值。 - 改進了對 Octeon 系列 MIPS CPU 的支援。將“octeon+”新增至有效 CPU 類型清單。
- 當組裝成 WebAssembly 中間程式碼時,會自動呼叫 wasm-opt 優化器(如果系統中可用)。
- 對於基於RISC-V架構的系統,在組譯器內聯插入的條件區塊中允許使用儲存浮點值的暫存器。
- 新增了新的編譯器標誌:「-fgnuc-version」以設定「__GNUC__」和類似巨集的版本值; "-fmacro-prefix-map=OLD=NEW" 將巨集中的目錄前綴 OLD 替換為 NEW,例如「__FILE__」; “-fpatchable-function-entry=N[,M]”在函數入口點之前和之後產生一定數量的NOP指令。對於RISC-V
新增了對「-ffixed-xX」、「-mcmodel=medany」和「-mcmodel=medlow」標誌的支援。 - 新增了對 ‘__attribute__((target(“branch-protection=...”))) 屬性的支持,其效果與選項類似
-分支保護 . - 在Windows平台上,當指定「-cfguard」標誌時,實作了執行串流完整性檢查(控制流程保護)對間接函數呼叫的替代。若要停用檢查替換,可以使用「-cfguard-nochecks」標誌或「__declspec(guard(nocf))」修飾符。
- 在不使用「extern」關鍵字的情況下,gnu_inline 屬性的行為與 GCC 類似。
- 與 OpenCL 和 CUDA 支援相關的功能已擴展。新增了對 OpenMP 5.0 新功能的支援。
- clang-format 公用程式中新增了 Standard 選項,它允許您確定解析和格式化程式碼時所使用的 C++ 標準版本(Latest、Auto、c++03、c++11、c++14、 c++17 、c++20)。
- 靜態分析器中新增了新的檢查:alpha.cplusplus.PlacementNew 用於確定是否有足夠的儲存空間,fuchsia.HandleChecker 用於檢測與Fuchsia 處理程序相關的洩漏,security.insecureAPI.decodeValueOfObjCType 用於使用[NSCoderdecodeValueOfObjCType時檢測潛在的緩衝區溢位:在:] 。
- Undefined Behaviour Sanitizer (UBSan) 擴展了其指標溢出檢查,以捕獲對 NULL 指標的非零偏移量的應用或由此產生的 NULL 指標偏移量的新增。
- 乾淨整潔的短絨
添加 很大一部分是新支票。
主要的
- 到框架
歸因者 新增了新的過程間優化和分析器。預測了19個不同屬性的狀態,包括12個屬性12個LLVM IR和7個抽象屬性(例如liveness)。 - 新增了編譯器內建的新矩陣數學函數(
內在的 ),在編譯期間被高效率的向量指令取代。 - 針對 X86、AArch64、ARM、SystemZ、MIPS、AMDGPU 和 PowerPC 架構的後端進行了大量改進。新增了CPU支持
Cortex-A65、Cortex-A65AE、Neoverse E1 和 Neoverse N1。對於 ARMv8.1-M,程式碼產生過程已得到最佳化(例如,出現了對具有最小開銷的循環的支援),並使用 MVE 擴充功能添加了對自動向量化的支援。改進了 CPU MIPS Octeon 支援。對於 PowerPC,啟用了使用 MASSV(數學加速子系統)庫的數學子程式向量化,改進了程式碼生成,並優化了循環的記憶體存取。對於 x86,向量類型 v2i32、v4i16、v2i16、v8i8、v4i8 和 v2i8 的處理已更改。 - 改進了 WebAssembly 的程式碼產生器。新增了對 TLS(線程本機儲存)和atomic.fence 指令的支援。 SIMD 支援已顯著擴展。 WebAssembly 物件檔案現在能夠使用多值函數簽署。
- 分析器在處理循環時使用
記憶體SSA ,它允許您定義不同記憶體操作之間的依賴關係。 MemorySSA 可以減少編譯和執行時間,或者可以用來代替 AliasSetTracker,而不會損失效能。 - LLDB 偵錯器顯著改進了對 DWARF v5 格式的支援。改進了對使用 MinGW 進行構建的支持
並且新增了調試 ARM 和 ARM64 架構的 Windows 可執行檔的初始功能。新增了按 Tab 自動完成輸入時提供的選項的描述。 -
擴充 LLD 連結器功能。改進了對ELF 格式的支持,包括glob 模板與GNU 鏈接器的完全兼容,添加了對壓縮調試節“.zdebug”的支持,添加了PT_GNU_PROPERTY 屬性來定義.note.gnu.property 節(可在未來的Linux 使用)核心),
“-zoseparate-code”、“-zseparate-code”和“-zseparate-loadable-segments”模式已經實現。改進了對 MinGW 和 WebAssembly 的支援。
來源: opennet.ru