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

Altı aylıq inkişafdan sonra təqdim etdi layihə buraxılışı LLVM 10.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 10.0-dakı yeni xüsusiyyətlərə C++ Konseptləri üçün dəstək daxildir, artıq Clang-ı ayrıca proses kimi işlətmir, Windows üçün CFG (nəzarət axını qoruyucu) yoxlamalarına dəstək və yeni CPU imkanları üçün dəstək daxildir.

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

  • " üçün dəstək əlavə edildianlayışlar", növbəti standarta daxil ediləcək C++ şablon uzantısı, kod adı C++2a (-std=c++2a bayrağı ilə açılır).
    Konsepsiyalar tərtib zamanı şablon parametrləri kimi qəbul edilə bilən arqumentlər toplusunu məhdudlaşdıran şablon parametr tələbləri toplusunu müəyyən etməyə imkan verir. Şablonda istifadə olunan məlumat növlərinin xüsusiyyətləri ilə giriş parametrlərinin məlumat tipi xüsusiyyətləri arasında məntiqi uyğunsuzluqların qarşısını almaq üçün anlayışlar istifadə edilə bilər.

    şablon
    konsepsiyası BərabərlikMüqayisəli = tələb edir(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Varsayılan olaraq, tərtibin həyata keçirildiyi ayrıca prosesin (“clang -cc1”) işə salınması dayandırılır. Kompilyasiya indi əsas prosesdə aparılır və "-fno-integrated-cc1" seçimi köhnə davranışı bərpa etmək üçün istifadə edilə bilər.
  • Yeni diaqnostik rejimlər:
    • "-Wc99-designator" və "-Wreorder-init-list" C++ rejimində C99 başlatıcılarının C99-da düzgün olduğu, lakin C++20-də olmadığı hallarda istifadə edilməməsi barədə xəbərdarlıq edir.
    • "-Wsizeof-array-div" - "int arr[10] kimi vəziyyətləri tutur; …sizeof(arr) / sizeof(qısa)…” (“sizeof(arr) / sizeof(int)” olmalıdır).
    • "-Wxor-used-as-po" - eksponentasiya ilə qarışdırıla bilən əməliyyatlarda "^" (xor) operatorunun istifadəsi kimi konstruksiyaların istifadəsinə qarşı xəbərdarlıq edir (2^16).
    • "-Wfinal-dtor-non-final-class" - "final" spesifikatoru ilə qeyd olunmayan, lakin "final" atributlu dağıdıcısı olan siniflər haqqında xəbərdarlıq edir.
    • "-Vtavtoloji-bitwise-müqayisə" bit üzrə əməliyyat və sabit arasında tavtoloji müqayisələrin diaqnostikası və bitwise OR əməliyyatının mənfi olmayan ədədə tətbiq edildiyi həmişə doğru müqayisələri müəyyən etmək üçün xəbərdarlıqlar qrupudur.
    • "-Wbitwise-şərti-mötərizə" məntiqi operatorları AND (&) və OR (|) şərti operator (?:) ilə qarışdırarkən problemlər barədə xəbərdarlıq edir.
    • “-Wmisleading-indentation” GCC-dən eyni adlı çekin analoqudur, if/else/for/while blokunun bir hissəsi kimi girintili ifadələr barədə xəbərdarlıq edir, lakin əslində onlar bu bloka daxil edilmir. .
    • “-Wextra” təyin edildikdə, konstruktorların istifadəsi barədə xəbərdarlıq edən “-Wdeprecated-copy” yoxlanışı aktivləşdirilir.
      Açıq dağıdıcı tərifi olan siniflərdə "köçür" və "kopyalayın".

    • "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" yoxlamaları genişləndirilib.
    • "-Wbitwise-op-mötərizələr" və "-Wlogical-op-mötərizələr" yoxlamaları defolt olaraq qeyri-aktivdir.
  • C və C++ kodlarında göstərici arifmetik əməliyyatlarına yalnız massivlərdə icazə verilir. "-fsanitize=pointer-overflow" rejimində Müəyyən edilməmiş Davranış Təmizləyicisi indi null göstəricisinə sıfırdan fərqli ofset əlavə etmək və ya qeyri-null göstəricidən tam ədəd çıxararkən null göstərici yaratmaq kimi halları tutur.
  • "-fsanitize=implicit-conversion" (İmplicit Conversion Sanitizer) rejimi "int" tipindən bir qədər kiçik olan növlər üçün artım və azalma əməliyyatları ilə bağlı problemləri müəyyən etmək üçün uyğunlaşdırılmışdır.
  • X86 hədəf arxitekturasını seçərkən "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" və "-march=cooperlake" vektorlaşdırılmış The default olaraq. kodu 512-bit zmm registrlərindən istifadə etməyi dayandırdı, onların mənbə kodunda birbaşa göstərilməsi istisna olmaqla. Səbəb 512 bit əməliyyatları yerinə yetirərkən CPU tezliyinin azalmasıdır ki, bu da ümumi performansa mənfi təsir göstərə bilər. Yeni davranışı dəyişdirmək üçün "-mprefer-vector-width=512" seçimi təmin edilir.
  • "-flax-vector-conversions" bayrağının davranışı GCC-yə bənzəyir: tam və üzən nöqtəli vektorlar arasında gizli vektor bit çevrilməsi qadağandır. Bu məhdudiyyəti aradan qaldırmaq üçün bayraqdan istifadə etmək təklif olunur
    Defolt olan "-flax-vector-conversions=all".

  • Octeon ailəsinin MIPS CPU-ları üçün təkmilləşdirilmiş dəstək. Etibarlı CPU növləri siyahısına "octeon+" əlavə edildi.
  • WebAssembly aralıq koduna yığıldıqda, sistemdə varsa, wasm-opt optimallaşdırıcı avtomatik olaraq çağırılır.
  • RISC-V arxitekturasına əsaslanan sistemlər üçün, assembler inline əlavələrinin şərti bloklarında üzən nöqtə dəyərlərini saxlayan registrlərin istifadəsinə icazə verilir.
  • Yeni kompilyator bayraqları əlavə edildi: "__GNUC__" və oxşar makrolar üçün versiya dəyərini təyin etmək üçün "-fgnuc-version"; "__FILE__" kimi makrolarda OLD kataloq prefiksini YENİ ilə əvəz etmək üçün "-fmacro-prefix-map=OLD=NEW"; Funksiya giriş nöqtəsindən əvvəl və sonra müəyyən sayda NOP təlimatı yaratmaq üçün "-fpatchable-function-entry=N[,M]". RISC-V üçün
    "-ffixed-xX", "-mcmodel=medany" və "-mcmodel=medlow" bayraqları üçün əlavə dəstək.

  • Təsiri seçimə bənzəyən '__attribute__((target("branch-protection=..."))) atributuna dəstək əlavə edildi - budaq-mühafizə.
  • Windows platformasında, "-cfguard" bayrağı göstərildikdə, dolayı funksiya çağırışları üçün icra axınının bütövlüyü yoxlamalarının (Control Flow Guard) dəyişdirilməsi həyata keçirilir. Çekin dəyişdirilməsini söndürmək üçün siz “-cfguard-nochecks” bayrağından və ya “__declspec(guard(nocf))” dəyişdiricisindən istifadə edə bilərsiniz.
  • Gnu_inline atributunun davranışı "extern" açar sözü olmadan istifadə edildiyi hallarda GCC ilə oxşardır.
  • OpenCL və CUDA dəstəyi ilə əlaqəli imkanlar genişləndirilmişdir. Yeni OpenMP 5.0 funksiyaları üçün əlavə dəstək.
  • Clang-format yardım proqramına Standart seçim əlavə edildi, bu, kodu təhlil edərkən və formatlaşdırarkən istifadə olunan C++ standartının versiyasını təyin etməyə imkan verir (Son, Auto, c++03, c++11, c++14, c++17, c++20).
  • Statik analizatora yeni yoxlamalar əlavə edildi: kifayət qədər yaddaş sahəsinin olub-olmadığını müəyyən etmək üçün alpha.cplusplus.PlacementNew, Fuşya işləyiciləri ilə bağlı sızmaları aşkar etmək üçün fuchsia.HandleChecker, potensial buferdən istifadə zamanı aşkar etmək üçün security.insecureAPI.decodeValueOfObjCType. :at:] .
  • Müəyyən edilməmiş Davranış Təmizləyicisi (UBSan) NULL göstəricilərə sıfırdan fərqli ofsetlərin tətbiqini və ya nəticədə NULL göstərici ofsetinin əlavə edilməsini tutmaq üçün göstərici daşqın yoxlamalarını genişləndirdi.
  • In linter clang-səliqəli əlavə etdi yeni çeklərin böyük bir hissəsi.

