Release av LLVM 11.0-kompilatorpaketet

Efter sex månaders utveckling presenteras projekt release LLVM 11.0 - GCC-kompatibla verktyg (kompilatorer, optimerare och kodgeneratorer) som kompilerar program till en mellanbitkod av RISC-liknande virtuella instruktioner (en virtuell dator på låg nivå med ett optimeringssystem på flera nivåer). Den genererade pseudokoden kan konverteras av JIT-kompilatorn till maskininstruktioner precis vid tidpunkten för programexekveringen.

Den viktigaste förändringen i den nya utgåvan var inkluderingen av Fläns, en frontend för Fortran-språket. Flang stöder Fortran 2018, OpenMP 4.5 och OpenACC 3.0, men utvecklingen av projektet har inte slutförts ännu och gränssnittet är begränsat till att analysera koden och kontrollera att den är korrekt. LLVM mellankodsgenerering stöds ännu inte, och för att generera körbara filer genereras kanonisk kod och skickas till en extern Fortran-kompilator.

Förbättringar i Clang 11.0:

  • Lade till möjligheten att återställa det abstrakta syntaxträdet (AST) för felaktig C++-kod, som kan användas för att diagnostisera fel och ger ytterligare information för externa verktyg som clang-tidy och clangd. Funktionen är aktiverad som standard för C++-kod och styrs via alternativen "-Xclang -f[no-]recovery-ast".
  • Lade till nya diagnostiska lägen:
    • "-Wpointer-to-int-cast" är en grupp varningar om att kasta pekare till en heltalstyp som inte innehåller alla möjliga värden.
    • "-Wuninitialized-const-reference" - en varning om att skicka oinitierade variabler i funktionsparametrar som accepterar referensargument med "const"-attributet.
    • "-Wimplicit-const-int-float-conversion" är en varning om att implicit konvertera en verklig konstant till en heltalstyp, aktiverad som standard.
  • För ARM-plattformen tillhandahålls C-funktioner inbyggda i kompilatorn (Inneboende) ersätts av de effektiva Arm v8.1-M MVE- och CDE-vektorinstruktionerna. De tillgängliga funktionerna definieras i rubrikfilerna arm_mve.h och arm_cde.h.
  • tillsatt en uppsättning utökade heltalstyper _ExtInt(N) som låter dig skapa typer som inte är en multipel av en potens av två, som effektivt kan bearbetas på FPGA / HLS. Till exempel, _ExtInt(7) definierar en heltalstyp som består av 7 bitar.
  • Lade till makron som definierar stöd för inbyggda C-funktioner baserat på ARM SVE (Scalable Vector Extension) instruktioner:
    __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. Till exempel definieras makrot __ARM_FEATURE_SVE när AArch64-koden genereras med kommandoradsalternativet "-march=armv8-a+sve".

  • "-O"-flaggan identifieras nu med "-O1"-optimeringsläget istället för "-O2".
  • Lade till nya kompilatorflaggor:
    • "-fstack-clash-protection" - möjliggör skydd mot stack och heap korsningar.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - låter dig välja undantagshanterarläge för flyttal.
    • "-ffp-model={precise,strict,fast}" förenklar åtkomsten till en rad specialiserade alternativ för flyttal.
    • "-fpch-codegen" och "-fpch-debuginfo" för att generera en förkompilerad header (PCH) med separata objektfiler för kod och debuginfo.
    • "-fsanitize-coverage-allowlist" och "-fsanitize-coverage-blocklist" för att kontrollera vitlista och svartlista täckningstestning.
    • "-mtls-size={12,24,32,48}" för att välja TLS-storlek (tråd-lokal lagring).
    • "-menable-experimental-extension" för att möjliggöra experimentella RISC-V-förlängningar.
  • Som standard använder C läget "-fno-common", vilket möjliggör effektivare åtkomst till globala variabler på vissa plattformar.
  • Flyttade standardmodulcache från /tmp till katalogen ~/.cache. Du kan använda flaggan "-fmodules-cache-path=" för att åsidosätta.
  • Standard C-standarden har uppdaterats från gnu11 till gnu17.
  • Lade till preliminärt stöd för GNU C-tillägget "asm linje» för att lägga till assembler-inlägg. Tillägget har bara analyserats än så länge, men bearbetas inte på något sätt.
  • Utökade möjligheter relaterade till stöd för OpenCL och CUDA. Lade till stöd för diagnostik av OpenCL 2.0-block och implementerade nya funktioner i OpenMP 5.0.
  • Lade till IndentExternBlock-alternativet för att klang-formatera verktyg för justering inuti externa "C" och externa "C++" block.
  • Förbättrad hantering av ärvda konstruktorer i C++ i den statiska analysatorn. Lade till nya kontroller alpha.core.C11Lock och alpha.fuchsia.Lock för att leta efter lås, alpha.security.cert.pos.34c för att upptäcka osäker användning av putenv, webkit.NoUncountedMemberChecker och webkit.RefCntblBaseVirtualDtor för att upptäcka problem med alpha uncountable typer .cplusplus .SmartPtr för att söka efter noll smart pointer-dereference.
  • I linter klang-prydligt Lagt till en stor del av nya kontroller.
  • Cachingserver clangd (Clang Server) har förbättrat prestanda och lagt till nya diagnostiska funktioner.

