Vrijgave van de LLVM 16.0-compilersuite

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

Voeg een reactie