Izdaja zbirke prevajalnikov LLVM 16.0

Po šestih mesecih razvoja je bila predstavljena izdaja projekta LLVM 16.0 - kompleta orodij, združljivega z GCC (prevajalniki, optimizatorji in generatorji kode), ki prevaja programe v vmesno bitno kodo virtualnih ukazov, podobnih RISC (virtualni stroj nizke ravni z večnivojski optimizacijski sistem). Ustvarjeno psevdokodo je mogoče pretvoriti s pomočjo prevajalnika JIT v strojna navodila neposredno v času izvajanja programa.

Glavne izboljšave v Clang 16.0:

  • Privzeti standard C++/ObjC++ je gnu++17 (prej gnu++14), kar pomeni, da so funkcije C++17 z razširitvami GNU privzeto podprte. Če želite vrniti prejšnje vedenje, lahko uporabite možnost "-std=gnu++14".
  • Implementirane napredne funkcije, povezane s standardom C++20:
    • Pogojno trivialne posebne članske funkcije,
    • zajemanje strukturiranih vezav v lambda funkcijah,
    • Operator enakosti znotraj izrazov,
    • Možnost izpustitve ključne besede typename v nekaterih kontekstih,
    • Veljavna inicializacija agregata v oklepajih (»Aggr(val1, val2)«).
  • Izvedene so bile funkcije, opredeljene v prihodnjem standardu C++2b:
    • Na koncu sestavljenih izrazov je dovoljeno postaviti oznake,
    • statični operator(),
    • statični operator[],
    • Združljivost s tipom char8_t je zagotovljena,
    • Obseg znakov, dovoljenih za uporabo v "\N{...}", je bil razširjen
    • Dodana možnost uporabe spremenljivk, deklariranih kot "static constexpr", v funkcijah, deklariranih kot constexpr.
  • Funkcije, opredeljene v prihodnjem C-standardu C2x, so bile implementirane:
    • Če želite onemogočiti opozorilo »-Wunused-label«, lahko atribut »[[maybe_unused]]« uporabite za oznake
    • Dovoljeno je postaviti oznake kamor koli znotraj sestavljenih izrazov,
    • Dodana operatorja typeof in typeof_unqual,
    • Nov tip nullptr_t in konstanta nullptr za definiranje ničelnih kazalcev, ki se lahko pretvorijo v kateri koli tip kazalca in predstavljajo različico NULL, ki ni vezana na tipa integer in void*.
    • V načinu C2x je dovoljen klic makra va_start s spremenljivim številom argumentov (variadic).
  • V načinih skladnosti C99, C11 in C17 privzeti možnosti "-Wimplicit-function-declaration" in "-Wimplicit-int" zdaj namesto opozorila povzročita napako.
  • Posredna uporaba "void *" (npr. "void func(void *p) { *p; }") v načinu C++ zdaj ustvari napako, podobno kot pri ISO C++, GCC, ICC in MSVC.
  • Določanje bitnih polj kot operandov navodil (npr. "__asm ​​​​{ mov eax, s.bf }") v vgrajenih sestavnih blokih v Microsoftovem slogu zdaj ustvari napako.
  • Dodana diagnostika za prisotnost različnih struktur in zvez z enakimi imeni v različnih modulih.
  • Zmogljivosti, povezane s podporo za OpenCL in OpenMP, so bile razširjene. Izboljšana diagnostika za predloge C++, ki se uporabljajo v argumentih jedra OpenCL. Izboljšana podpora za blok čakalne vrste za AMDGPU. Atribut nounwind je implicitno dodan vsem funkcijam. Izboljšana podpora za vgrajene funkcije.
  • Dodana možnost uporabe spremenljivke okolja CLANG_CRASH_DIAGNOSTICS_DIR za definiranje imenika, v katerem so shranjeni diagnostični podatki o zrušitvah.
  • Podpora za Unicode je bila posodobljena na specifikacijo Unicode 15.0. V identifikatorjih so dovoljeni nekateri matematični simboli, kot je "₊" (npr. "double xₖ₊₁").
  • Dodana podpora za nalaganje več konfiguracijskih datotek (najprej se naložijo privzete konfiguracijske datoteke, nato pa tiste, ki so določene prek zastavice “--config=”, ki jih je zdaj mogoče večkrat določiti). Spremenjen je privzeti vrstni red nalaganja konfiguracijskih datotek: clang najprej poskuša naložiti datoteko - .cfg, in če je ne najde, poskuša naložiti dve datoteki .cfg in .cfg. Za privzeto onemogočanje nalaganja konfiguracijskih datotek je bila dodana zastavica »--no-default-config«.
  • Da bi zagotovili ponovljive gradnje, je možno zamenjati trenutne vrednosti datuma in časa v makrih __DATE__, __TIME__ in __TIMESTAMP__ s časom, določenim v spremenljivki okolja SOURCE_DATE_EPOCH.
  • Za preverjanje prisotnosti vgrajenih funkcij (builtin), ki jih je mogoče uporabiti v kontekstu konstant, je bil dodan makro “__has_constexpr_builtin”.
  • Dodana je nova zastavica prevajanja "-fcoro-aligned-allocation" za poravnano dodelitev okvirja sorutine.
  • Zastavica “-fstrict-flex-arrays=” implementira podporo za tretjo stopnjo preverjanja elementov prilagodljivega niza v strukturah (Flexible Array Members, niz nedoločene velikosti na koncu strukture). Na tretji ravni se samo velikost "[]" (na primer "int b[]") obravnava kot prilagodljiv niz, velikost "[0]" (na primer "int b[0]") ni.
  • Dodana zastavica "-fmodule-output" za omogočanje enofaznega modela prevajanja za standardne module C++.
  • Dodan način »-Rpass-analysis=stack-frame-layout« za pomoč pri diagnosticiranju težav s postavitvijo okvirja sklada.
  • Dodan nov atribut __attribute__((target_version("cpu_features")))) in razširjena funkcionalnost atributa __attribute__((target_clones("cpu_features1","cpu_features2",...))) za izbiro določenih različic funkcij, ki jih ponuja AArch64 procesorji.
  • Razširjena diagnostična orodja:
    • Dodano opozorilo »-Wsingle-bit-bitfield-constant-conversion« za zaznavanje implicitnega obrezovanja pri dodeljevanju enobitnemu bitnemu polju z enobitnim predznakom.
    • Diagnostika neinicializiranih spremenljivk constexpr je bila razširjena.
    • Dodana opozorila »-Wcast-function-type-strict« in »-Wincompatible-function-pointer-types-strict« za prepoznavanje morebitnih težav s pretvorbo tipov funkcij.
    • Dodana diagnostika za uporabo nepravilnih ali rezerviranih imen modulov v izvoznih blokih.
    • Izboljšano zaznavanje manjkajočih "samodejnih" ključnih besed v definicijah.
    • Izvedba opozorila »-Winteger-overflow« je dodala preverjanja za dodatne situacije, ki vodijo do prelivanja.
  • Implementirana podpora za arhitekturo nabora navodil LoongArch (-march=loongarch64 ali -march=la464), ki se uporablja v procesorjih Loongson 3 5000 in izvaja nov RISC ISA, podoben MIPS in RISC-V.

