LLVM 16.0 konpiladore-multzoaren kaleratzea

Sei hilabeteko garapenaren ondoren, LLVM 16.0 proiektuaren oharra aurkezten da: GCC-rekin bateragarria den tresna-kit bat (konpilatzaileak, optimizatzaileak eta kode-sorgailuak) programak RISC moduko instrukzio birtualen bitarteko bitkode batean konpilatzen dituena (maila baxuko makina birtuala duena). maila anitzeko optimizazio sistema). Sortutako sasi-kodea JIT konpilatzaileak makinaren instrukzioetan bihur dezake programa exekutatzen den unean bertan.

Hobekuntza nagusiak Clang 16.0-n:

  • C++/ObjC++ estandar lehenetsia gnu++17 gisa ezarrita dago (lehen gnu++14), eta horrek C++17 funtzioetarako onartzen du lehenespenez GNU luzapenekin. "-std=gnu++14" aukera erabil dezakezu aurreko portaera itzultzeko.
  • C++20 estandarrari lotutako funtzio aurreratuak inplementatu dira:
    • Kideen funtzio berezi baldintza hutsalak,
    • lambda funtzioetan lotura egituratuak harrapatzea,
    • Adierazpen barruko berdintasun-operatzailea,
    • Testuinguru batzuetan typename gako-hitza ez zehazteko gaitasuna,
    • Parentesi artean agregatuaren hasierako baimena ("Aggr(val1, val2)").
  • Etorkizuneko C++2b estandarrean definitutako ezaugarriak inplementatuak:
    • Adierazpen konposatuen amaieran etiketak onartzen dira,
    • operadore estatikoa(),
    • operadore estatikoa[],
    • Char8_t motarekin bateragarritasuna ematen du,
    • "\N{...}"-n erabiltzeko baimendutako karaktere sorta zabaldu da,
    • "Constexpr estatikoa" gisa deklaratutako aldagaiak erabiltzeko gaitasuna gehitu da constexpr gisa deklaratutako funtzioetan.
  • Etorkizuneko C2x C estandarrean definitutako ezaugarriak:
    • "-Wunused-label" abisua desgaitzeko, "[[agian_unused]]" atributua aplika dakioke etiketei
    • Etiketak edozein lekutan jar daitezke adierazpen konposatuen barruan,
    • Typeof eta typeof_unqual operadoreak gehitu dira,
    • Nullptr_t mota berri bat eta nullptr konstante bat edozein erakusle motatara bihur daitezkeen erakusle nuluak definitzeko eta integral mota eta void*-ekin lotuta ez dagoen NULL-ren aldaera bat irudikatzeko.
    • C2x moduan, va_start makroari argumentu-kopuru aldakorreko (variadic) deitzea onartzen da.
  • C99, C11 eta C17 adostasun-moduetan, "-Wimplicit-function-declaration" eta "-Wimplicit-int" aukerek orain errore bat sortzen dute abisu baten ordez lehenespenez.
  • C++ moduan "void *" (adibidez, "void func(void *p) { *p; }") zeharkako erabilerak errore bat sortzen du orain, ISO C++, GCC, ICC eta MSVC-ren antzekoa.
  • Bit-eremuak instrukzio-eragile gisa zehazteak (adibidez, "__asm ​​​​{ mov eax, s.bf }") Microsoft-en estiloko lerroko muntaketa-blokeetan orain errore bat sortzen du.
  • Modulu ezberdinetan izen berdinak dituzten egitura eta batasun desberdinak egotearen diagnostikoak gehitu dira.
  • OpenCL eta OpenMP-ren laguntzarekin lotutako gaitasun hedatuak. OpenCL nukleoaren argumentuetan erabilitako C++ txantiloien diagnostiko hobetua. AMDGPUren ilaran blokeatzeko laguntza hobetua. Nounwind atributua inplizituki gehitzen da funtzio guztietan. Funtzio integratuetarako laguntza hobetua.
  • CLANG_CRASH_DIAGNOSTICS_DIR ingurune-aldagaia erabiltzeko gaitasuna eman du hutsegiteen diagnostiko-datuak gordetzen diren direktorioa definitzeko.
  • Unicode laguntza Unicode 15.0 zehaztapenera eguneratu da. Zenbait ikur matematiko onartzen dira identifikatzaileetan, hala nola "β‚Š" (adibidez, "xβ‚–β‚Šβ‚ bikoitza").
  • Hainbat konfigurazio-fitxategiak kargatzeko laguntza gehitu da (lehenengo konfigurazio-fitxategiak kargatzen dira, eta gero "--config=" banderaren bidez zehaztutakoak, orain hainbat aldiz zehaztu daitezkeenak). Lehenetsitako konfigurazio fitxategia kargatzeko ordena aldatu da: clang-ek fitxategia lehenik kargatzen saiatzen da - .cfg eta aurkitzen ez bada bi fitxategi kargatzen saiatzen da .cfg eta .cfg. "--no-default-config" marka gehitu da konfigurazio fitxategiak kargatzea lehenespenez desgaitzeko.
  • Eraikuntza errepikagarriak ziurtatzeko, __DATE__, __TIME__ eta __TIMESTAMP__ makroetako uneko data eta orduaren balioak SOURCE_DATE_EPOCH ingurune-aldagaian zehaztutako orduarekin ordezkatu daitezke.
  • Konstanteen testuinguruan erabil daitezkeen funtzio integratuak (builtin) egiaztatzeko, "__has_constexpr_builtin" makroa gehitu da.
  • "-fcoro-aligned-allocation" konpilazio marka berria gehitu da koroutine-markoen banaketa lerrokaturako.
  • "-fstrict-flex-arrays=" banderak egituretako array-elementu malgu bat egiaztatzeko hirugarren mailarako laguntza ezartzen du (Flexible Array Members, egituraren amaieran tamaina mugagabeko array bat). Hirugarren mailan, "[]" tamaina soilik (adibidez, "int b[]") matrize malgu gisa tratatzen da, baina "[0]" tamaina (adibidez, "int b[0]"). ez da.
  • "-fmodule-output" bandera gehitu da fase bakarreko konpilazio eredua C++ modulu estandarretan gaitzeko.
  • "-Rpass-analysis=stack-frame-diseinua" modua gehitu da, eta horri esker, pila markoen diseinuarekin arazoak diagnostikatzen dira.
  • Atributu berri bat __attribute__((target_version("cpu_features")))) gehitu da eta __attribute__((target_clones("cpu_features1β€³,"cpu_features2",…))))) zabaldu da emandako ezaugarrien bertsio zehatzak hautatzeko. CPU AArch64-ren eskutik.
  • Diagnostiko tresna hobetuak:
    • "-Wsingle-bit-bitfield-constant-conversion" abisua gehitu da mozketa inplizitua detektatzeko bit bateko bit-eremu sinatutako bit-eremu bati bat esleitzeko.
    • Hasieratu gabeko constexpr aldagaien diagnostiko hedatua.
    • "-Wcast-function-type-strict" eta "-Wincompatible-function-pointer-types-strict" abisuak gehitu dira, funtzio motaren igorpenarekin balizko arazoak detektatzeko.
    • Esportazio-blokeetan modulu-izen okerrak edo erreserbatuak erabiltzeko diagnostikoak gehitu dira.
    • Definizioetan falta diren "auto" gako-hitzak hautematea hobetu da.
    • "-Winteger-overflow" abisuaren ezarpenari gainezkatze-egoera gehigarrien egiaztapenak gehitu zaizkio.
  • LoongArch instrukzio-multzoaren arkitekturarako (-march=loongarch64 edo -march=la464) euskarria inplementatu da Loongson 3 5000 prozesadoreetan, MIPS eta RISC-V-ren antzeko RISC ISA berri bat inplementatzen duena.

LLVM 16.0-ko berrikuntza nagusiak:

  • LLVM kodean, C++17 estandarrean definitutako elementuak erabiltzea onartzen da.
  • LLVM eraikitzeko ingurumen-eskakizunak areagotzea. Eraikitze-tresnak orain C++17 estandarra onartu beharko luke, hau da. eraikitzeko GCC 7.1, Clang 5.0, Apple Clang 10.0 edo Visual Studio 2019 16.7 behar ditu gutxienez.
  • Cortex-A64, Cortex-X715 eta Neoverse V3 CPU, RME MEC (Memory Encryption Contexts) muntatzailea, Armv2 luzapenak (zenbaki konplexua) eta Function Multi Versioning gehitu dira AArch8.3 backend-era.
  • ARM arkitektura backend-ak jada ez ditu Armv2, Armv2A, Armv3 eta Armv3M xede-plataformak onartzen, kode zuzena sortzea ez zen bermatuta. Zenbaki konplexuekin lan egiteko argibideetarako kodea sortzeko gaitasuna gehitu da.
  • Instrukzio multzoen arkitekturak (ISA) AMX-FP86, CMPCXADD, AVX-IFMA, AVX-VNNI-INT16, AVX-NE-CONVERT X8 backend-en laguntza gehitu da. RDMSRLIST, RMSRLIST eta WRMSRNS argibideetarako laguntza gehitu da. "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" eta "-mcpu=grandridge" aukerak ezarri dira.
  • LoongArch plataformarako laguntza ofiziala gehitu da.
  • MIPS, PowerPC eta RISC-V arkitekturetarako backend hobetuak
  • LoongArch arkitekturarako 64 biteko exekutagarriak arazketarako laguntza gehitu da LLDB arazteari. COFF arazketa-sinboloen kudeaketa hobetu da. Kargatutako Windows moduluen zerrendan DLL bikoiztuen iragazketa eman da.
  • Libc++ liburutegian, lan nagusia C++20 eta C++23 estandarren ezaugarri berrietarako euskarria ezartzera bideratu zen.
  • Lotura-denbora nabarmen murriztu da LDD estekatzailean helbideak lekualdatzeko eskaneatze eta atalaren hasierako eragiketak paralelizatuz. Sekzioen konpresioaren laguntza gehitu da ZSTD algoritmoa erabiliz.

Iturria: opennet.ru

Gehitu iruzkin berria