Nakon šest mjeseci razvoja, predstavljeno je izdanje LLVM 16.0 projekta - GCC-kompatibilnog kompleta alata (kompajleri, optimizatori i generatori koda) koji kompajlira programe u srednji bit kod RISC-ovih virtualnih instrukcija (virtuelna mašina niskog nivoa sa sistem optimizacije na više nivoa). Generisani pseudokod se može konvertovati pomoću JIT kompajlera u mašinske instrukcije direktno u vreme izvršavanja programa.
Glavna poboljšanja u Clang 16.0:
- Podrazumevani C++/ObjC++ standard je gnu++17 (ranije gnu++14), što znači da su funkcije C++17 sa GNU ekstenzijama podržane po defaultu. Da biste vratili prethodno ponašanje, možete koristiti opciju "-std=gnu++14".
- Implementirane napredne funkcije vezane za C++20 standard:
- Uslovno trivijalne posebne funkcije člana,
- hvatanje strukturiranih veza u lambda funkcijama,
- Operator jednakosti unutar izraza,
- Mogućnost izostavljanja ključne riječi typename u nekim kontekstima,
- Važeća inicijalizacija agregata u zagradama (“Aggr(val1, val2)”).
- Implementirane su karakteristike definirane u budućem C++2b standardu:
- Dozvoljeno je stavljati oznake na kraj složenih izraza,
- statički operator(),
- statički operator[],
- Osigurana je kompatibilnost sa tipom char8_t,
- Raspon znakova dozvoljenih za upotrebu u "\N{...}" je proširen
- Dodata mogućnost korištenja varijabli deklariranih kao "statički constexpr" u funkcijama deklariranim kao constexpr.
- Implementirane su karakteristike definirane u budućem C-standardu C2x:
- Da biste onemogućili upozorenje "-Wunused-label", atribut "[[maybe_unused]]" je dozvoljeno primijeniti na oznake
- Dozvoljeno je postavljanje oznaka bilo gdje unutar složenih izraza,
- Dodani operatori typeof i typeof_unqual,
- Novi tip nullptr_t i konstanta nullptr za definiranje null pokazivača koji se mogu pretvoriti u bilo koji tip pokazivača i predstavljaju varijantu NULL koja nije vezana za integer i void* tipove.
- U C2x modu je dozvoljeno pozivanje makroa va_start s promjenjivim brojem argumenata (varijadičnim).
- U režimima usklađenosti C99, C11 i C17, zadane opcije "-Wimplicit-function-declaration" i "-Wimplicit-int" sada proizvode grešku umjesto upozorenja.
- Indirektna upotreba "void *" (npr. "void func(void *p) { *p; }") u C++ modu sada generiše grešku, slično ISO C++, GCC, ICC i MSVC.
- Određivanje bitnih polja kao operanada instrukcija (npr. "__asm { mov eax, s.bf }") u inline montažnim blokovima u Microsoft stilu sada generiše grešku.
- Dodata dijagnostika za prisustvo različitih struktura i sindikata sa istim imenima u različitim modulima.
- Mogućnosti povezane sa podrškom za OpenCL i OpenMP su proširene. Poboljšana dijagnostika za C++ šablone koji se koriste u argumentima OpenCL kernela. Poboljšana podrška blokova čekanja za AMDGPU. Atribut nounwind se implicitno dodaje svim funkcijama. Poboljšana podrška za ugrađene funkcije.
- Dodata je mogućnost korištenja varijable okruženja CLANG_CRASH_DIAGNOSTICS_DIR za definiranje direktorija u kojem se pohranjuju dijagnostički podaci o padu.
- Podrška za Unicode je ažurirana na Unicode 15.0 specifikaciju. Neki matematički simboli su dozvoljeni u identifikatorima, kao što je "₊" (npr. "double xₖ₊₁").
- Dodata podrška za učitavanje više konfiguracijskih datoteka (prvo se učitavaju zadane konfiguracijske datoteke, a zatim one specificirane preko “--config=” zastavice, koje se sada mogu specificirati više puta). Promijenjen je zadani redoslijed učitavanja konfiguracijskih datoteka: clang prvo pokušava učitati datoteku - .cfg, a ako se ne pronađe, pokušava učitati dvije datoteke .cfg and .cfg. Da biste onemogućili učitavanje konfiguracijskih datoteka prema zadanim postavkama, dodana je zastavica “--no-default-config”.
- Da biste osigurali ponovljive gradnje, moguće je zamijeniti trenutne vrijednosti datuma i vremena u makroima __DATE__, __TIME__ i __TIMESTAMP__ vremenom navedenim u varijabli okruženja SOURCE_DATE_EPOCH.
- Za provjeru prisutnosti ugrađenih funkcija (ugrađenih) koje se mogu koristiti u kontekstu konstanti, dodat je makro “__has_constexpr_builtin”.
- Dodana je nova zastavica kompilacije "-fcoro-aligned-allocation" za poravnanu dodjelu okvira korutine.
- Oznaka “-fstrict-flex-arrays=” implementira podršku za treći nivo verifikacije fleksibilnih elemenata niza u strukturama (Fleksibilni članovi niza, niz neodređene veličine na kraju strukture). Na trećem nivou, samo veličina "[]" (na primjer, "int b[]") se tretira kao fleksibilan niz, ali veličina "[0]" (na primjer, "int b[0]") nije.
- Dodata "-fmodule-output" zastavica za omogućavanje jednofaznog modela kompilacije za standardne C++ module.
- Dodan način rada "-Rpass-analysis=stack-frame-layout" kako bi se dijagnosticirali problemi s rasporedom okvira steka.
- Dodan novi atribut __attribute__((target_version("cpu_features"))) i proširena funkcionalnost atributa __attribute__((target_clones("cpu_features1","cpu_features2",...))) za odabir specifičnih verzija funkcija koje pruža AArch64 CPU.
- Dijagnostički alati prošireni:
- Dodato upozorenje "-Wsingle-bit-bitfield-constant-conversion" za otkrivanje implicitnog skraćivanja prilikom dodjeljivanja jednog bitovnom polju s jednim bitom.
- Dijagnostika neinicijaliziranih constexpr varijabli je proširena.
- Dodata upozorenja "-Wcast-function-type-strict" i "-Wincompatible-function-pointer-types-strict" kako bi se identificirali potencijalni problemi s prebacivanjem tipa funkcije.
- Dodata dijagnostika za korištenje netočnih ili rezerviranih naziva modula u blokovima za izvoz.
- Poboljšano otkrivanje nedostajućih "auto" ključnih riječi u definicijama.
- Implementacija upozorenja "-Winteger-overflow" dodala je provjere za dodatne situacije koje dovode do prelijevanja.
- Implementirana podrška za arhitekturu skupa instrukcija LoongArch (-march=loongarch64 ili -march=la464), koja se koristi u Loongson 3 5000 procesorima i implementira novi RISC ISA, sličan MIPS i RISC-V.
Ključne inovacije u LLVM 16.0:
- LLVM kodu je dozvoljeno da koristi elemente definirane u C++17 standardu.
- Zahtjevi okoline za izgradnju LLVM-a su povećani. Alati za pravljenje bi sada trebali podržavati C++17 standard, tj. Da biste napravili, potreban vam je najmanje GCC 7.1, Clang 5.0, Apple Clang 10.0 ili Visual Studio 2019 16.7.
- Backend za AArch64 arhitekturu dodaje podršku za Cortex-A715, Cortex-X3 i Neoverse V2 CPU, asembler za RME MEC (konteksti šifrovanja memorije), Armv8.3 ekstenzije (kompleksni broj) i višestruko verzioniranje funkcija.
- U backendu za ARM arhitekturu, podrška za Armv2, Armv2A, Armv3 i Armv3M ciljne platforme je prekinuta, za koje generisanje ispravnog koda nije bilo zagarantovano. Dodata mogućnost generiranja koda za upute za rad sa kompleksnim brojevima.
- Pozadina za arhitekturu X86 je dodala podršku za arhitekture skupa instrukcija (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Dodata podrška za RDMSRLIST, RMSRLIST i WRMSRNS instrukcije. Implementirane opcije "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" i "-mcpu=grandridge".
- Dodata zvanična podrška za LoongArch platformu.
- Poboljšana pozadina za MIPS, PowerPC i RISC-V arhitekture
- Dodata podrška za otklanjanje grešaka u 64-bitnim izvršnim datotekama za LoongArch arhitekturu LLDB debugeru. Poboljšano rukovanje COFF simbolima za otklanjanje grešaka. Omogućeno filtriranje duplikata DLL-ova na listi učitanih Windows modula.
- U biblioteci Libc++ glavni rad je bio fokusiran na implementaciju podrške za nove karakteristike standarda C++20 i C++23.
- LDD linker značajno smanjuje vrijeme povezivanja paralelizirajući skeniranje premještanja adrese i operacije inicijalizacije sekcija. Dodata podrška za kompresiju sekcija pomoću ZSTD algoritma.
izvor: opennet.ru