Rilis paket kompiler LLVM 15.0

Setelah enam bulan pengembangan, rilis proyek LLVM 15.0 disajikan - perangkat yang kompatibel dengan GCC (kompiler, pengoptimal, dan pembuat kode) yang mengkompilasi program ke dalam bitcode perantara dari instruksi virtual mirip RISC (mesin virtual tingkat rendah dengan sistem optimasi multi-level). Pseudocode yang dihasilkan dapat diubah menggunakan kompiler JIT menjadi instruksi mesin secara langsung pada saat eksekusi program.

Peningkatan besar di Dentang 15.0:

  • Untuk sistem berbasis arsitektur x86, flag β€œ-fzero-call-used-regs” telah ditambahkan, yang memastikan bahwa semua register CPU yang digunakan dalam fungsi tersebut disetel ulang ke nol sebelum mengembalikan kontrol dari fungsi tersebut. Opsi ini memungkinkan Anda melindungi terhadap kebocoran informasi dari fungsi dan mengurangi jumlah blok yang cocok untuk membuat gadget ROP (Return-Oriented Programming) dalam eksploitasi sekitar 20%.
  • Pengacakan penempatan memori struktur untuk kode C telah diterapkan, yang mempersulit ekstraksi data dari struktur jika terjadi eksploitasi kerentanan. Pengacakan diaktifkan dan dinonaktifkan menggunakan atribut randomize_layout dan no_randomize_layout, dan memerlukan pengaturan seed menggunakan flag "-frandomize-layout-seed" atau "-frandomize-layout-seed-file".
  • Menambahkan tanda "-fstrict-flex-arrays=" ", yang dengannya Anda dapat mengontrol batas-batas elemen array fleksibel dalam struktur (Anggota Array Fleksibel, array dengan ukuran tidak terbatas di akhir struktur). Jika disetel ke 0 (default), elemen terakhir struktur dengan array selalu diproses sebagai array fleksibel, 1 - hanya ukuran [], [0] dan [1] yang diproses sebagai array fleksibel, 2 - hanya ukuran [] dan [0] diproses seperti array fleksibel.
  • Menambahkan dukungan eksperimental untuk bahasa mirip C HLSL (Bahasa Shader Tingkat Tinggi), yang digunakan di DirectX untuk menulis shader.
  • Menambahkan "-Warray-parameter" untuk memperingatkan tentang penggantian fungsi dengan deklarasi argumen yang tidak kompatibel terkait dengan array dengan panjang tetap dan variabel.
  • Peningkatan kompatibilitas dengan MSVC. Menambahkan dukungan untuk "#pragma function" (menginstruksikan kompiler untuk menghasilkan pemanggilan fungsi alih-alih ekspansi inline) dan "#pragma alloc_text" (mendefinisikan nama bagian dengan kode fungsi) yang disediakan di MSVC. Menambahkan dukungan untuk flag /JMC dan /JMC yang kompatibel dengan MSVC.
  • Pekerjaan terus dilakukan untuk mendukung standar C2X dan C++23 di masa depan. Untuk bahasa C, penerapan berikut ini: atribut noreturn, kata kunci false dan true, tipe _BitInt(N) untuk bilangan bulat dengan kedalaman bit tertentu, makro *_WIDTH, awalan u8 untuk karakter yang dikodekan UTF-8.

    Untuk C++, hal berikut diimplementasikan: penggabungan modul, isolasi ABI anggota fungsi, inisialisasi dinamis terurut dari variabel non-lokal dalam modul, operator indeks multidimensi, auto(x), variabel non-literal, goto dan label dalam fungsi yang dideklarasikan sebagai constexpr , urutan escape yang dibatasi, diberi nama karakter escape.

  • Kemampuan yang terkait dengan dukungan OpenCL dan OpenMP telah diperluas. Menambahkan dukungan untuk ekstensi OpenCL cl_khr_subgroup_rotate.
  • Untuk arsitektur x86, perlindungan telah ditambahkan terhadap kerentanan pada prosesor yang disebabkan oleh eksekusi instruksi spekulatif setelah operasi lompat ke depan tanpa syarat. Masalah terjadi karena pemrosesan instruksi pre-emptive segera mengikuti instruksi cabang di memori (SLS, Spekulasi Garis Lurus). Untuk mengaktifkan perlindungan, opsi β€œ-mharden-sls=[none|all|return|indirect-jmp]” diusulkan.
  • Untuk platform yang mendukung ekstensi SSE2, tipe _Float16 telah ditambahkan, yang ditiru menggunakan tipe float jika tidak ada dukungan untuk instruksi AVX512-FP16.
  • Menambahkan tanda "-m[no-]rdpru" untuk mengontrol penggunaan instruksi RDPRU, didukung mulai dari prosesor AMD Zen2.
  • Menambahkan tanda "-mfunction-return=thunk-extern" untuk melindungi dari kerentanan RETBLEED, yang bekerja dengan menambahkan serangkaian instruksi yang mengecualikan keterlibatan mekanisme eksekusi spekulatif untuk cabang tidak langsung.

Inovasi utama di LLVM 15.0:

  • Menambahkan dukungan untuk arsitektur CPU Cortex-M85, Armv9-A, Armv9.1-A dan Armv9.2-A, ekstensi Armv8.1-M PACBTI-M.
  • Backend eksperimental untuk DirectX telah ditambahkan yang mendukung format DXIL (DirectX Intermediate Language) yang digunakan untuk DirectX shader. Backend diaktifkan dengan menentukan parameter β€œ-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” selama perakitan.
  • Libc++ terus mengimplementasikan fitur-fitur baru dari standar C++20 dan C++2b, termasuk penyelesaian implementasi pustaka β€œformat” dan versi eksperimental pustaka β€œrentang” yang diusulkan.
  • Peningkatan backend untuk arsitektur x86, PowerPC, dan RISC-V.
  • Kemampuan linker LLD dan debugger LLDB telah ditingkatkan.

Sumber: opennet.ru

Tambah komentar