LLVM kubva paGo maonero

Kugadzira compiler ibasa rakaoma zvikuru. Asi, zvinofadza, nekuvandudzwa kwemapurojekiti akaita seLLVM, mhinduro yedambudziko iri yakareruka zvikuru, iyo inobvumira kunyange mugadziri mumwe chete kugadzira mutauro mutsva uri pedyo nekushanda kuC. Kushanda neLLVM kwakaoma nekuti izvi system inomiririrwa nehuwandu hukuru hwekodhi, ine zvinyorwa zvishoma. Kuti uedze kugadzirisa kukanganisa uku, munyori wezvinyorwa, shanduro yatiri kubudisa nhasi, ari kuzoratidza mienzaniso yekodhi yakanyorwa muGo uye kuratidza kuti inotanga kushandurirwa sei Enda kuSSA, uyezve muLLVM IR uchishandisa compiler tinyGO. Iyo Go SSA neLLVM IR kodhi yakagadziridzwa zvishoma kuti ibvise zvinhu zvisina basa kune tsananguro dzakapihwa pano, kuitira kuti tsananguro dzinyatsonzwisisika.

LLVM kubva paGo maonero

Muenzaniso wekutanga

Basa rekutanga randichatarisa pano iri nyore nzira yekuwedzera nhamba:

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

Iri basa riri nyore kwazvo, uye, pamwe, hapana chingave chiri nyore. Inoturikira mune inotevera Go SSA kodhi:

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

Nemaonero aya, maratidziro emhando yedata akaiswa kurudyi uye anogona kufuratirwa muzviitiko zvakawanda.

Uyu muenzaniso mudiki unotobvumidza iwe kuti uone kukosha kwechimwe chikamu cheSSA. Sezvineiwo, kana uchishandura kodhi kuita SSA fomu, chirevo chega chega chinoputswa kuita zvikamu zvekutanga izvo zvakaumbwa. Kwatiri, murairo return a + b, chokwadi, inomiririra maitiro maviri: kuwedzera nhamba mbiri uye kudzosa mhedzisiro.

Mukuwedzera, pano iwe unogona kuona mabheji ekutanga echirongwa; mune iyi kodhi pane chete block - yekupinda block. Tichataura zvakawanda pamusoro pemabhuroko pazasi.

Iyo Go SSA kodhi inoshandura nyore kuita LLVM IR:

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

Zvaunogona kuona ndezvekuti kunyangwe zvimiro zvakasiyana zve syntactic zvichishandiswa pano, chimiro chebasa hachina kuchinjika. Iyo LLVM IR code ine simba shoma kudarika Go SSA code, yakafanana neC. Pano, mukuzivisa kwebasa, kutanga kune tsanangudzo yemhando yedata inodzoka, iyo nharo yemhando inoratidzwa pamberi pezita renharo. Pamusoro pezvo, kurerutsa IR parsing, mazita emasangano epasi rose anotungamirwa nechiratidzo @, uye pamberi pemazita enzvimbo pane chiratidzo % (basa rinoonekwawo sechinhu chepasi rose).

Chinhu chimwe chekucherechedza nezve kodhi iyi ndechekuti Go's mhando yekumiririra sarudzo int, iyo inogona kumiririrwa se 32-bit kana 64-bit kukosha, zvichienderana nemuunganidzi uye chinangwa chekubatanidza, inogamuchirwa kana LLVM inogadzira iyo IR kodhi. Ichi ndicho chimwe chezvikonzero zvakawanda zvekuti LLVM IR kodhi haisi, sekufunga kwevanhu vazhinji, chikuva chakazvimirira. Kodhi yakadaro, yakagadzirwa kune imwe puratifomu, haigone kungotorwa uye kuunganidzwa kune imwe puratifomu (kunze kwekunge iwe wakakodzera kugadzirisa dambudziko iri. nehanya zvakanyanya).

Imwe pfungwa inofadza inofanirwa kucherechedza ndeyokuti rudzi i64 haisi nhamba yakasainwa: haina kwayakarerekera maererano nekumiririra chiratidzo chenhamba. Zvichienderana nerairo, inogona kumiririra nhamba dzese dzakasainwa uye dzisina kusaina. Muchiitiko chekumiririra kwekushanda kwekuwedzera, izvi hazvina basa, saka hapana mutsauko mukushanda nenhamba dzakasainwa kana dzisina kunyorwa. Pano ndinoda kuona kuti mumutauro weC, kupfachukira kwakasainwa nhamba inoshanduka inotungamira kune hunhu husina kutsanangurwa, saka iyo Clang frontend inowedzera mureza kubasa. nsw (hapana kusaina kuputira), iyo inoudza LLVM kuti inogona kufunga kuti yekuwedzera haimbofashukira.

