Az LLVM 11.0 fordítócsomag kiadása

Hat hónapos fejlesztés után bemutatott projekt kiadás LLVM 11.0 — GCC-kompatibilis eszközök (fordítók, optimalizálók és kódgenerátorok), programok fordítása RISC-szerű virtuális utasítások közbenső bitkódjává (alacsony szintű virtuális gép többszintű optimalizáló rendszerrel). A generált pszeudokód JIT fordító segítségével gépi utasításokká konvertálható közvetlenül a program végrehajtása során.

A legfontosabb változás az új kiadásban az volt Lágyék, frontend fortran nyelvhez. A Flang támogatja a Fortran 2018-at, az OpenMP 4.5-öt és az OpenACC 3.0-t, de a projekt fejlesztése még nem fejeződött be, és a kezelőfelület a kódelemzésre és a helyesség-ellenőrzésre korlátozódik. Az LLVM köztes kód generálása még nem támogatott, és a végrehajtható fájlok generálásához kanonikus kód jön létre, amelyet egy külső Fortran fordítónak továbbít.

Fejlesztések a Clang 11.0-ban:

  • Hozzáadtuk az absztrakt szintaxisfa visszaállításának lehetőségét (AST). A funkció alapértelmezés szerint engedélyezve van a C++ kódhoz, és a "-Xclang -f[no-]recovery-ast" opciókkal vezérelhető.
  • Új diagnosztikai módok hozzáadva:
    • A „-Wpointer-to-int-cast” figyelmeztetések egy csoportja, amelyek a mutatók olyan int egész típusúra való öntésére vonatkoznak, amely nem fér el minden lehetséges értékhez.
    • „-Wuninitialized-const-reference” – figyelmeztetés az inicializálatlan változók átadására olyan függvényparaméterekben, amelyek elfogadják a „const” attribútummal rendelkező referenciaargumentumokat.
    • "-Wimplicit-const-int-float-conversion" - alapértelmezés szerint engedélyezve van, figyelmeztetés egy valós konstans implicit konverziójáról egész típussá.
  • Az ARM platformhoz a fordítóba beépített C funkciók állnak rendelkezésre (Intrinsics), az Arm v8.1-M MVE és CDE hatékony vektorutasítások váltották fel. Az elérhető funkciókat az arm_mve.h és arm_cde.h fejlécfájlok határozzák meg.
  • Hozzáadva kiterjesztett egész típusú _ExtInt(N) készlet, amely lehetővé teszi olyan típusok létrehozását, amelyek nem kettős hatványok többszörösei, és amelyek hatékonyan feldolgozhatók FPGA/HLS-en. Például, Az _ExtInt(7) egy 7 bitből álló egész számtípust határoz meg.
  • Hozzáadott makrók, amelyek meghatározzák a beépített C funkciók támogatását az ARM SVE (Scalable Vector Extension) utasításai alapján:
    __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. Például a __ARM_FEATURE_SVE makró az AArch64 kód generálásakor a "-march=armv8-a+sve" parancssori paraméter beállításával kerül meghatározásra.

  • A "-O" jelzőt a "-O1" helyett a "-O2" optimalizálási mód azonosítja.
  • Új fordítójelzők hozzáadva:
    • "-fstack-clash-protection" - lehetővé teszi a védelmet verem és kupac metszéspontjai.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - lehetővé teszi a kivételkezelő mód kiválasztását lebegőpontos számokhoz.
    • "-ffp-model={precise,strict,fast}" – Leegyszerűsíti a hozzáférést a lebegőpontos számok speciális beállításainak sorozatához.
    • Az "-fpch-codegen" és az "-fpch-debuginfo" egy előre lefordított fejléc (PCH) létrehozásához külön objektumfájlokkal a kódhoz és a hibakeresési információhoz.
    • „-fsanitize-coverage-allowlist” és „-fsanitize-coverage-blocklist” a fehér és fekete listák lefedettségének ellenőrzéséhez.
    • „-mtls-size={12,24,32,48}” a TLS (thread-local storage) méret kiválasztásához.
    • "-menable-experimental-extension" a kísérleti RISC-V bővítmények engedélyezéséhez.
  • A C alapértelmezett módja a „-fno-common”, amely egyes platformokon hatékonyabb hozzáférést tesz lehetővé a globális változókhoz.
  • Az alapértelmezett modul-gyorsítótár a /tmp-ből a ~/.cache könyvtárba került. A felülbíráláshoz használhatja az „-fmodules-cache-path=” jelzőt.
  • Az alapértelmezett C nyelvi szabvány gnu11-ről gnu17-re frissült.
  • Hozzáadott előzetes támogatás a GNU C bővítményhez "asm inline» összeszerelő betétek hozzáadásához. A kiterjesztés elemzése még folyamatban van, de semmilyen módon nem dolgozzák fel.
  • Az OpenCL- és CUDA-támogatáshoz kapcsolódó képességek kibővültek. Hozzáadott támogatást az OpenCL 2.0 blokkdiagnosztikához, és új OpenMP 5.0 funkciókat vezettek be.
  • IndentExternBlock opció hozzáadva a csilingelő formátumú segédprogramhoz a külső "C" és külső "C++" blokkon belüli igazításhoz.
  • A statikus analizátor javította az örökölt konstruktorok kezelését C++ nyelven. Új ellenőrzések hozzáadva az alpha.core.C11Lock és az alpha.fuchsia.Lock a zárolások ellenőrzéséhez, az alpha.security.cert.pos.34c a putenv nem biztonságos használatának észleléséhez, a webkit.NoUncountedMemberChecker és a webkit.RefCntblBaseVirtualDtor a megszámlálhatatlan típusú problémák észleléséhez, alpha .cplusplus .SmartPtr a null intelligens mutató hivatkozásának ellenőrzéséhez.
  • Linter-csengő rendben tette hozzá az új csekk nagy része.
  • A clangd gyorsítótárazó szerver (Clang Server) jobb teljesítményt és új diagnosztikai képességeket adott hozzá.

