LLVM kuchokera kumawonedwe a Go

Kupanga compiler ndi ntchito yovuta kwambiri. Koma, mwamwayi, ndi chitukuko cha mapulojekiti monga LLVM, njira yothetsera vutoli imakhala yophweka kwambiri, yomwe imalola ngakhale pulogalamu imodzi yokha kupanga chinenero chatsopano chomwe chili pafupi ndi ntchito C. Kugwira ntchito ndi LLVM kumakhala kovuta chifukwa izi dongosolo imayimiridwa ndi kuchuluka kwa code, yokhala ndi zolemba zochepa. Pofuna kukonza zolakwika izi, wolemba nkhaniyo, kumasulira kwake komwe tikusindikiza lero, akuwonetsa zitsanzo zamakhodi olembedwa mu Go ndikuwonetsa momwe amamasuliridwa koyamba Pitani ku SSA, ndiyeno mu LLVM IR pogwiritsa ntchito compiler tinyGO. Khodi ya Go SSA ndi LLVM IR yasinthidwa pang'ono kuti ichotse zinthu zomwe sizikugwirizana ndi mafotokozedwe omwe aperekedwa pano, kuti mafotokozedwewo amveke bwino.

LLVM kuchokera kumawonedwe a Go

Chitsanzo choyamba

Ntchito yoyamba yomwe ndikuyang'ana apa ndi njira yosavuta yowonjezerera manambala:

func myAdd(a, b int) int{
    return a + b
}

Ntchitoyi ndi yosavuta, ndipo, mwina, palibe chomwe chingakhale chophweka. Zimatanthawuza ku Go SSA code yotsatirayi:

func myAdd(a int, b int) int:
entry:
    t0 = a + b                                                    int
    return t0

Ndi malingaliro awa, zowunikira zamtundu wa data zimayikidwa kumanja ndipo zimatha kunyalanyazidwa nthawi zambiri.

Chitsanzo chaching'ono ichi chimakupatsani mwayi wowona zenizeni za gawo limodzi la SSA. Mwakutero, posintha kachidindo kukhala mawonekedwe a SSA, mawu aliwonse amagawidwa m'magawo oyambira omwe amapangidwa. Kwa ife, lamulo return a + b, kwenikweni, imayimira ntchito ziwiri: kuwonjezera manambala awiri ndi kubwezera zotsatira.

Kuphatikiza apo, apa mutha kuwona zoyambira za pulogalamuyi; mu code iyi pali chipika chimodzi chokha - chipika cholowera. Tikambirana zambiri za midadada pansipa.

Khodi ya Go SSA imasinthidwa mosavuta kukhala LLVM IR:

define i64 @myAdd(i64 %a, i64 %b) {
entry:
  %0 = add i64 %a, %b
  ret i64 %0
}

Chomwe mungazindikire ndichakuti ngakhale zida zosiyanasiyana zimagwiritsidwa ntchito pano, kapangidwe kake kamakhala kosasinthika. Khodi ya LLVM IR ndi yamphamvu pang'ono kuposa Go SSA code, yofanana ndi C. Pano, mu chilengezo cha ntchito, choyamba pali kufotokozera kwa mtundu wa deta yomwe imabwerera, mtundu wa mkangano umasonyezedwa pamaso pa dzina la mkangano. Kuphatikiza apo, kuti muchepetse kuyika kwa IR, mayina azinthu zapadziko lonse lapansi amatsogozedwa ndi chizindikiro @, ndipo pamaso pa mayina akumaloko pali chizindikiro % (ntchito imatengedwanso kuti ndi yapadziko lonse lapansi).

Chinthu chimodzi choyenera kukumbukira pa code iyi ndi chisankho choyimira mtundu wa Go int, yomwe ingathe kuimiridwa ngati mtengo wa 32-bit kapena 64-bit, malingana ndi wolemba ndi cholinga chophatikiza, amavomerezedwa pamene LLVM imapanga IR code. Ichi ndi chimodzi mwazifukwa zambiri zomwe LLVM IR code siili, monga momwe anthu ambiri amaganizira, nsanja yodziyimira pawokha. Khodi yoteroyo, yopangidwira nsanja imodzi, siingangotengedwa ndikuphatikizidwa papulatifomu ina (pokhapokha ngati muli oyenera kuthana ndi vutoli. ndi kusamala kwambiri).

