LLVM mai se vaaiga Go

O le atinaʻeina o se faʻapipiʻi o se galuega faigata tele. Ae, o le mea e lelei ai, faatasi ai ma le atinaʻeina o galuega faatino e pei o le LLVM, o le fofo i lenei faafitauli e matua faafaigofieina, lea e mafai ai e oo lava i se polokalama e tasi e fatuina se gagana fou e latalata i le faatinoga i le C. O le galulue faatasi ma le LLVM e faigata ona o le mea moni o lenei. faiga o loʻo faʻatusalia e le tele o numera, faʻapipiʻiina ma ni faʻamaumauga laiti. Ina ia taumafai e faʻasaʻo lenei faʻaletonu, o le tusitala o meafaitino, o le faaliliuga o loʻo matou lolomiina i aso nei, o le a faʻaalia faʻataʻitaʻiga o code na tusia i le Go ma faʻaalia pe faʻafefea ona faʻaliliu muamua i totonu. Alu SSA, ona sosoo ai lea ma le LLVM IR faʻaaogaina le tuʻufaʻatasia tinyGO. O le Go SSA ma le LLVM IR code ua fai sina teuteuga e aveese mea e le talafeagai ma faʻamatalaga o loʻo tuʻuina atu iinei, ina ia faʻamalamalama atili ai faʻamatalaga.

LLVM mai se vaaiga Go

Fa'ata'ita'iga muamua

O le galuega muamua o le a ou tilotilo i ai iinei o se faiga faigofie mo le faʻaopoopoina o numera:

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

O lenei galuega e matua faigofie lava, ma, masalo, e leai se mea e sili atu ona faigofie. E fa'aliliu i le Go SSA code nei:

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

Faatasi ai ma lenei vaaiga, o faʻamatalaga ituaiga faʻamatalaga o loʻo tuʻuina i le itu taumatau ma e mafai ona le amanaiaina i le tele o tulaga.

O lenei faʻataʻitaʻiga laʻititi ua faʻatagaina oe e vaʻai i le ute o le tasi itu o le SSA. O lona uiga, pe a fa'aliliu le code i le SSA form, o fa'amatalaga ta'itasi e malepe i lalo i vaega sili ona tulagalua o lo'o fatuina ai. I lo tatou tulaga, o le poloaiga return a + b, o le mea moni, e fai ma sui o gaioiga e lua: faʻaopoopo numera lua ma toe faʻafoʻi le iʻuga.

E le gata i lea, o iinei e mafai ona e vaʻai i poloka autu o le polokalame; i lenei code e naʻo le tasi le poloka - o le poloka ulufale. O le a tatou talanoa atili e uiga i poloka i lalo.

O le Go SSA code e faigofie ona liua i le LLVM IR:

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

O le mea e mafai ona e matauina e ui lava o faʻaoga faʻasologa eseese o loʻo faʻaogaina iinei, o le fausaga o le galuega e matuaʻi le suia. O le LLVM IR code e sili atu le malosi nai lo le Go SSA code, e tutusa ma C. O iinei, i le taʻutinoga o galuega, muamua o loʻo i ai se faʻamatalaga o le ituaiga faʻamatalaga e toe foʻi mai, o le ituaiga finauga o loʻo faʻaalia i luma o le igoa finauga. E le gata i lea, ina ia faʻafaigofie le IR parsing, o igoa o faʻalapotopotoga o le lalolagi e muamua i le faʻailoga @, ma i luma o igoa o le atunuu o loo i ai se faailoga % (o se galuega e manatu foi o se vaega o le lalolagi).

E tasi le mea e tatau ona maitauina e uiga i lenei code o le filifiliga faʻatusa a Go int, lea e mafai ona faʻatusalia e pei o le 32-bit poʻo le 64-bit tau, e faʻatatau i le tuʻufaʻatasia ma le sini o le tuʻufaʻatasia, e talia pe a faʻatupuina e le LLVM le code IR. O se tasi lea o le tele o mafuaʻaga e le o le LLVM IR code, e pei ona manatu le toʻatele o tagata, tulaga tutoatasi. O ia code, na faia mo le tasi faʻavae, e le mafai ona faʻaaogaina ma tuʻufaʻatasia mo se isi faʻavae (sei vagana ua e fetaui mo le foia o lenei faʻafitauli ma le faʻaeteete tele).

