LLVM 9.0 kompilyator dəstinin buraxılışı

Altı aylıq inkişafdan sonra təqdim etdi layihə buraxılışı LLVM 9.0 — GCC uyğun alətlər (tərtibçilər, optimallaşdırıcılar və kod generatorları), proqramları RISC-yə bənzər virtual təlimatların aralıq bit koduna (çox səviyyəli optimallaşdırma sistemi ilə aşağı səviyyəli virtual maşın) tərtib edir. Yaradılmış psevdokod JIT kompilyatorundan istifadə edərək proqramın icrası zamanı birbaşa maşın təlimatlarına çevrilə bilər.

LLVM 9.0-ın yeni xüsusiyyətlərinə hədəf RISC-V platformasından eksperimental dizayn etiketinin çıxarılması, OpenCL üçün C++ dəstəyi, proqramı LLD-də dinamik yüklənmiş hissələrə bölmək imkanı və “asm getdi", Linux nüvə kodunda istifadə olunur. libc++ WASI (WebAssembly System Interface) üçün dəstək əlavə etdi və LLD WebAssembly dinamik əlaqələndirilməsi üçün ilkin dəstək əlavə etdi.

Təkmilləşdirmələr Clang 9.0-da:

  • Əlavə edilib GCC-yə xas ifadənin həyata keçirilməsi "asm getdi“, bu, assembler daxili blokundan C kodundakı etiketə keçməyə imkan verir. Bu funksiya x86_64 arxitekturalı sistemlərdə Clang istifadə edərək “CONFIG_JUMP_LABEL=y” rejimində Linux nüvəsini qurmaq üçün tələb olunur. Əvvəlki buraxılışlarda əlavə edilmiş dəyişiklikləri nəzərə alaraq, Linux nüvəsi indi x86_64 arxitekturası üçün Clang-da tikilə bilər (əvvəllər yalnız arm, aarch64, ppc32, ppc64le və mips arxitekturaları üçün tikinti dəstəklənirdi). Üstəlik, Android və ChromeOS layihələri artıq nüvə qurmaq üçün Clang-dan istifadəyə çevrilib və Google, Linux sistemlərinin istehsalı üçün nüvələrin qurulması üçün əsas platforma kimi Clang-ı sınaqdan keçirir. Gələcəkdə LLD, llvm-objcopy, llvm-ar, llvm-nm və llvm-objdump daxil olmaqla, nüvənin qurulması prosesində digər LLVM komponentləri istifadə edilə bilər;
  • OpenCL-də C++ 17-dən istifadə üçün eksperimental dəstək əlavə edildi. Xüsusi xüsusiyyətlərə ünvan məkanı atributları üçün dəstək, tip tökmə operatorları tərəfindən ünvan məkanının çevrilməsinin bloklanması, C üçün OpenCL-də olduğu kimi vektor növlərinin təmin edilməsi, şəkillər, hadisələr, kanallar üçün xüsusi OpenCL növlərinin olması və s. daxildir.
  • Frontendin müxtəlif mərhələlərinin (analizləmə, işə salma) və arxa planın (optimallaşdırma mərhələləri) icra müddəti haqqında hesabat yaratmaq üçün “-ftime-trace” və “-ftime-trace-granularity=N” yeni tərtibçi bayraqları əlavə edildi. Hesabat json formatında saxlanılır, chrome://tracing və speedscope.app ilə uyğun gəlir;
  • “__declspec(alocator)” spesifikatorunun əlavə emalı və Visual Studio mühitində yaddaş istehlakına nəzarət etməyə imkan verən müşayiət olunan sazlama məlumatının yaradılması;
  • C dili üçün “__FILE_NAME__” makrosuna dəstək əlavə edilmişdir, bu makro “__FILE__” makrosuna bənzəyir, lakin tam yolu olmayan yalnız fayl adını ehtiva edir;
  • C++ müxtəlif C++ xüsusiyyətlərini, o cümlədən parametr və arqument nümunələri, istinad növləri, qaytarma növündən nəticə çıxarmaq, obyektlər, avtomatik yaradılan funksiyalar, daxili operatorlar və s.
  • OpenCL, OpenMP və CUDA dəstəyi ilə bağlı imkanlar genişləndirilib. Buraya daxili OpenCL funksiyalarının gizli daxil edilməsi üçün ilkin dəstək daxildir (“-fdeclare-opencl-builtins” bayrağı əlavə edilib), cl_arm_integer_dot_product genişləndirilməsi həyata keçirilib və diaqnostika alətləri genişləndirilib;
  • Statik analizatorun işi təkmilləşdirilmiş və statik analizin aparılmasına dair sənədlər əlavə edilmişdir. Mövcud yoxlayıcı modulları və dəstəklənən seçimləri göstərmək üçün bayraqlar əlavə edildi (“-analizator-yoxlayan[-seçim]-kömək”, “-analizator-yoxlayan[-seçim]-kömək-alfa” və “-analizator-yoxlayan[-seçim]-kömək ” -developer”). Xəbərdarlıqları səhv kimi qəbul etmək üçün "-analizator-verror" bayrağı əlavə edildi.
    Yeni doğrulama rejimləri əlavə edildi:

    • buferlərlə işləmək üçün təhlükəli təcrübələri müəyyən etmək üçün security.insecureAPI.DeprecatedOrUnsafeBufferHandling;
    • MIG (Mach Interface Generator) çağırış qaydalarının pozulmasını axtarmaq üçün osx.MIGChecker;
    • səhv XNU libkern obyekt çevrilmələrini tapmaq üçün optin.osx.OSObjectCStyleCast;
    • LLVM kod bazasında səhvləri aşkar etmək üçün modelləşdirmə yoxlama funksiyaları dəsti ilə apiModeling.llvm;
    • Başlanmamış C++ obyektlərinin yoxlanılması üçün stabilləşdirilmiş kod (optin.cplusplus paketində UninitializedObject);
  • Clang-format yardım proqramı C# dilində kodun formatlaşdırılması üçün əlavə dəstəyi əlavə etdi və Microsoft tərəfindən istifadə edilən kod formatlaşdırma üslubuna dəstək verir;
  • Visual Studio-ya daxil olan cl.exe kompilyatoru ilə seçim səviyyəsində uyğunluğu təmin edən alternativ komanda xətti interfeysi clang-cl, mövcud olmayan faylları komanda xətti variantları kimi nəzərdən keçirmək və müvafiq xəbərdarlıq göstərmək üçün evristikanı əlavə etmişdir (məsələn, işlədərkən "clang-cl /diaqnostik:caret /c test.cc");
  • OpenMP API-yə xas əlavə çeklər də daxil olmaqla, yeni çeklərin böyük bir hissəsi linter clang-tidy-ə əlavə edilmişdir;
  • Genişləndirilmiş server imkanları clangd Arxa fon indeksinin qurulması rejiminin defolt olaraq aktiv edildiyi (Clang Server), kodla kontekstual hərəkətlərə dəstək əlavə edildi (dəyişən axtarış, avtomatik və makro təriflərin genişləndirilməsi, qaçan sətirlərin qaçış olmayanlara çevrilməsi), göstərmək imkanı Clang-səliqəli xəbərdarlıqlar, başlıq fayllarında səhvlərin genişləndirilmiş diaqnostikası və tip iyerarxiyası haqqında məlumatları göstərmək imkanı əlavə etdi;

