Rilis paket kompiler LLVM 12.0

Setelah enam bulan pengembangan, rilis proyek LLVM 12.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 di Dentang 12.0:

  • Dukungan untuk atribut “mungkin” dan “tidak mungkin” yang diusulkan dalam standar C++20 telah diterapkan dan diaktifkan secara default, memungkinkan pengoptimal mendapat informasi tentang kemungkinan terpicunya konstruksi kondisional (misalnya, “[[kemungkinan ]] jika (acak > 0) {“).
  • Menambahkan dukungan untuk prosesor AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) dan Intel Sapphire Rapids (-march=sapphirerapids).
  • Menambahkan dukungan untuk flag "-march=x86-64-v[234]" untuk memilih level arsitektur x86-64 (v2 - mencakup ekstensi SSE4.2, SSSE3, POPCNT dan CMPXCHG16B; v3 - AVX2 dan MOVBE; v4 - AVX-512 ) .
  • Menambahkan dukungan untuk prosesor Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) dan Fujitsu A64FX (a64fx). Misalnya, untuk mengaktifkan pengoptimalan pada CPU Neoverse-V1, Anda dapat menentukan “-mcpu=neoverse-v1”.
  • Untuk arsitektur AArch64, flag compiler baru "-moutline-atomics" dan "-mno-outline-atomics" telah ditambahkan untuk mengaktifkan atau menonaktifkan fungsi pembantu operasi atom, seperti "__aarch64_cas8_relax". Fungsi tersebut mendeteksi pada saat runtime apakah dukungan LSE (Large System Extensions) tersedia dan menggunakan instruksi prosesor atom yang disediakan atau kembali menggunakan instruksi LL/SC (Load-link/store-conditional) untuk sinkronisasi.
  • Menambahkan opsi "-fbinutils-version" untuk memilih versi target suite binutils untuk kompatibilitas dengan perilaku linker dan assembler yang lebih lama.
  • Untuk file ELF yang dapat dieksekusi, ketika tanda “-gz” ditentukan, kompresi informasi debug menggunakan perpustakaan zlib diaktifkan secara default (gz=zlib). Menautkan file objek yang dihasilkan memerlukan lld atau GNU binutils 2.26+. Untuk memulihkan kompatibilitas dengan binutils versi lama, Anda dapat menentukan "-gz=zlib-gnu".
  • Pointer 'ini' sekarang diproses dengan pemeriksaan nonnull dan dereferenceable(N). Untuk menghapus atribut nonnull saat Anda perlu menggunakan nilai NULL, Anda dapat menggunakan opsi "-fdelete-null-pointer-checks".
  • Pada platform Linux, mode "-fasynchronous-unwind-tables" diaktifkan untuk arsitektur AArch64 dan PowerPC untuk menghasilkan tabel panggilan unwind, seperti di GCC.
  • Dalam "#pragma clang loop vectorize_width" ditambahkan kemampuan untuk menentukan opsi "tetap" (default) dan "dapat diskalakan" untuk memilih metode vektorisasi. Mode "yang dapat diskalakan", tidak bergantung pada panjang vektor, bersifat eksperimental dan dapat digunakan pada perangkat keras yang mendukung vektorisasi yang dapat diskalakan.
  • Peningkatan dukungan untuk platform Windows: Rakitan biner resmi untuk Windows pada sistem Arm64 telah disiapkan, termasuk kompiler Clang, linker LLD, dan pustaka runtime compiler-rt. Saat membangun platform target MinGW, akhiran .exe ditambahkan, bahkan saat kompilasi silang.
  • Kemampuan yang terkait dengan dukungan untuk OpenCL, OpenMP dan CUDA telah diperluas. Menambahkan opsi "-cl-std=CL3.0" dan "-cl-std=CL1.0" untuk memilih opsi makro untuk OpenCL 3.0 dan OpenCL 1.0. Alat diagnostik telah diperluas.
  • Menambahkan dukungan untuk instruksi HRESET, UINTR, dan AVXVNNI yang diterapkan di beberapa prosesor berbasis x86.
  • Pada sistem x86, dukungan untuk opsi "-mtune=" diaktifkan ", yang mengaktifkan optimasi mikroarsitektur yang dipilih, terlepas dari nilai "-march= "
  • Penganalisis statis telah meningkatkan pemrosesan beberapa fungsi POSIX dan secara signifikan meningkatkan penentuan hasil operasi kondisional ketika ada beberapa nilai simbolis dalam perbandingan. Pemeriksaan baru telah ditambahkan: fuchia.HandleChecker (mendefinisikan pegangan dalam struktur), webkit webkit.UncountedLambdaCapturesChecker dan alpha.webkit.UncountedLocalVarsChecker (memperhitungkan kekhasan bekerja dengan pointer dalam kode mesin WebKit).
  • Dalam ekspresi yang digunakan dalam konteks konstanta, penggunaan fungsi bawaan __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, diperbolehkan .__bswapq , _castf*, __rol* dan __ror*.
  • Menambahkan opsi BitFieldColonSpacing ke utilitas format dentang untuk memilih spasi di sekitar pengidentifikasi, kolom, dan definisi bidang.
  • Server caching clangd (Clang Server) pada platform Linux telah secara signifikan mengurangi konsumsi memori selama operasi jangka panjang (panggilan berkala ke malloc_trim disediakan untuk mengembalikan halaman memori bebas ke sistem operasi).

