Scaoileadh sraith tiomsaithe LLVM 10.0

Tar éis sé mhí d'fhorbairt curtha i láthair scaoileadh tionscadail LLVM 10.0 — Uirlisí atá comhoiriúnach le GCC (tiomsaitheoirí, optimizers agus gineadóirí cód), cláir a thiomsú i gcód giotán idirmheánach de threoracha fíorúla cosúil le RISC (meaisín fíorúil íseal-leibhéil le córas optamaithe il-leibhéil). Is féidir an pseudocode a ghintear a thiontú trí úsáid a bhaint as tiomsaitheoir JIT go treoracha meaisín go díreach ag an am a dhéantar an clár.

I measc na ngnéithe nua in LLVM 10.0 tá tacaíocht do C ++ Coincheapa, ní ritheann Clang mar phróiseas ar leith a thuilleadh, tacaíocht do sheiceálacha CFG (garda sreafa rialaithe) do Windows, agus tacaíocht do chumais nua LAP.

Feabhsúcháin i gClang 10.0:

  • Tacaíocht breise le haghaidh "coincheapa", síneadh teimpléad C++ a áireofar sa chéad chaighdeán eile, códainm C++2a (curtha ar siúl ag an bhratach -std=c++2a).
    Ligeann coincheapa duit sraith de cheanglais pharaiméadar teimpléid a shainiú a chuireann teorainn, ag am tiomsaithe, leis an sraith argóintí ar féidir glacadh leo mar pharaiméadair teimpléid. Is féidir na coincheapa a úsáid chun neamhréireachtaí loighciúla a sheachaint idir airíonna na gcineálacha sonraí a úsáidtear laistigh den teimpléad agus airíonna cineál sonraí na bparaiméadar ionchuir.

    teimpléad
    coincheap EqualityComparable = éilíonn(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • De réir réamhshocraithe, cuirtear deireadh le seoladh próisis ar leith (“clang -cc1”) ina ndéantar tiomsú. Déantar an tiomsú anois sa phríomhphróiseas, agus is féidir an rogha "-fno-integrated-cc1" a úsáid chun an sean-iompar a chur ar ais.
  • Modhanna diagnóiseacha nua:
    • Tugann "-Wc99-designator" agus "-Wreorder-init-list" rabhadh gan tosaigh a úsáid C99 i mód C++ i gcásanna ina bhfuil siad ceart in C99 ach nach bhfuil siad i C++20.
    • "-Wsizeof-array-div" - gabhann sé cásanna amhail "int arr[10]; …méid(arr) / méid(gearr)…” (ba cheart go mbeadh “méid(arr) / sizeof(int)”)).
    • Tugann "-Wxor-used-as-po" - rabhadh nach n-úsáidfear tógálacha amhail úsáid an oibreora "^" (xor) in oibríochtaí ar féidir iad a mheascadh le léiriú (2^16).
    • Tugann "-Wfinal-dtor-non-final-class" - rabhadh faoi aicmí nach bhfuil marcáilte leis an sonróir "deiridh", ach a bhfuil destructor leis an tréith "deiridh".
    • Is grúpa rabhaidh é "-Wtautological-bitwise-compare" chun comparáidí tautological a dhiagnóiseadh idir oibríocht bitwise agus tairiseach, agus chun comparáidí fíorfhíor a shainaithint ina gcuirtear an oibríocht bitwise OR i bhfeidhm ar uimhir neamhdhiúltach.
    • Tugann "-Wbitwise-conditional-parentheses" rabhadh maidir le fadhbanna nuair a dhéantar na hoibreoirí loighciúla AGUS (&) agus OR(|) a mheascadh leis an oibreoir coinníollach (?:).
    • Is analóg é “-Wmisleading- indentation” den tseiceáil den ainm céanna ó GCC, a thugann foláireamh faoi sloinn eangaithe amhail is gur cuid de bhloc más/eile/le haghaidh/am atá siad, ach i ndáiríre níl siad san áireamh sa bhloc seo .
    • Nuair a shonraítear “-Wextra”, cumasaítear an tseiceáil “-Wdeprecated-copy”, rabhadh faoi úsáid na dtógálaithe
      "bogadh" agus "cóipeáil" i ranganna le sainmhíniú sainráite scriostóra.

    • Leathnaíodh na seiceálacha "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis".
    • Díchumasaítear na seiceálacha "-Wbitwise-op-parentheses" agus "-Wlogical-op-parentheses" de réir réamhshocraithe.
  • I gcód C agus C++, ní cheadaítear oibríochtaí uimhríochtúla pointeora ach amháin in eagair. Gabhann an Sanitizer Iompraíochta Neamhshainithe sa mhód "-fsanitize=pointer-overflow" cásanna mar fhritháireamh neamh-nialasach a chur le pointeoir nialasach nó pointeoir nialasach a chruthú nuair a bhíonn slánuimhir á dhealú ó phointeoir neamh-null.
  • Déantar an mód "-fsanitize=implicit-conversion" (Sláintitheoir Tiontaithe Intuigthe) a oiriúnú chun fadhbanna le hoibríochtaí incriminte agus laghdaithe a aithint do chineálacha a bhfuil méid beagán níos lú acu ná an cineál "int".
  • Agus ailtireachtaí sprice x86 á roghnú "-march=skylake-avx512", "-march= icelake-client", "-march= icelake-server", "-march= cascadelake" agus "-march=cooperlake" de réir réamhshocraithe i veicteoirithe The tá stop ag cód úsáid a bhaint as cláir zmm 512-giotán, ach amháin i gcás ina bhfuil siad in iúl go díreach sa chód foinse. Is é an chúis atá leis ná go laghdaítear minicíocht an LAP nuair a bhíonn oibríochtaí 512-giotán á ndéanamh, rud a d'fhéadfadh tionchar diúltach a bheith aige ar fheidhmíocht fhoriomlán. Chun an t-iompar nua a athrú, soláthraítear an rogha "-mprefer-vector-width=512".
  • Tá iompar na brataí “-flax-vector-conversions” cosúil le GCC: tá cosc ​​ar thiontú intuigthe veicteora giotán idir veicteoirí slánuimhir agus snámhphointe. Chun deireadh a chur leis an teorannú seo, tá sé beartaithe an bhratach a úsáid
    "-flax-vector-conversions=all" arb é an réamhshocrú é.

  • Tacaíocht fheabhsaithe do CPUanna MIPS de theaghlach Octeon. Cuireadh "octeon+" leis an liosta de chineálacha bailí LAP.
  • Nuair a chuirtear le chéile i gcód idirmheánach WebAssembly, glaoitear an t-optimizer wasm-opt go huathoibríoch, má tá sé ar fáil sa chóras.
  • I gcás córais atá bunaithe ar ailtireacht RISC-V, ceadaítear úsáid a bhaint as cláir a stórálann luachanna snámhphointe i mbloic choinníollacha d’ionsáiteáin inlíne cóimeálaí.
  • Cuireadh bratacha tiomsaitheora nua leis: "-fgnuc-version" chun luach an leagain a shocrú do "__GNUC__" agus macraí comhchosúla; "-fmacro-prefix-map=OLD=NEW" chun an réimír eolaire OLD a chur in ionad NUA i macraí mar "__FILE__"; "-fpatchable-function-entry=N[,M]" chun líon áirithe treoracha NOP a ghiniúint roimh phointe iontrála na feidhme agus ina dhiaidh. Le haghaidh RISC-V
    tacaíocht bhreise do na bratacha "-ffixed-xX", "-mcmodel=medany" agus "-mcmodel=medlow".

  • Tacaíocht bhreise leis an aitreabúid '__attribute__((target("branch-protection=..."))), a bhfuil a éifeacht cosúil leis an rogha -mbranch-cosaint.
  • Ar ardán Windows, agus an bhratach “-cfguard” á shonrú, cuirtear i bhfeidhm seiceálacha sláine sreafa forghníomhaithe (Garda Sreabhadh Rialaithe) le haghaidh glaonna feidhme indíreacha. Chun ionadú seiceála a dhíchumasú, is féidir leat an bhratach “-cfguard-nochecks” nó an modhnóir “__declspec(guard(nocf))” a úsáid.
  • Tá iompar an aitreabúid gnu_inline cosúil le GCC i gcásanna ina n-úsáidtear é gan an eochairfhocal "seachtrach".
  • Leathnaíodh na cumais a bhaineann le tacaíocht OpenCL agus CUDA. Tacaíocht bhreise do ghnéithe nua OpenMP 5.0.
  • Tá rogha Chaighdeánach curtha leis an bhfóntas clang-format, a ligeann duit an leagan den chaighdeán C++ a úsáidtear nuair a bhíonn an cód parsála agus formáidithe á chinneadh (Is déanaí, Auto, c++03, c++11, c++14, c++17, c++20 ).
  • Tá seiceálacha nua curtha leis an anailísí statach: alpha.cplusplus.PlacementNew chun a chinneadh an bhfuil dóthain spáis stórála, fuchsia.HandleChecker chun sceitheanna a bhaineann le láimhseálaithe Fuchsia a bhrath, security.insecureAPI.decodeValueOfObjCType chun ró-shreabhadh maolánach féideartha a bhrath nuair a úsáidtear [NSCoder decodebCtalypepe :ag:] .
  • Tá an Sanitizer Iompraíochta Neamhshainithe (UBSan) tar éis a sheiceálacha thar maoil pointeora a leathnú chun cur i bhfeidhm fritháirimh neamh-nialais ar threoraí NULLComment a ghabháil nó cur le fritháireamh pointeoir NULLComment dá bharr.
  • I linter clang-slachtmhar curtha leis cuid mhór de na seiceálacha nua.

An príomh- nuálaíochtaí LLVM 10.0:

  • Go dtí an creat Attributor Tá leas iomlán a bhaint idir nósanna imeachta agus anailíseoirí nua curtha leis. Tá staid 19 airí éagsúla tuartha, lena n-áirítear 12 airí 12 LLVM IR agus 7 airí teibí amhail beocht.
  • Cuireadh feidhmeanna matamaitice maitrís nua isteach sa tiomsaitheoir (Intreacha), a chuirtear in ionad treoracha éifeachtacha veicteoirí le linn tiomsaithe.
  • Tá go leor feabhsuithe déanta ar na hinnill le haghaidh ailtireachtaí X86, AArch64, ARM, SystemZ, MIPS, AMDGPU agus PowerPC. Cuireadh tacaíocht LAP leis
    Cortex-A65, Cortex-A65AE, Neoverse E1 agus Neoverse N1. Le haghaidh ARMv8.1-M, ​​tá an próiseas giniúna cód optamaithe (mar shampla, tá an chuma ar thacaíocht do lúba a bhfuil forchostais íosta acu) agus cuireadh tacaíocht d’uathvectorization leis an síneadh MVE. Tacaíocht feabhsaithe CPU MIPS Octeon. Le haghaidh PowerPC, cumasaítear fo-ghnáthaimh matamaitice a veicteorú trí úsáid a bhaint as leabharlann MASSV (Fochóras Luasghéaraithe Matamaitice), feabhsaítear giniúint cód, agus baintear leas as rochtain chuimhne ó lúba. Maidir le x86, athraíodh láimhseáil na gcineálacha veicteora v2i32, v4i16, v2i16, v8i8, v4i8 agus v2i8.

  • Gineadóir cód feabhsaithe do WebAssembly. Tacaíocht bhreise do threoracha TLS (Stóráil Thread-Local) agus atomic.fence. Tá méadú suntasach tagtha ar thacaíocht SIMD. Tá an cumas anois ag comhaid oibiachta WebAssembly úsáid a bhaint as sínithe feidhm illuacha.
  • Úsáidtear an anailíseoir nuair a bhíonn lúba á bpróiseáil Cuimhne SSA, a ligeann duit spleáchais a shainiú idir oibríochtaí cuimhne éagsúla. Is féidir le MemorySSA am tiomsaithe agus forghníomhaithe a laghdú nó is féidir é a úsáid in ionad AliasSetTracker gan caillteanas feidhmíochta.
  • Tá feabhas suntasach tagtha ar thacaíocht don fhormáid DWARF v5 ag dífhabhtóir LLDB. Tacaíocht fheabhsaithe le tógáil le MinGW
    agus cumas tosaigh breise chun earraí inrite Windows a dhífhabhtú le haghaidh ailtireachtaí ARM agus ARM64. Cur síos breise ar na roghanna a thairgtear nuair a bhíonn ionchur uathchríochnaithe trí chluaisín a bhrú.

  • Leathnaithe Cumais nascóirí LLD. Tacaíocht fheabhsaithe don fhormáid ELF, lena n-áirítear comhoiriúnacht iomlán na dteimpléad glob leis an nascóir GNU a chinntiú, ag cur tacaíocht le haghaidh rannóga dífhabhtaithe comhbhrúite ".zdebug", ag cur an mhaoin PT_GNU_PROPERTY chun an roinn .note.gnu.property a shainiú (is féidir é a úsáid sa todhchaí Eithne Linux),
    Tá na modhanna “-z noseparate-code”, “-z separate-code” agus “-z separate-loadable-deighleoga” curtha i bhfeidhm. Tacaíocht fheabhsaithe do MinGW agus WebAssembly.

Foinse: oscailtenet.ru

Add a comment