Vrystelling van die LLVM 9.0-samestellersuite

Na ses maande van ontwikkeling aangebied projek vrystelling LLVM 9.0 — GCC-versoenbare gereedskap (samestellers, optimaliseerders en kode-opwekkers), wat programme saamstel in intermediêre bitkode van RISC-agtige virtuele instruksies (laevlak virtuele masjien met 'n multi-vlak optimeringstelsel). Die gegenereerde pseudokode kan direk met behulp van 'n JIT-samesteller in masjieninstruksies omgeskakel word ten tyde van die uitvoering van die program.

Nuwe kenmerke van LLVM 9.0 sluit in die verwydering van die eksperimentele ontwerpmerker van die teiken RISC-V-platform, C++-ondersteuning vir OpenCL, die vermoë om 'n program in dinamies gelaaide dele in LLD te verdeel, en die implementering van die "asm gaan", gebruik in die Linux-kernkode. libc++ het ondersteuning vir WASI (WebAssembly System Interface) bygevoeg, en LLD het aanvanklike ondersteuning vir WebAssembly-dinamiese koppeling bygevoeg.

Verbeterings in Clang 9.0:

  • Bygevoeg implementering van die GCC-spesifieke uitdrukking "asm gaan", wat jou toelaat om van 'n samesteller-inlynblok na 'n etiket in C-kode te beweeg. Hierdie kenmerk is nodig om die Linux-kern in die "CONFIG_JUMP_LABEL=y"-modus te bou deur Clang op stelsels met x86_64-argitektuur te gebruik. Met inagneming van die veranderinge wat in vorige vrystellings bygevoeg is, kan die Linux-kern nou in Clang gebou word vir die x86_64-argitektuur (voorheen is slegs gebou vir die arm, aarch64, ppc32, ppc64le en mips-argitekture ondersteun). Boonop is Android- en ChromeOS-projekte reeds omgeskakel om Clang vir kernbou te gebruik, en Google toets Clang as die hoofplatform vir die bou van pitte vir sy produksie Linux-stelsels. In die toekoms kan ander LLVM-komponente in die kernbouproses gebruik word, insluitend LLD, llvm-objcopy, llvm-ar, llvm-nm en llvm-objdump;
  • Bygevoeg eksperimentele ondersteuning vir die gebruik van C++17 in OpenCL. Spesifieke kenmerke sluit in ondersteuning vir adresruimte-kenmerke, blokkering van adresruimteomskakeling deur tipe uitsaaioperateurs, voorsiening van vektortipes soos in OpenCL vir C, die teenwoordigheid van spesifieke OpenCL-tipes vir beelde, gebeurtenisse, kanale, ens.
  • Nuwe samestellervlae "-ftime-trace" en "-ftime-trace-granularity=N" bygevoeg om 'n verslag te genereer oor die uitvoeringstyd van verskeie stadiums van die frontend (ontleding, inisialisering) en backend (optimeringstadia). Die verslag word in json-formaat gestoor, versoenbaar met chrome://tracing en speedscope.app;
  • Bygevoeg verwerking van die "__declspec(allocator)"-spesifiseerder en generering van gepaardgaande ontfoutingsinligting wat jou toelaat om geheueverbruik in die Visual Studio-omgewing te monitor;
  • Vir die C-taal is ondersteuning bygevoeg vir die "__FILE_NAME__"-makro, wat soos die "__FILE__"-makro lyk, maar slegs die lêernaam sonder die volle pad insluit;
  • C++ het ondersteuning vir adresruimte-kenmerke uitgebrei om verskeie C++-kenmerke te dek, insluitend parameter- en argumentpatrone, verwysingstipes, terugkeertipe-afleiding, objekte, outo-gegenereerde funksies, ingeboude operateurs, en meer.
  • Die vermoëns wat verband hou met ondersteuning vir OpenCL, OpenMP en CUDA is uitgebrei. Dit sluit aanvanklike ondersteuning vir implisiete insluiting van ingeboude OpenCL-funksies in (die "-fdeclare-opencl-builtins" vlag is bygevoeg), die cl_arm_integer_dot_product uitbreiding is geïmplementeer, en diagnostiese gereedskap is uitgebrei;
  • Die werk van die statiese ontleder is verbeter en dokumentasie oor die uitvoer van statiese analise is bygevoeg. Vlae bygevoeg om beskikbare kontroleerdermodules en ondersteunde opsies te vertoon ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" en "-analyzer-checker[-option]-help "-ontwikkelaar"). Bygevoeg "-analyzer-werror" vlag om waarskuwings as foute te hanteer.
    Nuwe verifikasiemodusse bygevoeg:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling om onveilige praktyke vir die werk met buffers te identifiseer;
    • osx.MIGChecker om te soek na oortredings van MIG (Mach Interface Generator) oproepreëls;
    • optin.osx.OSObjectCStyleCast om verkeerde XNU libkern objek omskakelings te vind;
    • apiModeling.llvm met 'n stel modelleringskontrolefunksies om foute in die LLVM-kodebasis op te spoor;
    • Gestabiliseerde kode vir die kontrolering van ongeinitialiseerde C++-objekte (UninitializedObject in die optin.cplusplus-pakket);
  • Die clang-formaat-nutsding het ondersteuning bygevoeg vir die formatering van kode in die C#-taal en bied ondersteuning vir die kodeformateringstyl wat deur Microsoft gebruik word;
  • clang-cl, 'n alternatiewe opdragreëlkoppelvlak wat opsievlakversoenbaarheid bied met die cl.exe-samesteller wat in Visual Studio ingesluit is, het heuristieke bygevoeg om nie-bestaande lêers as opdragreëlopsies te hanteer en 'n ooreenstemmende waarskuwing te vertoon (byvoorbeeld, wanneer "clang-cl /diagnostic :caret /c test.cc" uitgevoer word);
  • 'n Groot gedeelte van die nuwe tjeks is bygevoeg om linter clang-netjies, insluitend bygevoeg tjeks spesifiek vir die OpenMP API;
  • Uitgebreid bediener vermoëns klangd (Clang Server), waarin die agtergrondindeksboumodus by verstek geaktiveer is, is ondersteuning vir kontekstuele aksies met kode bygevoeg (veranderlike herwinning, uitbreiding van outo- en makrodefinisies, omskakeling van ontsnapte stringe na onontsnapte), die vermoë om te vertoon waarskuwings van Clang-netjies, uitgebreide diagnostiek van foute in koplêers en bygevoeg die vermoë om inligting oor die tipe hiërargie te vertoon;

