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

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

Clang 16.0-da əsas təkmilləşdirmələr:

  • Defolt C++/ObjC++ standartı gnu++17-dir (əvvəllər gnu++14), bu o deməkdir ki, C++17 funksiyaları GNU genişləndirmələri ilə standart olaraq dəstəklənir. Əvvəlki davranışı qaytarmaq üçün "-std=gnu++14" seçimindən istifadə edə bilərsiniz.
  • C++ 20 standartı ilə bağlı təkmilləşdirilmiş funksiyalar:
    • Şərti olaraq əhəmiyyətsiz xüsusi üzv funksiyaları,
    • lambda funksiyalarında strukturlaşdırılmış bağlamaların tutulması,
    • İfadələr daxilində bərabərlik operatoru,
    • Bəzi kontekstlərdə typename açar sözünü buraxmaq seçimi,
    • Mötərizədə etibarlı məcmu başlatma (“Aggr(val1, val2)”).
  • Gələcək C++2b standartında müəyyən edilmiş xüsusiyyətlər həyata keçirilmişdir:
    • Mürəkkəb ifadələrin sonunda etiketlərin yerləşdirilməsinə icazə verilir,
    • statik operator(),
    • statik operator[],
    • char8_t növü ilə uyğunluq təmin edilir,
    • "\N{...}" üçün istifadəyə icazə verilən simvol diapazonu genişləndirildi
    • Constexpr kimi elan edilmiş funksiyalarda "statik konstexpr" kimi elan edilmiş dəyişənlərdən istifadə etmək imkanı əlavə edildi.
  • Gələcək C-standart C2x-də müəyyən edilmiş xüsusiyyətlər həyata keçirilmişdir:
    • "-Wunused-label" xəbərdarlığını deaktiv etmək üçün "[[bəlkə_unused]]" atributunun etiketlərə tətbiqinə icazə verilir
    • Mürəkkəb ifadələrin hər hansı bir yerində etiketlərin yerləşdirilməsinə icazə verilir,
    • typeof və typeof_unqual operatorları əlavə edildi,
    • Yeni növ nullptr_t və nullptr sabiti istənilən göstərici növünə çevirə bilən və tam və void* tiplərinə bağlı olmayan NULL variantını təmsil edən null göstəriciləri müəyyən etmək üçün.
    • C2x rejimində va_start makrosunun dəyişən sayda arqumentlərlə (variadic) çağırılmasına icazə verilir.
  • C99, C11 və C17 uyğunluq rejimlərində "-Wimplicit-function-declaration" və "-Wimplicit-int" standart seçimləri indi xəbərdarlıq əvəzinə xəta yaradır.
  • C++ rejimində "void *" (məsələn, "void func(void *p) { *p; }") dolayı yolla istifadəsi indi ISO C++, GCC, ICC və MSVC-yə bənzər xəta yaradır.
  • Microsoft tipli daxili montaj bloklarında bit sahələrinin təlimat operandları (məsələn, "__asm  { mov eax, s.bf }") kimi təyin edilməsi indi xəta yaradır.
  • Fərqli modullarda eyni adlı müxtəlif strukturların və birləşmələrin olması üçün diaqnostika əlavə edildi.
  • OpenCL və OpenMP dəstəyi ilə əlaqəli imkanlar genişləndirilib. OpenCL nüvə arqumentlərində istifadə edilən C++ şablonları üçün təkmilləşdirilmiş diaqnostika. AMDGPU üçün təkmilləşdirilmiş növbə bloku dəstəyi. Nounwind atributu bütün funksiyalara dolayı əlavə olunur. Daxili funksiyalar üçün təkmilləşdirilmiş dəstək.
  • Qəza diaqnostik məlumatlarının saxlandığı qovluğu müəyyən etmək üçün CLANG_CRASH_DIAGNOSTICS_DIR mühit dəyişənindən istifadə etmək imkanı əlavə edildi.
  • Unicode dəstəyi Unicode 15.0 spesifikasiyasına yeniləndi. İdentifikatorlarda bəzi riyazi simvollara icazə verilir, məsələn, "₊" (məsələn, "ikiqat xₖ₊₁").
  • Çoxsaylı konfiqurasiya fayllarının yüklənməsi üçün əlavə dəstək (əvvəlcə defolt konfiqurasiya faylları yüklənir, sonra isə “--config=” bayrağı ilə qeyd olunanlar, indi bir neçə dəfə göstərilə bilər). Konfiqurasiya fayllarının standart yükləmə sırası dəyişdirildi: clang əvvəlcə faylı yükləməyə çalışır - .cfg və tapılmadıqda iki faylı yükləməyə çalışır .cfg və .cfg. Defolt olaraq konfiqurasiya fayllarının yüklənməsini söndürmək üçün “--no-default-config” bayrağı əlavə edilmişdir.
  • Təkrarlanan quruluşları təmin etmək üçün __DATE__, __TIME__ və __TIMESTAMP__ makroslarındakı cari tarix və vaxt dəyərlərini SOURCE_DATE_EPOCH mühit dəyişənində göstərilən vaxtla əvəz etmək mümkündür.
  • Sabitlər kontekstində istifadə edilə bilən daxili funksiyaların (quraşdırılmış) mövcudluğunu yoxlamaq üçün “__has_constexpr_builtin” makrosu əlavə edilmişdir.
  • Düzgün koroutin çərçivənin ayrılması üçün "-fcoro-aligned-allocation" yeni tərtib bayrağı əlavə edildi.
  • “-fstrict-flex-arrays=” bayrağı strukturlarda çevik massiv elementlərinin yoxlanılmasının üçüncü səviyyəsi üçün dəstəyi həyata keçirir (Flexible Array Members, strukturun sonunda qeyri-müəyyən ölçülü massiv). Üçüncü səviyyədə yalnız "[]" ölçüsü (məsələn, "int b[]") çevik massiv kimi qəbul edilir, lakin "[0]" ölçüsü (məsələn, "int b[0]") deyil.
  • Standart C++ modulları üçün birfazalı kompilyasiya modelini aktivləşdirmək üçün "-fmodule-output" bayrağı əlavə edildi.
  • Yığın çərçivəsinin düzülüşü ilə bağlı problemlərin diaqnostikasına kömək etmək üçün "-Rpass-analysis=stack-frame-layout" rejimi əlavə edildi.
  • Yeni atribut əlavə edildi __atribut__((target_version("cpu_features"))) və AArch1 tərəfindən təmin edilən funksiyaların xüsusi versiyalarını seçmək üçün __attribute__((target_clones("cpu_features2","cpu_features64",...))) atributunun funksionallığını genişləndirdi CPU-lar.
  • Diaqnostika alətləri genişləndirildi:
    • Bir bitlik imzalanmış bit sahəsinə təyin edərkən gizli kəsilməni aşkar etmək üçün "-Wsingle-bit-bitfield-constant-conversion" xəbərdarlığı əlavə edildi.
    • Başlanmamış constexpr dəyişənlərinin diaqnostikası genişləndirildi.
    • Funksiya növünün ötürülməsi ilə bağlı potensial problemləri müəyyən etmək üçün "-Wcast-function-type-strict" və "-Wincompatible-function-pointer-types-strict" xəbərdarlıqları əlavə edildi.
    • İxrac bloklarında səhv və ya qorunan modul adlarından istifadə üçün diaqnostika əlavə edildi.
    • Təriflərdə çatışmayan "avtomatik" açar sözlərin təkmilləşdirilmiş aşkarlanması.
    • "-Winteger-overflow" xəbərdarlığının həyata keçirilməsi daşqınlara səbəb olan əlavə hallar üçün yoxlamalar əlavə etdi.
  • Loongson 64 464 prosessorunda istifadə edilən və MIPS və RISC-V-ə bənzər yeni RISC ISA tətbiq edən LoongArch təlimat dəsti arxitekturası (-march=loongarch3 və ya -march=la5000) üçün həyata keçirilən dəstək.