Əsas yeniliklər LLVM 9.0:

  • LLD əlaqələndiricisinə eksperimental bölmə funksiyası əlavə edilmişdir ki, bu da bir proqramı bir neçə hissəyə bölməyə imkan verir, hər biri ayrıca ELF faylında yerləşir. Bu funksiya proqramın əsas hissəsini işə salmağa imkan verir ki, bu da əməliyyat zamanı lazım olduqda digər komponentləri yükləyəcək (məsələn, siz daxili PDF görüntüləyicisini ayrıca fayla ayıra bilərsiniz, o, yalnız istifadəçi PDF faylını açdıqda yüklənəcək. fayl).

    LLD Bağlayıcı ön plana çıxardı arm32_7, arm64, ppc64le və x86_64 arxitekturaları üçün Linux nüvəsini əlaqələndirmək üçün uyğun vəziyyətə.
    Yeni seçimlər "-" (stdout-a çıxış), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" və "-z ümumi səhifə ölçüsü". AArch64 arxitekturası üçün BTI (Branch Target Indicator) və PAC (Pointer Authentication Code) təlimatlarına dəstək əlavə edilib. MIPS, RISC-V və PowerPC platformalarına dəstək əhəmiyyətli dərəcədə yaxşılaşdırılıb. WebAssembly üçün dinamik əlaqə üçün ilkin dəstək əlavə edildi;

  • libc++-da həyata keçirilən ssize, std::is_constant_evaluated, std::midpoint və std::lerp funksiyaları, std::span-a “front” və “back” metodları əlavə edildi, std::is_unbounded_array və std::is_bounded_array növlərinin atributları əlavə edildi , std imkanları genişləndirildi: :atomic. GCC 4.9 üçün dəstək dayandırıldı (GCC 5.1 və daha yeni buraxılışlarla istifadə edilə bilər). Əlavə dəstək MƏN İDİM (WebAssembly System Interface, WebAssembly-dən brauzerdən kənar istifadə üçün interfeys);
  • Yeni optimallaşdırmalar əlavə edildi. Bəzi hallarda memcmp zənglərinin bcmp-ə çevrilməsi aktivləşdirildi. Aşağı keçid bloklarının əlçatmaz olduğu və ya təlimatların istifadə edilmədiyi, məsələn, void tipli funksiyaların çağırılması zamanı keçid cədvəlləri üçün diapazonun yoxlanılmasının həyata keçirilməsi;
  • RISC-V arxitekturasının arxa hissəsi stabilləşdirilib, o, artıq eksperimental olaraq yerləşdirilməyib və defolt olaraq qurulub. MAFDC genişləndirmələri ilə RV32I və RV64I təlimat dəsti variantları üçün tam kod yaratma dəstəyini təmin edir;
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU və PowerPC arxitekturaları üçün backendlərdə çoxsaylı təkmilləşdirmələr edilmişdir. Məsələn, memarlıq üçün
    AArch64, SVE2 (Ölçəklənən Vektor Genişləndirilməsi 2) və MTE (Yaddaş Təqvim Genişləndirilməsi) təlimatları üçün dəstək əlavə etdi; ARM backendində Armv8.1-M arxitekturası və MVE (M-Profil Vektor Genişləndirilməsi) genişlənməsi üçün dəstək əlavə edildi. GFX10 (Navi) arxitekturasına dəstək AMDGPU backendinə əlavə edildi, funksiya çağırma imkanları defolt olaraq aktivləşdirilib və birləşmiş keçid aktivləşdirilib. DPP (Data-Paralel Primitivlər).

  • LLDB debugger indi geri izlər üçün rəng vurğulayır və DWARF4 debug_types və DWARF5 debug_info blokları üçün əlavə dəstəyə malikdir;
  • COFF formatında obyekt və icra edilə bilən fayllar üçün dəstək llvm-objcopy və llvm-strip utilitlərinə əlavə edilmişdir.

Mənbə: opennet.ru

Добавить комментарий