LLVM 9.0 konpiladore-multzoaren kaleratzea

Sei hilabeteko garapenaren ostean aurkeztu proiektuaren kaleratzea LLVM 9.0 β€” GCC-rekin bateragarriak diren tresnak (konpilatzaileak, optimizatzaileak eta kode-sortzaileak), programak RISC moduko instrukzio birtualen bitarteko bitkodean konpilatzea (maila baxuko makina birtuala maila anitzeko optimizazio-sistema duena). Sortutako pseudokodea JIT konpiladore bat erabiliz makinen jarraibideetan bihur daiteke zuzenean programa exekutatzen den unean.

LLVM 9.0-ren ezaugarri berrien artean, diseinu esperimentalaren etiketa xede RISC-V plataformatik kentzea, OpenCLrako C++ euskarria, programa bat dinamikoki kargatutako zatietan zatitzeko gaitasuna eta LLD-en ezarpena.asm goto", Linux kernel kodean erabiltzen da. libc++-k WASI (WebAssembly System Interface) laguntza gehitu zuen eta LLD-k WebAssembly lotura dinamikorako hasierako euskarria gehitu zuen.

Hobekuntzak Clang 9.0-n:

  • Gehituta GCC-ren berariazko esamoldearen ezarpena "asm goto", eta horrek aukera ematen dizu muntatzaile lerroko bloke batetik C kodean etiketa batera pasatzeko. Ezaugarri hau beharrezkoa da Linux nukleoa "CONFIG_JUMP_LABEL=y" moduan eraikitzeko Clang erabiliz x86_64 arkitektura duten sistemetan. Aurreko bertsioetan gehitutako aldaketak kontuan hartuta, Linux nukleoa orain Clang-en eraiki daiteke x86_64 arkitekturarako (lehen arm, aarch64, ppc32, ppc64le eta mips arkitekturarako soilik eraikitzen zen onartzen). Gainera, Android eta ChromeOS proiektuak dagoeneko bihurtu dira Clang nukleoa eraikitzeko erabiltzeko, eta Google Clang probatzen ari da bere ekoizpen Linux sistemetarako nukleoak eraikitzeko plataforma nagusi gisa. Etorkizunean, beste LLVM osagai batzuk erabil daitezke nukleoa eraikitzeko prozesuan, besteak beste, LLD, llvm-objcopy, llvm-ar, llvm-nm eta llvm-objdump;
  • OpenCL-en C++17 erabiltzeko laguntza esperimentala gehitu da. Ezaugarri espezifikoak honako hauek dira: helbide-espazioaren atributuetarako laguntza, helbide-espazioen bihurketa blokeatzea mota casting-operadoreen arabera, OpenCL-n C-rako bektore-motak hornitzea, OpenCL mota espezifikoen presentzia irudiak, gertaerak, kanalak, etab.
  • "-ftime-trace" eta "-ftime-trace-granularity=N" konpilatzaile marka berriak gehitu dira frontend-aren (analisia, hasieratzea) eta backend-a (optimizazio faseak) exekuzio-denborari buruzko txostena sortzeko. Txostena json formatuan gordetzen da, chrome://tracing eta speedscope.app-ekin bateragarria;
  • "__declspec(allocator)" zehaztatzailearen prozesaketa gehitu da eta harekin batera arazketa-informazioa sortzea, Visual Studio ingurunean memoria-kontsumoa kontrolatzeko aukera ematen duena;
  • C hizkuntzarako, "__FILE_NAME__" makroaren laguntza gehitu da, "__FILE__" makroaren antza duena, baina fitxategi-izena soilik barne hartzen du bide osoa gabe;
  • C++-k helbide-espazioen atributuetarako laguntza zabaldu du C++-ren hainbat ezaugarri estaltzeko, besteak beste, parametro eta argumentu ereduak, erreferentzia motak, itzulera motaren inferentzia, objektuak, automatikoki sortutako funtzioak, operadore integratuak eta abar.
  • OpenCL, OpenMP eta CUDA laguntzarekin lotutako gaitasunak zabaldu dira. Honek hasierako euskarria barne hartzen du integratutako OpenCL funtzioak inplizituki sartzeko (β€œ-fdeclare-opencl-builtins” bandera gehitu da), cl_arm_integer_dot_product luzapena inplementatu da eta diagnostiko tresnak zabaldu dira;
  • Analizatzaile estatikoen lana hobetu da eta analisi estatikoa egiteko dokumentazioa gehitu da. Markak gehitu dira erabilgarri dauden egiaztatzaile-moduluak eta onartzen diren aukerak erakusteko ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" eta "-analyzer-checker[-option]-help ”-garatzailea”). "-analyzer-werror" marka gehitu da abisuak akats gisa tratatzeko.
    Egiaztapen-modu berriak gehitu dira:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling bufferekin lan egiteko praktika ez-seguruak identifikatzeko;
    • osx.MIGChecker MIG (Mach Interface Generator) deien arauen urraketak bilatzeko;
    • optin.osx.OSObjectCStyleCast XNU libkern objektu bihurketa okerrak aurkitzeko;
    • apiModeling.llvm LLVM kode-oinarrian akatsak detektatzeko modelizazioa egiaztatzeko funtzio multzo batekin;
    • Hasieratu gabeko C++ objektuak egiaztatzeko kode egonkortua (UninitializedObject optin.cplusplus paketean);
  • Clang-format utilitateak C# hizkuntzan kodea formateatzeko laguntza gehitu du eta Microsoft-ek erabiltzen duen kodea formateatzeko estiloari eusten dio;
  • clang-cl, Visual Studio-n sartutako cl.exe konpiladorearekin aukera-mailako bateragarritasuna eskaintzen duen komando-lerroko interfaze alternatibo batek heuristikoak gehitu ditu existitzen ez diren fitxategiak komando-lerroko aukera gisa tratatzeko eta dagokion abisua bistaratzeko (adibidez, "clang-cl /diagnostic :caret /c test.cc" exekutatzen denean;
  • Linter clang-tidy-ra egiaztapen berrien zati handi bat gehitu da, OpenMP APIrako berariazko egiaztapenak barne;
  • Zabaldua zerbitzariaren gaitasunak clangd (Clang Server), zeinetan atzeko planoko indizea eraikitzeko modua lehenespenez gaituta dagoen, kodea duten testuinguruko ekintzetarako laguntza gehitu da (aldagaiak berreskuratzea, definizio automatikoen eta makroen hedapena, iheseko kateak ihes gabekoen bihurtzea), bistaratzeko gaitasuna. Clang-tidy-ren abisuak, goiburuko fitxategietako akatsen diagnostikoa zabaldu zuen eta mota hierarkiari buruzko informazioa bistaratzeko gaitasuna gehitu zuen;

Nagusia berrikuntzak LLVM 9.0:

  • LLD estekatzaileari partizio-eginbide esperimental bat gehitu zaio, programa bat hainbat zatitan banatzeko aukera ematen duena, eta horietako bakoitza ELF fitxategi bereizi batean dago. Ezaugarri honek programaren zati nagusia abiarazteko aukera ematen du, funtzionamenduan behar den moduan beste osagai batzuk kargatuko dituena (adibidez, integratutako PDF ikuslea aparteko fitxategi batean bereiz dezakezu, erabiltzaileak PDFa irekitzen duenean soilik kargatuko dena. fitxategia).

    LLD Lokatzailea lehen mailara ekarri Arm32_7, arm64, ppc64le eta x86_64 arkitekturetarako Linux nukleoa lotzeko egokia den egoera batera.
    Aukera berriak "-" (irteera stdout-era), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", "- z ifunc-noplt" eta "-z common-page-size". AArch64 arkitekturarako, BTI (Branch Target Indicator) eta PAC (Pointer Authentication Code) argibideetarako laguntza gehitu da. MIPS, RISC-V eta PowerPC plataformetarako euskarria nabarmen hobetu da. WebAssembly-rako lotura dinamikorako hasierako laguntza gehitu da;

  • libc++-n ezarrita funtzioak ssize, std::is_constant_evaluated, std::midpoint eta std::lerp, "front" eta "back" metodoak gehitu dira std::span, std::is_unbounded_array eta std::is_bounded_array motako atributuak gehitu dira. , std gaitasunak zabaldu dira: :atomic. GCC 4.9rako laguntza eten egin da (GCC 5.1 eta bertsio berriagoekin erabil daiteke). Laguntza gehitu WASI (WebAssembly System Interface, nabigatzailetik kanpo WebAssembly erabiltzeko interfazea);
  • Optimizazio berriak gehitu dira. Zenbait egoeratan, memcmp deiak bcmp bihurtzea gaitu da. Beheko etengailu-blokeak eskuraezinak direnean edo instrukzioak erabiltzen ez direnean, adibidez, void motako funtzioei deitzean, barruti-egiaztapenaren ezabatzea inplementatu da;
  • RISC-V arkitekturaren backend-a egonkortu da, jada esperimental gisa kokatzen ez dena eta lehenespenez eraikita dago. MAFDC luzapenekin RV32I eta RV64I instrukzio multzoen aldaeretarako kodea sortzeko laguntza osoa eskaintzen du;
  • Hobekuntza ugari egin dira X86, AArch64, ARM, SystemZ, MIPS, AMDGPU eta PowerPC arkitekturaren backendetan. Adibidez, arkitekturarako
    AArch64-k SVE2 (Scalable Vector Extension 2) eta MTE (Memory Tagging Extensions) argibideetarako laguntza gehitu zuen; ARM backend-ean, Armv8.1-M arkitekturarako eta MVE (M-Profile Vector Extension) luzapenerako laguntza gehitu zen. GFX10 (Navi) arkitekturarako euskarria gehitu da AMDGPU backend-ean, funtzioak deitzeko gaitasunak gaituta daude lehenespenez eta pasabide konbinatua aktibatuta dago. DPP (Datu-Primitibo Paraleloak).

  • LLDB araztaileak atzera-trazetarako kolore nabarmenak ditu eta DWARF4 debug_types eta DWARF5 debug_info blokeetarako laguntza gehitu du;
  • COFF formatuan objektu eta fitxategi exekutagarrientzako laguntza gehitu da llvm-objcopy eta llvm-strip utilitateetan.

Iturria: opennet.ru

Gehitu iruzkin berria