O le isi itu manaia e tatau ona matauina o le ituaiga i64 e le o se numera saini: e le faaituau i tulaga e fai ma sui o le faailoga o le numera. Fa'alagolago i le fa'atonuga, e mafai ona fa'atusalia uma numera saini ma numera e le'i sainia. I le tulaga o le faʻatusaina o le faʻaopoopoga o gaioiga, e le afaina lea, o lea e leai se eseesega i le galue ma numera saini pe leai. O iinei ou te fia maitauina i le gagana C, o le faʻafefeina o se fesuiaiga o le numera saini e taʻitaʻia ai amioga e le faʻamalamalamaina, o lea e faʻaopoopo ai e le Clang frontend se fuʻa i le gaioiga. nsw (leai se afifi saini), lea e taʻu atu i le LLVM e mafai ona manatu o le faʻaopoopoga e le mafai ona sosolo.

Atonu e taua tele lenei mea mo nisi faʻataʻitaʻiga. Mo se faʻataʻitaʻiga, faʻaopoopoina mea taua e lua i16 i luga o se 32-bit platform (faatasi ai ma 32-bit registers) e manaʻomia, pe a maeʻa faʻaopoopoga, se gaioiga faʻalautele faʻailoga ina ia tumau ai i le lautele. i16. Ona o lenei mea, e masani ona sili atu le lelei o le faʻatinoina o gaioiga faʻavae e faʻavae i luga o le tele o masini resitala.

O le a le isi mea e tupu i lenei IR code e le o se mea e sili ona fiafia i ai i le taimi nei. O le code e sili ona lelei (ae i le tulaga o se faʻataʻitaʻiga faigofie e pei o matou, e leai se mea e sili ona lelei) ona liua lea i le numera masini.

Fa'ata'ita'iga lona lua

O le isi faʻataʻitaʻiga o le a tatou tilotilo i ai o le a sili atu ona lavelave. O lona uiga, o loʻo matou talanoa e uiga i se galuega e faʻaputuina ai se vaega o numera:

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

O lenei code e liliu i le Go SSA code nei:

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

I'inei e mafai ona e va'ai i nisi fausaga fa'apitoa mo le fa'atusaina o code i le SSA fomu. Masalo o le mea sili ona manino o lenei code o le mea moni e leai ni faʻatonuga faʻatonuga faʻatonutonu. Ina ia pulea le tafe o faʻatusatusaga, e naʻo tuʻutuʻuga ma le le faʻatulagaina oso, ma, afai tatou te manatu o lenei poloaiga o se poloaiga e pulea le tafe, o se toe foʻi mai.

O le mea moni, o iinei e mafai ona e gauai atu i le mea moni e le o vaevaeina le polokalame i poloka e faʻaaoga ai fusi faʻamalo (pei o le C aiga o gagana). E vaevaeina i igoa, faʻamanatuina o gagana faʻapotopotoga, ma tuʻuina atu i foliga o poloka autu. I totonu o le SSA, o poloka autu o loʻo faʻamatalaina o ni faʻasologa vavalalata o faʻailoga e amata i se igoa ma faʻaiʻu i faʻatonuga faʻamaeʻaina poloka, pei ole - return и jump.

