LLVM 10.0 kompilatoru komplekta izlaiŔana

Pēc seÅ”u mēneÅ”u attÄ«stÄ«bas uzrādÄ«ts projekta izlaidums LLVM 10.0 ā€” ar GCC saderÄ«gi rÄ«ki (kompilatori, optimizētāji un kodu Ä£eneratori), programmu kompilÄ“Å”anai RISC lÄ«dzÄ«gu virtuālo instrukciju starpbitkodā (zema lÄ«meņa virtuālā maŔīna ar daudzlÄ«meņu optimizācijas sistēmu). Ä¢enerēto pseidokodu, izmantojot JIT kompilatoru, var pārvērst maŔīnas instrukcijās tieÅ”i programmas izpildes laikā.

Jaunās LLVM 10.0 funkcijas ietver atbalstu C++ koncepcijām, vairs nedarbina Clang kā atseviŔķu procesu, atbalstu CFG (kontroles plÅ«smas aizsarga) pārbaudēm operētājsistēmai Windows un atbalstu jaunām CPU iespējām.

Uzlabojumi Clang 10.0 versijā:

  • Pievienots atbalsts "jēdzieni", C++ veidnes paplaÅ”inājums, kas tiks iekļauts nākamajā standartā ar koda nosaukumu C++2a (ieslēgts ar karogu -std=c++2a).
    Jēdzieni ļauj definēt veidnes parametru prasÄ«bu kopu, kas kompilÄ“Å”anas laikā ierobežo argumentu kopu, ko var pieņemt kā veidnes parametrus. Jēdzienus var izmantot, lai izvairÄ«tos no loÄ£iskām pretrunām starp veidnē izmantoto datu tipu Ä«paŔībām un ievades parametru datu tipa Ä«paŔībām.

    veidne
    jēdziens VienlīdzībaSalīdzināms = prasa(T a, T b) {
    {a == b} -> std::būla;
    {a != b } -> std::būla;
    };

  • Pēc noklusējuma tiek apturēta atseviŔķa procesa (ā€œclang -cc1ā€) palaiÅ”ana, kurā tiek veikta kompilācija. Kompilācija tagad tiek veikta galvenajā procesā, un opciju "-fno-integrated-cc1" var izmantot, lai atjaunotu veco darbÄ«bu.
  • Jauni diagnostikas režīmi:
    • "-Wc99-designator" un "-Wreorder-init-list" brÄ«dina neizmantot C99 inicializatorus C++ režīmā gadÄ«jumos, kad tie ir pareizi C99, bet ne C++20.
    • "-Wsizeof-array-div" ā€” uztver tādas situācijas kā "int arr[10]; ā€¦sizeof(arr) / sizeof(short)ā€¦ā€ (jābÅ«t ā€œsizeof(arr) / sizeof(int)ā€).
    • "-Wxor-used-as-po" ā€” brÄ«dina par tādu konstrukciju izmantoÅ”anu kā operators "^" (xor) operācijās, kuras var sajaukt ar eksponenci (2^16).
    • "-Wfinal-dtor-non-final-class" - brÄ«dina par klasēm, kuras nav atzÄ«mētas ar "final" precizētāju, bet kurām ir destruktors ar atribÅ«tu "final".
    • "-Wtautological-bitwise-compare" ir brÄ«dinājumu grupa, lai diagnosticētu tautoloÄ£iskos salÄ«dzinājumus starp bitu operāciju un konstanti, kā arÄ« identificētu vienmēr patiesus salÄ«dzinājumus, kuros bitu VAI darbÄ«ba tiek piemērota nenegatÄ«vam skaitlim.
    • "-Wbitwise-conditional-parenthes" brÄ«dina par problēmām, sajaucot loÄ£iskos operatorus AND (&) un OR (|) ar nosacÄ«jumu operatoru (?:).
    • ā€œ-Wmisleading-indentationā€ ir tāda paÅ”a nosaukuma pārbaudes analogs no GCC, kas brÄ«dina par atkāpēm, it kā tās bÅ«tu daļa no bloka if/else/for/while, bet patiesÄ«bā tās nav iekļautas Å”ajā blokā. .
    • Norādot ā€œ-Wextraā€, tiek iespējota pārbaude ā€œ-Wdeprecated-copyā€, brÄ«dinot par konstruktoru izmantoÅ”anu.
      "pārvietot" un "kopēt" klasēs ar skaidru destruktora definīciju.

    • Pārbaudes "-Wtautological-overlap-salÄ«dzināt", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" ir paplaÅ”inātas.
    • AtzÄ«mes "-Wbitwise-op-parenthes" un "-Wlogical-op-parenthes" pēc noklusējuma ir atspējotas.
  • C un C++ kodā rādÄ«tāja aritmētiskās darbÄ«bas ir atļautas tikai masÄ«vos. Undefined Behavior Sanitizer režīmā "-fsanitize=pointer-overflow" tagad uztver tādus gadÄ«jumus kā nulles nobÄ«des pievienoÅ”ana nulles rādÄ«tājam vai nulles rādÄ«tāja izveide, atņemot veselu skaitli no rādÄ«tāja, kas nav nulle.
  • Režīms "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) ir pielāgots, lai identificētu problēmas ar palielināŔanas un samazināŔanas darbÄ«bām veidiem, kuru bitu lielums ir mazāks nekā "int" tipam.
  • Atlasot x86 mērÄ·a arhitektÅ«ras "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" un "-march=cooperlake" pēc noklusējuma vektorizētajā kods ir pārtraucis izmantot 512 bitu zmm reÄ£istrus, izņemot to tieÅ”u norādi avota kodā. Iemesls ir tāds, ka CPU frekvence samazinās, veicot 512 bitu darbÄ«bas, kas var negatÄ«vi ietekmēt kopējo veiktspēju. Lai mainÄ«tu jauno darbÄ«bu, tiek nodroÅ”ināta opcija "-mprefer-vector-width=512".
  • Karoga "-linu vektoru konvertÄ“Å”ana" darbÄ«ba ir lÄ«dzÄ«ga GCC: ir aizliegta netieÅ”a vektora bitu konvertÄ“Å”ana starp veseliem skaitļiem un peldoŔā komata vektoriem. Lai novērstu Å”o ierobežojumu, tiek ierosināts izmantot karogu
    "-flax-vector-conversions=all", kas ir noklusējuma vērtība.

  • Uzlabots atbalsts Octeon saimes MIPS CPU. DerÄ«go CPU tipu sarakstam pievienots "octeon+".
  • Veicot montāžu WebAssembly starpkodā, automātiski tiek izsaukts wasm-opt optimizētājs, ja tāds ir pieejams sistēmā.
  • Sistēmām, kuru pamatā ir RISC-V arhitektÅ«ra, ir atļauts izmantot reÄ£istrus, kas glabā peldoŔā komata vērtÄ«bas, montētāja iekļauto ieliktņu nosacÄ«jumu blokos.
  • Pievienoti jauni kompilatora karodziņi: "-fgnuc-version", lai iestatÄ«tu "__GNUC__" un lÄ«dzÄ«gu makro versijas vērtÄ«bu; "-fmacro-prefix-map=OLD=NEW", lai aizstātu direktorija prefiksu OLD ar NEW makro, piemēram, "__FILE__"; "-fpatchable-function-entry=N[,M]", lai Ä£enerētu noteiktu skaitu NOP instrukciju pirms un pēc funkcijas ievades punkta. RISC-V
    pievienots atbalsts karodziņiem "-ffixed-xX", "-mcmodel=medany" un "-mcmodel=medlow".

  • Pievienots atbalsts atribÅ«tam '__attribute__((target(ā€œbranch-protection=..."))), kura iedarbÄ«ba ir lÄ«dzÄ«ga opcijai -zaru aizsardzÄ«ba.
  • Windows platformā, norādot karogu ā€œ-cfguardā€, tiek ieviesta izpildes plÅ«smas integritātes pārbaužu (Control Flow Guard) aizstāŔana ar netieÅ”ajiem funkciju izsaukumiem. Lai atspējotu čeku aizstāŔanu, varat izmantot karogu ā€œ-cfguard-nochecksā€ vai modifikatoru ā€œ__declspec(guard(nocf))ā€.
  • AtribÅ«ta gnu_inline darbÄ«ba ir lÄ«dzÄ«ga GCC gadÄ«jumos, kad tas tiek izmantots bez atslēgvārda "extern".
  • Ar OpenCL un CUDA atbalstu saistÄ«tās iespējas ir paplaÅ”inātas. Pievienots atbalsts jaunajām OpenMP 5.0 funkcijām.
  • Clang-format utilÄ«tai ir pievienota standarta opcija, kas ļauj noteikt C++ standarta versiju, kas tiek izmantota koda parsÄ“Å”anai un formatÄ“Å”anai (Jaunākais, Automātiskais, c++03, c++11, c++14, c++17, c++20 ).
  • Statiskajam analizatoram ir pievienotas jaunas pārbaudes: alpha.cplusplus.PlacementNew, lai noteiktu, vai ir pietiekami daudz vietas krātuvē, fuchsia.HandleChecker, lai atklātu noplÅ«des, kas saistÄ«tas ar Fuchsia apdarinātājiem, security.insecureAPI.decodeValueOfObjCType, lai noteiktu iespējamo bufera pārpildes, lietojot [NSCoder decodealueyV. :at:] .
  • Undefined Behavior Sanitizer (UBSan) ir paplaÅ”inājis rādÄ«tāja pārpildes pārbaudes, lai uztvertu nulles nobÄ«des piemēroÅ”anu NULL rādÄ«tājiem vai NULL rādÄ«tāja nobÄ«des pievienoÅ”anu.
  • Linteres čaukstÄ«gi pievienots liela daļa jaunu čeku.

