Utgivelse av LLVM 16.0-kompilatorpakken

Etter seks måneders utvikling ble utgivelsen av LLVM 16.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.

Store forbedringer i Clang 16.0:

  • Standard C++/ObjC++-standard er gnu++17 (tidligere gnu++14), som betyr at C++17-funksjoner med GNU-utvidelser støttes som standard. For å returnere den forrige oppførselen, kan du bruke alternativet "-std=gnu++14".
  • Implementerte avanserte funksjoner relatert til C++20-standarden:
    • Betinget trivielle spesialmedlemsfunksjoner,
    • fange opp strukturerte bindinger i lambdafunksjoner,
    • Likhetsoperatør i uttrykk,
    • Mulighet for å utelate nøkkelordet typename i noen sammenhenger,
    • Gyldig samlet initialisering i parentes ("Aggr(val1, val2)").
  • Funksjoner definert i den fremtidige C++2b-standarden er implementert:
    • Det er tillatt å plassere etiketter på slutten av sammensatte uttrykk,
    • statisk operator(),
    • statisk operator[],
    • Kompatibilitet med char8_t-typen er sikret,
    • Utvalget av tegn som er tillatt for bruk i "\N{...}" er utvidet
    • Lagt til muligheten til å bruke variabler deklarert som "statisk constexpr" i funksjoner deklarert som constexpr.
  • Funksjonene definert i den fremtidige C-standarden C2x er implementert:
    • For å deaktivere "-Wunused-label"-advarselen, tillates "[[kanskje_ubrukt]]"-attributtet brukt på etiketter
    • Det er tillatt å plassere etiketter hvor som helst innenfor sammensatte uttrykk,
    • Lagt til type- og type_unqual-operatorer,
    • En ny type nullptr_t og en nullptr-konstant for å definere null-pekere som kan konvertere til en hvilken som helst pekertype og representerer en variant av NULL som ikke er bundet til heltalls- og void*-typer.
    • I C2x-modus er det tillatt å kalle va_start-makroen med et variabelt antall argumenter (variadisk).
  • I C99-, C11- og C17-samsvarsmoduser produserer standardalternativene "-Wimplicit-function-declaration" og "-Wimplicit-int" nå en feil i stedet for en advarsel.
  • Indirekte bruk av "void *" (f.eks. "void func(void *p) { *p; }") i C++-modus genererer nå en feil som ligner på ISO C++, GCC, ICC og MSVC.
  • Å spesifisere bitfelt som instruksjonsoperander (f.eks. "__asm{ mov eax, s.bf }") i Microsoft-stil inline assembly-blokker genererer nå en feil.
  • Lagt til diagnostikk for tilstedeværelsen av forskjellige strukturer og fagforeninger med samme navn i forskjellige moduler.
  • Mulighetene knyttet til OpenCL- og OpenMP-støtte er utvidet. Forbedret diagnostikk for C++-maler brukt i OpenCL-kjerneargumenter. Forbedret køblokkstøtte for AMDGPU. Substantivvind-attributtet er implisitt lagt til alle funksjoner. Forbedret støtte for innebygde funksjoner.
  • Lagt til muligheten til å bruke miljøvariabelen CLANG_CRASH_DIAGNOSTICS_DIR for å definere katalogen der krasjdiagnosedata lagres.
  • Unicode-støtte er oppdatert til Unicode 15.0-spesifikasjonen. Noen matematiske symboler er tillatt i identifikatorer, for eksempel "₊" (f.eks. "dobbel xₖ₊₁").
  • Lagt til støtte for lasting av flere konfigurasjonsfiler (standard konfigurasjonsfiler lastes først, og deretter de som er spesifisert via "--config="-flagget, som nå kan spesifiseres flere ganger). Endret standard innlastingsrekkefølge for konfigurasjonsfiler: clang prøver å laste filen først - .cfg, og hvis den ikke blir funnet, prøver den å laste to filer .cfg og .cfg. For å deaktivere lasting av konfigurasjonsfiler som standard, er flagget "--no-default-config" lagt til.
  • For å sikre repeterbare bygg, er det mulig å erstatte gjeldende dato- og klokkeslettverdier i makroene __DATE__, __TIME__ og __TIMESTAMP__ med tiden spesifisert i SOURCE_DATE_EPOCH-miljøvariabelen.
  • For å sjekke tilstedeværelsen av innebygde funksjoner (builtin) som kan brukes i sammenheng med konstanter, er makroen "__has_constexpr_builtin" lagt til.
  • Lagt til nytt kompileringsflagg "-fcoro-aligned-allocation" for justert coroutine-rammetildeling.
  • "-fstrict-flex-arrays="-flagget implementerer støtte for det tredje nivået for å sjekke for fleksible array-elementer i strukturer (Flexible Array Members, en array av ubestemt størrelse på slutten av strukturen). På det tredje nivået behandles bare størrelsen "[]" (for eksempel "int b[]") som en fleksibel matrise, men størrelsen "[0]" (for eksempel "int b[0]") er ikke.
  • Lagt til "-fmodule-output"-flagg for å aktivere enfase kompileringsmodell for standard C++-moduler.
  • Lagt til "-Rpass-analysis=stack-frame-layout"-modus for å hjelpe til med å diagnostisere problemer med stackrammelayout.
  • Lagt til et nytt attributt __attribute__((target_version("cpu_features"))) og utvidet funksjonaliteten til attributtet __attribute__((target_clones("cpu_features1","cpu_features2",...))) for å velge spesifikke versjoner av funksjoner levert av AArch64 CPUer.
  • Diagnoseverktøy utvidet:
    • Lagt til advarsel "-Wsingle-bit-bitfield-constant-conversion" for å oppdage implisitt trunkering når en tilordnes til et enkeltbits signert bitfelt.
    • Diagnostikken av uinitialiserte constexpr-variabler er utvidet.
    • Lagt til "-Wcast-function-type-strict" og "-Wincompatible-function-pointer-types-strict" advarsler for å identifisere potensielle problemer med funksjonstype casting.
    • Lagt til diagnostikk for bruk av feil eller reserverte modulnavn i eksportblokker.
    • Forbedret gjenkjenning av manglende "auto" søkeord i definisjoner.
    • Implementeringen av "-Winteger-overflow"-advarselen har lagt til kontroller for ytterligere situasjoner som fører til overløp.
  • Støtte for LoongArch-instruksjonssettarkitekturen (-march=loongarch64 eller -march=la464), brukt i Loongson 3 5000-prosessorer og implementering av den nye RISC ISA, lik MIPS og RISC-V, har blitt implementert.

