Rilis paket kompiler LLVM 9.0

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

Fitur baru LLVM 9.0 termasuk penghapusan tag desain eksperimental dari platform RISC-V target, dukungan C++ untuk OpenCL, kemampuan untuk membagi program menjadi bagian-bagian yang dimuat secara dinamis di LLD, dan implementasi “asm pergi", digunakan dalam kode kernel Linux. libc++ menambahkan dukungan untuk WASI (WebAssembly System Interface), dan LLD menambahkan dukungan awal untuk tautan dinamis WebAssembly.

Perbaikan di Dentang 9.0:

  • Ditambahkan implementasi ekspresi khusus GCC "asm pergi“, yang memungkinkan Anda berpindah dari blok inline assembler ke label dalam kode C. Fitur ini diperlukan untuk membangun kernel Linux dalam mode “CONFIG_JUMP_LABEL=y” menggunakan Dentang pada sistem dengan arsitektur x86_64. Dengan mempertimbangkan perubahan yang ditambahkan pada rilis sebelumnya, kernel Linux sekarang dapat dibuat di Clang untuk arsitektur x86_64 (sebelumnya hanya mendukung arsitektur arm, aarch64, ppc32, ppc64le, dan mips). Selain itu, proyek Android dan ChromeOS telah dikonversi untuk menggunakan Clang untuk pembuatan kernel, dan Google sedang menguji Clang sebagai platform utama untuk membuat kernel untuk sistem Linux produksinya. Di masa depan, komponen LLVM lainnya dapat digunakan dalam proses pembuatan kernel, termasuk LLD, llvm-objcopy, llvm-ar, llvm-nm, dan llvm-objdump;
  • Menambahkan dukungan eksperimental untuk menggunakan C++17 di OpenCL. Fitur khusus termasuk dukungan untuk atribut ruang alamat, pemblokiran konversi ruang alamat berdasarkan operator pengecoran tipe, penyediaan tipe vektor seperti pada OpenCL untuk C, keberadaan tipe OpenCL spesifik untuk gambar, acara, saluran, dll.
  • Menambahkan flag compiler baru “-ftime-trace” dan “-ftime-trace-granularity=N” untuk menghasilkan laporan tentang waktu eksekusi berbagai tahapan frontend (parsing, inisialisasi) dan backend (tahapan optimasi). Laporan disimpan dalam format json, kompatibel dengan chrome://tracing dan speedscope.app;
  • Menambahkan pemrosesan penentu “__declspec(allocator)” dan pembuatan informasi debug yang menyertainya yang memungkinkan Anda memantau konsumsi memori di lingkungan Visual Studio;
  • Untuk bahasa C, dukungan telah ditambahkan untuk makro “__FILE_NAME__”, yang menyerupai makro “__FILE__”, tetapi hanya menyertakan nama file tanpa path lengkap;
  • C++ telah memperluas dukungan untuk atribut ruang alamat untuk mencakup berbagai fitur C++, termasuk pola parameter dan argumen, tipe referensi, inferensi tipe kembalian, objek, fungsi yang dihasilkan secara otomatis, operator bawaan, dan banyak lagi.
  • Kemampuan yang terkait dengan dukungan untuk OpenCL, OpenMP dan CUDA telah diperluas. Hal ini mencakup dukungan awal untuk penyertaan implisit fungsi OpenCL bawaan (flag “-fdeclare-opencl-builtins” telah ditambahkan), ekstensi cl_arm_integer_dot_product telah diterapkan, dan alat diagnostik telah diperluas;
  • Pekerjaan penganalisis statis telah ditingkatkan dan dokumentasi tentang melakukan analisis statis telah ditambahkan. Menambahkan tanda untuk menampilkan modul pemeriksa yang tersedia dan opsi yang didukung (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” dan “-analyzer-checker[-option]-help ” -pengembang"). Menambahkan tanda "-analyzer-werror" untuk menganggap peringatan sebagai kesalahan.
    Menambahkan mode verifikasi baru:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling untuk mengidentifikasi praktik tidak aman untuk bekerja dengan buffer;
    • osx.MIGChecker untuk mencari pelanggaran aturan panggilan MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast untuk menemukan konversi objek libkern XNU yang salah;
    • apiModeling.llvm dengan serangkaian fungsi pemeriksaan pemodelan untuk mendeteksi kesalahan dalam basis kode LLVM;
    • Kode yang distabilkan untuk memeriksa objek C++ yang tidak diinisialisasi (UninitializedObject dalam paket optin.cplusplus);
  • Utilitas clang-format telah menambahkan dukungan untuk memformat kode dalam bahasa C# dan menyediakan dukungan untuk gaya pemformatan kode yang digunakan oleh Microsoft;
  • clang-cl, antarmuka baris perintah alternatif yang menyediakan kompatibilitas tingkat opsi dengan kompiler cl.exe yang disertakan dalam Visual Studio, telah menambahkan heuristik untuk memperlakukan file yang tidak ada sebagai opsi baris perintah dan menampilkan peringatan yang sesuai (misalnya, saat menjalankan "clang-cl /diagnostic :caret /c test.cc");
  • Sebagian besar pemeriksaan baru telah ditambahkan ke linter clang-tidy, termasuk pemeriksaan tambahan khusus untuk OpenMP API;
  • Diperluas kemampuan server dentang (Server Dentang), di mana mode pembuatan indeks latar belakang diaktifkan secara default, dukungan untuk tindakan kontekstual dengan kode telah ditambahkan (pengambilan variabel, perluasan definisi otomatis dan makro, konversi string yang lolos ke string yang tidak lolos), kemampuan untuk menampilkan peringatan dari Clang-tidy, memperluas diagnostik kesalahan dalam file header dan menambahkan kemampuan untuk menampilkan informasi tentang hierarki tipe;

Utama inovasi LLVM 9.0:

  • Fitur partisi eksperimental telah ditambahkan ke linker LLD, yang memungkinkan Anda membagi satu program menjadi beberapa bagian, yang masing-masing terletak di file ELF terpisah. Fitur ini memungkinkan Anda untuk meluncurkan bagian utama program, yang akan memuat komponen lain sesuai kebutuhan selama pengoperasian (misalnya, Anda dapat memisahkan penampil PDF bawaan ke dalam file terpisah, yang hanya akan dimuat saat pengguna membuka PDF mengajukan).

    Tautan LLD telah membawa ke keadaan yang cocok untuk menghubungkan kernel Linux untuk arsitektur arm32_7, arm64, ppc64le dan x86_64.
    Opsi baru "-" (keluaran ke stdout), "-[no-]allow-shlib-undefinisi", "-undefinisi-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" dan "-z ukuran halaman umum". Untuk arsitektur AArch64, dukungan untuk instruksi BTI (Branch Target Indicator) dan PAC (Pointer Authentication Code) telah ditambahkan. Dukungan untuk platform MIPS, RISC-V dan PowerPC telah ditingkatkan secara signifikan. Menambahkan dukungan awal untuk tautan dinamis untuk WebAssembly;

  • Di libc++ dilaksanakan fungsi ssize, std::is_constant_evaluated, std::midpoint dan std::lerp, metode "depan" dan "belakang" telah ditambahkan ke std::span, atribut tipe std::is_unbounded_array dan std::is_bounded_array telah ditambahkan , kemampuan std telah diperluas: :atomic. Dukungan untuk GCC 4.9 telah dihentikan (dapat digunakan dengan GCC 5.1 dan rilis yang lebih baru). Dukungan tambahan WSASI (Antarmuka Sistem WebAssembly, antarmuka untuk menggunakan WebAssembly di luar browser);
  • Pengoptimalan baru telah ditambahkan. Mengaktifkan konversi panggilan memcmp ke bcmp dalam beberapa situasi. Penerapan pengecekan jangkauan untuk tabel lompat di mana blok sakelar bawah tidak dapat dijangkau atau ketika instruksi tidak digunakan, misalnya, saat memanggil fungsi dengan tipe void;
  • Backend untuk arsitektur RISC-V telah distabilkan, yang tidak lagi diposisikan sebagai eksperimental dan dibangun secara default. Memberikan dukungan pembuatan kode penuh untuk varian set instruksi RV32I dan RV64I dengan ekstensi MAFDC;
  • Banyak perbaikan telah dilakukan pada backend untuk arsitektur X86, AArch64, ARM, SystemZ, MIPS, AMDGPU dan PowerPC. Misalnya untuk arsitektur
    AArch64 menambahkan dukungan untuk instruksi SVE2 (Scalable Vector Extension 2) dan MTE (Memory Tagging Extensions); di backend ARM, dukungan untuk arsitektur Armv8.1-M dan ekstensi MVE (M-Profile Vector Extension) telah ditambahkan. Dukungan untuk arsitektur GFX10 (Navi) telah ditambahkan ke backend AMDGPU, kemampuan pemanggilan fungsi diaktifkan secara default, dan pass gabungan diaktifkan DPP (Primitif Data-Paralel).

  • Debugger LLDB sekarang memiliki penyorotan warna untuk penelusuran balik dan menambahkan dukungan untuk blok debug_types DWARF4 dan debug_info DWARF5;
  • Dukungan untuk objek dan file yang dapat dieksekusi dalam format COFF telah ditambahkan ke utilitas llvm-objcopy dan llvm-strip.

Sumber: opennet.ru

Tambah komentar