Keluaran suite pengkompil LLVM 16.0

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

Tambah komen