LLVM 9.0 kompiliatoriaus rinkinio išleidimas

Po šešių mėnesių vystymosi pateiktas projekto leidimas LLVM 9.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 9.0 funkcijos apima eksperimentinio dizaino žymos pašalinimą iš tikslinės RISC-V platformos, C++ OpenCL palaikymą, galimybę padalinti programą į dinamiškai įkeliamas dalis LLD ir įdiegimą.asm goto“, naudojamas „Linux“ branduolio kode. libc++ pridėjo WASI (WebAssembly System Interface) palaikymą, o LLD pridėjo pradinį WebAssembly dinaminio susiejimo palaikymą.

Patobulinimai Clang 9.0:

  • Pridėta GCC specifinės išraiškos įgyvendinimasasm goto“, kuri leidžia pereiti nuo surinkėjo eilutinio bloko prie etiketės C kodu. Ši funkcija reikalinga norint sukurti „Linux“ branduolį „CONFIG_JUMP_LABEL=y“ režimu naudojant „Clang“ sistemose su x86_64 architektūra. Atsižvelgiant į ankstesniuose leidimuose pridėtus pakeitimus, „Linux“ branduolį dabar galima sukurti naudojant „Clang“, skirtą x86_64 architektūrai (anksčiau buvo palaikomas tik arm, aarch64, ppc32, ppc64le ir mips architektūros kūrimas). Be to, „Android“ ir „ChromeOS“ projektai jau buvo konvertuoti į „Clang“ branduolio kūrimui, o „Google“ išbando „Clang“ kaip pagrindinę platformą branduoliams kurti savo gamybinėms „Linux“ sistemoms. Ateityje branduolio kūrimo procese gali būti naudojami kiti LLVM komponentai, įskaitant LLD, llvm-objcopy, llvm-ar, llvm-nm ir llvm-objdump;
  • Pridėtas eksperimentinis C++17 naudojimo OpenCL palaikymas. Konkrečios funkcijos apima adresų erdvės atributų palaikymą, adresų erdvės konvertavimo blokavimą naudojant tipo perdavimo operatorius, vektorių tipų teikimą, kaip OpenCL for C, konkrečių OpenCL tipų buvimą vaizdams, įvykiams, kanalams ir kt.
  • Pridėtos naujos kompiliatoriaus vėliavėlės „-ftime-trace“ ir „-ftime-trace-granularity=N“, kad būtų sukurta ataskaita apie įvairių priekinės sistemos (analizavimas, inicijavimas) ir užpakalinės programos (optimizavimo etapai) vykdymo laiką. Ataskaita išsaugoma json formatu, suderinamu su chrome://tracing ir speedscope.app;
  • Pridėtas „__declspec(allocator)“ specifikatoriaus apdorojimas ir pridedamos derinimo informacijos generavimas, leidžiantis stebėti atminties suvartojimą „Visual Studio“ aplinkoje;
  • C kalbai buvo pridėta makrokomandos „__FILE_NAME__“ palaikymas, kuris primena makrokomandą „__FILE__“, bet apima tik failo pavadinimą be viso kelio;
  • C++ išplėtė adresų erdvės atributų palaikymą, kad apimtų įvairias C++ funkcijas, įskaitant parametrų ir argumentų šablonus, nuorodų tipus, grąžinimo tipo išvadą, objektus, automatiškai sugeneruotas funkcijas, įtaisytuosius operatorius ir kt.
  • Su OpenCL, OpenMP ir CUDA palaikymu susijusios galimybės buvo išplėstos. Tai apima pradinį netiesioginio integruotų OpenCL funkcijų įtraukimo palaikymą (pridėta „-fdeclare-opencl-builtins“ vėliavėlė), įdiegtas cl_arm_integer_dot_product plėtinys ir išplėsti diagnostikos įrankiai;
  • Patobulintas statinio analizatoriaus darbas, papildyta statinės analizės atlikimo dokumentacija. Pridėtos vėliavėlės, rodančios galimus tikrinimo modulius ir palaikomas parinktis („-analyzer-checker[-option]-help“, „-analyzer-checker[-option]-help-alpha“ ir „-analyzer-checker[-option]-help“ " -programuotojas"). Pridėta vėliavėlė „-analyzer-werror“, kad įspėjimai būtų traktuojami kaip klaidos.
    Pridėta naujų patvirtinimo režimų:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling, siekiant nustatyti nesaugią darbo su buferiais praktiką;
    • osx.MIGChecker ieškoti MIG (Mach Interface Generator) skambučių taisyklių pažeidimų;
    • optin.osx.OSObjectCStyleCast, kad surastumėte neteisingas XNU libkern objektų konversijas;
    • apiModeling.llvm su modeliavimo tikrinimo funkcijų rinkiniu, leidžiančiu aptikti klaidas LLVM kodų bazėje;
    • Stabilizuotas kodas neinicijuotiems C++ objektams tikrinti (UninitializedObject pakete optin.cplusplus);
  • „Clang-format“ programa papildė kodo formatavimo C# kalba palaikymą ir palaiko „Microsoft“ naudojamą kodo formatavimo stilių;
  • clang-cl, alternatyvi komandų eilutės sąsaja, kuri užtikrina parinkčių lygio suderinamumą su cl.exe kompiliatoriumi, įtrauktu į „Visual Studio“, pridėjo euristiką, skirtą neegzistuojantiems failams laikyti komandų eilutės parinktimis ir rodyti atitinkamą įspėjimą (pvz., paleidus "clang-cl /diagnostic :caret /c test.cc");
  • Didelė dalis naujų patikrų buvo pridėta, kad būtų tvarkinga, įskaitant patikras, būdingas OpenMP API;
  • Išplėstas serverio galimybes skambėjo (Clang Server), kuriame pagal numatytuosius nustatymus įjungtas fono indekso kūrimo režimas, pridėtas kontekstinių veiksmų su kodu palaikymas (kintamųjų gavimas, automatinių ir makrokomandų apibrėžimų išplėtimas, pašalintų eilučių konvertavimas į nepakeičiamas eilutes), galimybė rodyti įspėjimai iš Clang-tidy, išplėsta klaidų diagnostika antraštės failuose ir pridėta galimybė rodyti informaciją apie tipo hierarchiją;