Izvi zvingave zvakakosha kune dzimwe optimizations. Semuenzaniso, kuwedzera maitiro maviri i16 papuratifomu ye32-bit (ine 32-bit marejista) inoda, mushure mekuwedzera, chiratidzo chekuwedzera kushanda kuitira kuti urambe uri munzvimbo. i16. Nekuda kweizvi, zvinowanzoita zvakanyanya kuita mashandiro akazara zvichienderana nesaizi yemuchina.

Chii chinoitika chinotevera neiyi IR kodhi hazvisi zvekunyanya kufarira kwatiri ikozvino. Iyo kodhi yakagadziridzwa (asi muchiitiko chemuenzaniso wakapfava sewedu, hapana chinogadziriswa) uye wozoshandurwa kuita kodhi yemuchina.

Muenzaniso wechipiri

Muenzaniso unotevera watichatarisa uchave wakaoma zvishoma. Sezvineiwo, tiri kutaura nezve basa rinopfupikisa chidimbu chetigers:

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

Iyi kodhi inoshandura kune inotevera Go SSA kodhi:

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

Pano iwe unogona kutoona zvimwe zvivakwa zvakajairwa zvekumiririra kodhi muSSA fomu. Zvichida chinhu chiri pachena chekodhi iyi inyaya yekuti hapana mirairo yekudzora kuyerera. Kuti udzore kuyerera kwekuverenga, kune chete kusvetuka kwemamiriro uye kusingaverengeki, uye, kana tikafunga murairo uyu semurairo wekudzora kuyerera, murairo wekudzoka.

Muchokwadi, pano iwe unogona kutarisisa kune chokwadi chekuti chirongwa hachina kukamurwa kuita mabhuroko uchishandisa curly braces (semumhuri C yemitauro). Inopatsanurwa nemavara, inoyeuchidza mitauro yegungano, uye inoratidzwa muchimiro chemabhuroko ekutanga. MuSSA, zvidhinha zvekutanga zvinotsanangurwa sekuteedzana kwekodhi kutanga neregi uye kupera nemirairo yekupedzisa block block, senge- - return ΠΈ jump.

Imwe tsanangudzo inofadza yekodhi iyi inomiririrwa nemurairo phi. Mirayiridzo yacho haina kujairika uye inogona kutora nguva kuti inzwisise. rangarira, izvo S.S.A. ipfupi kune Static Single Assignment. Ichi chiratidziro chepakati chekodhi inoshandiswa nevakongiri, umo shanduko yega yega inopihwa kukosha kamwe chete. Izvi zvakanakira kuratidza mabasa akareruka senge basa redu myAddinoratidzwa pamusoro, asi haina kukodzera kune mamwe mabasa akaomarara senge basa rakurukurwa muchikamu chino sum. Kunyanya, zvinoshanduka zvinoshanduka panguva yekuitwa kwechiuno i ΠΈ n.

SSA inodarika chirambidzo chekugovera hunhu hwakasiyana kamwechete uchishandisa inonzi rairo phi (zita rayo rakatorwa muarufabheti yechiGiriki). Icho chokwadi ndechekuti kuti iyo SSA inomiririra kodhi igadziriswe kumitauro yakaita seC, unofanirwa kushandisa mamwe manomano. Mhedzisiro yekudaidza iyi rairo kukosha kwazvino kweiyo variable (i kana n), uye rondedzero yezvivharo zvekutanga inoshandiswa semaparamita ayo. Somuenzaniso, funga murayiro uyu:

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

Zvazvinoreva ndezvizvi: kana iyo yapfuura basic block yaive block entry (input), zvino t0 inogara iripo 0, uye kana iyo yapfuura yekutanga block yaive for.body, ipapo unofanira kutora kukosha t6 kubva ku block iyi. Izvi zvese zvingaite sezvisinganzwisisike, asi nzira iyi ndiyo inoita kuti SSA ishande. Kubva pamaonero emunhu, izvi zvese zvinoita kuti kodhi ive yakaoma kunzwisisa, asi chokwadi chekuti kukosha kwega kwega kunopihwa kamwe chete kunoita kuti akawanda optimizations ave nyore.

Ziva kuti kana iwe ukanyora yako compiler, kazhinji haufanirwe kubata nemhando iyi yezvinhu. Kunyangwe Clang haagadzirise mirairo iyi phi, inoshandisa michina alloca (inofanana nekushanda neyakajairwa yenzvimbo dzakasiyana). Zvadaro, kana uchimhanyisa LLVM optimization pass yakadanwa mem2reg, mirayiridzo alloca yakashandurwa kuita SSA fomu. TinyGo, zvisinei, inogamuchira kubva kuGo SSA, iyo, zviri nyore, yakatoshandurwa kuita SSA fomu.

