Keluaran suite pengkompil LLVM 12.0

Selepas enam bulan pembangunan, keluaran projek LLVM 12.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 dalam Clang 12.0:

  • Sokongan untuk atribut "kemungkinan" dan "tidak mungkin" yang dicadangkan dalam piawaian C++20 telah dilaksanakan dan didayakan secara lalai, membolehkan pengoptimum dimaklumkan tentang kebarangkalian binaan bersyarat dicetuskan (contohnya, "[[mungkin ]] jika (rawak > 0) {β€œ).
  • Menambah sokongan untuk pemproses AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) dan Intel Sapphire Rapids (-march=sapphirerapids).
  • Menambah sokongan untuk bendera "-march=x86-64-v[234]" untuk memilih tahap seni bina x86-64 (v2 - meliputi sambungan SSE4.2, SSSE3, POPCNT dan CMPXCHG16B; v3 - AVX2 dan MOVBE; v4 - AVX-512 ).
  • Sokongan tambahan untuk pemproses Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) dan Fujitsu A64FX (a64fx). Contohnya, untuk mendayakan pengoptimuman untuk CPU Neoverse-V1, anda boleh menentukan "-mcpu=neoverse-v1".
  • Untuk seni bina AArch64, bendera pengkompil baharu "-moutline-atomics" dan "-mno-outline-atomics" telah ditambahkan untuk mendayakan atau melumpuhkan fungsi pembantu operasi atom, seperti "__aarch64_cas8_relax". Fungsi sedemikian mengesan pada masa jalan sama ada sokongan LSE (Sambungan Sistem Besar) tersedia dan menggunakan arahan pemproses atom yang disediakan atau kembali menggunakan arahan LL/SC (Pautan-muatan/stor-bersyarat) untuk penyegerakan.
  • Menambahkan pilihan "-fbinutils-version" untuk memilih versi sasaran suite binutils untuk keserasian dengan kelakuan pemaut dan pemasang yang lebih lama.
  • Untuk fail boleh laku ELF, apabila bendera "-gz" ditentukan, pemampatan maklumat penyahpepijatan menggunakan perpustakaan zlib didayakan secara lalai (gz=zlib). Memautkan fail objek yang terhasil memerlukan lld atau GNU binutils 2.26+. Untuk memulihkan keserasian dengan versi binutil yang lebih lama, anda boleh menentukan "-gz=zlib-gnu".
  • Penunjuk 'ini' kini diproses dengan semakan tidak batal dan boleh dirujuk(N). Untuk mengalih keluar atribut nonnull apabila anda perlu menggunakan nilai NULL, anda boleh menggunakan pilihan "-fdelete-null-pointer-checks".
  • Pada platform Linux, mod "-fasynchronous-unwind-tables" didayakan untuk seni bina AArch64 dan PowerPC untuk menjana jadual panggilan santai, seperti dalam GCC.
  • Dalam "#pragma clang loop vectorize_width" menambahkan keupayaan untuk menentukan pilihan "tetap" (lalai) dan "boleh berskala" untuk memilih kaedah vektorisasi. Mod "boleh berskala", bebas daripada panjang vektor, adalah percubaan dan boleh digunakan pada perkakasan yang menyokong penvektoran boleh skala.
  • Sokongan yang dipertingkatkan untuk platform Windows: Perhimpunan binari rasmi untuk Windows pada sistem Arm64 telah disediakan, termasuk pengkompil Clang, penyambung LLD dan perpustakaan runtime compiler-rt. Apabila membina untuk platform sasaran MinGW, akhiran .exe ditambah, walaupun semasa menyusun silang.
  • Keupayaan yang dikaitkan dengan sokongan untuk OpenCL, OpenMP dan CUDA telah diperluaskan. Menambahkan pilihan "-cl-std=CL3.0" dan "-cl-std=CL1.0" untuk memilih pilihan makro untuk OpenCL 3.0 dan OpenCL 1.0. Alat diagnostik telah diperluaskan.
  • Menambah sokongan untuk arahan HRESET, UITR dan AVXVNNI yang dilaksanakan dalam beberapa pemproses berasaskan x86.
  • Pada sistem x86, sokongan untuk pilihan "-mtune=" didayakan, mendayakan pengoptimuman seni bina mikro yang dipilih tanpa mengira nilai "-march=".
  • Penganalisis statik telah meningkatkan pemprosesan beberapa fungsi POSIX dan dengan ketara meningkatkan penentuan hasil operasi bersyarat apabila terdapat beberapa nilai simbolik dalam perbandingan. Semakan baharu telah ditambah: fuchia.HandleChecker (mentakrifkan pemegang dalam struktur), webkit.UncountedLambdaCapturesChecker webkit dan alpha.webkit.UncountedLocalVarsChecker (mengambil kira keistimewaan bekerja dengan penunjuk dalam kod enjin WebKit).
  • Dalam ungkapan yang digunakan dalam konteks pemalar, penggunaan fungsi terbina dalam __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsd64, __bsd, __bsd, __bsd, __bsd, is__bsd, wap bswapq , _castf*, __rol* dan __ror*.
  • Menambahkan pilihan BitFieldColonSpacing pada utiliti format dentang untuk memilih jarak sekitar pengecam, lajur dan takrifan medan.
  • Pelayan caching clangd (Clang Server) pada platform Linux telah mengurangkan penggunaan memori dengan ketara semasa operasi jangka panjang (panggilan berkala ke malloc_trim disediakan untuk mengembalikan halaman memori percuma kepada sistem pengendalian).

