Izdanje LLVM 16.0 kompajlerskog paketa

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

Dodajte komentar