Inovasi utama di LLVM 12.0:

  • Dukungan untuk alat pembangunan llvm-build yang ditulis dengan Python telah dihentikan, dan sebagai gantinya proyek telah sepenuhnya beralih menggunakan sistem pembangunan CMake.
  • Di backend untuk arsitektur AArch64, dukungan untuk platform Windows telah ditingkatkan: pembuatan keluaran assembler yang benar untuk sistem Windows target telah dipastikan, pembuatan data pada panggilan pelepasan telah dioptimalkan (ukuran data tersebut telah dikurangi sebesar 60 %), kemampuan untuk membuat data pelepasan menggunakan assembler telah ditambahkan arahan .seh_*.
  • Backend untuk arsitektur PowerPC menghadirkan optimalisasi baru untuk loop dan penerapan inline, perluasan dukungan untuk prosesor Power10, penambahan dukungan untuk instruksi MMA untuk manipulasi matriks, dan peningkatan dukungan untuk sistem operasi AIX.
  • Backend x86 menambahkan dukungan untuk prosesor AMD Zen 3, Intel Alder Lake dan Intel Sapphire Rapids, serta instruksi prosesor HRESET, UINTR dan AVXVNNI. Dukungan untuk MPX (Memory Protection Extensions) untuk memeriksa pointer guna memastikan batas memori tidak lagi didukung (teknologi ini tidak tersebar luas dan telah dihapus dari GCC dan dentang). Menambahkan dukungan ke assembler untuk awalan {disp32} dan {disp8} serta akhiran .d32 dan .d8 untuk mengontrol ukuran offset dan lompatan operan. Menambahkan atribut baru "tune-cpu" untuk mengontrol penyertaan optimasi mikroarsitektur.
  • Mode baru “-fsanitize=unsigned-shift-base” telah ditambahkan ke pendeteksi masalah bilangan bulat (pembersih bilangan bulat, “-fsanitize=integer”) untuk mendeteksi luapan bilangan bulat yang tidak ditandatangani setelah sedikit bergeser ke kiri.
  • Di berbagai detektor (asan, cfi, lsan, msan, tsan, ubsan sanitizer) dukungan untuk distribusi Linux dengan perpustakaan Musl standar telah ditambahkan.
  • Kemampuan linker LLD telah diperluas. Peningkatan dukungan untuk format ELF, termasuk opsi tambahan “--dependency-file”, “-error-handling-script”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program -visibilitas” " Peningkatan dukungan MinGW. Untuk format Mach-O (macOS), dukungan untuk arsitektur arm64, arm, dan i386, optimasi waktu tautan (LTO), dan pelepasan tumpukan untuk penanganan pengecualian telah diterapkan.
  • Libc++ mengimplementasikan fitur-fitur baru dari standar C++20 dan telah memulai pengembangan fitur-fitur spesifikasi C++2b. Menambahkan dukungan untuk membangun dengan menonaktifkan dukungan pelokalan (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) dan perangkat untuk menghasilkan angka pseudo-acak (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Sumber: opennet.ru

Tambah komentar