Ngaleupaskeun suite kompiler LLVM 12.0

Sanggeus genep bulan pangwangunan, sékrési proyék LLVM 12.0 dibere - a toolkit GCC-cocog (compilers, optimizers sarta generator kode) nu compiles program kana bitcode panengah instruksi maya RISC-kawas (mesin virtual tingkat low kalawan a sistem optimasi multi-tingkat). Pseudocode nu dihasilkeun bisa dirobah maké JIT compiler kana parentah mesin langsung dina waktu palaksanaan program.

Perbaikan dina Clang 12.0:

  • Rojongan pikeun atribut "kamungkinan" sareng "teu mungkin" anu diajukeun dina standar C ++ 20 parantos dilaksanakeun sareng diaktipkeun sacara standar, ngamungkinkeun para optimizer tiasa terang ngeunaan kamungkinan konstruk kondisional dipicu (contona, "[[pikaresepeun". ]] lamun (acak > 0) {“).
  • Ditambahkeun rojongan pikeun AMD Zen 3 (-maret = znver3), Intel Alder Lake (-maret = alderlake) sarta Intel Sapphire Rapids (-maret = sapphirerapids) prosesor.
  • Ditambahkeun dukungan pikeun "-march = x86-64-v [234]" umbul pikeun milih tingkat arsitektur x86-64 (v2 - nyertakeun ekstensi SSE4.2, SSSE3, POPCNT sareng CMPXCHG16B; v3 - AVX2 sareng MOVBE; v4 - AVX-512 ).
  • Ditambahkeun dukungan pikeun Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) sareng prosesor Fujitsu A64FX (a64fx). Contona, pikeun ngaktipkeun optimizations pikeun Neoverse-V1 CPUs, Anjeun bisa nangtukeun "-mcpu = neoverse-v1".
  • Pikeun arsitektur AArch64, bandéra kompiler anyar "-moutline-atomics" jeung "-mno-outline-atomics" geus ditambahkeun pikeun ngaktipkeun atawa nganonaktipkeun fungsi helper operasi atom, kayaning "__aarch64_cas8_relax". Fungsi sapertos ngadeteksi dina runtime naha rojongan LSE (System Extensions badag) sadia tur nganggo parentah processor atom disadiakeun atawa ragrag deui ngagunakeun LL / SC (Load-link / toko-kondisi) parentah pikeun sinkronisasi.
  • Ditambahkeun pilihan "-fbinutils-version" pikeun milih versi target tina suite binutils pikeun kasaluyuan sareng paripolah linker sareng assembler anu langkung lami.
  • Pikeun file laksana ELF, nalika bendera "-gz" dieusian, komprési informasi debugging ngagunakeun perpustakaan zlib diaktipkeun sacara standar (gz = zlib). Ngahubungkeun file objék anu dihasilkeun merlukeun lld atanapi GNU binutils 2.26+. Pikeun mulangkeun kasaluyuan sareng versi heubeul tina binutils, Anjeun bisa nangtukeun "-gz=zlib-gnu".
  • Pointer 'ieu' ayeuna diolah ku cék nonnull sareng dereferenceable(N). Pikeun ngahapus atribut nonnull, upami anjeun kedah nganggo nilai NULL, anjeun tiasa nganggo pilihan "-fdelete-null-pointer-checks".
  • Dina platform Linux, mode "-fasynchronous-unwind-tables" diaktipkeun pikeun arsitéktur AArch64 sareng PowerPC pikeun ngahasilkeun tabel sauran unwind, sapertos dina GCC.
  • Ditambahkeun kamampuhan pikeun nangtukeun "dibereskeun" (standar) jeung "scalable" pilihan pikeun milih métode vectorization dina "#pragma clang loop vectorize_width". Mode "scalable", bebas tina panjang vektor, nyaeta ékspériméntal sarta bisa dipaké dina hardware nu ngarojong vectorization scalable.
  • Ningkatkeun rojongan pikeun platform Windows: Majelis binér resmi pikeun Windows on sistem Arm64 geus disiapkeun, kaasup kompiler Clang, linker LLD jeung perpustakaan runtime compiler-rt. Nalika ngawangun pikeun platform target MinGW, ahiran .exe ditambahkeun, sanajan cross-compile.
  • Kamampuhan anu aya hubunganana sareng dukungan pikeun OpenCL, OpenMP sareng CUDA parantos dilegaan. pilihan ditambahkeun "-cl-std = CL3.0" jeung "-cl-std = CL1.0" pikeun milih pilihan makro pikeun OpenCL 3.0 sarta OpenCL 1.0. Alat diagnostik parantos dilegakeun.
  • Ditambahkeun dukungan pikeun petunjuk HRESET, UITR, sareng AVXVNNI anu dilaksanakeun dina sababaraha prosesor basis x86.
  • Dina sistem x86, rojongan pikeun pilihan "-mtune=" diaktipkeun, sangkan optimizations microarchitectural dipilih paduli nilai "-march=".
  • Analis statik parantos ningkatkeun ngolah sababaraha fungsi POSIX sareng sacara signifikan ningkatkeun tekad tina hasil operasi kondisional nalika aya sababaraha nilai simbolis dina babandingan. cék anyar geus ditambahkeun: fuchia.HandleChecker (ngahartikeun handles dina struktur), webkit.UncountedLambdaCapturesChecker webkit na alpha.webkit.UncountedLocalVarsChecker (nyandak kana akun peculiarities gawé bareng pointers dina kode mesin WebKit).
  • Dina éksprési dipaké dina konteks konstanta, pamakéan diwangun-di fungsi __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd, wap bswapq , _castf*, __rol* jeung __ror*.
  • Nambahkeun pilihan BitFieldColonSpacing kana utilitas clang-format pikeun milih jarak di sabudeureun identifier, kolom, sareng definisi lapangan.
  • Server caching clangd (Clang Server) dina platform Linux parantos ngirangan konsumsi mémori nalika operasi jangka panjang (panggero périodik ka malloc_trim disayogikeun pikeun ngabalikeun halaman mémori gratis kana sistem operasi).