LLVM 16.0-da əsas yeniliklər:

  • LLVM koduna C++17 standartında müəyyən edilmiş elementlərdən istifadə etməyə icazə verilir.
  • LLVM-nin qurulması üçün ətraf mühit tələbləri artırıldı. Quraşdırma alətləri indi C++ 17 standartını dəstəkləməlidir, yəni. Qurmaq üçün sizə ən azı GCC 7.1, Clang 5.0, Apple Clang 10.0 və ya Visual Studio 2019 16.7 lazımdır.
  • AArch64 arxitekturasının arxa hissəsi Cortex-A715, Cortex-X3 və Neoverse V2 CPU-ları, RME MEC (Yaddaş Şifrələmə Kontekstləri) üçün assembler, Armv8.3 genişləndirmələri (Kompleks Nömrə) və Function Multi Versioning üçün dəstək əlavə edir.
  • ARM arxitekturası üçün arxa planda doğru kodun yaradılmasına zəmanət verilməyən Armv2, Armv2A, Armv3 və Armv3M hədəf platformalarına dəstək dayandırılıb. Kompleks nömrələrlə işləmək üçün təlimatlar üçün kod yaratmaq imkanı əlavə edildi.
  • X86 arxitekturasının arxa hissəsi AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT təlimat dəsti arxitekturaları (ISAs) üçün dəstək əlavə etdi. RDMSRLIST, RMSRLIST və WRMSRNS təlimatları üçün əlavə dəstək. "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" və "-mcpu=grandridge" variantları həyata keçirilib.
  • LoongArch platforması üçün rəsmi dəstək əlavə edildi.
  • MIPS, PowerPC və RISC-V arxitekturaları üçün təkmilləşdirilmiş arxa uçlar
  • LLDB sazlayıcısına LoongArch arxitekturası üçün 64-bit icra olunan faylları sazlamaq üçün dəstək əlavə edildi. COFF sazlama simvollarının təkmilləşdirilmiş işlənməsi. Yüklənmiş Windows modullarının siyahısında dublikat DLL-lərin süzülməsi təmin edilmişdir.
  • Libc++ kitabxanasında əsas iş C++20 və C++23 standartlarının yeni funksiyalarına dəstəyin həyata keçirilməsinə yönəldilib.
  • LDD əlaqələndiricisi ünvanın dəyişdirilməsinin skan edilməsi və bölmənin işə salınması əməliyyatlarını paralelləşdirməklə əlaqə vaxtını əhəmiyyətli dərəcədə azaldır. ZSTD alqoritmindən istifadə edərək bölmənin sıxılması üçün əlavə dəstək.

Mənbə: opennet.ru

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