Izdanje LLVM 9.0 kompajlerskog paketa

Nakon šest mjeseci razvoja predstavljen izdanje projekta LLVM 9.0 — GCC-kompatibilni alati (kompajlatori, optimizatori i generatori koda), kompajliranje programa u srednji bit kod virtuelnih instrukcija sličnih RISC-u (virtuelna mašina niskog nivoa sa sistemom optimizacije na više nivoa). Generisani pseudokod se može konvertovati pomoću JIT kompajlera u mašinske instrukcije direktno u vreme izvršavanja programa.

Nove karakteristike LLVM 9.0 uključuju uklanjanje oznake eksperimentalnog dizajna sa ciljne RISC-V platforme, C++ podršku za OpenCL, mogućnost podjele programa na dinamički učitane dijelove u LLD-u i implementaciju “asm goto", koji se koristi u kodu jezgra Linuxa. libc++ je dodao podršku za WASI (WebAssembly System Interface), a LLD je dodao početnu podršku za WebAssembly dinamičko povezivanje.

Poboljšanja u Clang 9.0:

  • Dodano implementacija GCC-specifičnog izraza "asm goto“, koji vam omogućava da pređete sa inline bloka asemblera na oznaku u C kodu. Ova funkcija je potrebna za izgradnju Linux kernela u “CONFIG_JUMP_LABEL=y” modu koristeći Clang na sistemima sa x86_64 arhitekturom. Uzimajući u obzir promjene dodane u prethodnim izdanjima, Linux kernel sada može biti izgrađen u Clang-u za arhitekturu x86_64 (ranije je bila podržana samo zgrada za arm, aarch64, ppc32, ppc64le i mips arhitekture). Štaviše, Android i ChromeOS projekti su već pretvoreni da koriste Clang za izgradnju kernela, a Google testira Clang kao glavnu platformu za pravljenje kernela za svoje proizvodne Linux sisteme. U budućnosti, druge LLVM komponente mogu se koristiti u procesu izgradnje kernela, uključujući LLD, llvm-objcopy, llvm-ar, llvm-nm i llvm-objdump;
  • Dodata eksperimentalna podrška za korištenje C++17 u OpenCL-u. Specifične karakteristike uključuju podršku za atribute adresnog prostora, blokiranje konverzije adresnog prostora prema operatorima prelivanja tipa, obezbeđivanje vektorskih tipova kao u OpenCL za C, prisustvo specifičnih OpenCL tipova za slike, događaje, kanale, itd.
  • Dodane su nove zastavice kompajlera “-ftime-trace” i “-ftime-trace-granularity=N” za generiranje izvještaja o vremenu izvršavanja različitih faza frontenda (parsing, inicijalizacija) i backend-a (faze optimizacije). Izvještaj se čuva u json formatu, kompatibilan sa chrome://tracing i speedscope.app;
  • Dodata obrada specifikacije “__declspec(allocator)” i generisanje pratećih informacija za otklanjanje grešaka koje vam omogućavaju da nadgledate potrošnju memorije u okruženju Visual Studio;
  • Za jezik C, dodata je podrška za makro “__FILE_NAME__”, koji liči na makro “__FILE__”, ali uključuje samo ime datoteke bez pune putanje;
  • C++ je proširio podršku za atribute adresnog prostora kako bi pokrio različite karakteristike C++-a, uključujući obrasce parametara i argumenata, referentne tipove, zaključivanje tipa povratka, objekte, automatski generirane funkcije, ugrađene operatore i još mnogo toga.
  • Mogućnosti povezane s podrškom za OpenCL, OpenMP i CUDA su proširene. Ovo uključuje početnu podršku za implicitno uključivanje ugrađenih OpenCL funkcija (dodata je zastavica “-fdeclare-opencl-builtins”), implementirana je ekstenzija cl_arm_integer_dot_product, a dijagnostički alati su prošireni;
  • Unaprijeđen je rad statičkog analizatora i dodata je dokumentacija o izvođenju statičke analize. Dodane su zastavice za prikaz dostupnih modula za provjeru i podržanih opcija (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” i “-analyzer-checker[-option]-help ” -programer"). Dodata oznaka "-analyzer-werror" za tretiranje upozorenja kao grešaka.
    Dodani novi načini verifikacije:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling za identifikaciju nesigurnih praksi za rad sa baferima;
    • osx.MIGChecker za traženje kršenja MIG (Mach Interface Generator) pravila poziva;
    • optin.osx.OSObjectCStyleCast za pronalaženje netočnih konverzija XNU libkern objekata;
    • apiModeling.llvm sa skupom funkcija za provjeru modeliranja za otkrivanje grešaka u LLVM kodnoj bazi;
    • Stabilizirani kod za provjeru neinicijaliziranih C++ objekata (UninitializedObject u paketu optin.cplusplus);
  • Uslužni program clang-format je dodao podršku za formatiranje koda u jeziku C# i pruža podršku za stil formatiranja koda koji koristi Microsoft;
  • clang-cl, alternativni interfejs komandne linije koji obezbeđuje kompatibilnost na nivou opcija sa cl.exe kompajlerom uključenim u Visual Studio, dodao je heuristiku za tretiranje nepostojećih datoteka kao opcija komandne linije i prikazivanje odgovarajućeg upozorenja (na primer, kada se pokreće "clang-cl /diagnostic :caret /c test.cc");
  • Veliki dio novih provjera je dodat u linter clang-tidy, uključujući dodane provjere specifične za OpenMP API;
  • Prošireno mogućnosti servera clangd (Clang Server), u kojem je podrazumevano omogućen način izgradnje pozadinskog indeksa, dodata je podrška za kontekstualne radnje sa kodom (preuzimanje varijable, proširenje auto i makro definicija, konverzija escaped stringova u one bez prelaska), mogućnost prikaza upozorenja od Clang-tidy, proširena dijagnostika grešaka u datotekama zaglavlja i dodana mogućnost prikaza informacija o hijerarhiji tipova;

Glavni inovacije LLVM 9.0:

  • LLD linkeru je dodana opcija eksperimentalnog particioniranja, koja vam omogućava da podijelite jedan program na nekoliko dijelova, od kojih se svaki nalazi u zasebnoj ELF datoteci. Ova funkcija vam omogućava da pokrenete glavni dio programa, koji će učitati ostale komponente po potrebi tokom rada (na primjer, možete odvojiti ugrađeni PDF preglednik u zasebnu datoteku, koja će se učitati samo kada korisnik otvori PDF fajl).

    LLD Linker doveo do izražaja u stanje pogodno za povezivanje Linux kernela za arm32_7, arm64, ppc64le i x86_64 arhitekture.
    Nove opcije "-" (izlaz u stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" i "-z uobičajena-veličina-stranice". Za AArch64 arhitekturu, dodata je podrška za BTI (Branch Target Indicator) i PAC (Pointer Authentication Code) instrukcije. Podrška za MIPS, RISC-V i PowerPC platforme je značajno poboljšana. Dodata početna podrška za dinamičko povezivanje za WebAssembly;

  • U libc++ implementirano funkcije ssize, std::is_constant_evaluated, std::midpoint i std::lerp, metode “front” i “back” su dodane u std::span, dodani su atributi tipova std::is_unbounded_array i std::is_bounded_array , std mogućnosti su proširene: :atomic. Podrška za GCC 4.9 je ukinuta (može se koristiti sa GCC 5.1 i novijim izdanjima). Dodata podrška WASI (WebAssembly System Interface, interfejs za korišćenje WebAssembly van pretraživača);
  • Dodane su nove optimizacije. Omogućena konverzija memcmp poziva u bcmp u nekim situacijama. Implementirano izostavljanje provjere opsega za tablice skokova u kojima su donji blokovi prekidača nedostupni ili kada se instrukcije ne koriste, na primjer, kada se pozivaju funkcije tipa void;
  • Pozadina za RISC-V arhitekturu je stabilizirana, koja više nije pozicionirana kao eksperimentalna i izgrađena je po defaultu. Pruža punu podršku za generiranje koda za RV32I i RV64I varijante skupa instrukcija sa MAFDC ekstenzijama;
  • Brojna poboljšanja su napravljena na pozadinskim površinama za arhitekture X86, AArch64, ARM, SystemZ, MIPS, AMDGPU i PowerPC. Na primjer, za arhitekturu
    AArch64 je dodao podršku za SVE2 (Scalable Vector Extension 2) i MTE (Memory Tagging Extensions) instrukcije; u ARM backend, dodata je podrška za Armv8.1-M arhitekturu i MVE (M-Profile Vector Extension) ekstenzija. Podrška za GFX10 (Navi) arhitekturu je dodana u AMDGPU pozadinu, mogućnosti pozivanja funkcija su omogućene prema zadanim postavkama, a kombinovani prolaz je aktiviran DPP (Paralelni primitivi podataka).

  • LLDB debugger sada ima isticanje boja za tragove nazad i dodatu podršku za DWARF4 debug_types i DWARF5 debug_info blokove;
  • Podrška za objektne i izvršne datoteke u COFF formatu dodata je uslužnim programima llvm-objcopy i llvm-strip.

izvor: opennet.ru

Dodajte komentar