Selepas enam bulan pembangunan, keluaran projek LLVM 16.0 telah dibentangkan - kit alat serasi GCC (penyusun, pengoptimum dan penjana kod) yang menyusun atur cara ke dalam kod bit perantaraan arahan maya seperti RISC (mesin maya peringkat rendah dengan sistem pengoptimuman pelbagai peringkat). Pseudokod yang dijana boleh ditukar menggunakan pengkompil JIT ke dalam arahan mesin secara langsung pada masa pelaksanaan program.
Penambahbaikan utama dalam Clang 16.0:
- Piawaian C++/ObjC++ lalai ialah gnu++17 (sebelum ini gnu++14), yang bermaksud ciri C++17 dengan sambungan GNU disokong secara lalai. Untuk mengembalikan tingkah laku sebelumnya, anda boleh menggunakan pilihan "-std=gnu++14".
- Melaksanakan ciri lanjutan yang berkaitan dengan standard C++20:
- Fungsi ahli khas yang remeh bersyarat,
- menangkap ikatan berstruktur dalam fungsi lambda,
- ΠΠΏΠ΅ΡΠ°ΡΠΎΡ ΡΠ°Π²Π΅Π½ΡΡΠ²Π° Π²Π½ΡΡΡΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ,
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ typename Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°Ρ ,
- Permulaan agregat yang sah dalam kurungan (βAggr(val1, val2)β).
- Ciri yang ditakrifkan dalam piawaian C++2b akan datang telah dilaksanakan:
- Ia dibenarkan meletakkan label pada akhir ungkapan majmuk,
- pengendali statik(),
- pengendali statik[],
- Keserasian dengan jenis char8_t dipastikan,
- Julat aksara yang dibenarkan untuk digunakan dalam "\N{...}" telah dikembangkan
- Menambah keupayaan untuk menggunakan pembolehubah yang diisytiharkan sebagai "statik constexpr" dalam fungsi yang diisytiharkan sebagai constexpr.
- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ Π‘ΠΈ-ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ C2x:
- ΠΠ»Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ Β«-Wunused-labelΒ» ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° Β«[[maybe_unused]]Β» ΠΊ ΠΌΠ΅ΡΠΊΠ°ΠΌ,
- Ia dibenarkan untuk meletakkan label di mana-mana dalam ungkapan majmuk,
- Menambah jenis operator dan jenis_tidak sama,
- Jenis nullptr_t baharu dan pemalar nullptr untuk mentakrifkan penunjuk nol yang boleh menukar kepada sebarang jenis penunjuk dan mewakili varian NULL yang tidak terikat kepada jenis integer dan void*.
- Dalam mod C2x, memanggil makro va_start dengan bilangan pembolehubah argumen (variadic) dibenarkan.
- Dalam mod pematuhan C99, C11 dan C17, pilihan lalai "-Wimplicit-function-declaration" dan "-Wimplicit-int" kini menghasilkan ralat dan bukannya amaran.
- Penggunaan tidak langsung "void *" (cth. "void func(void *p) { *p; }") dalam mod C++ kini menjana ralat, serupa dengan ISO C++, GCC, ICC dan MSVC.
- Menentukan medan bit sebagai operan arahan (cth. "__asm ββββ{ mov eax, s.bf }") dalam blok pemasangan sebaris gaya Microsoft kini menjana ralat.
- Menambah diagnostik untuk kehadiran struktur dan kesatuan yang berbeza dengan nama yang sama dalam modul yang berbeza.
- Keupayaan yang dikaitkan dengan sokongan OpenCL dan OpenMP telah diperluaskan. Diagnostik yang dipertingkatkan untuk templat C++ yang digunakan dalam hujah kernel OpenCL. Sokongan blok beratur yang dipertingkatkan untuk AMDGPU. Atribut nounwind ditambah secara tersirat pada semua fungsi. Sokongan yang lebih baik untuk fungsi terbina dalam.
- Menambahkan keupayaan untuk menggunakan pembolehubah persekitaran CLANG_CRASH_DIAGNOSTICS_DIR untuk mentakrifkan direktori di mana data diagnostik ranap disimpan.
- Sokongan Unicode telah dikemas kini kepada spesifikasi Unicode 15.0. Sesetengah simbol matematik dibenarkan dalam pengecam, seperti "β" (cth. "double xβββ").
- Menambah sokongan untuk memuatkan berbilang fail konfigurasi (fail konfigurasi lalai dimuatkan dahulu, dan kemudian yang ditentukan melalui bendera "--config=", yang kini boleh ditentukan beberapa kali). Mengubah susunan pemuatan lalai fail konfigurasi: dentang cuba memuatkan fail terlebih dahulu - .cfg, dan jika ia tidak dijumpai ia cuba memuatkan dua fail .cfg dan .cfg. Untuk melumpuhkan memuatkan fail konfigurasi secara lalai, bendera "--no-default-config" telah ditambahkan.
- Untuk memastikan binaan boleh berulang, adalah mungkin untuk menggantikan nilai tarikh dan masa semasa dalam makro __DATE__, __TIME__ dan __TIMESTAMP__ dengan masa yang ditentukan dalam pembolehubah persekitaran SOURCE_DATE_EPOCH.
- Untuk menyemak kehadiran fungsi terbina dalam (builtin) yang boleh digunakan dalam konteks pemalar, makro "__has_constexpr_builtin" telah ditambahkan.
- Menambahkan bendera kompilasi baharu "-fcoro-aligned-allocation" untuk peruntukan bingkai coroutine yang dijajarkan.
- Π ΡΠ»Π°Π³Π΅ Β«-fstrict-flex-arrays=Β» ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΠ΅ΡΡΠ΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°-ΠΌΠ°ΡΡΠΈΠ²Π° Π² ΡΡΡΡΠΊΡΡΡΠ°Ρ (Flexible Array Members, ΠΌΠ°ΡΡΠΈΠ² Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π² ΠΊΠΎΠ½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ). ΠΠ° ΡΡΠ΅ΡΡΠ΅ΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·ΠΌΠ΅Ρ Β«[]Β» (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Β«int b[]Β») ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ², Π° ΡΠ°Π·ΠΌΠ΅Ρ Β«[0]Β» (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Β«int b[0]Β») β Π½Π΅Ρ.
- ΠΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠ»Π°Π³ Β«-fmodule-outputΒ» Π΄Π»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΡΠ°Π·Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ C++.
- Menambahkan mod "-Rpass-analysis=stack-frame-layout" untuk membantu mendiagnosis masalah dengan susun atur bingkai tindanan.
- Menambahkan atribut baharu __attribute__((target_version("cpu_features"))) dan melanjutkan kefungsian atribut __attribute__((target_clones("cpu_features1","cpu_features2",...))) untuk memilih versi khusus ciri yang disediakan oleh AArch64 CPU.
- Alat diagnostik dikembangkan:
- Menambahkan amaran "-Wsingle-bit-bitfield-constant-conversion" untuk mengesan pemangkasan tersirat apabila menugaskan satu kepada medan bit bertanda satu bit.
- Diagnostik pembolehubah konstexpr yang tidak dimulakan telah diperluaskan.
- Menambahkan amaran "-Wcast-function-type-strict" dan "-Wincompatible-function-pointer-types-types-strict" untuk mengenal pasti masalah yang berpotensi dengan penghantaran jenis fungsi.
- Menambahkan diagnostik untuk menggunakan nama modul yang salah atau dikhaskan dalam blok eksport.
- Pengesanan yang lebih baik bagi kata kunci "auto" yang tiada dalam definisi.
- Pelaksanaan amaran "-Winteger-overflow" telah menambah semakan untuk situasi tambahan yang membawa kepada limpahan.
- Sokongan untuk seni bina set arahan LoongArch (-march=loongarch64 atau -march=la464), yang digunakan dalam pemproses Loongson 3 5000 dan melaksanakan RISC ISA baharu, serupa dengan MIPS dan RISC-V, telah dilaksanakan.
Inovasi utama dalam LLVM 16.0:
- Kod LLVM dibenarkan menggunakan elemen yang ditakrifkan dalam piawaian C++17.
- Keperluan persekitaran untuk membina LLVM telah ditingkatkan. Alat binaan kini sepatutnya menyokong standard C++17, i.e. Untuk membina, anda memerlukan sekurang-kurangnya GCC 7.1, Clang 5.0, Apple Clang 10.0 atau Visual Studio 2019 16.7.
- Bahagian belakang untuk seni bina AArch64 menambah sokongan untuk CPU Cortex-A715, Cortex-X3 dan Neoverse V2, pemasang untuk RME MEC (Konteks Penyulitan Memori), sambungan Armv8.3 (Nombor Kompleks) dan Fungsi Berbilang Versi.
- Di bahagian belakang untuk seni bina ARM, sokongan untuk platform sasaran Armv2, Armv2A, Armv3 dan Armv3M telah dihentikan, yang mana penjanaan kod yang betul tidak dijamin. Menambahkan keupayaan untuk menjana kod untuk arahan untuk bekerja dengan nombor kompleks.
- Bahagian belakang untuk seni bina X86 telah menambah sokongan untuk seni bina set arahan (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Menambah sokongan untuk arahan RDMSRLIST, RMSRLIST dan WRMSRNS. Pilihan yang dilaksanakan "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" dan "-mcpu=grandridge".
- Menambah sokongan rasmi untuk platform LoongArch.
- Bahagian belakang yang dipertingkatkan untuk seni bina MIPS, PowerPC dan RISC-V
- Menambahkan sokongan untuk penyahpepijatan boleh laku 64-bit untuk seni bina LoongArch kepada penyahpepijat LLDB. Pengendalian simbol nyahpepijat COFF dipertingkat. Disediakan penapisan DLL pendua dalam senarai modul Windows yang dimuatkan.
- Dalam perpustakaan Libc++, kerja utama tertumpu pada pelaksanaan sokongan untuk ciri baharu piawaian C++20 dan C++23.
- Penyambung LDD dengan ketara mengurangkan masa pemautan dengan menyelaraskan pengimbasan penempatan semula alamat dan operasi permulaan bahagian. Menambah sokongan untuk pemampatan bahagian menggunakan algoritma ZSTD.
Sumber: opennet.ru