Keluaran suite pengkompil LLVM 15.0

Selepas enam bulan pembangunan, keluaran projek LLVM 15.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 15.0:

  • Untuk sistem berdasarkan seni bina x86, bendera "-fzero-call-used-regs" telah ditambahkan, yang memastikan semua daftar CPU yang digunakan dalam fungsi ditetapkan semula kepada sifar sebelum mengembalikan kawalan daripada fungsi. Pilihan ini membolehkan anda melindungi daripada kebocoran maklumat daripada fungsi dan mengurangkan bilangan blok yang sesuai untuk membina alat ROP (Return-Oriented Programming) dalam eksploitasi sebanyak lebih kurang 20%.
  • Rawak penempatan memori struktur untuk kod C telah dilaksanakan, yang merumitkan pengekstrakan data daripada struktur sekiranya berlaku eksploitasi kelemahan. Rawak dihidupkan dan dimatikan menggunakan atribut randomize_layout dan no_randomize_layout, dan memerlukan penetapan benih menggunakan bendera "-frandomize-layout-seed" atau "-frandomize-layout-seed-file".
  • Menambahkan bendera "-fstrict-flex-arrays=", yang dengannya anda boleh mengawal sempadan untuk elemen tatasusunan fleksibel dalam struktur (Ahli Tatasusunan Fleksibel, tatasusunan saiz tidak tentu pada penghujung struktur). Apabila ditetapkan kepada 0 (lalai), elemen terakhir struktur dengan tatasusunan sentiasa diproses sebagai tatasusunan fleksibel, 1 - hanya saiz [], [0] dan [1] diproses sebagai tatasusunan fleksibel, 2 - saiz sahaja [] dan [0] diproses seperti tatasusunan yang fleksibel.
  • Menambahkan sokongan percubaan untuk bahasa seperti C HLSL (High-Level Shader Language), yang digunakan dalam DirectX untuk menulis shader.
  • Menambahkan "-Warray-parameter" untuk memberi amaran tentang fungsi mengatasi dengan pengisytiharan hujah yang tidak serasi yang dikaitkan dengan tatasusunan tetap dan panjang berubah.
  • Keserasian yang lebih baik dengan MSVC. Sokongan tambahan untuk "fungsi #pragma" (mengarahkan pengkompil untuk menjana panggilan fungsi dan bukannya pengembangan sebaris) dan "#pragma alloc_text" (mentakrifkan nama bahagian dengan kod fungsi) yang disediakan dalam MSVC. Menambah sokongan untuk bendera /JMC dan /JMC yang serasi dengan MSVC.
  • Kerja terus menyokong piawaian C2X dan C++23 masa hadapan. Untuk bahasa C, perkara berikut dilaksanakan: atribut noreturn, kata kunci palsu dan benar, jenis _BitInt(N) untuk integer kedalaman bit tertentu, *_WIDTH makro, awalan u8 untuk aksara yang dikodkan UTF-8.

    Untuk C++, perkara berikut dilaksanakan: penggabungan modul, pengasingan ABI ahli fungsi, pemulaan dinamik tertib pembolehubah bukan setempat dalam modul, pengendali indeks berbilang dimensi, auto(x), pembolehubah bukan literal, goto dan label dalam fungsi yang diisytiharkan sebagai constexpr , urutan pelarian yang dihadkan, dinamakan aksara pelarian.

  • Keupayaan yang dikaitkan dengan sokongan OpenCL dan OpenMP telah diperluaskan. Menambah sokongan untuk sambungan OpenCL cl_khr_subgroup_rotate.
  • Untuk seni bina x86, perlindungan telah ditambah terhadap kelemahan dalam pemproses yang disebabkan oleh pelaksanaan arahan spekulatif selepas operasi lompat ke hadapan tanpa syarat. Masalah berlaku disebabkan oleh pemprosesan awal arahan serta-merta selepas arahan cawangan dalam ingatan (SLS, Spekulasi Garis Lurus). Untuk mendayakan perlindungan, pilihan β€œ-mharden-sls=[none|all|return|indirect-jmp]” dicadangkan.
  • Untuk platform yang menyokong sambungan SSE2, jenis _Float16 telah ditambahkan, yang dicontohi menggunakan jenis apungan dalam kes kekurangan sokongan untuk arahan AVX512-FP16.
  • Menambahkan bendera "-m[no-]rdpru" untuk mengawal penggunaan arahan RDPRU, disokong bermula dengan pemproses AMD Zen2.
  • Menambahkan bendera "-mfunction-return=thunk-extern" untuk melindungi daripada kerentanan RETBLEED, yang berfungsi dengan menambahkan urutan arahan yang mengecualikan penglibatan mekanisme pelaksanaan spekulatif untuk cawangan tidak langsung.

Inovasi utama dalam LLVM 15.0:

  • Menambah sokongan untuk seni bina CPU Cortex-M85, Armv9-A, Armv9.1-A dan Armv9.2-A, sambungan Armv8.1-M PACBTI-M.
  • Bahagian belakang percubaan untuk DirectX telah ditambahkan yang menyokong format DXIL (DirectX Intermediate Language) yang digunakan untuk shader DirectX. Bahagian belakang didayakan dengan menentukan parameter "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" semasa pemasangan.
  • Libc++ terus melaksanakan ciri baharu piawaian C++20 dan C++2b, termasuk penyiapan pelaksanaan pustaka "format" dan versi percubaan pustaka "julat" yang dicadangkan.
  • Bahagian belakang yang dipertingkatkan untuk seni bina x86, PowerPC dan RISC-V.
  • Keupayaan penyambung LLD dan penyahpepijat LLDB telah dipertingkatkan.

Sumber: opennet.ru

Tambah komen