LLVM 9.0 хөрвүүлэгчийн багцыг гаргасан

Зургаан сарын хөгжлийн дараа танилцуулсан төслийн хувилбар LLVM 9.0 — GCC-тэй нийцтэй хэрэгслүүд (эмхэтгэгчид, оновчтой болгогчид болон код үүсгэгчид), програмуудыг RISC-тэй төстэй виртуал зааврын завсрын бит код болгон хөрвүүлэх (олон түвшний оновчлолын систем бүхий доод түвшний виртуал машин). Үүсгэсэн псевдокодыг JIT хөрвүүлэгч ашиглан программыг гүйцэтгэх үед шууд машины заавар болгон хувиргаж болно.

LLVM 9.0-ийн шинэ боломжууд нь зорилтот RISC-V платформоос туршилтын дизайны шошгыг арилгах, OpenCL-ийн C++ дэмжлэг, LLD-д програмыг динамикаар ачаалагдсан хэсгүүдэд хуваах чадвар, "asm goto", Линуксийн цөмийн кодонд ашиглагддаг. libc++ нь WASI (WebAssembly System Interface)-ийн дэмжлэгийг нэмсэн бөгөөд LLD нь WebAssembly динамик холболтын анхны дэмжлэгийг нэмсэн.

Сайжруулалт Clang 9.0 дээр:

  • Нэмсэн GCC-ийн тусгай илэрхийллийн хэрэгжилт "asm goto", энэ нь ассемблерийн шугаман блокоос С код дахь шошго руу шилжих боломжийг олгодог. Энэ функц нь x86_64 архитектуртай систем дээр Clang ашиглан "CONFIG_JUMP_LABEL=y" горимд Линуксийн цөмийг бүтээхэд шаардлагатай. Өмнөх хувилбаруудад нэмсэн өөрчлөлтүүдийг харгалзан Линуксийн цөмийг одоо x86_64 архитектурт зориулж Clang-д барьж болно (өмнө нь зөвхөн arm, aarch64, ppc32, ppc64le болон mips архитектурт зориулж бүтээхийг дэмждэг байсан). Түүнчлэн, Android болон ChromeOS-ийн төслүүдийг цөм бүтээхэд Clang ашиглахаар аль хэдийн хөрвүүлсэн бөгөөд Google нь Clang-ийг Линукс системийнхээ үйлдвэрлэлийн цөмийг бүтээх үндсэн платформ болгон туршиж байна. Ирээдүйд LLD, llvm-objcopy, llvm-ar, llvm-nm, llvm-objdump зэрэг бусад LLVM бүрэлдэхүүн хэсгүүдийг цөм бүтээх процесст ашиглаж болно;
  • OpenCL дээр C++ 17 ашиглах туршилтын дэмжлэгийг нэмсэн. Онцлог шинж чанарууд нь хаягийн зайны шинж чанаруудыг дэмжих, төрөл дамжуулах операторуудаар хаягийн орон зай хөрвүүлэхийг хориглох, OpenCL-д зориулсан вектор төрлөөр хангах, зураг, үйл явдал, суваг гэх мэт тусгай OpenCL төрлүүдтэй байх зэрэг орно.
  • "-ftime-trace" болон "-ftime-trace-granularity=N" шинэ хөрвүүлэгчийн тугуудыг нэмж, урд талын (шинжилгээ, эхлүүлэх) болон арын хэсгийн (оновчлох үе шат) янз бүрийн үе шатуудын гүйцэтгэлийн хугацааны талаар тайлан гаргах боломжтой. Тайланг chrome://tracing болон speedscope.app-д нийцүүлэн json форматаар хадгалсан;
  • Visual Studio орчинд санах ойн зарцуулалтыг хянах боломжийг олгодог "__declspec(allocator)" тодорхойлогчийн боловсруулалт болон дагалдах дибаг хийх мэдээллийг бий болгосон;
  • Си хэлний хувьд "__FILE_NAME__" макроны дэмжлэгийг нэмсэн бөгөөд энэ нь "__FILE__" макротой төстэй боловч зөвхөн файлын нэрийг бүрэн замгүй агуулсан;
  • C++ нь параметр болон аргументын загвар, лавлагааны төрлүүд, буцаах төрлийн дүгнэлт, объект, автоматаар үүсгэгдсэн функцууд, суурилуулсан операторууд гэх мэт C++-ийн төрөл бүрийн функцуудыг хамарсан хаягийн зайны шинж чанаруудын дэмжлэгийг өргөжүүлсэн.
  • OpenCL, OpenMP болон CUDA-ийн дэмжлэгтэй холбоотой боломжуудыг өргөжүүлсэн. Үүнд OpenCL-ийн суулгасан функцуудыг далд оруулах анхны дэмжлэг ("-fdeclare-opencl-builtins" туг нэмэгдсэн), cl_arm_integer_dot_product өргөтгөл хэрэгжиж, оношилгооны хэрэгслүүд өргөжсөн;
  • Статик анализаторын ажлыг сайжруулж, статик шинжилгээ хийх баримт бичгийг нэмсэн. Боломжтой шалгагч модулиуд болон дэмжигдсэн сонголтуудыг харуулахын тулд дарцагуудыг нэмсэн ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" болон "-analyzer-checker[-option]-help "-хөгжүүлэгч"). Анхааруулгыг алдаа гэж үзэхийн тулд "-analyzer-werror" тэмдгийг нэмсэн.
    Баталгаажуулах шинэ горимуудыг нэмсэн:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling буфертэй ажиллахад аюултай практикийг тодорхойлох;
    • MIG (Mach Interface Generator) дуудлагын дүрмийн зөрчлийг хайх osx.MIGChecker;
    • optin.osx.OSObjectCStyleCast нь буруу XNU libkern объект хувиргалтыг олох;
    • apiModeling.llvm нь LLVM кодын сан дахь алдааг илрүүлэх загварчлалын шалгах функцуудын багцтай;
    • Эхлээгүй C++ объектуудыг шалгах тогтворжуулсан код (optin.cplusplus багц дахь UninitializedObject);
  • Clang-format хэрэгсэл нь C# хэл дээрх кодыг форматлах дэмжлэгийг нэмсэн бөгөөд Microsoft-ын ашигладаг код форматлах хэв маягийг дэмждэг;
  • Visual Studio-д багтсан cl.exe хөрвүүлэгчтэй тохируулгын түвшний нийцтэй байдлыг хангадаг өөр командын мөрийн интерфейс болох clang-cl нь байхгүй файлуудыг командын мөрийн сонголт гэж үзэж, харгалзах сэрэмжлүүлгийг харуулах эвристикийг нэмсэн (жишээлбэл, "clang-cl /diagnostic :caret /c test.cc"-г ажиллуулах үед);
  • OpenMP API-д зориулсан нэмэлт шалгалтуудыг оруулаад linter clang-tidy-д шинэ чекүүдийн ихээхэн хэсгийг нэмсэн;
  • Өргөтгөсөн серверийн чадвар clangd Арын индекс үүсгэх горимыг анхдагчаар идэвхжүүлсэн (Clang сервер) код бүхий контекст үйлдлүүдийн дэмжлэгийг нэмсэн (хувьсагчийн хайлт, автомат болон макро тодорхойлолтыг өргөтгөх, зугтсан мөрүүдийг гадагшаа гарахгүй болгон хувиргах), харуулах чадвар Clang-tidy-аас сэрэмжлүүлэг, толгой файл дахь алдааны оношлогоог өргөжүүлж, төрлийн шатлалын талаархи мэдээллийг харуулах боломжийг нэмсэн;

