LLVM 10.0 kompiliatoriaus rinkinio išleidimas

Po šešių mėnesių vystymosi pateiktas projekto leidimas LLVM 10.0 - Su GCC suderinami įrankiai (kompiliatoriai, optimizatoriai ir kodų generatoriai), kurie kompiliuoja programas į tarpinį RISC tipo virtualių komandų bitų kodą (žemo lygio virtuali mašina su kelių lygių optimizavimo sistema). Sukurtą pseudo kodą JIT kompiliatorius gali konvertuoti į mašinos komandas iškart programos vykdymo metu.

Naujos LLVM 10.0 funkcijos apima C++ koncepcijų palaikymą, nebepaleidžia Clang kaip atskiro proceso, CFG (kontrolės srauto apsaugos) patikrų palaikymas, skirtas Windows, ir naujų procesoriaus galimybių palaikymas.

Patobulinimai Clang 10.0:

  • Pridėtas palaikymas „koncepcijos“, C++ šablono plėtinys, kuris bus įtrauktas į kitą standartą, kodiniu pavadinimu C++2a (įjungtas vėliavėle -std=c++2a).
    Sąvokos leidžia apibrėžti šablono parametrų reikalavimų rinkinį, kuris kompiliavimo metu apriboja argumentų, kuriuos galima priimti kaip šablono parametrus, rinkinį. Šios sąvokos gali būti naudojamos siekiant išvengti loginių neatitikimų tarp šablone naudojamų duomenų tipų savybių ir įvesties parametrų duomenų tipo savybių.

    šabloną
    sąvoka LygybėComparable = reikalauja(T a, T b) {
    { a == b } -> std::bulio vertė;
    { a != b } -> std::bulio vertė;
    };

  • Pagal numatytuosius nustatymus atskiro proceso („clang -cc1“), kuriame atliekamas kompiliavimas, paleidimas sustabdomas. Kompiliavimas dabar atliekamas pagrindiniame procese, o parinktis „-fno-integrated-cc1“ gali būti naudojama norint atkurti seną elgesį.
  • Nauji diagnostikos režimai:
    • „-Wc99-designator“ ir „-Wreorder-init-list“ įspėja nenaudoti C99 iniciatorių C++ režimu tais atvejais, kai jie teisingi C99, bet ne C++20.
    • "-Wsizeof-array-div" – užfiksuoja tokias situacijas kaip "int arr[10]; …sizeof(arr) / sizeof(short)...“ (turėtų būti „sizeof(arr) / sizeof(int)“).
    • „-Wxor-used-as-po“ – įspėja nenaudoti konstrukcijų, tokių kaip „^“ (xor) operatorius operacijose, kurias galima supainioti su eksponencija (2^16).
    • „-Wfinal-dtor-non-final-class“ – įspėja apie klases, kurios nėra pažymėtos „final“ specifikacija, bet turi destruktorių su „final“ atributu.
    • „-Wtautological-bitwise-pagre“ yra įspėjimų grupė, skirta diagnozuoti tautologinius bitų operacijos ir konstantos palyginimus ir nustatyti visada teisingus palyginimus, kuriuose bitų ARBA operacija taikoma neneigiamam skaičiui.
    • „-Wbitwise-conditional-parenthes“ įspėja apie problemas maišant loginius operatorius AND (&) ir OR (|) su sąlyginiu operatoriumi (?:).
    • „-Wmisleading-indentation“ yra to paties pavadinimo patikros iš GCC analogas, kuris įspėja apie įtraukas posakius, tarsi jie būtų bloko if/else/for/while dalis, bet iš tikrųjų jie nėra įtraukti į šį bloką. .
    • Nurodžius „-Wextra“, įjungiamas „-Wdeprecated-copy“ patikrinimas, įspėjantis apie konstruktorių naudojimą
      „perkelti“ ir „kopijuoti“ klasėse su aiškiu destruktoriaus apibrėžimu.

    • Patikrinimai „-Wtautological-overlap-pagre“, „-Wsizeof-pointer-div“, „-Wtautological-palyginti“, „-Wrange-loop-analysis“ buvo išplėsti.
    • Patikros „-Wbitwise-op-parenthes“ ir „-Wlogical-op-parenthes“ pagal numatytuosius nustatymus yra išjungtos.
  • C ir C++ koduose rodyklės aritmetinės operacijos leidžiamos tik masyvuose. Neapibrėžtos elgsenos valymo priemonė „-fsanitize=pointer-overflow“ režimu dabar užfiksuoja tokius atvejus, kaip nulinio poslinkio pridėjimas prie nulinės žymeklio arba nulio žymeklio sukūrimas atimant sveikąjį skaičių iš nenulinės rodyklės.
  • Režimas „-fsanitize=implicit-conversion“ (netiesioginės konversijos dezinfekavimo priemonė) pritaikytas nustatyti didinimo ir mažinimo operacijų problemas, susijusias su tipais, kurių bitų dydis yra mažesnis nei „int“ tipo.
  • Pasirinkus x86 tikslines architektūras „-march=skylake-avx512“, „-march=icelake-client“, „-march=icelake-server“, „-march=cascadelake“ ir „-march=cooperlake“ pagal numatytuosius nustatymus vektorizuotame kodas nustojo naudoti 512 bitų zmm registrus, išskyrus tiesioginį jų nurodymą šaltinio kode. Priežastis ta, kad procesoriaus dažnis mažėja atliekant 512 bitų operacijas, o tai gali neigiamai paveikti bendrą našumą. Norint pakeisti naują veikimą, pateikiama parinktis „-mprefer-vector-width=512“.
  • Vėliavos „-linų vektoriaus konversijos“ veikimas yra panašus į GCC: numanomos vektoriaus bitų konversijos tarp sveikųjų skaičių ir slankiojo kablelio vektorių yra draudžiamos. Siekiant panaikinti šį apribojimą, siūloma naudoti vėliavėlę
    „-flax-vector-conversions=all“, kuris yra numatytasis.

  • Pagerintas Octeon šeimos MIPS procesorių palaikymas. Į galiojančių procesorių tipų sąrašą įtraukta „octeon+“.
  • Sumontuojant į tarpinį „WebAssembly“ kodą, automatiškai iškviečiamas „wasm-opt“ optimizatorius, jei toks yra sistemoje.
  • Sistemose, pagrįstose RISC-V architektūra, slankiojo kablelio reikšmes kaupiančius registrus leidžiama naudoti sąlyginiuose asemblerio įdėklų blokuose.
  • Pridėtos naujos kompiliatoriaus vėliavėlės: „-fgnuc-version“, kad būtų nustatyta „__GNUC__“ ir panašių makrokomandų versijos reikšmė; "-fmacro-prefix-map=OLD=NEW", kad pakeistumėte katalogo priešdėlį OLD į NEW makrokomandose, pvz., "__FILE__"; „-fpatchable-function-entry=N[,M]“, kad sugeneruotų tam tikrą skaičių NOP instrukcijų prieš ir po funkcijos įvesties taško. Skirta RISC-V
    pridėtas vėliavėlių „-ffixed-xX“, „-mcmodel=medany“ ir „-mcmodel=medlow“ palaikymas.

  • Pridėtas atributo ‘__attribute__((target(“branch-protection=...”)))) palaikymas, kurio poveikis panašus į parinkties -šakų apsauga.
  • „Windows“ platformoje, nurodant vėliavėlę „-cfguard“, netiesioginių funkcijų iškvietimų vykdymo srauto vientisumo patikros (Control Flow Guard) pakeičiamos. Norėdami išjungti čekio pakeitimą, galite naudoti vėliavėlę „-cfguard-nochecks“ arba modifikatorių „__declspec(guard(nocf))“.
  • Atributo gnu_inline elgesys yra panašus į GCC tais atvejais, kai jis naudojamas be raktinio žodžio "extern".
  • Su OpenCL ir CUDA palaikymu susijusios galimybės buvo išplėstos. Pridėtas naujų OpenMP 5.0 funkcijų palaikymas.
  • „Clang-format“ priemonėje buvo pridėta standartinė parinktis, leidžianti nustatyti C++ standarto versiją, naudojamą analizuojant ir formatuojant kodą (naujausias, automatinis, c++03, c++11, c++14, c++17, c++20 ).
  • Prie statinio analizatoriaus pridėtos naujos patikros: alpha.cplusplus.PlacementNew, siekiant nustatyti, ar yra pakankamai vietos saugykloje, fuchsia.HandleChecker, kad aptiktų nuotėkius, susijusius su Fuchsia tvarkytojais, security.insecureAPI.decodeValueOfObjCType, kad būtų galima aptikti galimus buferio perpildymus naudojant [NSCoder decodealueyV. :at:] .
  • „Undefined Behavior Sanitizer“ (UBSan) išplėtė savo rodyklės perpildymo patikras, kad užfiksuotų nulinių poslinkių taikymą NULL rodyklėms arba dėl to pridėtą NULL rodyklės poslinkį.
  • Tvarkingas pridėta didelė dalis naujų čekių.