Den huvudsakliga innovationer LLVM 11.0:

  • Byggsystemet har bytts till att använda Python 3. Om Python 3 inte är tillgängligt har möjligheten att återgå till att använda Python 2 implementerats.
  • Front-end med en kompilator för Go-språket (llgo) exkluderas från releasen, som kan komma att omstruktureras i framtiden.
  • Attributet vektor-funktion-abi-variant har lagts till den mellanliggande representationen (IR) för att beskriva mappningen mellan skalära och vektorfunktioner för samtalsvektorisering. Två separata vektortyper llvm::FixedVectorType och llvm::ScalableVectorType är separerade från llvm::VectorType.
  • Det anses vara odefinierat beteende att förgrena sig baserat på udef-värden och skicka undef-värden till standardbiblioteksfunktioner. I
    memset/memcpy/memmove är tillåtet att skicka undef-pekare, men om parametern med storlek är noll.

  • LLJIT har lagt till stöd för att utföra statiska initieringar via metoderna LLJIT::initialize och LLJIT::deinitialize. Implementerade möjligheten att lägga till statiska bibliotek till JITDylib med klassen StaticLibraryDefinitionGenerator. Lade till C API för ORCv2 (API för att bygga JIT-kompilatorer).
  • Lade till stöd för Cortex-A64, Cortex-A34, Cortex-A77 och Cortex-X78-processorer till AArch1-arkitekturens backend. Implementerade ARMv8.2-BF16 (BFloat16) och ARMv8.6-A tillägg, inklusive RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) och ARMv8.0-DGH (tips om datainsamling). Möjligheten att generera kod för inbyggda lindningsfunktioner för SVE-vektorinstruktioner tillhandahålls.
  • Stöd för Cortex-M55, Cortex-A77, Cortex-A78 och Cortex-X1-processorer har lagts till i ARM-arkitekturens backend. Implementerade tillägg
    Armv8.6-A Matrix Multiply och RMv8.2-AA32BF16 BFloat16.

  • Lagt till stöd för kodgenerering för POWER10-processorer till PowerPC-arkitekturens backend. Utökade slingoptimeringar och förbättrat stöd för flyttalsoperationer.
  • Backend för RISC-V-arkitekturen tillåts acceptera patchar med stöd för experimentella utökade instruktionsuppsättningar som ännu inte har godkänts officiellt.
  • Backend för AVR-arkitekturen har flyttats från kategorin experimentell till stabil, inkluderad i baspaketet.
  • Backend för x86-arkitekturen stöder Intel AMX- och TSXLDTRK-instruktionerna. Tillagt attackskydd HVAC (Load Value Injection), såväl som den allmänna mekanismen för undertryckning av sidoeffekter för spekulativ exekvering, är implementerade för att blockera attacker orsakade av spekulativ utförande av operationer i CPU:n.
  • Lade till stöd för MemorySanitizer och LeakSanitizer i SystemZ-backend.
  • Stöd för en rubrikfil med matematiska konstanter har lagts till i Libc++ .
  • Expanderat LLD länkfunktioner. Förbättrat stöd för ELF-format, inklusive att lägga till "--lto-emit-asm", "--lto-whole-program-visibility", "--print-archive-stats", "--shuffle-sections", "-- thinlto-single-module", "--unique", "--rosegment", "--threads=N". Lade till alternativet "--time-trace" för att spara spåret till en fil, som sedan kan analyseras via chrome://tracing-gränssnittet i Chrome.

Källa: opennet.ru

Lägg en kommentar