pagrindinis naujoves LLVM 9.0:

  • Prie LLD linkerio buvo pridėta eksperimentinė skaidymo funkcija, leidžianti padalinti vieną programą į kelias dalis, kurių kiekviena yra atskirame ELF faile. Ši funkcija leidžia paleisti pagrindinę programos dalį, kuri pagal poreikį įkels kitus komponentus veikimo metu (pvz., integruotą PDF peržiūros programą galite atskirti į atskirą failą, kuris bus įkeltas tik vartotojui atidarius PDF failas).

    LLD Linker iškeltas į pirmą planą į būseną, tinkamą susieti Linux branduolį arm32_7, arm64, ppc64le ir x86_64 architektūroms.
    Naujos parinktys "-" (išvestis į stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt“ ir „-z common-page-size“. AArch64 architektūrai buvo pridėtos PTI (šakos tikslinio rodiklio) ir PAC (rodiklio autentifikavimo kodo) instrukcijos. MIPS, RISC-V ir PowerPC platformų palaikymas buvo žymiai patobulintas. Pridėtas pradinis WebAssembly dinaminio susiejimo palaikymas;

  • libc++ įgyvendinta Funkcijos ssize, std::is_constant_evaluated, std::midpoint ir std::lerp, metodai "front" ir "back" buvo įtraukti į std::span, buvo pridėti tipų atributai std::is_unbounded_array ir std::is_bounded_array , std galimybės buvo išplėstos: :atomic. GCC 4.9 palaikymas buvo nutrauktas (gali būti naudojamas su GCC 5.1 ir naujesnėmis versijomis). Pridėta parama WASI (WebAssembly System Interface, sąsaja, skirta naudoti WebAssembly už naršyklės ribų);
  • Pridėta naujų optimizacijų. Kai kuriose situacijose įgalintas memcmp skambučių konvertavimas į bcmp. Įgyvendintas diapazono tikrinimo praleidimas peršokimo lentelėse, kuriose nepasiekiami apatiniai jungiklių blokai arba kai nenaudojamos instrukcijos, pavyzdžiui, iškviečiant funkcijas, kurių tipas void;
  • RISC-V architektūros užpakalinė dalis buvo stabilizuota, kuri nebėra eksperimentinė ir sukurta pagal numatytuosius nustatymus. Teikia visą kodo generavimo palaikymą RV32I ir RV64I instrukcijų rinkinio variantams su MAFDC plėtiniais;
  • Buvo atlikta daugybė X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ir PowerPC architektūrų backends patobulinimų. Pavyzdžiui, architektūrai
    AArch64 pridėjo SVE2 (Scalable Vector Extension 2) ir MTE (Memory Tagging Extensions) instrukcijų palaikymą; ARM backend buvo pridėtas Armv8.1-M architektūros palaikymas ir MVE (M-Profile Vector Extension) plėtinys. GFX10 (Navi) architektūros palaikymas buvo pridėtas prie AMDGPU sistemos, funkcijų iškvietimo galimybės įjungtos pagal numatytuosius nustatymus ir suaktyvintas kombinuotas leidimas VKD (Data-Parallel Primitives).

  • LLDB derinimo priemonėje dabar yra spalvų paryškinimas atgaliniams pėdsakams ir papildomas DWARF4 debug_types ir DWARF5 debug_info blokų palaikymas;
  • Objektų ir vykdomųjų failų palaikymas COFF formatu buvo pridėtas prie llvm-objcopy ir llvm-strip paslaugų.

Šaltinis: opennet.ru

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