Inovasi konci dina LLVM 12.0:

  • Rojongan pikeun alat ngawangun llvm-build anu ditulis dina Python parantos dileungitkeun, sareng proyékna parantos ngalih ka ngagunakeun sistem ngawangun CMake.
  • Dina backend pikeun arsitéktur AArch64, rojongan pikeun platform Windows geus ningkat: generasi bener kaluaran assembler pikeun target sistem Windows geus ensured, generasi data on unwind nelepon geus dioptimalkeun (ukuran data misalna geus ngurangan ku 60). %), kamampuhan pikeun nyieun data unwind maké assembler geus ditambahkeun directives .seh_*.
  • Backend pikeun arsitéktur PowerPC nampilkeun optimasi anyar pikeun loop sareng panyebaran inline, ngalegaan dukungan pikeun prosesor Power10, nambihan dukungan pikeun petunjuk MMA pikeun manipulasi matriks, sareng ningkatkeun dukungan pikeun sistem operasi AIX.
  • Backend x86 nambihan pangrojong pikeun AMD Zen 3, Intel Alder Lake sareng prosesor Intel Sapphire Rapids, ogé petunjuk prosésor HRESET, UITR sareng AVXVNNI. Rojongan pikeun MPX (Memori Protection Extensions) pikeun mariksa pointers pikeun mastikeun wates memori teu dirojong deui (téhnologi ieu teu nyebar sarta geus dikaluarkeun tina GCC na clang). Ditambahkeun dukungan kana assembler pikeun awalan {disp32} sareng {disp8} sareng sufiks .d32 sareng .d8 pikeun ngatur ukuran offset operan sareng luncat. Nambahkeun atribut anyar "tune-cpu" pikeun ngadalikeun citakan optimasi microarchitectural.
  • Modeu anyar "-fsanitize = unsigned-shift-base" geus ditambahkeun kana detektor masalah integer (integer sanitizer, "-fsanitize = integer") pikeun ngadeteksi overflows of unsigned integer sanggeus shift bit ka kénca.
  • Dina sagala rupa detéktor (asan, cfi, lsan, msan, tsan, ubsan sanitizer) rojongan pikeun distribusi Linux jeung perpustakaan Musl standar geus ditambahkeun.
  • Kamampuhan tina linker LLD geus dimekarkeun. Ningkatkeun dukungan pikeun format ELF, kalebet pilihan tambihan "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program". - visibilitas" " Ningkatkeun rojongan MinGW. Pikeun format Mach-O (macOS), dukungan pikeun arm64, arm, sareng arsitéktur i386, link-time optimizations (LTO), sareng stack unwinding pikeun penanganan pengecualian parantos dilaksanakeun.
  • Libc ++ implements fitur anyar tina standar C ++ 20 sarta geus dimimitian ngembangkeun fitur tina spésifikasi C ++ 2b. Ditambahkeun dukungan pikeun ngawangun kalayan nganonaktipkeun dukungan lokalisasi ("-DLIBCXX_ENABLE_LOCALIZATION = OFF") sareng alat pikeun ngahasilkeun angka pseudo-acak ("-DLIBCXX_ENABLE_RANDOM_DEVICE = OFF").

sumber: opennet.ru

Tambahkeun komentar