Vrystelling van die LLVM 11.0-samestellersuite

Na ses maande van ontwikkeling aangebied projek vrystelling LLVM 11.0 — GCC-versoenbare gereedskap (samestellers, optimaliseerders en kode-opwekkers), wat programme saamstel in intermediêre bitkode van RISC-agtige virtuele instruksies (laevlak virtuele masjien met 'n multi-vlak optimeringstelsel). Die gegenereerde pseudokode kan direk met behulp van 'n JIT-samesteller in masjieninstruksies omgeskakel word ten tyde van die uitvoering van die program.

Die belangrikste verandering in die nuwe weergawe was die insluiting van Flank, frontend vir die Fortran-taal. Flang ondersteun Fortran 2018, OpenMP 4.5 en OpenACC 3.0, maar die ontwikkeling van die projek is nog nie voltooi nie en die voorkant is beperk tot kode-ontleding en kontrolering vir korrektheid. Generering van LLVM-tussenkode word nog nie ondersteun nie en om uitvoerbare lêers te genereer, word kanonieke kode gegenereer en na 'n eksterne Fortran-samesteller oorgedra.

Verbeterings in Clang 11.0:

  • Bygevoeg die vermoë om die abstrakte sintaksboom te herstel (AST) vir gebroke C++-kode, wat gebruik kan word om foute te help diagnoseer en bykomende inligting aan eksterne nutsprogramme soos clang-tidy en clangd verskaf. Die kenmerk is by verstek geaktiveer vir C++-kode en word beheer deur die "-Xclang -f[no-]recovery-ast" opsies.
  • Bygevoeg nuwe diagnostiese modusse:
    • "-Wpointer-to-int-cast" is 'n groep waarskuwings oor die uitsaai van wysers na 'n heelgetaltipe int wat nie alle moontlike waardes akkommodeer nie.
    • "-Wuninitialized-const-reference" - waarskuwing oor die deurstuur van ongeinitialiseerde veranderlikes in funksieparameters wat verwysingsargumente met die "const"-kenmerk aanvaar.
    • "-Wimplicit-const-int-float-conversion" - geaktiveer by verstek waarskuwing oor implisiete omskakeling van 'n reële konstante na 'n heelgetal tipe.
  • Vir die ARM-platform word C-funksies wat in die samesteller ingebou is, verskaf (Intrinsieke), vervang deur doeltreffende vektorinstruksies Arm v8.1-M MVE en CDE. Die beskikbare funksies word gedefinieer in die koplêers arm_mve.h en arm_cde.h.
  • Bygevoeg 'n stel uitgebreide heelgetaltipes _ExtInt(N), wat jou toelaat om tipes te skep wat nie veelvoude van magte van twee is nie, wat doeltreffend op FPGA/HLS verwerk kan word. Byvoorbeeld, _ExtInt(7) definieer 'n heelgetaltipe wat uit 7 bisse bestaan.
  • Bygevoeg makro's wat ondersteuning definieer vir ingeboude C-funksies gebaseer op ARM SVE (Scalable Vector Extension) instruksies:
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Byvoorbeeld, die __ARM_FEATURE_SVE-makro word gedefinieer wanneer AArch64-kode gegenereer word deur die opdragreëlopsie "-march=armv8-a+sve" te stel.

  • Die "-O" vlag word nou geïdentifiseer met die "-O1" optimeringsmodus in plaas van "-O2".
  • Bygevoeg nuwe samesteller vlae:
    • "-fstack-clash-protection" - maak beskerming teen moontlik kruisings van stapel en hoop.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - laat jou toe om die uitsonderingshanteerdermodus vir swaaipuntgetalle te kies.
    • "-ffp-model={presis,strict,fast}" - Vereenvoudig toegang tot 'n reeks gespesialiseerde opsies vir swaaipuntgetalle.
    • "-fpch-codegen" en "-fpch-debuginfo" om 'n vooraf saamgestelde kop (PCH) te genereer met aparte objeklêers vir kode en debuginfo.
    • "-fsanitize-coverage-allowlist" en "-fsanitize-coverage-blocklist" vir die nagaan van dekking wat wit en swart lyste toets.
    • “-mtls-size={12,24,32,48}” om die TLS (draad-plaaslike berging) grootte te kies.
    • "-menable-experimental-extension" om eksperimentele RISC-V-uitbreidings moontlik te maak.
  • Die verstekmodus vir C is "-fno-common", wat meer doeltreffende toegang tot globale veranderlikes op sommige platforms moontlik maak.
  • Die verstek module kas is geskuif van /tmp na die ~/.cache gids. Om te ignoreer, kan jy die “-fmodules-cache-path=” vlag gebruik.
  • Die standaard C-taalstandaard is opgedateer van gnu11 na gnu17.
  • Bygevoeg voorlopige ondersteuning vir GNU C uitbreiding "asm inlyn» om samesteller-insetsels by te voeg. Die uitbreiding word nog ontleed, maar op geen manier verwerk nie.
  • Die vermoëns wat met OpenCL- en CUDA-ondersteuning geassosieer word, is uitgebrei. Bygevoeg ondersteuning vir OpenCL 2.0 blok diagnostiek en geïmplementeer nuwe OpenMP 5.0 kenmerke.
  • Bygevoeg IndentExternBlock-opsie om klang-formaat nut vir belyning binne eksterne "C" en eksterne "C++" blokke.
  • Die statiese ontleder het verbeterde hantering van oorgeërfde konstruktors in C++. Bygevoeg nuwe tjeks alpha.core.C11Lock en alpha.fuchsia.Lock om na te gaan vir slotte, alpha.security.cert.pos.34c om onveilige gebruik van putenv, webkit.NoUncountedMemberChecker en webkit.RefCntblBaseVirtualDtor op te spoor om probleme met alfa ontelbare tipes op te spoor .cplusplus .SmartPtr om te kyk vir nul slimwyserverwysing.
  • In linter klang-netjies bygevoeg 'n groot gedeelte van nuwe tjeks.
  • Die clangd-kasbediener (Clang Server) het werkverrigting verbeter en nuwe diagnostiese vermoëns bygevoeg.

Die belangrikste innovasies LLVM 11.0:

  • Die boustelsel is oorgeskakel na die gebruik van Python 3. As Python 3 nie beskikbaar is nie, is dit moontlik om terug te keer na die gebruik van Python 2.
  • Die voorkant met die samesteller vir die Go-taal (llgo) is uitgesluit van die vrystelling, wat in die toekoms herstruktureer kan word.
  • Die vektor-funksie-abi-variant-kenmerk is by die intermediêre voorstelling (IR) gevoeg om die kartering tussen skalêre en vektorfunksies te beskryf om oproepe te vektoriseer. Van llvm::VectorType is daar twee afsonderlike vektortipes llvm::FixedVectorType en llvm::ScalableVectorType.
  • Vertakking gebaseer op udef-waardes en die oordrag van undef-waardes na standaard biblioteekfunksies word as ongedefinieerde gedrag erken. IN
    memset/memcpy/memmove laat verbygaan van undef-wysers, maar as die parameter met grootte nul is.

  • LLJIT het ondersteuning bygevoeg vir die uitvoering van statiese inisialisering deur die LLJIT::initialize- en LLJIT::deinitialize-metodes. Die vermoë om statiese biblioteke by JITDylib by te voeg deur die StaticLibraryDefinitionGenerator-klas te gebruik, is geïmplementeer. Bygevoeg C API vir ORCv2 (API vir die bou van JIT-samestellers).
  • Ondersteuning vir Cortex-A64-, Cortex-A34-, Cortex-A77- en Cortex-X78-verwerkers is by die agterkant van die AArch1-argitektuur gevoeg. ARMv8.2-BF16 (BFloat16) en ARMv8.6-A-uitbreidings geïmplementeer, insluitend RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) en ARMv8.0-DGH (Wenk vir data-insameling). Die vermoë om kode te genereer vir ingeboude funksies-bindings aan SVE vektorinstruksies word verskaf.
  • Ondersteuning vir Cortex-M55, Cortex-A77, Cortex-A78 en Cortex-X1 verwerkers is by die agterkant vir die ARM-argitektuur gevoeg. Uitbreidings geïmplementeer
    Armv8.6-A Matrix Multiply en RMv8.2-AA32BF16 BFloat16.

  • Ondersteuning vir kodegenerering vir POWER10-verwerkers is by die agterkant van die PowerPC-argitektuur gevoeg. Lusoptimalisasies is uitgebrei en swaaipuntondersteuning is verbeter.
  • Die agterkant vir die RISC-V-argitektuur laat die aanvaarding toe van pleisters wat eksperimentele uitgebreide instruksiestelle ondersteun wat nog nie amptelik goedgekeur is nie.
  • Die agterkant vir die AVR-argitektuur is oorgedra van die eksperimentele kategorie na stabiel, ingesluit in die basiese verspreiding.
  • Die agterkant vir x86-argitektuur ondersteun Intel AMX- en TSXLDTRK-instruksies. Bygevoeg beskerming teen aanvalle LVI (Load Value Injection), en implementeer ook 'n algemene spekulatiewe uitvoering newe-effek onderdrukking meganisme om aanvalle wat veroorsaak word deur spekulatiewe uitvoering van bedrywighede op die SVE te blokkeer.
  • In die agterkant vir die SystemZ-argitektuur is ondersteuning vir MemorySanitizer en LeakSanitizer bygevoeg.
  • Bygevoeg ondersteuning vir koplêer met wiskundige konstantes by Libc++ .
  • Uitgebreid LLD skakelaar vermoëns. Verbeterde ondersteuning vir die ELF-formaat, insluitend die bygevoegde opsies "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- enkelmodule", "-uniek", "-rosegment", "-drade=N". Bygevoeg "--time-trace" opsie om die spoor na 'n lêer te stoor, wat dan geanaliseer kan word via die chrome://tracing-koppelvlak in Chrome.

Bron: opennet.ru

Voeg 'n opmerking