O le isi faʻamatalaga manaia o lenei code o loʻo faʻatusalia e le faʻatonuga phi. O faatonuga e fai si ese ma e ono umi se taimi e malamalama ai. manatua, lena S.S.A. e faapuupuu mo le Static Single Assignment. O se faʻataʻitaʻiga vavalalata lea o le code faʻaaogaina e tagata faʻapipiʻi, lea e tuʻuina atu ai suiga taʻitasi i se tau naʻo le tasi. E lelei tele lenei mo le faʻaalia o galuega faigofie e pei o la tatou galuega myAddo loʻo faʻaalia i luga, ae e le talafeagai mo galuega faʻalavelave e pei o le galuega o loʻo talanoaina i lenei vaega sum. Aemaise lava, e suia suiga i le taimi o le faʻatinoina o le matasele i и n.

SSA e faʻafefe le faʻatapulaʻaina o le tuʻuina atu o tau fesuiaiga i le taimi e faʻaaoga ai se mea e taʻua o faatonuga phi (o lona igoa e aumai mai le alafapeta Eleni). O le mea moni e faapea ina ia mafai ona faia le SSA sui o le code mo gagana pei o C, e tatau ona e faia ni togafiti. O le iʻuga o le valaʻau o lenei faʻatonuga o le tau o loʻo iai nei o le fesuiaiga (i poʻo n), ma o se lisi o poloka autu o loʻo faʻaaogaina e fai ma ona faʻamau. Mo se faʻataʻitaʻiga, mafaufau i le faatonuga lenei:

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

O lona uiga e faapea: pe afai o le poloka faavae muamua o se poloka entry (tusi), ona t0 e tumau 0, ma afai o le poloka faavae muamua sa for.body, ona tatau lea ona e ave le tau t6 mai lenei poloka. Atonu e foliga mai e lilo uma nei mea, ae o lenei faiga o le mea lea e galue ai le SSA. Mai le va'aiga a le tagata, o nei mea uma e faigata ai ona malamalama i le code, ae o le mea moni o tau ta'itasi e na'o le tasi e tu'uina atu e fa'afaigofie ai le tele o su'esu'ega.

Manatua afai e te tusia lau lava tagata faʻapipiʻi, e masani lava e te le tau feagai ma ia ituaiga mea. E oo lava ia Clang e le faia uma nei faatonuga phi, e faʻaaogaina se masini alloca (e pei o le galue ma fesuiaiga masani i le lotoifale). Ma, pe a faʻatautaia se LLVM optimization pass e valaʻau mem2reg, faatonuga alloca liliu ile SSA fomu. Ae ui i lea, o TinyGo, e maua mai i le Go SSA, lea, e faigofie, ua uma ona liua i le SSA form.

O le isi fa'afouga o le vaevaega o le code intermediate o lo'o iloiloina, o le avanoa i fasi elemene e ala i fa'asino igoa o lo'o fa'atusalia i le tulaga o se fa'agaioiga o le fa'atatauina o le tuatusi ma le fa'agaioiga o le fa'ate'aina o le fa'ai'uga. O iinei e mafai ona e vaʻai i le faʻaopoopoga tuusaʻo o faʻamau i le IR code (mo se faʻataʻitaʻiga - 1:int). I le faʻataʻitaʻiga ma le galuega myAdd e le'i fa'aaogaina. I le taimi nei ua tatou maua na foliga mai le auala, seʻi o tatou vaʻavaʻai pe o le a le mea e avea ai lenei code pe a liua i le LLVM IR form:

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
}

O iinei, e pei ona i ai muamua, e mafai ona tatou vaʻai i le fausaga lava e tasi, lea e aofia ai isi fausaga syntactic. Mo se faʻataʻitaʻiga, i telefoni phi tau ma fa'ailoga ua fesuia'i. Ae ui i lea, o loʻo i ai se mea iinei e tatau ona gauai faapitoa i ai.

I le amataga, iinei e mafai ona e vaʻai i se saini galuega e matua ese lava. E le lagolagoina e le LLVM fasi pepa, ma o se taunuuga, e avea o se faʻataʻitaʻiga, o le TinyGo compiler na faʻatupuina lenei code intermediate vaevae le faʻamatalaga o lenei fausaga faʻamaumauga i ni vaega. E mafai ona suitulaga i elemene fasi vaega e tolu (ptr, len и cap) e avea o se fausaga (struct), ae fai ma sui oi latou o ni vaega eseese se tolu e mafai ai mo nisi faʻataʻitaʻiga. O isi tagata tu'ufa'atasi e mafai ona fa'atusalia le fasi pepa i isi auala, e fa'atatau i le vala'au o fa'atonuga a le fa'atulagaina o galuega.