Nøkkelinnovasjoner i LLVM 16.0:

  • LLVM-kode er tillatt å bruke elementer definert i C++17-standarden.
  • Miljøkravene for bygg LLVM er økt. Byggeverktøyene skal nå støtte C++17-standarden, dvs. For å bygge trenger du minst GCC 7.1, Clang 5.0, Apple Clang 10.0 eller Visual Studio 2019 16.7.
  • Bakenden for AArch64-arkitekturen legger til støtte for Cortex-A715, Cortex-X3 og Neoverse V2 CPUer, assembler for RME MEC (Memory Encryption Contexts), Armv8.3-utvidelser (Complex Number) og Function Multi Versioning.
  • I backend for ARM-arkitekturen har støtte for målplattformene Armv2, Armv2A, Armv3 og Armv3M blitt avviklet, som generering av riktig kode ikke var garantert for. Lagt til muligheten til å generere kode for instruksjoner for arbeid med komplekse tall.
  • Backend for X86-arkitekturen har lagt til støtte for instruksjonssettarkitekturer (ISAer) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Lagt til støtte for RDMSRLIST, RMSRLIST og WRMSRNS instruksjoner. Implementerte alternativer "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" og "-mcpu=grandridge".
  • Lagt til offisiell støtte for LoongArch-plattformen.
  • Forbedrede backends for MIPS-, PowerPC- og RISC-V-arkitekturer
  • Lagt til støtte for feilsøking av 64-biters kjørbare filer for LoongArch-arkitekturen til LLDB-feilsøkeren. Forbedret håndtering av COFF-feilsøkingssymboler. Gir filtrering av dupliserte DLL-er i listen over innlastede Windows-moduler.
  • I Libc++-biblioteket var hovedarbeidet fokusert på å implementere støtte for nye funksjoner i C++20- og C++23-standardene.
  • LDD-linkeren reduserer koblingstiden betydelig ved å parallellisere adresseflyttingsskanning og seksjonsinitialiseringsoperasjoner. Lagt til støtte for seksjonskomprimering ved hjelp av ZSTD-algoritmen.

Kilde: opennet.ru

Legg til en kommentar