Na zes maanden ontwikkeling werd de release van het LLVM 16.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.
Belangrijke verbeteringen in Clang 16.0:
- De standaard C++/ObjC++-standaard is gnu++17 (voorheen gnu++14), wat betekent dat C++17-functies met GNU-extensies standaard worden ondersteund. Om het vorige gedrag terug te geven, kunt u de optie "-std=gnu++14" gebruiken.
- Geavanceerde functies geïmplementeerd met betrekking tot de C++20-standaard:
- Voorwaardelijk triviale speciale lidfuncties,
- het vastleggen van gestructureerde bindingen in lambda-functies,
- Gelijkheidsoperator binnen expressies,
- Optie om het trefwoord typename in sommige contexten weg te laten,
- Geldige geaggregeerde initialisatie tussen haakjes (“Aggr(val1, val2)”).
- Functies gedefinieerd in de toekomstige C++2b-standaard zijn geïmplementeerd:
- Het is toegestaan om labels aan het einde van samengestelde uitdrukkingen te plaatsen,
- statische operator(),
- statische operator[],
- Compatibiliteit met het type char8_t is gegarandeerd,
- Het bereik van tekens dat mag worden gebruikt in "\N{...}" is uitgebreid
- De mogelijkheid toegevoegd om variabelen te gebruiken die zijn gedeclareerd als "statische constexpr" in functies die zijn gedeclareerd als constexpr.
- De functies die in de toekomstige C-standaard C2x zijn gedefinieerd, zijn geïmplementeerd:
- Om de waarschuwing '-Wunused-label' uit te schakelen, mag het kenmerk '[[maybe_unused]]' worden toegepast op labels
- Het is toegestaan om overal binnen samengestelde uitdrukkingen labels te plaatsen,
- Operatoren typeof en typeof_unqual toegevoegd,
- Een nieuw type nullptr_t en een nullptr-constante om null-pointers te definiëren die naar elk pointertype kunnen worden geconverteerd en een variant van NULL vertegenwoordigen die niet gebonden is aan integer- en void*-typen.
- In de C2x-modus is het aanroepen van de macro va_start met een variabel aantal argumenten (variadisch) toegestaan.
- In de nalevingsmodi C99, C11 en C17 produceren de standaardopties "-Wimplicit-function-declaration" en "-Wimplicit-int" nu een fout in plaats van een waarschuwing.
- Indirect gebruik van "void *" (bijv. "void func(void *p) { *p; }") in de C++-modus genereert nu een fout, vergelijkbaar met ISO C++, GCC, ICC en MSVC.
- Het specificeren van bitvelden als instructie-operands (bijvoorbeeld "__asm {mov eax, s.bf }") in inline assemblageblokken in Microsoft-stijl genereert nu een fout.
- Diagnose toegevoegd voor de aanwezigheid van verschillende structuren en verbindingen met dezelfde namen in verschillende modules.
- De mogelijkheden die verband houden met OpenCL- en OpenMP-ondersteuning zijn uitgebreid. Verbeterde diagnostiek voor C++-sjablonen die worden gebruikt in OpenCL-kernelargumenten. Verbeterde ondersteuning voor wachtrijblokken voor AMDGPU. Het zelfstandig naamwoordwind-attribuut wordt impliciet aan alle functies toegevoegd. Verbeterde ondersteuning voor ingebouwde functies.
- De mogelijkheid toegevoegd om de omgevingsvariabele CLANG_CRASH_DIAGNOSTICS_DIR te gebruiken om de map te definiëren waarin diagnostische gegevens over crashes worden opgeslagen.
- Unicode-ondersteuning is bijgewerkt naar de Unicode 15.0-specificatie. Sommige wiskundige symbolen zijn toegestaan in ID's, zoals "₊" (bijvoorbeeld "dubbele xₖ₊₁").
- Ondersteuning toegevoegd voor het laden van meerdere configuratiebestanden (standaardconfiguratiebestanden worden eerst geladen en vervolgens de bestanden die zijn opgegeven via de vlag “--config=”, die nu meerdere keren kan worden opgegeven). De standaardvolgorde voor het laden van configuratiebestanden is gewijzigd: clang probeert eerst het bestand -.cfg te laden, en als dit niet wordt gevonden, probeert het twee bestanden .cfg en te laden .cfg. Om het laden van configuratiebestanden standaard uit te schakelen, is de vlag “--no-default-config” toegevoegd.
- Om herhaalbare builds te garanderen, is het mogelijk om de huidige datum- en tijdwaarden in de macro's __DATE__, __TIME__ en __TIMESTAMP__ te vervangen door de tijd die is opgegeven in de omgevingsvariabele SOURCE_DATE_EPOCH.
- Om te controleren op de aanwezigheid van ingebouwde functies (builtin) die kunnen worden gebruikt in de context van constanten, is de macro “__has_constexpr_builtin” toegevoegd.
- Nieuwe compilatievlag "-fcoro-aligned-allocation" toegevoegd voor uitgelijnde coroutine-frametoewijzing.
- De vlag “-fstrict-flex-arrays=” implementeert ondersteuning voor het derde niveau van verificatie van flexibele array-elementen in structuren (Flexible Array Members, een array van onbepaalde grootte aan het einde van de structuur). Op het derde niveau wordt alleen de grootte "[]" (bijvoorbeeld "int b[]") behandeld als een flexibele array, maar de grootte "[0]" (bijvoorbeeld "int b[0]") is niet.
- Vlag "-fmodule-output" toegevoegd om eenfasig compilatiemodel voor standaard C++-modules mogelijk te maken.
- De modus "-Rpass-analysis=stack-frame-layout" is toegevoegd om problemen met de lay-out van het stapelframe te helpen diagnosticeren.
- Een nieuw attribuut __attribute__((target_version("cpu_features"))) toegevoegd en de functionaliteit van het attribuut __attribute__((target_clones("cpu_features1","cpu_features2",...))) uitgebreid om specifieke versies van functies van AArch64 te selecteren CPU's.
- Diagnostische hulpmiddelen uitgebreid:
- Waarschuwing "-Wsingle-bit-bitfield-constant-conversion" toegevoegd om impliciete afkapping te detecteren bij het toewijzen van één aan een bitveld met enkel bits teken.
- De diagnostiek van niet-geïnitialiseerde constexpr-variabelen is uitgebreid.
- Waarschuwingen "-Wcast-function-type-strict" en "-Wincompatibel-function-pointer-types-strict" toegevoegd om potentiële problemen met het casten van functietypen te identificeren.
- Diagnose toegevoegd voor het gebruik van onjuiste of gereserveerde modulenamen in exportblokken.
- Verbeterde detectie van ontbrekende 'auto'-zoekwoorden in definities.
- De implementatie van de waarschuwing "-Winteger-overflow" heeft controles toegevoegd voor extra situaties die tot overflows leiden.
- Ondersteuning geïmplementeerd voor de LoongArch-instructiesetarchitectuur (-march=loongarch64 of -march=la464), gebruikt in Loongson 3 5000-processors en implementatie van de nieuwe RISC ISA, vergelijkbaar met MIPS en RISC-V.
Belangrijkste innovaties in LLVM 16.0:
- LLVM-code mag elementen gebruiken die zijn gedefinieerd in de C++17-standaard.
- De omgevingseisen voor het bouwen van LLVM zijn verhoogd. De bouwtools zouden nu de C++17-standaard moeten ondersteunen, d.w.z. Om te bouwen heb je minimaal GCC 7.1, Clang 5.0, Apple Clang 10.0 of Visual Studio 2019 16.7 nodig.
- De backend voor de AArch64-architectuur voegt ondersteuning toe voor Cortex-A715, Cortex-X3 en Neoverse V2 CPU's, assembler voor RME MEC (Memory Encryption Contexts), Armv8.3-extensies (Complex Number) en Function Multi Versioning.
- In de backend voor de ARM-architectuur is de ondersteuning voor de Armv2-, Armv2A-, Armv3- en Armv3M-doelplatforms stopgezet, waarvoor het genereren van correcte code niet gegarandeerd was. De mogelijkheid toegevoegd om code te genereren voor instructies voor het werken met complexe getallen.
- De backend voor de X86-architectuur heeft ondersteuning toegevoegd voor instructiesetarchitecturen (ISA's) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Ondersteuning toegevoegd voor RDMSRLIST-, RMSRLIST- en WRMSRNS-instructies. Geïmplementeerde opties "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" en "-mcpu=grandridge".
- Officiële ondersteuning toegevoegd voor het LoongArch-platform.
- Verbeterde backends voor MIPS-, PowerPC- en RISC-V-architecturen
- Ondersteuning toegevoegd voor het debuggen van 64-bit uitvoerbare bestanden voor de LoongArch-architectuur aan de LLDB-foutopsporing. Verbeterde verwerking van COFF-foutopsporingssymbolen. Biedt filtering van dubbele DLL's in de lijst met geladen Windows-modules.
- In de Libc++-bibliotheek was het belangrijkste werk gericht op het implementeren van ondersteuning voor nieuwe functies van de C++20- en C++23-standaarden.
- De LDD-linker vermindert de koppelingstijd aanzienlijk door het parallelliseren van adresverplaatsingsscans en sectie-initialisatiebewerkingen. Ondersteuning toegevoegd voor sectiecompressie met behulp van het ZSTD-algoritme.
Bron: opennet.ru