Əsas yeniliklər LLVM 10.0:

  • Çərçivəyə Atributor Yeni prosedurlararası optimallaşdırmalar və analizatorlar əlavə edildi. 19 atribut 12 LLVM IR və canlılıq kimi 12 abstrakt atribut daxil olmaqla 7 müxtəlif atributun vəziyyəti proqnozlaşdırılır.
  • Kompilyatora quraşdırılmış yeni matris riyazi funksiyalar əlavə edildi (İntrinsiklər), kompilyasiya zamanı səmərəli vektor göstərişləri ilə əvəz olunur.
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU və PowerPC arxitekturaları üçün backendlərdə çoxsaylı təkmilləşdirmələr edilmişdir. CPU dəstəyi əlavə edildi
    Cortex-A65, Cortex-A65AE, Neoverse E1 və Neoverse N1. ARMv8.1-M üçün kod yaratma prosesi optimallaşdırıldı (məsələn, minimum yükü olan döngələr üçün dəstək ortaya çıxdı) və MVE uzantısından istifadə edərək avtovektorlaşdırma dəstəyi əlavə edildi. Təkmilləşdirilmiş CPU MIPS Octeon dəstəyi. PowerPC üçün MASSV (Riyazi Sürətləndirmə Alt Sistemi) kitabxanasından istifadə edərək riyazi alt proqramların vektorlaşdırılması aktivləşdirilib, kodun yaradılması təkmilləşdirilib və dövrələrdən yaddaşa giriş optimallaşdırılıb. X86 üçün v2i32, v4i16, v2i16, v8i8, v4i8 və v2i8 vektor növlərinin işlənməsi dəyişdirildi.

  • WebAssembly üçün təkmilləşdirilmiş kod generatoru. TLS (Thread-Local Storage) və atomic.fence təlimatları üçün əlavə dəstək. SIMD dəstəyi əhəmiyyətli dərəcədə genişləndirildi. WebAssembly obyekt faylları artıq çox dəyərli funksiya imzalarından istifadə etmək imkanına malikdir.
  • Döngələri emal edərkən analizator istifadə olunur YaddaşSSA, müxtəlif yaddaş əməliyyatları arasında asılılıqları müəyyən etməyə imkan verir. MemorySSA tərtib və icra müddətini azalda bilər və ya performansını itirmədən AliasSetTracker əvəzinə istifadə edilə bilər.
  • LLDB sazlayıcısı DWARF v5 formatı üçün dəstəyi əhəmiyyətli dərəcədə təkmilləşdirmişdir. MinGW ilə tikinti üçün təkmilləşdirilmiş dəstək
    və ARM və ARM64 arxitekturaları üçün Windows icra sənədlərini sazlamaq üçün ilkin imkan əlavə etdi. Nişanı basaraq daxiletmənin avtomatik tamamlanması zamanı təklif olunan seçimlərin təsviri əlavə edilib.

  • Genişləndirilmiş LLD əlaqələndirici imkanları. ELF formatı üçün təkmilləşdirilmiş dəstək, o cümlədən qlob şablonlarının GNU əlaqələndiricisi ilə tam uyğunluğunun təmin edilməsi, sıxılmış sazlama bölmələri ".zdebug" üçün dəstəyin əlavə edilməsi, .note.gnu.property bölməsini müəyyən etmək üçün PT_GNU_PROPERTY xassəsinin əlavə edilməsi (gələcəkdə istifadə edilə bilər) Linux nüvələri),
    “-z burun-kod”, “-z ayrı-ayrı kod” və “-z ayrı-ayrı-yüklənə bilən-seqmentlər” rejimləri tətbiq edilmişdir. MinGW və WebAssembly üçün təkmilləşdirilmiş dəstək.

Mənbə: opennet.ru

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