Etter seks måneders utvikling ble utgivelsen av LLVM 13.0-prosjektet presentert - et GCC-kompatibelt verktøysett (kompilatorer, optimerere og kodegeneratorer) som kompilerer programmer til mellombitkode av RISC-lignende virtuelle instruksjoner (en virtuell maskin på lavt nivå med en optimeringssystem på flere nivåer). Den genererte pseudokoden kan konverteres ved hjelp av en JIT-kompilator til maskininstruksjoner direkte på tidspunktet for programkjøring.
Forbedringer i Clang 13.0:
- Garanterte halekall (kaller en subrutine helt på slutten av en funksjon, og oppretter en halekursjon hvis subrutinen kaller seg selv) støttes. Garanterte halekall støttes ved bruk av attributtet "[[clang::musttail]]" i C++ og "__attribute__((musttail))" i C, brukt i uttrykket "return". Denne funksjonen muliggjør optimaliseringer gjennom kodeutfolding til en flat iterasjon for å spare stakkplass.
- Attributtdefinisjoner i C++11-stil støttes nå i clang "using"-deklarasjoner og -utvidelser, ved bruk av formatet "[[]]".
- La til flagget «-Wreserved-identifier» for å sende ut en advarsel når reserverte identifikatorer angis i brukerkode.
- La til flaggene «-Wunused-but-set-parameter» og «-Wunused-but-set-variable» for å skrive ut en advarsel hvis en parameter eller variabel er satt, men ikke brukt.
- La til flagget «-Wnull-pointer-subtraction» for å advare om kode kan føre til udefinert oppførsel på grunn av bruk av en nullpeker i subtraksjonsoperasjoner.
- La til flagget «-fstack-usage» for å generere en ekstra «.su»-fil for hver kodefil som inneholder informasjon om størrelsen på stakkrammer for hver funksjon som er definert i filen som behandles.
- En ny utdatatype er lagt til den statiske analysatoren – «sarif-html», som resulterer i dannelsen av rapporter i både HTML- og Sarif-formater. En ny kontroll er lagt til allocClassWithName. Når alternativet «-analyzer-display-progress» spesifiseres, sendes analysetiden for hver funksjon ut. Smartpointer-analysatoren (alpha.cplusplus.SmartPtr) er nesten klar.
- Utvidede muligheter knyttet til OpenCL-støtte. La til støtte for nye utvidelser cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields og __cl_clang_non_portable_kernel_param_types. Fortsatt implementering av OpenCL 3.0-spesifikasjonen. For C brukes OpenCL 1.2-spesifikasjonen som standard, med mindre en annen versjon er eksplisitt valgt. For C++, lagt til støtte for filer med utvidelsen ".clcpp".
- Støtte for løkketransformasjonsdirektiver ("#pragma omp unrol" og "#pragma omp tile") definert i OpenMP 5.1-spesifikasjonen er implementert.
- clang-format-verktøyet er oppdatert med følgende alternativer: SpacesInLineCommentPrefix for å bestemme antall mellomrom før kommentarer, IndentAccessModifiers, LambdaBodyIndentation og PPIndentWidth for å kontrollere justeringen av poster, lambda-uttrykk og preprocessor-direktiver. Muligheten til å sortere listen over headerfiler (SortIncludes) er utvidet. Støtte for formatering av JSON-filer er lagt til.
- En stor mengde nye sjekker har blitt lagt til i den klangryddige linteren.
Nøkkelinnovasjoner i LLVM 13.0:
- La til alternativet "-ehcontguard" for å bruke CET-teknologi (Windows Control-flow Enforcement Technology) for å beskytte mot utførelse av utnyttelser bygget ved hjelp av returorientert programmering (ROP)-teknikker i unntakshåndteringsfasen.
- debuginfo-test-prosjektet har fått nytt navn til cross-project-tester og er utviklet for å teste komponenter fra forskjellige prosjekter, ikke begrenset til feilsøkingsinformasjon.
- Byggesystemet støtter bygging av flere distribusjoner, for eksempel én med verktøy og den andre med biblioteker for utviklere.
- Bakgrunnen for AArch64-arkitekturen implementerer støtte for Armv9-A RME (Realm Management Extension) og SME (Scalable Matrix Extension)-utvidelsene i assembler.
- Støtte for ISA V68/HVX er lagt til i Hexagon-arkitekturens backend.
- X86-backend har forbedret støtte for AMD Zen 3-prosessorer.
- La til støtte for GFX1013 RDNA2 APU til AMDGPU-backend.
- Libc++ fortsetter å implementere nye funksjoner i C++20- og C++2b-standardene, inkludert ferdigstillelsen av «konsept»-biblioteket. For plattformen Windows La til støtte for std::filesystem basert på MinGW. Header-filer er separert. , Og La til byggealternativet LIBCXX_ENABLE_INCOMPLETE_FEATURES for å deaktivere headerfiler med ufullstendig funksjonalitet.
- LLD-lenkeren er utvidet for å støtte Big-endian Aarch64-prosessorer, og Mach-O-backend er forbedret for å tillate kobling av vanlige programmer. Forbedringer som er nødvendige for å koble Glibc ved hjelp av LLD er inkludert.
- Verktøyet llvm-mca (Machine Code Analyzer) har blitt oppdatert for å støtte superskalare pipeline-prosessorer i rekkefølge, som ARM Cortex-A55.
- LLDB-feilsøkingsprogrammet for AArch64-plattformen støtter nå fullt ut pekerautentisering, MTE-mekanismen (MemTag, Memory Tagging Extension) og SVE-registre. Kommandoer er lagt til for å binde tagger til hver minneallokeringsoperasjon og for å sjekke pekeren ved tilgang til minne, som må være bundet til en gyldig tagg.
- LLDB-feilsøkingsprogrammet og Fortran-grensesnittet Flang er lagt til de binære samlingene som genereres av prosjektet.
Kilde: opennet.ru
