Lëshimi i paketës së përpiluesit LLVM 9.0

Pas gjashtë muajsh zhvillimi prezantuar publikimi i projektit LLVM 9.0 — Mjete të përputhshme me GCC (përpiluesit, optimizuesit dhe gjeneruesit e kodeve), përpilimi i programeve në bitkod të ndërmjetëm të instruksioneve virtuale të ngjashme me RISC (makinë virtuale e nivelit të ulët me një sistem optimizimi me shumë nivele). Pseudokodi i gjeneruar mund të konvertohet duke përdorur një përpilues JIT në udhëzime makine direkt në kohën e ekzekutimit të programit.

Karakteristikat e reja të LLVM 9.0 përfshijnë heqjen e etiketës së dizajnit eksperimental nga platforma e synuar RISC-V, mbështetjen e C++ për OpenCL, aftësinë për të ndarë një program në pjesë të ngarkuara dinamikisht në LLD dhe zbatimin e "asm goto", e përdorur në kodin e kernelit Linux. libc++ shtoi mbështetjen për WASI (WebAssembly System Interface) dhe LLD shtoi mbështetjen fillestare për lidhjen dinamike të WebAssembly.

Përmirësimet në Clang 9.0:

  • Shtuar zbatimi i shprehjes specifike të GCC "asm goto", e cila ju lejon të kaloni nga një bllok i integruar i asamblerit në një etiketë në kodin C. Kjo veçori kërkohet për të ndërtuar kernelin Linux në modalitetin "CONFIG_JUMP_LABEL=y" duke përdorur Clang në sistemet me arkitekturë x86_64. Duke marrë parasysh ndryshimet e shtuara në versionet e mëparshme, kerneli Linux tani mund të ndërtohet në Clang për arkitekturën x86_64 (më parë mbështetej vetëm ndërtimi për arkitekturat arm, aarch64, ppc32, ppc64le dhe mips). Për më tepër, projektet Android dhe ChromeOS tashmë janë konvertuar për të përdorur Clang për ndërtimin e kernelit dhe Google po teston Clang si platformën kryesore për ndërtimin e kernelit për sistemet e tij Linux të prodhimit. Në të ardhmen, përbërës të tjerë LLVM mund të përdoren në procesin e ndërtimit të kernelit, duke përfshirë LLD, llvm-objcopy, llvm-ar, llvm-nm dhe llvm-objdump;
  • U shtua mbështetje eksperimentale për përdorimin e C++17 në OpenCL. Karakteristikat specifike përfshijnë mbështetjen për atributet e hapësirës së adresave, bllokimin e konvertimit të hapësirës së adresave sipas operatorëve të transmetimit të tipit, ofrimin e llojeve të vektorëve si në OpenCL për C, praninë e llojeve specifike OpenCL për imazhe, ngjarje, kanale, etj.
  • U shtuan flamujt e rinj të përpiluesit "-ftime-trace" dhe "-ftime-trace-granularity=N" për të gjeneruar një raport mbi kohën e ekzekutimit të fazave të ndryshme të frontendit (parsing, inicializimi) dhe backend (fazat e optimizimit). Raporti ruhet në formatin json, i pajtueshëm me chrome://tracing dhe speedscope.app;
  • Përpunimi i shtuar i specifikuesit "__declspec(alokator)" dhe gjenerimi i informacionit shoqërues të korrigjimit që ju lejon të monitoroni konsumin e memories në mjedisin Visual Studio;
  • Për gjuhën C, mbështetja është shtuar për makron "__FILE_NAME__", e cila i ngjan makro "__FILE__", por përfshin vetëm emrin e skedarit pa shtegun e plotë;
  • C++ ka zgjeruar mbështetjen për atributet e hapësirës së adresave për të mbuluar veçori të ndryshme të C++, duke përfshirë modelet e parametrave dhe argumenteve, llojet e referencës, konkluzionet e llojit të kthimit, objektet, funksionet e gjeneruara automatikisht, operatorët e integruar dhe më shumë.
  • Aftësitë që lidhen me mbështetjen për OpenCL, OpenMP dhe CUDA janë zgjeruar. Kjo përfshin mbështetjen fillestare për përfshirjen e nënkuptuar të funksioneve të integruara OpenCL (është shtuar flamuri "-fdeclare-opencl-builtins"), shtesa cl_arm_integer_dot_product është zbatuar dhe mjetet diagnostikuese janë zgjeruar;
  • Është përmirësuar puna e analizuesit statik dhe është shtuar dokumentacioni për kryerjen e analizave statike. Flamuj të shtuar për të shfaqur modulet e disponueshme të kontrolluesit dhe opsionet e mbështetura ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" dhe "-analyzer-checker[-option]-help " -zhvilluesi"). U shtua flamuri "-analyzer-werror" për të trajtuar paralajmërimet si gabime.
    U shtuan mënyra të reja verifikimi:

    • Security.insecureAPI.DeprecatedOrUnsafeBufferHandling për të identifikuar praktikat e pasigurta për të punuar me buffer;
    • osx.MIGChecker për të kërkuar shkelje të rregullave të thirrjes MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast për të gjetur konvertime të pasakta të objekteve libkern XNU;
    • apiModeling.llvm me një grup funksionesh kontrolli modelimi për të zbuluar gabimet në bazën e kodeve LLVM;
    • Kodi i stabilizuar për kontrollimin e objekteve të painitializuara C++ (UninitializedObject në paketën optin.cplusplus);
  • Programi clang-format ka shtuar mbështetje për formatimin e kodit në gjuhën C# dhe ofron mbështetje për stilin e formatimit të kodit të përdorur nga Microsoft;
  • clang-cl, një ndërfaqe alternative e linjës së komandës që ofron përputhshmëri në nivel opsionesh me përpiluesin cl.exe të përfshirë në Visual Studio, ka shtuar heuristikë për të trajtuar skedarët joekzistues si opsione të linjës së komandës dhe për të shfaqur një paralajmërim përkatës (për shembull, kur ekzekutoni "clang-cl /diagnostic :caret /c test.cc");
  • Një pjesë e madhe e çeqeve të reja i është shtuar linter clang-tidy, duke përfshirë kontrolle të shtuara specifike për OpenMP API;
  • Zgjeruar aftësitë e serverit trokitur (Clang Server), në të cilin modaliteti i ndërtimit të indeksit të sfondit është aktivizuar si parazgjedhje, është shtuar mbështetje për veprimet kontekstuale me kod (rikthimi i variablave, zgjerimi i definicioneve automatike dhe makro, konvertimi i vargjeve të arratisura në ato të pashpjeguara), aftësia për të shfaqur paralajmërime nga Clang-tidy, zgjeroi diagnostikimin e gabimeve në skedarët e kokës dhe shtoi aftësinë për të shfaqur informacione rreth hierarkisë së tipit;

