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.
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.
"-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.
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.