Setelah enam bulan pengembangan, LLVM 22.1.0 telah dirilis. LLVM mengembangkan alat (kompiler, pengoptimal, dan generator kode) yang mengkompilasi program menjadi bitcode perantara berupa instruksi virtual mirip RISC (mesin virtual tingkat rendah dengan sistem optimasi multi-level). Pseudokode yang dihasilkan dapat dikonversi menjadi kode mesin untuk platform target tertentu atau digunakan oleh kompilator just-in-time (JIT) untuk menghasilkan instruksi mesin secara langsung selama eksekusi program. Berdasarkan teknologi LLVM, proyek ini mengembangkan kompilator Clang, yang mendukung bahasa pemrograman C, C++, dan Objective-C. Mulai dari cabang 18.x, proyek ini beralih ke skema penomoran versi baru, di mana rilis 0 ("N.0") digunakan selama pengembangan, dan versi stabil pertama diberi nomor "N.1."
Perbaikan pada Clang 22 meliputi:
- Menambahkan dukungan untuk token alokasi memori (Allocation Tokens) untuk menandai operasi alokasi memori yang dilakukan menggunakan fungsi seperti malloc dengan pengidentifikasi unik. Token alokasi memungkinkan penataan informasi heap, menyederhanakan deteksi kebocoran memori, dan memungkinkan pengelompokan objek berdasarkan tujuan atau pola modifikasinya (misalnya, memisahkan data "panas" dari data "dingin"). Untuk mengaktifkannya, gunakan flag "-fsanitize=alloc-token".
- Fitur-fitur yang terkait dengan bahasa C:
- Spesifikasi draf yang mendefinisikan mekanisme eksekusi tertunda "defer" telah diimplementasikan, memungkinkan tindakan dieksekusi ketika cakupan saat ini berakhir. Flag "-fdefer-ts" telah ditambahkan untuk mengaktifkan dukungan "defer".
- Fungsi bawaan __builtin_stack_address() telah ditambahkan, yang mencerminkan fungsi serupa di GCC. Fungsi ini mengembalikan alamat tumpukan yang memisahkan area tumpukan dari fungsi saat ini yang memanggil __builtin_stack_address() dan fungsi-fungsi selanjutnya yang dipanggilnya.
- Kemampuan yang sedang dikembangkan untuk standar C2y masa depan:
- Menambahkan dukungan untuk perulangan bernama, yang memungkinkan Anda untuk menetapkan nama pada perulangan dan pernyataan switch, yang dapat ditentukan dalam pernyataan break dan continue untuk secara eksplisit mendefinisikan perulangan yang akan diakhiri. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // pergi ke CONT1 continue outer; // pergi ke CONT2 // CONT1 } // CONT2 }
- Implementasi makro bawaan "__COUNTER__", yang dirancang untuk menghasilkan nama pengenal unik, telah diperluas dan dimasukkan ke dalam standar. Batas 2147483647 panggilan ke makro ini telah ditetapkan; melebihi batas ini akan menghasilkan kesalahan.
- Menghapus peringatan (-Wstatic-in-inline) saat menggunakan fungsi atau variabel statis di dalam fungsi yang dideklarasikan sebagai "extern inline".
- Kemampuan yang didefinisikan dalam standar C23 C:
- File header float.h sekarang mendukung makro FLT_SNAN, DBL_SNAN, dan LDBL_SNAN, yang mengimplementasikan nilai NaN yang diberi sinyal (menyebabkan pengecualian saat digunakan dalam operasi aritmatika) untuk tipe float, double, dan long double.
- Memperbaiki bug di mana tipe tak bernama yang berbeda diperlakukan sebagai kompatibel dalam unit terjemahan yang sama jika mereka memiliki bidang yang sama.
- Flag "-MG" yang digunakan untuk mengabaikan file header yang hilang selama pemindaian dependensi telah diperluas ke direktif "#embed" dan sekarang menekan kesalahan "file not found" ketika file yang ditentukan dalam direktif "#embed" hilang.
- Fitur terkait C++:
- Kemampuan untuk menggunakan pengikatan terstruktur dalam konteks "constexpr", seperti yang dikembangkan dalam spesifikasi C++2c (C++26), telah ditambahkan. Ini berarti bahwa referensi ke ekspresi konstan sekarang dapat berupa ekspresi konstan itu sendiri. Dukungan diimplementasikan untuk array dan struktur sederhana (tuple belum didukung). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Sesuai dengan persyaratan standar C++20, batasan sekarang dikonversi ke bentuk standar sebelum diperiksa, sehingga memungkinkan pesan diagnostik yang lebih akurat dan penanganan yang tepat terhadap kesalahan substitusi dalam argumen templat yang hanya digunakan dalam concept-id.
- Menambahkan serangkaian fungsi bawaan "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" untuk mengetahui apakah operator perbandingan "<", ">", "<=", dan ">=" disintesis dari operator "<=>".
- Parameter "-Wincompatible-pointer-types" telah diubah untuk menghasilkan pesan kesalahan, bukan peringatan. Untuk kembali ke perilaku sebelumnya, gunakan opsi "-Wno-error=incompatible-pointer-types".
- Menambahkan fungsi bawaan __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter, dan __builtin_dedup_pack. Misalnya, builtin_dedup_pack memungkinkan Anda untuk menghapus duplikat dari daftar tipe: menggunakan MyTypeList = TypeList<__builtin_dedup_pack …>; // tipe yang dihasilkan akan berupa TypeList
- Saat melakukan debugging perilaku yang tidak terdefinisi dengan UBSan (-fsanitize=undefined -fsanitize-trap=undefined), informasi penyebab kesalahan kini disertakan dalam informasi debug yang dihasilkan. Flag "-fsanitize-debug-trap-reasons" telah ditambahkan untuk menentukan tingkat detail dalam informasi kesalahan. Flag ini dapat diatur ke "basic" untuk deskripsi umum (misalnya, "Penjumlahan bilangan bulat mengalami overflow") dan "detailed" untuk menyertakan informasi detail (misalnya, "overflow penjumlahan bilangan bulat bertanda pada 'a + b'").
- Menambahkan flag compiler baru:
- Gunakan "-f[no-]sanitize-debug-trap-reasons" untuk mengontrol apakah alasan jebakan pengecualian disematkan dalam informasi debug saat mengkompilasi dengan mode "-fsanitize-trap".
- Gunakan opsi "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", dan "-fsanitize-alloc-token-extended" untuk mengelola token alokasi memori.
- "-fmatrix-memory-layout" untuk mengontrol tata letak memori tipe matriks (misalnya, column-major untuk tipe column-major, row-major untuk tipe row-major).
- Fungsi sekarang memiliki atribut "malloc_span", mirip dengan atribut malloc tetapi berlaku untuk fungsi yang mengembalikan struktur seperti span yang berisi pointer dan field dengan ukuran atau pointer ke akhir blok.
- Menambahkan atribut "modular_format" untuk secara dinamis memilih implementasi fungsi printf yang terhubung secara statis yang dibutuhkan pada saat penautan.
- Alat diagnostik dan analisis statis telah diperluas, pemeriksaan baru telah ditambahkan (beberapa lusin peningkatan terkait diagnostik).
- Intrinsik tambahan untuk ekstensi SSE, AVX, dan AVX512 telah ditambahkan ke backend X86. Mode build telah ditambahkan untuk CPU Intel berdasarkan mikroarsitektur Wildcat Lake (-march=wildcatlake) dan Nova Lake (-march=novalake).
- Backend AArch64 sekarang mendukung prosesor Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium), dan Arm C1-Ultra (c1-ultra). Fungsi bawaan tambahan telah ditambahkan untuk instruksi FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], dan FCVTA[US]. Dukungan Function Multi-Versioning (FMV) telah distabilkan. Pengguna sekarang dapat menimpa prioritas versi fungsi yang berbeda.
- Menambahkan dukungan untuk arsitektur LoongArch32 (LA32R, LA32S).
- Peningkatan pada backend untuk arsitektur ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly, dan PowerPC.
Sumber: opennet.ru
