Keluaran suite pengkompil LLVM 9.0

Selepas enam bulan pembangunan dibentangkan keluaran projek LLVM 9.0 β€” Alat serasi GCC (penyusun, pengoptimum dan penjana kod), menyusun atur cara ke dalam kod bit perantaraan arahan maya seperti RISC (mesin maya peringkat rendah dengan sistem pengoptimuman berbilang peringkat). Pseudokod yang dihasilkan boleh ditukar menggunakan pengkompil JIT ke dalam arahan mesin secara langsung pada masa pelaksanaan program.

Ciri baharu LLVM 9.0 termasuk penyingkiran teg reka bentuk percubaan daripada platform RISC-V sasaran, sokongan C++ untuk OpenCL, keupayaan untuk membahagikan program kepada bahagian yang dimuatkan secara dinamik dalam LLD dan pelaksanaan β€œasm goto", digunakan dalam kod kernel Linux. libc++ menambah sokongan untuk WASI (WebAssembly System Interface), dan LLD menambah sokongan awal untuk pemautan dinamik WebAssembly.

Penambahbaikan dalam Clang 9.0:

  • Ditambah pelaksanaan ungkapan khusus GCC "asm gotoβ€œ, yang membolehkan anda beralih daripada blok sebaris pemasang ke label dalam kod C. Ciri ini diperlukan untuk membina kernel Linux dalam mod "CONFIG_JUMP_LABEL=y" menggunakan Clang pada sistem dengan seni bina x86_64. Dengan mengambil kira perubahan yang ditambahkan dalam keluaran sebelumnya, kernel Linux kini boleh dibina dalam Clang untuk seni bina x86_64 (sebelum ini hanya membina untuk lengan, aarch64, ppc32, ppc64le dan seni bina mips telah disokong). Selain itu, projek Android dan ChromeOS telah pun ditukar untuk menggunakan Clang untuk pembinaan kernel, dan Google sedang menguji Clang sebagai platform utama untuk membina kernel untuk sistem Linux pengeluarannya. Pada masa hadapan, komponen LLVM lain boleh digunakan dalam proses binaan kernel, termasuk LLD, llvm-objcopy, llvm-ar, llvm-nm dan llvm-objdump;
  • Menambahkan sokongan percubaan untuk menggunakan C++17 dalam OpenCL. Ciri khusus termasuk sokongan untuk atribut ruang alamat, menyekat penukaran ruang alamat mengikut jenis operator penghantaran, penyediaan jenis vektor seperti dalam OpenCL untuk C, kehadiran jenis OpenCL khusus untuk imej, acara, saluran, dll.
  • Menambahkan bendera pengkompil baharu β€œ-ftime-trace” dan β€œ-ftime-trace-granularity=N” untuk menjana laporan tentang masa pelaksanaan pelbagai peringkat bahagian hadapan (penghuraian, permulaan) dan hujung belakang (peringkat pengoptimuman). Laporan disimpan dalam format json, serasi dengan chrome://tracing dan speedscope.app;
  • Menambah pemprosesan penentu "__declspec(allocator)" dan penjanaan maklumat penyahpepijatan yang disertakan yang membolehkan anda memantau penggunaan memori dalam persekitaran Visual Studio;
  • Untuk bahasa C, sokongan telah ditambahkan untuk makro "__FILE_NAME__", yang menyerupai makro "__FILE__", tetapi hanya termasuk nama fail tanpa laluan penuh;
  • C++ telah mengembangkan sokongan untuk atribut ruang alamat untuk merangkumi pelbagai ciri C++, termasuk parameter dan corak hujah, jenis rujukan, inferens jenis pulangan, objek, fungsi jana automatik, operator terbina dalam dan banyak lagi.
  • Keupayaan yang dikaitkan dengan sokongan untuk OpenCL, OpenMP dan CUDA telah diperluaskan. Ini termasuk sokongan awal untuk kemasukan tersirat bagi fungsi OpenCL terbina dalam (bendera "-fdeclare-opencl-builtins" telah ditambah), sambungan cl_arm_integer_dot_product telah dilaksanakan dan alat diagnostik telah diperluaskan;
  • Kerja-kerja penganalisis statik telah ditambah baik dan dokumentasi untuk melaksanakan analisis statik telah ditambah. Menambahkan bendera untuk memaparkan modul penyemak yang tersedia dan pilihan yang disokong (β€œ-pemeriksa-penganalisis[-pilihan]-bantuan”, β€œ-pemeriksa-penganalisis[-pilihan]-bantuan-alfa” dan β€œ-pemeriksa-penganalisis[-pilihan]-bantuan ” -pembangun"). Menambahkan bendera "-analyzer-werror" untuk menganggap amaran sebagai ralat.
    Menambah mod pengesahan baharu:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling untuk mengenal pasti amalan tidak selamat untuk bekerja dengan penimbal;
    • osx.MIGCecker untuk mencari pelanggaran peraturan panggilan MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast untuk mencari penukaran objek libkern XNU yang salah;
    • apiModeling.llvm dengan set fungsi semakan pemodelan untuk mengesan ralat dalam pangkalan kod LLVM;
    • Kod yang distabilkan untuk menyemak objek C++ yang tidak diinisialisasi (UninitializedObject dalam pakej optin.cplusplus);
  • Utiliti format clang telah menambah sokongan untuk pemformatan kod dalam bahasa C# dan menyediakan sokongan untuk gaya pemformatan kod yang digunakan oleh Microsoft;
  • clang-cl, antara muka baris perintah alternatif yang menyediakan keserasian peringkat pilihan dengan pengkompil cl.exe yang disertakan dalam Visual Studio, telah menambah heuristik untuk merawat fail yang tidak wujud sebagai pilihan baris arahan dan memaparkan amaran yang sepadan (contohnya, apabila menjalankan "clang-cl /diagnostic :caret /c test.cc");
  • Sebilangan besar semakan baharu telah ditambahkan pada linter clang-kemas, termasuk pemeriksaan tambahan khusus untuk OpenMP API;
  • Dikembangkan keupayaan pelayan clangd (Clang Server), di mana mod pembinaan indeks latar belakang didayakan secara lalai, sokongan untuk tindakan kontekstual dengan kod telah ditambahkan (pendapatan semula pembolehubah, pengembangan definisi auto dan makro, penukaran rentetan yang dilepaskan kepada yang tidak dilepaskan), keupayaan untuk memaparkan amaran daripada Clang-tidy, memperluaskan diagnostik ralat dalam fail pengepala dan menambahkan keupayaan untuk memaparkan maklumat tentang hierarki jenis;

Utama inovasi LLVM 9.0:

  • Ciri pembahagian percubaan telah ditambahkan pada pemaut LLD, yang membolehkan anda membahagikan satu program kepada beberapa bahagian, setiap satunya terletak dalam fail ELF yang berasingan. Ciri ini membolehkan anda melancarkan bahagian utama program, yang akan memuatkan komponen lain seperti yang diperlukan semasa operasi (contohnya, anda boleh memisahkan pemapar PDF terbina dalam ke dalam fail berasingan, yang akan dimuatkan hanya apabila pengguna membuka PDF fail).

    Penghubung LLD dibawa ke hadapan kepada keadaan yang sesuai untuk memautkan kernel Linux untuk seni bina arm32_7, arm64, ppc64le dan x86_64.
    Pilihan baharu "-" (output ke stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" dan "-z common-page-size". Untuk seni bina AArch64, sokongan untuk arahan BTI (Penunjuk Sasaran Cawangan) dan PAC (Kod Pengesahan Penunjuk) telah ditambahkan. Sokongan untuk platform MIPS, RISC-V dan PowerPC telah dipertingkatkan dengan ketara. Menambah sokongan awal untuk pemautan dinamik untuk WebAssembly;

  • Dalam libc++ dilaksanakan fungsi ssize, std::is_constant_evaluated, std::midpoint dan std::lerp, kaedah "depan" dan "belakang" telah ditambah pada std::span, atribut jenis std::is_unbounded_array dan std::is_bounded_array telah ditambah , keupayaan std telah diperluaskan: :atomic. Sokongan untuk GCC 4.9 telah dihentikan (boleh digunakan dengan GCC 5.1 dan keluaran yang lebih baharu). Menambah sokongan ADAKAH SAYA (Antaramuka Sistem WebAssembly, antara muka untuk menggunakan WebAssembly di luar pelayar);
  • Pengoptimuman baharu telah ditambah. Mendayakan penukaran panggilan memcmp kepada bcmp dalam beberapa situasi. Melaksanakan peninggalan semakan julat untuk jadual lompat di mana blok suis bawah tidak dapat dicapai atau apabila arahan tidak digunakan, contohnya, apabila memanggil fungsi dengan jenis void;
  • Bahagian belakang untuk seni bina RISC-V telah distabilkan, yang tidak lagi diletakkan sebagai percubaan dan dibina secara lalai. Menyediakan sokongan penjanaan kod penuh untuk varian set arahan RV32I dan RV64I dengan sambungan MAFDC;
  • Banyak penambahbaikan telah dibuat pada bahagian belakang untuk seni bina X86, AArch64, ARM, SystemZ, MIPS, AMDGPU dan PowerPC. Sebagai contoh, untuk seni bina
    AArch64 menambah sokongan untuk arahan SVE2 (Scalable Vector Extension 2) dan MTE (Memory Tagging Extensions); dalam bahagian belakang ARM, sokongan untuk seni bina Armv8.1-M dan sambungan MVE (M-Profile Vector Extension) telah ditambahkan. Sokongan untuk seni bina GFX10 (Navi) telah ditambahkan pada bahagian belakang AMDGPU, keupayaan panggilan fungsi didayakan secara lalai dan pas gabungan diaktifkan Timbalan Pendakwa Raya (Primitif Selari Data).

  • Penyahpepijat LLDB kini mempunyai penonjolan warna untuk jejak belakang dan sokongan tambahan untuk blok debug_types DWARF4 dan DWARF5 debug_info;
  • Sokongan untuk fail objek dan boleh laku dalam format COFF telah ditambahkan pada utiliti llvm-objcopy dan llvm-strip.

Sumber: opennet.ru

Tambah komen