A főbb innovációk LLVM 11.0:

  • A felépítési rendszer Python 3 használatára vált. Ha a Python 3 nem érhető el, akkor vissza lehet térni a Python 2 használatára.
  • A Go nyelv (llgo) fordítójával ellátott kezelőfelület ki van zárva a kiadásból, amely a jövőben átstrukturálható.
  • A vector-function-abi-variant attribútumot hozzáadtuk a köztes reprezentációhoz (IR), hogy leírja a skaláris és a vektorfüggvények közötti leképezést a hívások vektorizálására. Az llvm::VectorType-ból két különböző vektortípus létezik: llvm::FixedVectorType és llvm::ScalableVectorType.
  • Az uef értékeken alapuló elágazás és az undef értékek szabványos könyvtári függvényeknek való átadása meghatározatlan viselkedésnek minősül. BAN BEN
    A memset/memcpy/memmove engedélyezi az undef mutatók átadását, de ha a paraméter mérete nulla.

  • Az LLJIT támogatja a statikus inicializálások végrehajtását az LLJIT::initialize és LLJIT::deinitialize metódusokon keresztül. Megvalósult az a lehetőség, hogy statikus könyvtárakat adjunk hozzá a JITDylibhez a StaticLibraryDefinitionGenerator osztály használatával. C API hozzáadva a következőhöz ORCv2 (API JIT fordítók építéséhez).
  • A Cortex-A64, Cortex-A34, Cortex-A77 és Cortex-X78 processzorok támogatása hozzáadásra került az AArch1 architektúra háttérrendszeréhez. Megvalósított ARMv8.2-BF16 (BFloat16) és ARMv8.6-A bővítmények, beleértve az RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Graned Traps), ARMv8.6-AMU (Activity Monitors virtualizáció) és ARMv8.0-DGH (adatgyűjtési tipp). Lehetőség van kód generálására a beépített függvények SVE vektorutasításokhoz való kötéséhez.
  • A Cortex-M55, Cortex-A77, Cortex-A78 és Cortex-X1 processzorok támogatása bekerült az ARM architektúra háttérrendszerébe. Kiterjesztések megvalósítva
    Armv8.6-A Matrix Multiply és RMv8.2-AA32BF16 BFloat16.

  • A POWER10 processzorok kódgenerálásának támogatása hozzáadásra került a PowerPC architektúra háttérrendszeréhez. Kibővült a hurokoptimalizálás, és javult a lebegőpontos támogatás.
  • A RISC-V architektúra háttérrendszere lehetővé teszi a hivatalosan még nem jóváhagyott kísérleti kiterjesztett utasításkészleteket támogató javítások elfogadását.
  • Az AVR architektúra háttérrendszere átkerült a kísérleti kategóriából a stabilba, amely az alap disztribúcióban szerepel.
  • Az x86 architektúrához készült háttérrendszer támogatja az Intel AMX és TSXLDTRK utasításait. Hozzáadott védelem a támadások ellen LVI (Load Value Injection), valamint egy általános spekulatív végrehajtási mellékhatás-elnyomási mechanizmust valósít meg a CPU-n végzett műveletek spekulatív végrehajtása által okozott támadások blokkolására.
  • A SystemZ architektúra háttérprogramjában a MemorySanitizer és a LeakSanitizer támogatása került hozzáadásra.
  • A matematikai állandókat tartalmazó fejlécfájl támogatása hozzáadva a Libc++-hoz .
  • Kiterjesztett LLD linker képességek. Továbbfejlesztett támogatás az ELF formátumhoz, beleértve a "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", "" opciókat. -thinlto- single-module", "-unique", "-rosegment", "-threads=N". A „--time-trace” opció hozzáadva a nyomkövetés fájlba mentéséhez, amely azután elemezhető a Chrome chrome://tracing felületén keresztül.

Forrás: opennet.ru

Hozzászólás