Imwe tsvakiridzo yechidimbu chepakati kodhi iri kutariswa ndeyekuti kuwana zvidimbu zvezvikamu ne index inomiririrwa muchimiro chekushanda kwekuverenga kero uye mashandiro ekudzoreredza chinongedzo chabuda. Pano iwe unogona kuona kuwedzera kwakananga kweanogara kune iyo IR kodhi (semuenzaniso - 1:int) Mumuenzaniso nebasa myAdd izvi hazvina kushandiswa. Zvino zvatava neaya maficha kubva munzira, ngatitarisei kuti kodhi iyi inovei kana yashandurwa kuita LLVM IR fomu:

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, sepakutanga, tinogona kuona chimiro chimwe chete, icho chinosanganisira mamwe maumbirwo ezvinyorwa. Semuenzaniso, mukufona phi kukosha uye mavara akachinjika. Zvisinei, pane chimwe chinhu pano chakakodzera kunyatsoteerera.

Kutanga, pano iwe unogona kuona akasiyana zvachose siginicha yebasa. LLVM haitsigire zvimedu, uye semhedzisiro, sekugadzirisa, iyo TinyGo compiler iyo yakagadzira iyi yepakati kodhi inopatsanura tsananguro yeiyi data chimiro kuita zvikamu. Inogona kumiririra zvimedu zvitatu (ptr, len ΠΈ cap) sechimiro (chimiro), asi kuvamiririra sezvikamu zvitatu zvakasiyana kunobvumira kumwe optimizations. Vamwe vagadziri vanogona kumiririra chidimbu nedzimwe nzira, zvichienderana nemakonisheni ekufona emabasa epuratifomu.

Chimwe chinhu chinonakidza chekodhi iyi kushandiswa kwekuraira getelementptr (kazhinji yakapfupikiswa seGEP).

Murairo uyu unoshanda nemanongedzo uye unoshandiswa kuwana chinongedzo kuchikamu chechikamu. Semuenzaniso, ngatiienzanise neinotevera kodhi yakanyorwa muC:

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

Kana kuti neinotevera yakaenzana neiyi:

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

Chinhu chinonyanya kukosha apa ndechekuti mirairo getelementptr haiite dereferencing Operations. Inongoverengera chinongedzo chitsva zvichibva pane chiripo. Inogona kutorwa semirayiridzo mul ΠΈ add pamwero wehardware. Unogona kuverenga zvakawanda nezve GEP mirairo pano.

Chimwe chinhu chinonakidza chekodhi iyi yepakati ndiko kushandiswa kwekuraira icmp. Uyu ndiwo murairo wechinangwa chakajairika unoshandiswa kuita kuenzanisa kwakakwana. Mhedzisiro yemurairo uyu inogara yakakosha yemhando i1 - kukosha kunonzwisisika. Muchiitiko ichi, kuenzanisa kunoitwa uchishandisa keyword slt (yakasainwa zvishoma pane), sezvo tiri kuenzanisa nhamba mbiri dzakambomiririrwa nemhando int. Kana isu taifananidza maviri asina kusaina nhamba, isu taizoshandisa icmp, uye izwi guru rinoshandiswa mukuenzanisa raizova ult. Kuenzanisa nhamba dzenzvimbo dzinoyangarara, mumwe murairo unoshandiswa, fcmp, iyo inoshanda nenzira yakafanana.

Migumisiro

Ndinotenda kuti mune ino chinyorwa ndakafukidza akakosha maficha eLLVM IR. Zvechokwadi, kune zvakawanda zvakawanda pano. Kunyanya, iyo yepakati inomiririra iyo kodhi inogona kunge iine akawanda anonongedzero anobvumira optimization inopfuura kuti ifunge nezvemamwe maficha ekodhi anozivikanwa kune anounganidza ayo asingagoni neimwe nzira kuratidzwa muIR. Semuenzaniso, uyu mureza inbounds GEP mirayiridzo, kana mireza nsw ΠΈ nuw, iyo inogona kuwedzerwa kune mirayiridzo add. Izvo zvakafanana zvinoenda kune keyword private, zvichiratidza kune optimizer kuti basa rainomaka harizotaurwi kubva kunze kweiyo ikozvino compilation unit. Izvi zvinobvumira zvakawanda zvinonakidza interprocedural optimizations sekubvisa nharo dzisina kushandiswa.

Unogona kuverenga zvakawanda nezveLLVM mukati zvinyorwa, iyo yauchazoreva kazhinji paunenge uchigadzira yako LLVM-yakavakirwa compiler. Here gwara, iyo inotarisa kugadzira muunganidzi wemutauro wakapfava zvikuru. Ose maviri aya masosi eruzivo achave anobatsira kwauri paunenge uchigadzira yako compiler.

Vanodiwa vaverengi! Uri kushandisa LLVM?

LLVM kubva paGo maonero

Source: www.habr.com

Voeg