Liberigo de la kompililo LLVM 9.0

Post ses monatoj da evoluo prezentita projekteldono LLVM 9.0 — GCC-kongruaj iloj (kompiloj, optimumigiloj kaj kodgeneratoroj), kompilantaj programojn en mezan bitokodon de RISC-similaj virtualaj instrukcioj (malaltnivela virtuala maŝino kun plurnivela optimumigo-sistemo). La generita pseŭdokodo povas esti konvertita uzante JIT-kompililon en maŝininstrukciojn rekte dum programekzekuto.

Novaj funkcioj de LLVM 9.0 inkluzivas la forigon de la eksperimenta desegna etikedo de la cela platformo RISC-V, C++-subteno por OpenCL, la kapablon dividi programon en dinamike ŝarĝitajn partojn en LLD, kaj la efektivigon de la "asm goto", uzata en la Linukso-kernkodo. libc++ aldonis subtenon por WASI (WebAssembly System Interface), kaj LLD aldonis komencan subtenon por WebAssembly dinamika ligado.

Plibonigoj en Clang 9.0:

  • Aldonita efektivigo de la GCC-specifa esprimo "asm goto", kiu ebligas al vi moviĝi de asemblelo enlinia bloko al etikedo en C-kodo. Ĉi tiu funkcio estas postulata por konstrui la Linuksan kernon en la "CONFIG_JUMP_LABEL=y" reĝimo uzante Clang sur sistemoj kun x86_64 arkitekturo. Konsiderante la ŝanĝojn aldonitajn en antaŭaj eldonoj, la Linukso-kerno nun povas esti konstruita en Clang por la x86_64-arkitekturo (antaŭe nur konstruaĵo por la brako, aarch64, ppc32, ppc64le kaj mips-arkitekturoj estis subtenata). Plie, Android kaj ChromeOS-projektoj jam estis konvertitaj por uzi Clang por kernkonstruado, kaj Google provas Clang kiel la ĉefa platformo por konstrui kernojn por siaj produktaj Linukso-sistemoj. En la estonteco, aliaj LLVM-komponentoj povas esti uzitaj en la kerna konstruprocezo, inkluzive de LLD, llvm-objcopy, llvm-ar, llvm-nm, kaj llvm-objdump;
  • Aldonita eksperimenta subteno por uzi C++ 17 en OpenCL. Specifaj ecoj inkludas subtenon por adresspacaj atributoj, blokante adresspackonverton per tipgisadfunkciigistoj, zorgaĵon de vektorspecoj kiel en OpenCL por C, la ĉeeston de specifaj OpenCL-tipoj por bildoj, okazaĵoj, kanaloj, ktp.
  • Aldonitaj novaj kompililoj "-ftime-trace" kaj "-ftime-trace-granularity=N" por generi raporton pri la ekzekuttempo de diversaj stadioj de la fasado (analizado, inicialigo) kaj backend (optimumigo-stadioj). La raporto estas konservita en formato json, kongrua kun chrome://tracing kaj speedscope.app;
  • Aldonita prilaborado de la "__declspec(allocator)" specifilo kaj generacio de akompanaj sencimigaj informoj, kiuj ebligas al vi kontroli la konsumon de memoro en la medio Visual Studio;
  • Por la C-lingvo, subteno estis aldonita por la makroo “__FILE_NAME__”, kiu similas la makroon “__FILE__”, sed inkluzivas nur la dosiernomon sen la plena vojo;
  • C++ vastigis subtenon por adresspacaj atributoj por kovri diversajn C++-ecojn, inkluzive de parametro- kaj argumentpadronoj, referencspecoj, revenspeca inferenco, objektoj, aŭtomate generitaj funkcioj, enkonstruitaj funkciigistoj, kaj pli.
  • La kapabloj asociitaj kun subteno por OpenCL, OpenMP kaj CUDA estis vastigitaj. Ĉi tio inkluzivas komencan subtenon por implica inkludo de enkonstruitaj OpenCL-funkcioj (la flago "-fdeclare-opencl-builtins" estis aldonita), la etendo cl_arm_integer_dot_product estis efektivigita, kaj diagnozaj iloj estis vastigitaj;
  • La laboro de la senmova analizilo estis plibonigita kaj dokumentado pri farado de senmova analizo estis aldonita. Aldonitaj flagoj por montri disponeblajn kontrolajn modulojn kaj subtenatajn opciojn ("-analyzer-checker[-opcio]-helpo", "-analyzer-checker[-opcio]-help-alpha" kaj "-analyzer-checker[-opcio]-helpo ”-programisto”). Aldonita flago "-analyzer-werror" por trakti avertojn kiel erarojn.
    Aldonitaj novaj konfirmreĝimoj:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling por identigi nesekurajn praktikojn por labori kun bufroj;
    • osx.MIGChecker por serĉi malobservojn de MIG (Mach Interface Generator) alvokaj reguloj;
    • optin.osx.OSObjectCStyleCast por trovi malĝustajn XNU-libkern-objektajn konvertiĝojn;
    • apiModeling.llvm kun aro de modelaj kontrolaj funkcioj por detekti erarojn en la LLVM-kodbazo;
    • Stabiligita kodo por kontroli neinicialigitajn C++-objektojn (UninitializedObject en la pako optin.cplusplus);
  • La clang-formata ilo aldonis subtenon por formatado de kodo en la lingvo C# kaj provizas subtenon por la koda formatstilo uzata de Microsoft;
  • clang-cl, alternativa komandlinia interfaco kiu disponigas opcionivelan kongruecon kun la cl.exe kompililo inkluzivita en Visual Studio, aldonis heŭristikojn por trakti neekzistantajn dosierojn kiel komandliniajn opciojn kaj montri respondan averton (ekzemple, kiam ruliĝas "clang-cl /diagnostic :caret /c test.cc");
  • Granda parto de novaj ĉekoj estis aldonita al linter clang-tidy, inkluzive de aldonitaj ĉekoj specifaj por la OpenMP API;
  • Vastigita servilaj kapabloj clangd (Clang Server), en kiu la fona indeksa konstrureĝimo estas ebligita defaŭlte, subteno por kontekstaj agoj kun kodo estis aldonita (varia rehavigo, vastiĝo de aŭtomataj kaj makrodifinoj, konvertiĝo de eskapintaj ŝnuroj al neeskapitaj), la kapablo montri avertoj de Clang-tidy, vastigis diagnozon de eraroj en kapdosieroj kaj aldonis la kapablon montri informojn pri la tiphierarkio;

Ĉefa novigoj LLVM 9.0:

  • Eksperimenta partiga funkcio estis aldonita al la LLD-ligilo, kiu permesas vin dividi unu programon en plurajn partojn, ĉiu el kiuj troviĝas en aparta ELF-dosiero. Ĉi tiu funkcio ebligas al vi lanĉi la ĉefan parton de la programo, kiu ŝarĝos aliajn komponantojn laŭbezone dum operacio (ekzemple, vi povas apartigi la enkonstruitan PDF-rigardilon en apartan dosieron, kiu ŝargiĝos nur kiam la uzanto malfermas la PDF-on. dosiero).

    LLD Linker alportita al la antaŭo al stato taŭga por ligi la Linuksan kernon por arm32_7, arm64, ppc64le kaj x86_64 arkitekturoj.
    Novaj opcioj "-" (eligo al stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" kaj "-z komuna-paĝgrandeco". Por la AArch64-arkitekturo, subteno por instrukcioj BTI (Branch Target Indicator) kaj PAC (Pointer Authentication Code) estis aldonita. Subteno por MIPS, RISC-V kaj PowerPC-platformoj estis signife plibonigita. Aldonita komenca subteno por dinamika ligo por WebAssembly;

  • En libc++ efektivigita funkcioj ssize, std::is_constant_evaluated, std::midpoint kaj std::lerp, metodoj "front" kaj "back" estis aldonitaj al std::span, atributoj de tipoj std::is_unbounded_array kaj std::is_bounded_array estis aldonitaj. , std-kapabloj estis vastigitaj: :atomic. Subteno por GCC 4.9 estis nuligita (uzeblas kun GCC 5.1 kaj pli novaj eldonoj). Aldonita subteno WASI (WebAssembly System Interface, interfaco por uzi WebAssembly ekster la retumilo);
  • Novaj optimumigoj estis aldonitaj. Ebligita konvertiĝo de memcmp-vokoj al bcmp en iuj situacioj. Efektivigita preterlaso de intervalkontrolado por saltotabeloj en kiuj pli malaltaj ŝaltilblokoj estas neatingeblaj aŭ kiam instrukcioj ne estas uzitaj, ekzemple, dum vokado de funkcioj kun tipo void;
  • La backend por la RISC-V-arkitekturo estis stabiligita, kiu ne plu estas poziciigita kiel eksperimenta kaj estas konstruita defaŭlte. Provizas plenan kodon-generadsubtenon por RV32I kaj RV64I instrukciaĵaro variaĵoj kun MAFDC etendaĵoj;
  • Multaj plibonigoj estis faritaj al backends por X86, AArch64, ARM, SystemZ, MIPS, AMDGPU kaj PowerPC-arkitekturoj. Ekzemple, por arkitekturo
    AArch64 aldonis subtenon por SVE2 (Scalable Vector Extension 2) kaj MTE (Memory Tagging Extensions) instrukcioj; en la ARM-backend, subteno por la Armv8.1-M-arkitekturo kaj la MVE (M-Profile Vector Extension) etendo estis aldonita. Subteno por la GFX10 (Navi) arkitekturo estis aldonita al la AMDGPU-backend, funkcio-vokaj kapabloj estas ebligitaj defaŭlte, kaj kombinita enirpermesilo estas aktivigita. DPP (Datum-Paralelaj Primitivoj).

  • La LLDB-sencimigilo nun havas kolormarkigon por retrospuroj kaj aldonis subtenon por la DWARF4 debug_types kaj DWARF5 debug_info-blokoj;
  • Subteno por objektoj kaj ruleblaj dosieroj en COFF-formato estis aldonita al la llvm-objcopy kaj llvm-strip iloj.

fonto: opennet.ru

Aldoni komenton