Mfundo ina yochititsa chidwi ndi yakuti mtunduwo i64 sichowerengeka chosainidwa: sichilowererapo poyimira chizindikiro cha nambala. Kutengera ndi malangizo, imatha kuyimira manambala osainidwa komanso osasainidwa. Pankhani yoyimira ntchito yowonjezera, izi ziribe kanthu, kotero palibe kusiyana pakati pa kugwira ntchito ndi manambala olembedwa kapena osayinidwa. Pano ndikufuna kudziwa kuti m'chinenero cha C, kusefukira kwa chiwerengero chosindikizidwa kumabweretsa khalidwe losadziΕ΅ika, kotero kuti kutsogolo kwa Clang kumawonjezera mbendera kuntchito. nsw (palibe kukulunga kosainidwa), komwe kumauza LLVM kuti ingaganize kuti kuwonjezera sikusefukira.

Izi zitha kukhala zofunikira pakukhathamiritsa kwina. Mwachitsanzo, kuwonjezera mfundo ziwiri i16 pa pulatifomu ya 32-bit (yokhala ndi zolembera za 32-bit) imafuna, pambuyo pake, ntchito yowonjezera chizindikiro kuti ikhalebe pamtunda. i16. Chifukwa cha izi, nthawi zambiri zimakhala zogwira mtima kwambiri kuchita ntchito zonse molingana ndi kukula kwa zolembera zamakina.

Zomwe zimachitika kenako ndi code ya IR iyi sizokhudza ife tsopano. Khodiyo imakongoletsedwa (koma ngati chitsanzo chosavuta ngati chathu, palibe chomwe chimakonzedwa) ndikusinthidwa kukhala makina.

Chitsanzo chachiwiri

Chitsanzo chotsatira chomwe tiwona chikhala chovuta kwambiri. Mwakutero, tikulankhula za ntchito yomwe imaphatikiza magawo angapo:

func sum(numbers []int) int {
    n := 0
    for i := 0; i < len(numbers); i++ {
        n += numbers[i]
    }
    return n
}

Khodi iyi imasinthidwa kukhala nambala yotsatira ya Go SSA:

func sum(numbers []int) int:
entry:
    jump for.loop
for.loop:
    t0 = phi [entry: 0:int, for.body: t6] #n                       int
    t1 = phi [entry: 0:int, for.body: t7] #i                       int
    t2 = len(numbers)                                              int
    t3 = t1 < t2                                                  bool
    if t3 goto for.body else for.done
for.body:
    t4 = &numbers[t1]                                             *int
    t5 = *t4                                                       int
    t6 = t0 + t5                                                   int
    t7 = t1 + 1:int                                                int
    jump for.loop
for.done:
    return t0

Apa mutha kuwona kale zomanga zambiri zoyimira ma code mu mawonekedwe a SSA. Mwina chodziwikiratu kwambiri cha code iyi ndikuti palibe malamulo owongolera oyenda. Kuti muwongolere kuthamanga kwa mawerengedwe, pali kulumpha kokhazikika komanso kopanda malire, ndipo, ngati tilingalira lamulo ili ngati lamulo loyendetsa kayendetsedwe kake, lamulo lobwerera.