Galvenais jauninājumiem LLVM 10.0:

  • Uz ietvaru AtribÅ«ts Ir pievienotas jaunas starpprocedÅ«ru optimizācijas un analizatori. Tiek prognozēts 19 dažādu atribÅ«tu stāvoklis, ieskaitot 12 atribÅ«tus 12 LLVM IR un 7 abstraktus atribÅ«tus, piemēram, dzÄ«vÄ«gumu.
  • Pievienotas jaunas matricas matemātiskās funkcijas, kas iebÅ«vētas kompilatorā (BÅ«tiskās Ä«paŔības), kuras kompilācijas laikā aizstāj ar efektÄ«vām vektoru instrukcijām.
  • Ir veikti daudzi X86, AArch64, ARM, SystemZ, MIPS, AMDGPU un PowerPC arhitektÅ«ru aizmugursistēmas uzlabojumi. Pievienots CPU atbalsts
    Cortex-A65, Cortex-A65AE, Neoverse E1 un Neoverse N1. ARMv8.1-M ir optimizēts koda Ä£enerÄ“Å”anas process (piemēram, ir parādÄ«jies atbalsts cilpām ar minimālu pieskaitāmo slodzi), un, izmantojot MVE paplaÅ”inājumu, ir pievienots atbalsts autovektorizācijai. Uzlabots CPU MIPS Octeon atbalsts. PowerPC ir iespējota matemātisko apakÅ”programmu vektorizācija, izmantojot MASSV (matemātiskā paātrinājuma apakÅ”sistēmas) bibliotēku, ir uzlabota koda Ä£enerÄ“Å”ana un optimizēta piekļuve atmiņai no cilpām. AttiecÄ«bā uz x86 ir mainÄ«ta vektoru tipu v2i32, v4i16, v2i16, v8i8, v4i8 un v2i8 apstrāde.

  • Uzlabots WebAssembly kodu Ä£enerators. Pievienots TLS (Thread-Local Storage) un atomic.fence instrukciju atbalsts. SIMD atbalsts ir ievērojami paplaÅ”ināts. WebAssembly objektu failiem tagad ir iespēja izmantot vairāku vērtÄ«bu funkciju parakstus.
  • Analizatoru izmanto, apstrādājot cilpas AtmiņaSSA, kas ļauj definēt atkarÄ«bas starp dažādām atmiņas operācijām. MemorySSA var samazināt kompilācijas un izpildes laiku vai arÄ« to var izmantot AliasSetTracker vietā, nezaudējot veiktspēju.
  • LLDB atkļūdotājs ir ievērojami uzlabojis DWARF v5 formāta atbalstu. Uzlabots atbalsts bÅ«vniecÄ«bai ar MinGW
    un pievienota sākotnējā iespēja atkļūdot Windows izpildāmos failus ARM un ARM64 arhitektūrām. Pievienoti apraksti opcijām, kas tiek piedāvātas, automātiski pabeidzot ievadi, nospiežot tab.

  • Izvērsts LLD saistÄ«Å”anas iespējas. Uzlabots ELF formāta atbalsts, tostarp nodroÅ”inot pilnÄ«gu glob veidņu savietojamÄ«bu ar GNU saiti, pievienojot atbalstu saspiestām atkļūdoÅ”anas sadaļām ".zdebug", pievienojot rekvizÄ«tu PT_GNU_PROPERTY, lai definētu sadaļu .note.gnu.property (var izmantot nākotnē Linux kodoli),
    Ir ieviesti režīmi ā€œ-z noseaparate-codeā€, ā€œ-z atseviŔķs kodsā€ un ā€œ-z atseviŔķi-ielādējamie segmentiā€. Uzlabots MinGW un WebAssembly atbalsts.

Avots: opennet.ru

Pievieno komentāru