O le isi mea manaia o lenei code o le faʻaaogaina o le faʻatonuga getelementptr (e masani ona faapuupuuina o le GEP).

O lenei fa'atonuga e galue fa'atasi ma fa'ailoga ma fa'aoga e maua ai se fa'asino ile elemene fasi. Mo se faʻataʻitaʻiga, seʻi o tatou faʻatusatusa i le code lea na tusia i le C:

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

Pe fa'atasi ai ma mea nei e tutusa ma lenei:

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

O le mea pito sili ona taua iinei o le faʻatonuga getelementptr e le fa'atinoina galuega fa'aleaogaina. Na'o le fa'atatauina o se fa'ailoga fou e fa'atatau i le mea o iai. E mafai ona avea o ni faatonuga mul и add i le tulaga o meafaigaluega. E mafai ona e faitau atili e uiga i faatonuga a le GEP iinei.

O le isi mea manaia o lenei code intermediate o le faʻaaogaina o le faʻatonuga icmp. Ole fa'atonuga fa'apitoa lea e fa'aaoga e fa'atino ai fa'atusatusaga fa'atasi. O le taunuuga o lenei faatonuga e masani lava o se taua o le ituaiga i1 — taua talafeagai. I lenei tulaga, e faia se faʻatusatusaga e faʻaaoga ai le upu autu slt (saini itiiti ifo), talu ai o loʻo matou faʻatusatusaina numera e lua na faʻatusalia muamua e le ituaiga int. Afai o loʻo matou faʻatusatusaina ni numera lua e leʻi sainia, ona matou faʻaaogaina lea icmp, ma o le upu autu o loʻo faʻaaogaina i le faʻatusatusaga o le ult. Ina ia faʻatusatusa numera o loʻo faʻafefeteina, o loʻo faʻaaogaina se isi faʻatonuga, fcmp, lea e galue i se auala talitutusa.

O taunuʻuga

Ou te talitonu o lenei mea ua ou ufiufi ai vaega sili ona taua o le LLVM IR. Ioe, e tele atu isi mea iinei. Aemaise lava, o le vaeluagalemu o le faʻailoga e mafai ona aofia ai le tele o faʻamatalaga e faʻatagaina ai le faʻaogaina o pasi e amanaʻia ai nisi o vaega o le code ua iloa e le tagata faʻapipiʻi e le mafai ona faʻaalia i se isi itu i le IR. Mo se faʻataʻitaʻiga, o le fuʻa lea inbounds GEP faatonuga, po'o fu'a nsw и nuw, lea e mafai ona faaopoopo i faatonuga add. E faapena foi mo le upu autu private, fa'ailoa atu i le fa'asilisili o le galuega e fa'ailogaina o le a le fa'asino mai i fafo atu o le iunite tu'ufa'atasi o lo'o iai nei. Ole mea lea e fa'atagaina ai le tele o su'esu'ega interprocedural e pei ole fa'ate'aina o finauga e le'i fa'aaogaina.

E mafai ona e faitau atili e uiga i LLVM i fa'amaumauga, lea e te fa'asino i ai i taimi uma pe a atia'e lau lava LLVM-fa'avae tu'ufa'atasi. O iinei taʻitaʻi, lea e vaʻavaʻai i le atinaʻeina o se tuʻufaʻatasia mo se gagana faigofie tele. O nei puna'oa e lua o fa'amatalaga o le a aoga ia te oe pe a fatuina lau oe fa'aputu.

Lau faitau le au faitau! O e fa'aaogaina le LLVM?

LLVM mai se vaaiga Go

puna: www.habr.com

Faaopoopo i ai se faamatalaga