Die belangrikste innovasies LLVM 9.0:

  • 'n Eksperimentele partisie-funksie is by die LLD-skakelaar gevoeg, wat jou toelaat om een ​​program in verskeie dele te verdeel, wat elkeen in 'n aparte ELF-lêer geleë is. Hierdie kenmerk laat jou toe om die hoofgedeelte van die program te begin, wat ander komponente sal laai soos nodig tydens werking (jy kan byvoorbeeld die ingeboude PDF-kyker in 'n aparte lêer skei, wat slegs sal laai wanneer die gebruiker die PDF oopmaak lêer).

    LLD Linker na vore gebring na 'n toestand wat geskik is om die Linux-kern vir arm32_7, arm64, ppc64le en x86_64 argitekture te koppel.
    Nuwe opsies "-" (uitvoer na stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" en "-z algemene bladsygrootte". Vir die AArch64-argitektuur is ondersteuning vir BTI (Branch Target Indicator) en PAC (Pointer Authentication Code) instruksies bygevoeg. Ondersteuning vir MIPS-, RISC-V- en PowerPC-platforms is aansienlik verbeter. Bygevoeg aanvanklike ondersteuning vir dinamiese koppeling vir WebAssembly;

  • In libc++ geïmplementeer funksies ssize, std::is_konstant_geëvalueer, std::middelpunt en std::lerp, metodes "front" en "back" is bygevoeg by std::span, eienskappe van tipes std::is_unbounded_array en std::is_bounded_array is bygevoeg , std vermoëns is uitgebrei: :atomic. Ondersteuning vir GCC 4.9 is gestaak (kan met GCC 5.1 en nuwer vrystellings gebruik word). Bygevoeg ondersteuning WAS EK (WebAssembly System Interface, 'n koppelvlak vir die gebruik van WebAssembly buite die blaaier);
  • Nuwe optimaliserings is bygevoeg. Geaktiveerde omskakeling van memcmp-oproepe na bcmp in sommige situasies. Geïmplementeerde weglating van omvangkontrolering vir sprongtabelle waarin onderste skakelaarblokke onbereikbaar is of wanneer instruksies nie gebruik word nie, byvoorbeeld wanneer funksies met tipe leeg geroep word;
  • Die agterkant vir die RISC-V-argitektuur is gestabiliseer, wat nie meer as eksperimenteel geposisioneer is nie en by verstek gebou is. Verskaf volledige kode generering ondersteuning vir RV32I en RV64I instruksie stel variante met MAFDC uitbreidings;
  • Talle verbeterings is aangebring aan backends vir X86, AArch64, ARM, SystemZ, MIPS, AMDGPU en PowerPC argitekture. Byvoorbeeld, vir argitektuur
    AArch64 het ondersteuning bygevoeg vir SVE2 (Scalable Vector Extension 2) en MTE (Memory Tagging Extensions) instruksies; in die ARM backend is ondersteuning vir die Armv8.1-M argitektuur en die MVE (M-Profile Vector Extension) uitbreiding bygevoeg. Ondersteuning vir die GFX10 (Navi)-argitektuur is by die AMDGPU-agterkant gevoeg, funksie-oproepvermoëns is by verstek geaktiveer, en 'n gekombineerde pas is geaktiveer DOV (Data-parallelle primitiewe).

  • Die LLDB-ontfouter het nou kleurverligting vir terugspore en bygevoeg ondersteuning vir die DWARF4 debug_types en DWARF5 debug_info blokke;
  • Ondersteuning vir objek- en uitvoerbare lêers in COFF-formaat is by die llvm-objcopy en llvm-strip nutsprogramme gevoeg.

Bron: opennet.ru

Voeg 'n opmerking