Үндсэн инноваци LLVM 9.0:

  • LLD холбогч дээр туршилтын хуваалтын функц нэмэгдсэн бөгөөд энэ нь нэг програмыг хэд хэдэн хэсэгт хуваах боломжийг олгодог бөгөөд тус бүр нь тусдаа ELF файлд байрладаг. Энэ функц нь програмын үндсэн хэсгийг ажиллуулах боломжийг олгодог бөгөөд энэ нь ашиглалтын явцад шаардлагатай бол бусад бүрэлдэхүүн хэсгүүдийг ачаалах болно (жишээлбэл, та суулгасан PDF харагчийг тусдаа файл болгон салгаж болно, зөвхөн хэрэглэгч PDF файлыг нээх үед ачаалагдах болно. файл).

    LLD холбогч анхаарлын төвд авчирсан arm32_7, arm64, ppc64le болон x86_64 архитектурт зориулсан Linux цөмийг холбоход тохиромжтой төлөв рүү.
    Шинэ сонголтууд "-" (stdout руу гаралт), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" болон "-z нийтлэг хуудасны хэмжээ". AArch64 архитектурын хувьд BTI (Салбарын зорилтот үзүүлэлт) болон PAC (Заагч баталгаажуулалтын код) зааварчилгааны дэмжлэгийг нэмсэн. MIPS, RISC-V болон PowerPC платформуудын дэмжлэг мэдэгдэхүйц сайжирсан. WebAssembly-д зориулсан динамик холболтын анхны дэмжлэгийг нэмсэн;

  • libc++ дээр хэрэгжүүлсэн ssize, std::is_constant_evaluated, std::midpoint болон std::lerp функцууд, std::span-д “front” болон “back” аргууд нэмэгдсэн, std::is_unbounded_array болон std::is_bounded_array төрлийн шинж чанарууд нэмэгдсэн , std боломжуудыг өргөтгөсөн: :атомын. GCC 4.9-ийн дэмжлэгийг зогсоосон (GCC 5.1 болон шинэ хувилбаруудад ашиглах боломжтой). Нэмэлт дэмжлэг WASI (WebAssembly System Interface, WebAssembly-г хөтчөөс гадуур ашиглах интерфейс);
  • Шинэ оновчлол нэмэгдсэн. Зарим тохиолдолд memcmp дуудлагыг bcmp руу хөрвүүлэхийг идэвхжүүлсэн. Доод шилжүүлэгчийн блокууд хүрэх боломжгүй эсвэл зааврыг ашиглаагүй үед, жишээлбэл, хүчин төгөлдөр бус функцийг дуудах үед үсрэх хүснэгтүүдийн хүрээг шалгахыг орхигдуулсан;
  • RISC-V архитектурын арын хэсгийг тогтворжуулсан бөгөөд энэ нь туршилтын байрлалд байхаа больсон бөгөөд анхдагчаар бүтээгдсэн. MAFDC өргөтгөл бүхий RV32I болон RV64I зааварчилгааны багц хувилбаруудад код үүсгэх бүрэн дэмжлэг үзүүлэх;
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU болон PowerPC архитектуруудын арын хэсэгт олон тооны сайжруулалт хийгдсэн. Жишээлбэл, архитектурын хувьд
    AArch64 нь SVE2 (Scalable Vector Extension 2) болон MTE (Memory Tagging Extensions) зааврын дэмжлэгийг нэмсэн; ARM арын хэсэгт Armv8.1-M архитектур болон MVE (M-Profile Vector Extension) өргөтгөлийн дэмжлэг нэмэгдсэн. GFX10 (Navi) архитектурын дэмжлэгийг AMDGPU арын хэсэгт нэмсэн, функц дуудах чадварыг анхдагчаар идэвхжүүлсэн бөгөөд хосолсон дамжуулалтыг идэвхжүүлсэн. ХХН (Data-Parallel Primitives).

  • LLDB дибаг хийгч нь одоо арын мөрийг өнгөөр ​​тодруулж, DWARF4 debug_types болон DWARF5 debug_info блокуудын дэмжлэгийг нэмсэн;
  • COFF форматтай объект болон гүйцэтгэх файлуудын дэмжлэгийг llvm-objcopy болон llvm-strip хэрэгслүүдэд нэмсэн.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх