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.
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
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 myAdd
o 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 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
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
Lau faitau le au faitau! O e fa'aaogaina le LLVM?
puna: www.habr.com