M'malo mwake, apa mutha kulabadira kuti pulogalamuyo sinagawidwe m'mabwalo ogwiritsa ntchito ma curly braces (monga m'banja la C la zilankhulo). Imagawidwa ndi zilembo, kukumbukira zilankhulo za msonkhano, ndipo imaperekedwa ngati midadada yoyambira. Mu SSA, midadada yoyambira imatanthauzidwa ngati kutsatizana kwa kachidindo koyambira ndi cholembera ndikutha ndi malangizo oyambira omaliza, monga -- return ΠΈ jump.

Mfundo ina yosangalatsa ya code iyi ikuimiridwa ndi malangizo phi. Malangizowo ndi achilendo ndipo zingatenge nthawi kuti amvetsetse. kumbukirani, izo S.S.A. ndichidule cha Static Single Assignment. Ichi ndi chiwonetsero chapakati cha code yomwe amagwiritsidwa ntchito ndi ophatikiza, momwe kusintha kulikonse kumapatsidwa mtengo kamodzi kokha. Izi ndi zabwino kufotokoza ntchito zosavuta monga ntchito yathu myAddzomwe zasonyezedwa pamwambapa, koma sizoyenera ntchito zovuta kwambiri monga momwe tafotokozera m'gawoli sum. Makamaka, zosintha zimasintha panthawi yakuchita lupu i ΠΈ n.

SSA imadumpha malire pakugawira zosinthika mukamagwiritsa ntchito zomwe zimatchedwa malangizo phi (dzina lake latengedwa ku zilembo zachi Greek). Chowonadi ndi chakuti kuti mawonekedwe a SSA apangidwe azilankhulo monga C, muyenera kugwiritsa ntchito zidule zina. Chotsatira choyitana malangizowa ndi mtengo wamakono wa kusintha (i kapena n), ndipo mndandanda wa midadada yoyambira imagwiritsidwa ntchito ngati magawo ake. Mwachitsanzo, taganizirani malangizo awa:

t0 = phi [entry: 0:int, for.body: t6] #n

Tanthauzo lake ndi motere: ngati chipika choyambirira chinali chipika entry (zolowera), ndiye t0 ndi zokhazikika 0, ndipo ngati chipika choyambirira chinali for.body, ndiye muyenera kutenga mtengo t6 kuchokera ku block iyi. Izi zitha kuwoneka ngati zachinsinsi, koma njira iyi ndi yomwe imapangitsa SSA kugwira ntchito. Kuchokera kumalingaliro aumunthu, zonsezi zimapangitsa kuti code ikhale yovuta kumvetsa, koma mfundo yakuti mtengo uliwonse umaperekedwa kamodzi kokha zimapangitsa kukhathamiritsa kochuluka kukhala kosavuta.

Dziwani kuti ngati mulemba zolemba zanu, nthawi zambiri simuyenera kuthana ndi zinthu zamtunduwu. Ngakhale Clang samapanga malangizo onsewa phi, imagwiritsa ntchito makina alloca (zikufanana ndi ntchito ndi zosintha wamba zapagulu). Kenako, mukamayendetsa chiphaso cha kukhathamiritsa kwa LLVM chimatchedwa m2 reg, malangizo alloca kusinthidwa kukhala mawonekedwe a SSA. TinyGo, komabe, imalandira zolowa kuchokera ku Go SSA, yomwe, mosavuta, yasinthidwa kale kukhala mawonekedwe a SSA.

Chinanso chatsopano chachidutswa cha kachidindo kapakati chomwe chikuganiziridwa ndichakuti mwayi wogawa magawo ndi index umayimiridwa ngati ntchito yowerengera adilesi ndikugwiritsa ntchito kuchotsera cholozeracho. Apa mutha kuwona kuwonjezeredwa kwachindunji kwa ma IR code (mwachitsanzo - 1:int). Mu chitsanzo ndi ntchito myAdd izi sizinagwiritsidwe ntchito. Tsopano popeza tazichotsa, tiyeni tiwone zomwe code iyi imakhala itasinthidwa kukhala mawonekedwe a LLVM IR:

define i64 @sum(i64* %ptr, i64 %len, i64 %cap) {
entry:
  br label %for.loop

for.loop:                                         ; preds = %for.body, %entry
  %0 = phi i64 [ 0, %entry ], [ %5, %deref.next ]
  %1 = phi i64 [ 0, %entry ], [ %6, %deref.next ]
  %2 = icmp slt i64 %1, %len
  br i1 %2, label %for.body, label %for.done

for.body:                                         ; preds = %for.loop
  %3 = getelementptr i64, i64* %ptr, i64 %1
  %4 = load i64, i64* %3
  %5 = add i64 %0, %4
  %6 = add i64 %1, 1
  br label %for.loop

for.done:                                         ; preds = %for.loop
  ret i64 %0
}

Pano, monga kale, tikutha kuona dongosolo lomwelo, lomwe limaphatikizapo mapangidwe ena a syntactic. Mwachitsanzo, mu mafoni phi ma values ​​ndi zilembo zosinthidwa. Komabe, pali china chake apa chomwe chili choyenera kusamala kwambiri.

Poyamba, apa mutha kuwona siginecha yosiyana kotheratu. LLVM sichigwirizana ndi magawo, ndipo chifukwa chake, monga kukhathamiritsa, TinyGo compiler yomwe idapanga kachidindo kameneka kamagawaniza kufotokozera kwa detayi m'magawo. Ikhoza kuyimira magawo atatu a magawo (ptr, len ΠΈ cap) monga chomangira (chomangira), koma kuwayimira ngati magulu atatu osiyana amalola kukhathamiritsa kwina. Ophatikiza ena atha kuyimilira gawolo mwanjira zina, kutengera ndi kuyitanira kwa ntchito za nsanja yomwe mukufuna.

Chinthu china chochititsa chidwi cha code iyi ndi kugwiritsa ntchito malangizo getelementptr (nthawi zambiri amafupikitsidwa ngati GEP).

Malangizowa amagwira ntchito ndi zolozera ndipo amagwiritsidwa ntchito kupeza cholozera pagawo. Mwachitsanzo, tiyeni tifanizire ndi code yotsatirayi yolembedwa mu C:

int* sliceptr(int *ptr, int index) {
    return &ptr[index];
}

Kapena ndi zofanana ndi izi:

int* sliceptr(int *ptr, int index) {
    return ptr + index;
}

Chinthu chofunika kwambiri apa ndi kuti malangizo getelementptr sichigwira ntchito zosokoneza. Imangowerengera cholozera chatsopano kutengera chomwe chilipo. Ikhoza kutengedwa ngati malangizo mul ΠΈ add pa mlingo wa hardware. Mutha kuwerenga zambiri za malangizo a GEP apa.

Chinthu chinanso chosangalatsa cha code iyi yapakatikati ndikugwiritsa ntchito malangizo icmp. Uwu ndi malangizo ofunikira omwe amagwiritsidwa ntchito pofanizira zinthu zonse. Chotsatira chotsatira malangizowa nthawi zonse chimakhala chamtengo wapatali i1 - mtengo womveka. Pankhaniyi, kufananitsa kumapangidwa pogwiritsa ntchito mawu osakira slt (yosaina kuchepera), popeza tikufanizira manambala awiri omwe adayimiridwa kale ndi mtunduwo int. Ngati tikuyerekeza manambala awiri osasainidwa, ndiye kuti tigwiritsa ntchito icmp, ndipo mawu ofunikira omwe amagwiritsidwa ntchito pofananiza angakhale ult. Poyerekeza manambala oyandama, malangizo ena amagwiritsidwa ntchito, fcmp, zomwe zimagwira ntchito mofananamo.

Zotsatira

Ndikukhulupirira kuti m'nkhaniyi ndalemba zofunikira kwambiri za LLVM IR. Inde, pali zambiri pano. Makamaka, kuyimira kwapakatikati kwa kachidindo kumatha kukhala ndi zofotokozera zambiri zomwe zimalola kuti kukhathamiritsa kumadutsa kuti aganizire mbali zina za code yomwe imadziwika ndi wopanga zomwe sizingafotokozedwe mwanjira ina mu IR. Mwachitsanzo, iyi ndi mbendera inbounds Malangizo a GEP, kapena mbendera nsw ΠΈ nuw, zomwe zingathe kuwonjezeredwa ku malangizo add. Zomwezo zimapitanso ku mawu osakira private, zomwe zikuwonetsa kukhathamiritsa kuti ntchito yomwe ikuwonetsa sidzatchulidwa kuchokera kunja kwa gawo lamakono lophatikiza. Izi zimalola kukhathamiritsa kosangalatsa kophatikizana monga kuchotsa mikangano yosagwiritsidwa ntchito.

Mutha kuwerenga zambiri za LLVM mu zolemba, zomwe mumazitchula nthawi zambiri mukamapanga compiler yanu yochokera ku LLVM. Pano kalozera, yomwe imayang'ana kupanga compiler ya chinenero chosavuta kwambiri. Magwero onsewa azidziwitso adzakhala othandiza kwa inu popanga compiler yanu.

Wokondedwa owerenga! Kodi mukugwiritsa ntchito LLVM?

LLVM kuchokera kumawonedwe a Go

Source: www.habr.com

Kuwonjezera ndemanga