pagrindinis naujoves LLVM 10.0:

  • Į karkasą Atributorius Pridėta naujų tarpprocedūrinių optimizacijų ir analizatorių. Numatoma 19 skirtingų atributų būsena, įskaitant 12 atributų 12 LLVM IR ir 7 abstrakčius požymius, tokius kaip gyvumas.
  • Pridėtos naujos matricinės matematinės funkcijos, integruotos į kompiliatorių (Esminės savybės), kurios kompiliavimo metu pakeičiamos efektyviomis vektorinėmis instrukcijomis.
  • Buvo atlikta daugybė X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ir PowerPC architektūrų backends patobulinimų. Pridėtas procesoriaus palaikymas
    Cortex-A65, Cortex-A65AE, Neoverse E1 ir Neoverse N1. ARMv8.1-M kodo generavimo procesas buvo optimizuotas (pavyzdžiui, atsirado palaikymas kilpoms su minimaliomis pridėtinėmis sąnaudomis), o automatinio vektorizavimo palaikymas buvo pridėtas naudojant MVE plėtinį. Patobulintas CPU MIPS Octeon palaikymas. „PowerPC“ įgalintas matematinių paprogramių vektorizavimas naudojant MASSV (matematinio pagreičio posistemio) biblioteką, patobulintas kodo generavimas ir optimizuota prieiga prie atminties iš kilpų. Naudojant x86, vektorių tipų v2i32, v4i16, v2i16, v8i8, v4i8 ir v2i8 tvarkymas buvo pakeistas.

  • Patobulintas „WebAssembly“ kodų generatorius. Pridėtas TLS (Thread-Local Storage) ir atomic.fence instrukcijų palaikymas. SIMD palaikymas buvo žymiai išplėstas. WebAssembly objektų failai dabar turi galimybę naudoti kelių reikšmių funkcijų parašus.
  • Analizatorius naudojamas apdorojant kilpas AtmintisSSA, kuri leidžia apibrėžti priklausomybes tarp skirtingų atminties operacijų. MemorySSA gali sumažinti kompiliavimo ir vykdymo laiką arba gali būti naudojama vietoj AliasSetTracker neprarandant našumo.
  • LLDB derinimo priemonė žymiai pagerino DWARF v5 formato palaikymą. Pagerintas kūrimo su MinGW palaikymas
    ir pridėta pradinė galimybė derinti Windows vykdomuosius failus ARM ir ARM64 architektūroms. Pridėtas parinkčių, siūlomų automatiškai užbaigiant įvestį paspaudus skirtuką, aprašymai.

  • Išplėstas LLD linkerio galimybės. Pagerintas ELF formato palaikymas, įskaitant visiško globos šablonų suderinamumo su GNU linkeriu užtikrinimą, suglaudintų derinimo sekcijų „.zdebug“ palaikymą, PT_GNU_PROPERTY nuosavybės pridėjimą, kad būtų galima apibrėžti .note.gnu.property sekciją (gali būti naudojama ateityje Linux branduoliai),
    Įdiegti režimai „-z noseparate-code“, „-z atskiras kodas“ ir „-z atskiri įkeliami segmentai“. Pagerintas MinGW ir WebAssembly palaikymas.

Šaltinis: opennet.ru

Добавить комментарий