Ključne novosti v LLVM 16.0:

  • Koda LLVM lahko uporablja elemente, definirane v standardu C++17.
  • Okoljske zahteve za gradnjo LLVM so bile povečane. Orodja za gradnjo bi morala zdaj podpirati standard C++17, tj. Za izdelavo potrebujete vsaj GCC 7.1, Clang 5.0, Apple Clang 10.0 ali Visual Studio 2019 16.7.
  • Zaledje za arhitekturo AArch64 dodaja podporo za procesorje Cortex-A715, Cortex-X3 in Neoverse V2, asembler za RME MEC (konteksti šifriranja pomnilnika), razširitve Armv8.3 (kompleksno število) in več različic funkcij.
  • V ozadju za arhitekturo ARM je bila ukinjena podpora za ciljne platforme Armv2, Armv2A, Armv3 in Armv3M, za katere ni bilo zagotovljeno ustvarjanje pravilne kode. Dodana možnost generiranja kode za navodila za delo s kompleksnimi števili.
  • Zaledje za arhitekturo X86 ima dodano podporo za arhitekture nabora ukazov (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Dodana podpora za navodila RDMSRLIST, RMSRLIST in WRMSRNS. Implementirane možnosti "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeralddrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" in "-mcpu=grandridge".
  • Dodana uradna podpora za platformo LoongArch.
  • Izboljšana ozadja za arhitekture MIPS, PowerPC in RISC-V
  • Dodana podpora za razhroščevanje 64-bitnih izvršljivih datotek za arhitekturo LoongArch v razhroščevalnik LLDB. Izboljšano ravnanje s simboli za odpravljanje napak COFF. Zagotovljeno filtriranje podvojenih DLL-jev na seznamu naloženih modulov Windows.
  • V knjižnici Libc++ je bilo glavno delo osredotočeno na implementacijo podpore za nove funkcije standardov C++20 in C++23.
  • LDD povezovalnik bistveno skrajša čas povezovanja z vzporednim skeniranjem premestitve naslova in operacijami inicializacije odsekov. Dodana podpora za stiskanje odsekov z uporabo algoritma ZSTD.

Vir: opennet.ru

Dodaj komentar