Izdanje LLVM 10.0 kompajlerskog paketa

Nakon šest mjeseci razvoja predstavljen izdanje projekta LLVM 10.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 u LLVM 10.0 uključuju podršku za C++ koncepte, više ne pokreće Clang kao poseban proces, podršku za CFG (control flow guard) provjere za Windows i podršku za nove CPU mogućnosti.

Poboljšanja u Clang 10.0:

  • Dodata podrška za "koncept", ekstenzija C++ šablona koja će biti uključena u sljedeći standard, kodnog naziva C++2a (uključena zastavicom -std=c++2a).
    Koncepti vam omogućavaju da definirate skup zahtjeva parametara šablona koji, u vrijeme kompajliranja, ograničavaju skup argumenata koji se mogu prihvatiti kao parametri predloška. Koncepti se mogu koristiti da bi se izbjegle logičke nedosljednosti između svojstava tipova podataka koji se koriste unutar predloška i svojstava tipa podataka ulaznih parametara.

    šablon
    koncept JednakostUporedivi = zahtijeva(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Po defaultu, zaustavlja se pokretanje zasebnog procesa (“clang -cc1”) u kojem se vrši kompilacija. Kompilacija je sada urađena u glavnom procesu, a opcija "-fno-integrated-cc1" se može koristiti za vraćanje starog ponašanja.
  • Novi dijagnostički načini:
    • "-Wc99-designator" i "-Wreorder-init-list" upozoravaju na korištenje C99 inicijalizatora u C++ modu u slučajevima kada su ispravni u C99, ali ne i u C++20.
    • "-Wsizeof-array-div" - hvata situacije kao što je "int arr[10]; …sizeof(arr) / sizeof(short)…” (trebalo bi biti “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - upozorava na upotrebu konstrukcija kao što je upotreba "^" (xor) operatora u operacijama koje se mogu brkati sa eksponencijacijom (2^16).
    • "-Wfinal-dtor-non-final-class" - upozorava na klase koje nisu označene specifikacijom "final", ali imaju destruktor sa atributom "final".
    • "-Wtautological-bitwise-compare" je grupa upozorenja za dijagnosticiranje tautoloških poređenja između operacije po bitu i konstante, i za identifikaciju uvijek istinitih poređenja u kojima se operacija ILI po bitu primjenjuje na nenegativan broj.
    • "-Wbitwise-conditional-parentheses" upozorava na probleme prilikom miješanja logičkih operatora AND (&) i OR (|) sa uslovnim operatorom (?:).
    • “-Wmisleading-indentation” je analogna provjera istog imena iz GCC-a, koja upozorava na uvučene izraze kao da su dio if/else/for/while bloka, ali zapravo nisu uključeni u ovaj blok .
    • Kada navedete “-Wextra”, omogućena je provjera “-Wdeprecated-copy” koja upozorava na korištenje konstruktora
      "move" i "copy" u klasama s eksplicitnom definicijom destruktora.

    • Provjere "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" su proširene.
    • Provjere "-Wbitwise-op-parentheses" i "-Wlogical-op-parentheses" su onemogućene prema zadanim postavkama.
  • U C i C++ kodu, aritmetičke operacije pokazivača su dozvoljene samo u nizovima. Undefined Behavior Sanitizer u "-fsanitize=pointer-overflow" modu sada hvata slučajeve kao što je dodavanje pomaka različitog od nule nultom pokazivaču ili kreiranje null pokazivača prilikom oduzimanja cijelog broja od pokazivača koji nije nula.
  • Režim "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) je prilagođen da identifikuje probleme sa operacijama povećanja i smanjenja za tipove čija je veličina bita manja od one tipa "int".
  • Prilikom odabira ciljne arhitekture x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" i "-march=cooperlake" prema zadanim postavkama u vektoriziranom kod je prestao da koristi 512-bitne zmm registre, osim njihove direktne indikacije u izvornom kodu. Razlog je taj što se frekvencija procesora smanjuje prilikom izvođenja 512-bitnih operacija, što može negativno utjecati na ukupne performanse. Za promjenu novog ponašanja, omogućena je opcija "-mprefer-vector-width=512".
  • Ponašanje zastavice "-flax-vector-conversions" je slično GCC-u: implicitne vektorske konverzije bitova između cjelobrojnih i vektora s pomičnim zarezom su zabranjene. Da bi se uklonilo ovo ograničenje, predlaže se korištenje zastave
    "-flax-vector-conversions=all" što je podrazumevano.

  • Poboljšana podrška za MIPS CPU iz porodice Octeon. Dodan "octeon+" na listu važećih tipova procesora.
  • Prilikom sklapanja u WebAssembly međukod, automatski se poziva wasm-opt optimizator, ako je dostupan u sistemu.
  • Za sisteme bazirane na RISC-V arhitekturi, upotreba registara koji pohranjuju vrijednosti s pomičnim zarezom je dozvoljena u uslovnim blokovima asemblerskih inline umetaka.
  • Dodane nove zastavice kompajlera: "-fgnuc-version" za postavljanje vrijednosti verzije za "__GNUC__" i slične makroe; "-fmacro-prefix-map=OLD=NEW" za zamjenu prefiksa direktorija OLD sa NEW u makroima kao što je "__FILE__"; "-fpatchable-function-entry=N[,M]" za generiranje određenog broja NOP instrukcija prije i poslije tačke ulaza funkcije. Za RISC-V
    dodata podrška za "-ffixed-xX", "-mcmodel=medany" i "-mcmodel=medlow" zastavice.

  • Dodata podrška za atribut ‘__attribute__((target(“branch-protection=..."))), čiji je učinak sličan opciji -mbranch-zaštita.
  • Na Windows platformi, kada se specificira oznaka “-cfguard”, implementirana je zamjena provjera integriteta toka izvršavanja (Control Flow Guard) za indirektne pozive funkcija. Da biste onemogućili zamjenu provjera, možete koristiti oznaku “-cfguard-nochecks” ili modifikator “__declspec(guard(nocf))”.
  • Ponašanje atributa gnu_inline slično je GCC-u u slučajevima kada se koristi bez ključne riječi "extern".
  • Mogućnosti povezane sa OpenCL i CUDA podrškom su proširene. Dodata podrška za nove funkcije OpenMP 5.0.
  • Dodatna je opcija Standard u pomoćni program clang-format, koji vam omogućava da odredite verziju C++ standarda koji se koristi prilikom raščlanjivanja i formatiranja koda (Najnovije, Automatski, c++03, c++11, c++14, c++17, c++20).
  • Nove provjere su dodane u statički analizator: alpha.cplusplus.PlacementNew da se utvrdi da li ima dovoljno prostora za pohranu, fuchsia.HandleChecker za otkrivanje curenja vezanih za Fuchsia rukovaoce, security.insecureAPI.decodeValueOfObjCType za otkrivanje potencijalnih prekoračenja bafera kada se koristi [NSaCTCoder defjcodeV :at:] .
  • Undefined Behavior Sanitizer (UBSan) je proširio svoje provjere prekoračenja pokazivača kako bi uhvatio primjenu pomaka koji nisu nula na NULL pokazivače ili rezultirajuće dodavanje NULL pomaka pokazivača.
  • U linter zveket-uredno dodano veliki dio novih čekova.

Glavni inovacije LLVM 10.0:

  • Do okvira Attributor Dodane su nove interproceduralne optimizacije i analizatori. Predviđeno je stanje 19 različitih atributa, uključujući 12 atributa 12 LLVM IR i 7 apstraktnih atributa kao što je životnost.
  • Dodane nove matrične matematičke funkcije ugrađene u kompajler (Intrinsics), koje se zamjenjuju efikasnim vektorskim instrukcijama tokom kompilacije.
  • Brojna poboljšanja su napravljena na pozadinskim površinama za arhitekture X86, AArch64, ARM, SystemZ, MIPS, AMDGPU i PowerPC. Dodata podrška za CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 i Neoverse N1. Za ARMv8.1-M optimiziran je proces generiranja koda (na primjer, pojavila se podrška za petlje s minimalnim troškovima) i dodana je podrška za autovektorizaciju pomoću MVE ekstenzije. Poboljšana podrška za CPU MIPS Octeon. Za PowerPC je omogućena vektorizacija matematičkih potprograma pomoću biblioteke MASSV (Mathematical Acceleration SubSystem), generisanje koda je poboljšano, a pristup memoriji iz petlji je optimizovan. Za x86, promijenjeno je rukovanje tipovima vektora v2i32, v4i16, v2i16, v8i8, v4i8 i v2i8.

  • Poboljšan generator koda za WebAssembly. Dodata podrška za TLS (Thread-Local Storage) i atomic.fence instrukcije. SIMD podrška je značajno proširena. WebAssembly objektne datoteke sada imaju mogućnost korištenja potpisa funkcija s više vrijednosti.
  • Analizator se koristi prilikom obrade petlji MemorySSA, koji vam omogućava da definirate ovisnosti između različitih memorijskih operacija. MemorySSA može smanjiti vrijeme kompilacije i izvršavanja ili se može koristiti umjesto AliasSetTracker-a bez gubitka performansi.
  • LLDB debugger je značajno poboljšao podršku za DWARF v5 format. Poboljšana podrška za izgradnju sa MinGW
    i dodata je inicijalna mogućnost otklanjanja grešaka u Windows izvršnim datotekama za ARM i ARM64 arhitekture. Dodati opisi opcija koje se nude prilikom automatskog dovršavanja unosa pritiskom na tab.

  • Prošireno LLD linker mogućnosti. Poboljšana podrška za ELF format, uključujući potpunu kompatibilnost glob šablona sa GNU linkerom, dodata podrška za komprimirane sekcije za otklanjanje grešaka ".zdebug", dodano svojstvo PT_GNU_PROPERTY za definiranje odjeljka .note.gnu.property (može se koristiti u budućem Linuxu jezgra),
    Implementirani su režimi “-z noseparate-code”, “-z separate-code” i “-z separate-loadable-segments”. Poboljšana podrška za MinGW i WebAssembly.

izvor: opennet.ru

Dodajte komentar