Kryesore risitë LLVM 9.0:

  • Një veçori eksperimentale e ndarjes është shtuar në lidhësin LLD, i cili ju lejon të ndani një program në disa pjesë, secila prej të cilave ndodhet në një skedar të veçantë ELF. Kjo veçori ju lejon të nisni pjesën kryesore të programit, i cili do të ngarkojë komponentë të tjerë sipas nevojës gjatë funksionimit (për shembull, mund të ndani shikuesin e integruar PDF në një skedar të veçantë, i cili do të ngarkohet vetëm kur përdoruesi të hapë PDF-në dosje).

    Lidhës LLD solli në plan të parë në një gjendje të përshtatshme për lidhjen e kernelit Linux për arkitekturat arm32_7, arm64, ppc64le dhe x86_64.
    Opsionet e reja "-" (dalja në stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" dhe "-z common-page-size". Për arkitekturën AArch64, është shtuar mbështetje për udhëzimet BTI (Branch Target Indicator) dhe PAC (Pointer Authentication Code). Mbështetja për platformat MIPS, RISC-V dhe PowerPC është përmirësuar ndjeshëm. Mbështetja fillestare e shtuar për lidhjen dinamike për WebAssembly;

  • Në libc++ zbatuar funksionet ssize, std::is_constant_evaluated, std::midpoint dhe std::lerp, metodat "front" dhe "back" janë shtuar në std::span, atributet e llojeve std::is_unbounded_array dhe std::is_bounded_array janë shtuar. , aftësitë std janë zgjeruar: :atomic. Mbështetja për GCC 4.9 është ndërprerë (mund të përdoret me GCC 5.1 dhe versionet më të reja). Mbështetje e shtuar WASI (WebAssembly System Interface, një ndërfaqe për përdorimin e WebAssembly jashtë shfletuesit);
  • Janë shtuar optimizime të reja. Konvertimi i thirrjeve memcmp në bcmp është aktivizuar në disa situata. Mungesa e zbatuar e kontrollit të diapazonit për tabelat e kërcimit në të cilat blloqet e çelësit të poshtëm janë të paarritshëm ose kur nuk përdoren instruksione, për shembull, kur thirren funksione me llojin void;
  • Backend-i për arkitekturën RISC-V është stabilizuar, i cili nuk është më i pozicionuar si eksperimental dhe është ndërtuar si parazgjedhje. Ofron mbështetje të plotë të gjenerimit të kodit për variantet e grupeve të instruksioneve RV32I dhe RV64I me zgjerime MAFDC;
  • Përmirësime të shumta janë bërë në backend për arkitekturat X86, AArch64, ARM, SystemZ, MIPS, AMDGPU dhe PowerPC. Për shembull, për arkitekturën
    AArch64 shtoi mbështetje për udhëzimet SVE2 (Scalable Vector Extension 2) dhe MTE (Memory Tagging Extensions); në backend ARM, u shtua mbështetje për arkitekturën Armv8.1-M dhe zgjerimin MVE (M-Profile Vector Extension). Mbështetja për arkitekturën GFX10 (Navi) është shtuar në prapavijën e AMDGPU, aftësitë e thirrjes së funksionit janë aktivizuar si parazgjedhje dhe aktivizohet një kalim i kombinuar DPP (Data-Parallel Primitives).

  • Korrigjuesi LLDB tani ka theksim me ngjyra për gjurmët e pasme dhe mbështetje të shtuar për blloqet DWARF4 debug_types dhe DWARF5 debug_info;
  • Mbështetja për objektet dhe skedarët e ekzekutueshëm në formatin COFF është shtuar në shërbimet llvm-objcopy dhe llvm-strip.

Burimi: opennet.ru

Shto një koment