Selepas enam bulan pembangunan, LLVM 22.1.0 telah dikeluarkan. Ia membangunkan alatan (pengkompil, pengoptimum dan penjana kod) yang mengkompil program ke dalam bitkod perantaraan arahan maya seperti RISC (mesin maya peringkat rendah dengan sistem pengoptimuman berbilang peringkat). Pseudokod yang dijana boleh ditukar menjadi kod mesin untuk platform sasaran tertentu atau digunakan oleh pengkompil tepat masa (JIT) untuk menjana arahan mesin secara langsung semasa pelaksanaan program. Berdasarkan teknologi LLVM, projek ini sedang membangunkan pengkompil Clang, yang menyokong bahasa pengaturcaraan C, C++ dan Objektif-C. Bermula dengan cabang 18.x, projek ini beralih kepada skema penomboran versi baharu, yang mana keluaran 0 ("N.0") digunakan semasa pembangunan, dan versi stabil pertama dinomborkan "N.1."
Penambahbaikan dalam Clang 22 termasuk:
- Sokongan untuk token peruntukan memori (Token Peruntukan) telah ditambah untuk menandakan operasi peruntukan memori yang dilakukan menggunakan fungsi seperti malloc dengan pengecam unik. Token peruntukan membolehkan penstrukturan maklumat timbunan, memudahkan pengesanan kebocoran memori dan mendayakan pengelompokan objek berdasarkan tujuan atau corak pengubahsuaiannya (cth., memisahkan data "panas" daripada "sejuk"). Untuk mendayakannya, gunakan bendera "-fsanitize=alloc-token".
- Ciri-ciri yang berkaitan dengan bahasa C:
- Satu draf spesifikasi yang mentakrifkan mekanisme pelaksanaan tertunda "defer" telah dilaksanakan, yang membolehkan tindakan dilaksanakan apabila skop semasa tamat. Bendera "-fdefer-ts" telah ditambah untuk mendayakan sokongan "defer".
- Fungsi terbina dalam __builtin_stack_address() telah ditambah, mencerminkan fungsi yang serupa dalam GCC. Fungsi ini mengembalikan alamat tindanan yang memisahkan kawasan tindanan bagi fungsi semasa yang memanggil __builtin_stack_address() dan fungsi seterusnya yang dipanggilnya.
- Keupayaan dibangunkan untuk piawaian C2y masa hadapan:
- Sokongan untuk gelung bernama telah ditambah, yang membolehkan anda memberikan nama kepada gelung dan pernyataan suis, yang boleh dinyatakan dalam pernyataan break dan continue untuk menentukan gelung yang hendak dikeluarkan secara eksplisit. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // go to CONT1 continue outer; // go to CONT2 // CONT1 } // CONT2 }
- Pelaksanaan makro "__COUNTER__" terbina dalam, yang direka untuk menjana nama pengecam unik, telah diperluas dan dimasukkan ke dalam piawaian. Had 2147483647 panggilan ke makro ini telah ditetapkan; melebihi had ini akan menghasilkan ralat.
- Amaran (-Wstatic-in-in-line) telah dialih keluar apabila menggunakan fungsi statik atau pembolehubah di dalam fungsi yang diisytiharkan sebagai "extern inline".
- Keupayaan yang ditakrifkan dalam piawaian C23 C:
- Fail pengepala float.h kini menyokong makro FLT_SNAN, DBL_SNAN dan LDBL_SNAN, yang melaksanakan nilai NaN bertanda (menyebabkan pengecualian apabila digunakan dalam operasi aritmetik) untuk jenis float, double dan long double.
- Membetulkan pepijat di mana jenis tanpa nama yang berbeza dianggap serasi dalam unit terjemahan yang sama jika ia mempunyai medan yang sama.
- Bendera "-MG" yang digunakan untuk mengabaikan fail pengepala yang hilang semasa pengimbasan kebergantungan telah dilanjutkan kepada arahan "#embed" dan kini menyekat ralat "fail tidak dijumpai" apabila fail yang dinyatakan dalam arahan "#embed" hilang.
- Ciri berkaitan C++:
- Keupayaan untuk menggunakan pengikatan berstruktur dalam konteks "constexpr", seperti yang dibangunkan dalam spesifikasi C++2c (C++26), telah ditambah. Ini bermakna rujukan kepada ungkapan malar kini boleh menjadi ungkapan malar. Sokongan dilaksanakan untuk tatasusunan dan struktur mudah (tuple belum disokong). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Seperti yang dikehendaki oleh piawaian C++20, kekangan kini ditukar kepada bentuk piawai sebelum disemak, membolehkan mesej diagnostik yang lebih tepat dan pengendalian ralat penggantian yang betul dalam argumen templat yang hanya digunakan dalam id konsep.
- Menambah keluarga fungsi terbina dalam "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" untuk mengetahui sama ada operator perbandingan "<", ">", "<=", dan ">=" telah disintesis daripada operator "<=>".
- Parameter "-Wincompatible-pointer-types" telah diubah untuk menghasilkan ralat dan bukannya amaran. Untuk kembali kepada tingkah laku sebelumnya, gunakan pilihan "-Wno-error=incompatible-pointer-types".
- Fungsi terbina dalam __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 telah ditambah. Contohnya, builtin_dedup_pack membolehkan anda mengalih keluar pendua daripada senarai jenis: menggunakan MyTypeList = TypeList<__builtin_dedup_pack β¦>; // jenis yang terhasil akan menjadi TypeList
- Apabila menyahpepijat tingkah laku yang tidak ditakrifkan dengan UBSan (-fsanitize=undefined -fsanitize-trap=undefined), maklumat punca ralat kini disertakan dalam maklumat penyahpepijatan yang dijana. Bendera "-fsanitize-debug-trap-reasons" telah ditambah untuk menentukan tahap perincian dalam maklumat ralat. Ia boleh ditetapkan kepada "asas" untuk penerangan umum (cth., "Penambahan integer melimpah") dan "terperinci" untuk memasukkan maklumat terperinci (cth., "limpahan penambahan integer bertanda dalam 'a + b'").
- Menambah bendera pengkompil baharu:
- "-f[no-]sanitize-debug-trap-reasons" untuk mengawal sama ada sebab perangkap pengecualian dibenamkan dalam maklumat nyahpepijat semasa mengkompil dengan mod "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", dan "-fsanitize-alloc-token-extended" untuk mengurus token peruntukan memori.
- "-fmatrix-memory-layout" untuk mengawal susun atur memori bagi jenis matriks (cth. column-major untuk column-major, row-major untuk row-major).
- Fungsi kini mempunyai atribut "malloc_span", serupa dengan atribut malloc tetapi boleh digunakan untuk fungsi yang mengembalikan struktur seperti rentang yang mengandungi penunjuk dan medan dengan saiz atau penunjuk ke hujung blok.
- Menambah atribut "modular_format" untuk memilih pelaksanaan fungsi printf yang dipautkan secara statik yang diperlukan secara dinamik pada masa pautan.
- Alat analisis diagnostik dan statik telah diperluas, pemeriksaan baharu telah ditambah (beberapa dozen penambahbaikan berkaitan diagnostik).
- Intrinsik tambahan untuk sambungan SSE, AVX dan AVX512 telah ditambah pada bahagian belakang X86. Mod binaan telah ditambah untuk CPU Intel berdasarkan mikroarkitektur Wildcat Lake (-march=wildcatlake) dan Nova Lake (-march=novalake).
- Bahagian belakang AArch64 kini menyokong pemproses 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 terbina dalam tambahan telah ditambah untuk arahan FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] dan FCVTA[US. Sokongan Function Multi-Versionating (FMV) telah distabilkan. Pengguna kini boleh mengatasi keutamaan versi fungsi yang berbeza.
- Sokongan untuk seni bina LoongArch32 (LA32R, LA32S) telah ditambah.
- Bahagian belakang yang dipertingkatkan untuk seni bina ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly dan PowerPC.
Sumber: opennet.ru
