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