Inovasi utama dalam LLVM 12.0:

  • Sokongan untuk alat binaan llvm-build yang ditulis dalam Python telah dihentikan, dan sebaliknya projek itu telah beralih sepenuhnya kepada menggunakan sistem binaan CMake.
  • Di bahagian belakang untuk seni bina AArch64, sokongan untuk platform Windows telah dipertingkatkan: penjanaan output pemasang yang betul untuk sistem Windows sasaran telah dipastikan, penjanaan data pada panggilan santai telah dioptimumkan (saiz data tersebut telah dikurangkan sebanyak 60 %), keupayaan untuk mencipta data santai menggunakan assembler telah ditambah arahan .seh_*.
  • Bahagian belakang untuk seni bina PowerPC menampilkan pengoptimuman baharu untuk gelung dan penggunaan sebaris, sokongan yang diperluaskan untuk pemproses Power10, menambah sokongan untuk arahan MMA untuk manipulasi matriks dan sokongan yang lebih baik untuk sistem pengendalian AIX.
  • Bahagian belakang x86 menambah sokongan untuk pemproses AMD Zen 3, Intel Alder Lake dan Intel Sapphire Rapids, serta arahan pemproses HRESET, UITR dan AVXVNNI. Sokongan untuk MPX (Sambungan Perlindungan Memori) untuk menyemak penunjuk untuk memastikan sempadan memori tidak lagi disokong (teknologi ini tidak meluas dan telah dialih keluar daripada GCC dan denting). Menambahkan sokongan pada pemasang untuk awalan {disp32} dan {disp8} serta akhiran .d32 dan .d8 untuk mengawal saiz offset dan lompatan operan. Menambah atribut baharu "tune-cpu" untuk mengawal kemasukan pengoptimuman seni bina mikro.
  • Mod baharu "-fsanitize=unsigned-shift-base" telah ditambahkan pada pengesan masalah integer (integer sanitizer, "-fsanitize=integer") untuk mengesan limpahan integer yang tidak ditandatangani selepas beralih sedikit ke kiri.
  • Dalam pelbagai pengesan (asan, cfi, lsan, msan, tsan, ubsan sanitizer) sokongan untuk pengedaran Linux dengan perpustakaan Musl standard telah ditambah.
  • Keupayaan penghubung LLD telah diperluaskan. Sokongan yang dipertingkatkan untuk format ELF, termasuk pilihan tambahan "--fail-bergantung", "skrip-penangan-ralat", "-lto-pseudo-probe-untuk-profiling", "-no-lto-whole-program -keterlihatan” " Sokongan MinGW yang dipertingkatkan. Untuk format Mach-O (macOS), sokongan untuk seni bina arm64, lengan dan i386, pengoptimuman masa pautan (LTO) dan melonggarkan tindanan untuk pengendalian pengecualian telah dilaksanakan.
  • Libc++ melaksanakan ciri baharu standard C++20 dan telah memulakan pembangunan ciri spesifikasi C++2b. Menambahkan sokongan untuk membina dengan melumpuhkan sokongan penyetempatan (β€œ-DLIBCXX_ENABLE_LOCALIZATION=OFF”) dan peranti untuk menjana nombor pseudo-rawak (β€œ-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Sumber: opennet.ru

Tambah komen