Na zes maanden ontwikkeling werd de release van het LLVM 13.0-project gepresenteerd: een GCC-compatibele toolkit (compilers, optimizers en codegenerators) die programma's compileert in tussenliggende bitcode van RISC-achtige virtuele instructies (een virtuele machine op laag niveau met een optimalisatiesysteem op meerdere niveaus). De gegenereerde pseudocode kan met behulp van een JIT-compiler direct tijdens de programma-uitvoering in machine-instructies worden omgezet.
Verbeteringen in Clang 13.0:
- Gegarandeerde tail calls (een aanroep van een subroutine helemaal aan het einde van een functie, die een tail recursie creëert als de subroutine zichzelf aanroept) worden nu ondersteund. Gegarandeerde tail calls worden ondersteund met behulp van het kenmerk "[[clang::musttail]]" in C++ en "__attribute__((musttail))" in C, gebruikt in de "return"-instructie. Deze functie maakt optimalisaties mogelijk door code af te vlakken tot een platte iteratie om stackruimte te besparen.
- "using"-declaraties en clang-extensies bieden ondersteuning voor het definiëren van attributen in C++11-stijl met behulp van het "[[]]"-formaat.
- Vlag "-Wreserved-identifier" toegevoegd om een waarschuwing weer te geven wanneer gereserveerde identifiers zijn opgegeven in de gebruikerscode.
- De vlaggen "-Wunused-but-set-parameter" en "-Wunused-but-set-variable" zijn toegevoegd om een waarschuwing af te drukken als een parameter of variabele is ingesteld maar niet wordt gebruikt.
- Vlag "-Wnull-pointer-subtraction" toegevoegd om een waarschuwing te geven als de code ongedefinieerd gedrag zou kunnen introduceren vanwege het gebruik van een null-pointer bij aftrekkingsbewerkingen.
- De vlag "-fstack-usage" toegevoegd om voor elk codebestand een extra ".su"-bestand te genereren met informatie over de grootte van stapelframes voor elke functie die is gedefinieerd in het bestand dat wordt verwerkt.
- Er is een nieuw uitvoertype toegevoegd aan de statische analysator - "sarif-html", wat leidt tot het gelijktijdig genereren van rapporten in HTML- en Sarif-formaten. Nieuwe allocClassWithName-controle toegevoegd. Wanneer u de optie “-analyzer-display-progress” specificeert, wordt de analysetijd van elke functie weergegeven. De slimme pointer-analysator (alpha.cplusplus.SmartPtr) is bijna klaar.
- De ondersteuning voor OpenCL is uitgebreid. Ondersteuning voor de nieuwe extensies cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields en __cl_clang_non_portable_kernel_param_types is toegevoegd. De implementatie van de OpenCL 3.0-specificatie is voortgezet. Voor C wordt standaard OpenCL 1.2 gebruikt, tenzij expliciet een andere versie is geselecteerd. Ondersteuning voor bestanden met de extensie ".clcpp" is toegevoegd voor C++.
- Ondersteuning voor lustransformatierichtlijnen (“#pragma omp unrol” en “#pragma omp tegel”) gedefinieerd in de OpenMP 5.1-specificatie is geïmplementeerd.
- Het hulpprogramma clang-format is bijgewerkt met de volgende opties: SpacesInLineCommentPrefix voor het specificeren van het aantal spaties vóór opmerkingen, IndentAccessModifiers, LambdaBodyIndentation en PPIndentWidth voor het bepalen van de uitlijning van records, lambda-expressies en preprocessorrichtlijnen. De sorteermogelijkheden voor headerbestandslijsten (SortIncludes) zijn uitgebreid. Ondersteuning voor JSON-bestandsopmaak is toegevoegd.
- Er is een groot deel van de nieuwe cheques toegevoegd aan het linter-clang-tidy.
Belangrijkste innovaties in LLVM 13.0:
- De optie "-ehcontguard" is toegevoegd om CET-technologie te gebruiken (Windows Control-flow Enforcement Technology) voor bescherming in de fase van exception handling tegen de uitvoering van exploits die zijn gebouwd met behulp van return-oriented programming (ROP)-technieken.
- Het project debuginfo-test is hernoemd naar cross-project-tests en is ontworpen voor het testen van componenten uit verschillende projecten, niet beperkt tot debuginformatie.
- Het bouwsysteem biedt ondersteuning voor het bouwen van meerdere distributies, bijvoorbeeld één met hulpprogramma's en de andere met bibliotheken voor ontwikkelaars.
- De backend voor de AArch64-architectuur implementeert ondersteuning voor de Armv9-A RME (Realm Management Extension) en SME (Scalable Matrix Extension) extensies in assembler.
- Ondersteuning voor ISA V68/HVX is toegevoegd aan de backend voor de Hexagon-architectuur.
- De x86-backend heeft verbeterde ondersteuning voor AMD Zen 3-processors.
- Ondersteuning toegevoegd voor GFX1013 RDNA2 APU aan de AMDGPU-backend.
- Libc++ blijft nieuwe functies van de C++20- en C++2b-standaarden implementeren, waaronder de voltooiing van de "concepts"-bibliotheek. Voor het platform Windows Ondersteuning voor std::filesystem op basis van MinGW is toegevoegd. Headerbestanden zijn gescheiden. , En De buildoptie LIBCXX_ENABLE_INCOMPLETE_FEATURES is toegevoegd om headerbestanden met onvolledige functionaliteit uit te schakelen.
- De LLD-linker is uitgebreid ter ondersteuning van Big-endian Aarch64-processoren en de Mach-O-backend is verbeterd om het koppelen van standaardprogramma's mogelijk te maken. Verbeteringen die nodig zijn voor het koppelen van Glibc met behulp van LLD zijn opgenomen.
- Het hulpprogramma llvm-mca (Machine Code Analyzer) is bijgewerkt om processoren te ondersteunen die instructies in volgorde uitvoeren (in-order superscalar pipeline), zoals de ARM Cortex-A55.
- De LLDB-debugger voor het AArch64-platform ondersteunt nu volledig pointerauthenticatie, het Memory Tagging Extension (MemTag)-mechanisme en SVE-registers. Er zijn opdrachten toegevoegd om tags te koppelen aan elke geheugentoewijzingsbewerking en ervoor te zorgen dat de pointer tijdens geheugentoegang aan de juiste tag wordt gekoppeld.
- De LLDB-debugger en de Fortran-frontend, Flang, zijn toegevoegd aan de binaire assembly's die door het project zijn gegenereerd.
Bron: opennet.ru
