Az LLVM 9.0 fordítócsomag kiadása

Hat hónapos fejlesztés után bemutatott projekt kiadás LLVM 9.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.

Az LLVM 9.0 új szolgáltatásai közé tartozik a kísérleti tervezési címke eltávolítása a cél RISC-V platformról, az OpenCL C++ támogatása, a program dinamikusan betöltött részekre osztása az LLD-ben, valamint a „asm goto", amelyet a Linux kernel kódjában használnak. A libc++ hozzáadta a WASI (WebAssembly System Interface) támogatását, az LLD pedig a WebAssembly dinamikus összekapcsolásának kezdeti támogatását.

Fejlesztések a Clang 9.0-ban:

  • Hozzáadva a GCC-specifikus kifejezés megvalósítása "asm goto“, amely lehetővé teszi az assembler soron belüli blokkról a C kódú címkére való áttérést. Ez a funkció szükséges a Linux kernel „CONFIG_JUMP_LABEL=y” módban történő felépítéséhez a Clang használatával x86_64 architektúrájú rendszereken. Figyelembe véve a korábbi kiadásokban bevezetett változtatásokat, a Linux kernel immár Clang nyelven is beépíthető az x86_64 architektúrához (korábban csak az arm, aarch64, ppc32, ppc64le és mips architektúrákhoz való építés volt támogatott). Sőt, az Android és a ChromeOS projekteket már átalakították a Clang használatára a kernelépítéshez, és a Google teszteli a Clang-t, mint az éles Linux-rendszerek kernelépítésének fő platformját. A jövőben más LLVM-összetevők is használhatók a kernelépítési folyamatban, beleértve az LLD-t, az llvm-objcopy-t, az llvm-ar-t, az llvm-nm-t és az llvm-objdump-ot;
  • Kísérleti támogatás hozzáadva a C++17 OpenCL-ben való használatához. A speciális jellemzők közé tartozik a címtér-attribútumok támogatása, a címtér-konverzió blokkolása típusöntési operátorok által, a vektortípusok biztosítása, mint az OpenCL for C esetében, bizonyos OpenCL-típusok jelenléte képekhez, eseményekhez, csatornákhoz stb.
  • Új „-ftime-trace” és „-ftime-trace-granularity=N” fordítójelzők hozzáadva, hogy jelentést készítsenek a frontend (elemzés, inicializálás) és a backend (optimalizálási szakaszok) különböző szakaszainak végrehajtási idejéről. A jelentés json formátumban kerül mentésre, amely kompatibilis a chrome://tracing és a speedscope.app fájlokkal;
  • A „__declspec(allocator)” specifikátor feldolgozása és a kísérő hibakeresési információk generálása, amely lehetővé teszi a memóriafogyasztás figyelését a Visual Studio környezetben;
  • A C nyelvhez hozzáadtuk a „__FILE_NAME__” makrót, amely hasonlít a „__FILE__” makróra, de csak a fájlnevet tartalmazza a teljes elérési út nélkül;
  • A C++ kibővítette a címtér-attribútumok támogatását, hogy lefedje a különböző C++-szolgáltatásokat, beleértve a paraméter- és argumentummintákat, a referenciatípusokat, a visszatérési típusú következtetéseket, az objektumokat, az automatikusan generált függvényeket, a beépített operátorokat és még sok mást.
  • Az OpenCL, OpenMP és CUDA támogatásához kapcsolódó képességek kibővültek. Ez magában foglalja a beépített OpenCL-függvények implicit bevonásának kezdeti támogatását (a „-fdeclare-opencl-builtins” jelzőt hozzáadtuk), a cl_arm_integer_dot_product kiterjesztést implementálták, és a diagnosztikai eszközöket kibővítették;
  • A statikus analizátor munkáját továbbfejlesztettük, és hozzáadtuk a statikus elemzés elvégzésének dokumentációját. Jelzők hozzáadva az elérhető ellenőrző modulok és a támogatott opciók megjelenítéséhez ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" és "-analyzer-checker[-option]-help" ” -fejlesztő”). "-analyzer-werror" jelző hozzáadva a figyelmeztetések hibaként történő kezeléséhez.
    Új ellenőrzési módok hozzáadva:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling a pufferekkel végzett munka nem biztonságos gyakorlatainak azonosítására;
    • osx.MIGChecker a MIG (Mach Interface Generator) hívási szabályok megsértésének keresésére;
    • optin.osx.OSObjectCStyleCast a helytelen XNU libkern objektumkonverziók megtalálásához;
    • apiModeling.llvm egy sor modellezés-ellenőrző funkcióval az LLVM kódbázis hibáinak észlelésére;
    • Stabilizált kód az inicializálatlan C++ objektumok ellenőrzéséhez (UninitializedObject az optin.cplusplus csomagban);
  • A clang-format segédprogram támogatja a kód formázását a C# nyelven, és támogatja a Microsoft által használt kódformázási stílust;
  • A clang-cl, egy alternatív parancssori interfész, amely opció szintű kompatibilitást biztosít a Visual Studio-ban található cl.exe fordítóval, heurisztikával bővítette a nem létező fájlokat parancssori opcióként, és megfelelő figyelmeztetést jelenít meg (például a "clang-cl /diagnostic :caret /c test.cc" futtatásakor);
  • Az új ellenőrzések nagy része hozzáadásra került a csengőhang-tisztaság érdekében, beleértve az OpenMP API-ra jellemző hozzáadott ellenőrzéseket;
  • Kiterjesztett szerver képességei csengett (Clang Server), amelyben alapértelmezés szerint engedélyezve van a háttérindexépítési mód, hozzáadásra került a kóddal végzett kontextuális műveletek támogatása (változók lekérése, az automatikus és makró definíciók bővítése, a megtisztított karakterláncok átalakítása nem megtisztított karakterláncokká), megjelenítési lehetőség figyelmeztetések a Clang-tidy-től, a fejlécfájlokban található hibák kibővített diagnosztikája és a típushierarchiával kapcsolatos információk megjelenítésének lehetősége;

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

  • Az LLD linkerhez egy kísérleti particionálási szolgáltatás került, amely lehetővé teszi egy program több részre bontását, amelyek mindegyike külön ELF fájlban található. Ez a funkció lehetővé teszi a program fő részének elindítását, amely működés közben szükség szerint betölti a többi komponenst (például a beépített PDF-nézegetőt külön fájlba különítheti el, amely csak akkor töltődik be, amikor a felhasználó megnyitja a PDF-fájlt fájl).

    LLD Linker hozott olyan állapotba, amely alkalmas a Linux kernel összekapcsolására az arm32_7, arm64, ppc64le és x86_64 architektúrákhoz.
    Új beállítások "-" (kimenet az stdout-ba), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" és "-z közös oldalméret". Az AArch64 architektúrához hozzáadták a BTI (Branch Target Indicator) és a PAC (Pointer Authentication Code) utasításokat. A MIPS, RISC-V és PowerPC platformok támogatása jelentősen javult. Kezdeti támogatás hozzáadva a WebAssembly dinamikus összekapcsolásához;

  • A libc++-ban megvalósítani ssize, std::is_constant_evaluated, std::midpoint és std::lerp függvények, a „front” és „back” metódus hozzáadásra került az std::span-hoz, az std::is_unbounded_array és std::is_bounded_array típusú attribútumok hozzáadva , std képességei bővültek: :atomic. A GCC 4.9 támogatása megszűnt (a GCC 5.1 és újabb kiadásokkal használható). Hozzáadott támogatás VOLTAM ÉN (WebAssembly System Interface, a WebAssembly böngészőn kívüli használatára szolgáló felület);
  • Új optimalizációk kerültek hozzáadásra. Bizonyos helyzetekben engedélyezve van a memcmp-hívások bcmp-be való konvertálása. A tartományellenőrzés elhagyása olyan ugrótáblázatoknál, amelyekben az alsó kapcsolóblokkok nem érhetők el, vagy ha nem használnak utasításokat, például void típusú függvények hívásakor;
  • A RISC-V architektúra hátterét stabilizálták, amely már nem kísérleti jellegű, és alapértelmezés szerint meg van építve. Teljes kódgenerálási támogatást biztosít az RV32I és RV64I utasításkészlet-változatokhoz MAFDC kiterjesztéssel;
  • Számos fejlesztés történt az X86, AArch64, ARM, SystemZ, MIPS, AMDGPU és PowerPC architektúrák háttérrendszerein. Például az építészethez
    Az AArch64 hozzáadta az SVE2 (Scalable Vector Extension 2) és az MTE (Memory Tagging Extensions) utasítások támogatását; az ARM háttérrendszerben az Armv8.1-M architektúra és az MVE (M-Profile Vector Extension) bővítmény. A GFX10 (Navi) architektúra támogatása hozzáadásra került az AMDGPU háttérrendszerhez, a funkcióhívási képességek alapértelmezés szerint engedélyezve vannak, és aktiválva van a kombinált átjárás DPP (Adatpárhuzamos primitívek).

  • Az LLDB debugger most már színkiemelést is tartalmaz a visszakövetésekhez, és hozzáadott támogatást a DWARF4 debug_types és DWARF5 debug_info blokkhoz;
  • Az llvm-objcopy és az llvm-strip segédprogramok a COFF formátumú objektum- és végrehajtható fájlok támogatásával bővültek.

Forrás: opennet.ru

Hozzászólás