LLVM ho latela pono ea Go

Ho theha moqapi ke mosebetsi o boima haholo. Empa, ka lehlohonolo, ka nts'etsopele ea merero e kang LLVM, tharollo ea bothata bona e nolofalitsoe haholo, e lumellang esita le moqapi a le mong ho theha puo e ncha e haufi le ts'ebetso ho C. Ho sebetsa le LLVM ho thatafalloa ke taba ea hore sena Sistimi e emeloa ke palo e kholo ea khoutu, e nang le litokomane tse nyane. E le ho leka ho lokisa bofokoli bona, mongoli oa boitsebiso boo, phetolelo eo re e hatisang kajeno, o tla bontša mehlala ea khoutu e ngotsoeng ho Go le ho bontša kamoo e fetoletsoeng kateng pele. Kea SSA, ebe ho LLVM IR ho sebelisa compiler nyenyaneGO. Khoutu ea Go SSA le LLVM IR e hlophisitsoe hanyenyane ho tlosa lintho tse sa amaneng le litlhaloso tse fanoeng mona, e le ho etsa hore litlhaloso li utloisisehe haholoanyane.

LLVM ho latela pono ea Go

Mohlala oa pele

Mosebetsi oa pele oo ke tla o sheba mona ke mokhoa o bonolo oa ho eketsa linomoro:

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

Mosebetsi ona o bonolo haholo, 'me, mohlomong, ha ho letho le ka bang bonolo. E fetolela khoutu e latelang ea Go SSA:

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

Ka pono ena, lintlha tsa mofuta oa data li behiloe ka ho le letona 'me hangata li ka hlokomolohuoa.

Mohlala ona o monyane o se o ntse o u lumella ho bona moelelo oa karolo e le 'ngoe ea SSA. E leng, ha o fetolela khoutu ho sebopeho sa SSA, polelo e 'ngoe le e' ngoe e arotsoe ka likarolo tsa mantlha tseo e entsoeng ka tsona. Tabeng ea rona, taelo return a + b, ha e le hantle, e emela liketso tse peli: ho eketsa linomoro tse peli le ho khutlisetsa sephetho.

Ho phaella moo, mona u ka bona li-blocks tsa motheo tsa lenaneo; ka khoutu ena ho na le sebaka se le seng feela - sebaka sa ho kena. Re tla bua haholoanyane ka li-blocks ka tlase.

Khoutu ea Go SSA e fetolela habonolo ho LLVM IR:

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

Seo u ka se hlokomelang ke hore le hoja libopeho tse fapaneng tsa syntactic li sebelisoa mona, sebopeho sa mosebetsi ha sea fetoha. Khoutu ea LLVM IR e matla hanyenyane ho feta khoutu ea Go SSA, e tšoanang le C. Mona, phatlalatsong ea mosebetsi, pele ho na le tlhaloso ea mofuta oa data oo e o khutlisetsang, mofuta oa khang o bontšoa pele ho lebitso la khang. Ntle le moo, ho nolofatsa parsing ea IR, mabitso a mekhatlo ea lefats'e a etelloa pele ke letšoao @, ’me pele ho mabitso a sebaka ho na le letšoao % (ts'ebetso e boetse e nkuoa e le mokhatlo oa lefats'e).

Ntho e 'ngoe eo u lokelang ho e ela hloko ka khoutu ena ke qeto ea mofuta oa Go ea ho emela int, e ka emeloa e le boleng ba 32-bit kapa 64-bit, ho itšetlehile ka moqapi le sepheo sa ho bokella, e amoheloa ha LLVM e hlahisa khoutu ea IR. Lena ke le leng la mabaka a mangata ao khoutu ea LLVM IR e seng, joalo ka ha batho ba bangata ba nahana, sethaleng se ikemetseng. Khoutu e joalo, e etselitsoeng sethala se le seng, e ke ke ea nkuoa le ho bokelloa sethaleng se seng (ntle le haeba o loketse ho rarolla bothata bona. ka tlhokomelo e feteletseng).

Ntlha e 'ngoe e thahasellisang eo re lokelang ho e ela hloko ke hore mofuta i64 ha se palo e felletseng e saenneng: ha e nke lehlakore mabapi le ho emela letshwao la palo. Ho latela taelo, e ka emela linomoro tse saennoeng le tse sa saenneng. Tabeng ea boemeli ba ts'ebetso ea ho eketsa, sena ha se tsotellehe, kahoo ha ho na phapang pakeng tsa ho sebetsa le linomoro tse saennoeng kapa tse sa ngolisoang. Mona ke rata ho hlokomela hore puong ea C, ho khaphatseha ha palo e felletseng e saennoeng ho lebisa boitšoarong bo sa hlalosoang, kahoo Clang frontend e eketsa folakha ts'ebetsong. nsw (ha ho na sekoaelo se saenneng), se bolellang LLVM hore e ka nka hore tlatsetso ha e na ho tlala.

Sena se ka ba sa bohlokoa bakeng sa lintlafatso tse ling. Ka mohlala, ho eketsa litekanyetso tse peli i16 sethaleng sa 32-bit (e nang le li-registerers tsa 32-bit) e hloka, ka mor'a ho phaella, ts'ebetso ea ho atolosa matšoao e le hore e lule e le teng. i16. Ka lebaka la sena, hangata ho sebetsa hantle haholo ho etsa ts'ebetso e felletseng ho latela boholo ba ngoliso ea mochini.

Ho etsahalang ka mor'a moo ka khoutu ena ea IR ha se ntho e re khahlang hona joale. Khoutu e ntlafalitsoe (empa molemong oa mohlala o bonolo joalo ka oa rona, ha ho letho le ntlafalitsoeng) ebe o fetoloa khoutu ea mochini.

Mohlala oa bobeli

Mohlala o latelang oo re tla o sheba o tla ba thata haholoanyane. Ka mantsoe a mang, re bua ka ts'ebetso e akaretsang sekhechana sa lipalo:

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

Khoutu ena e fetolela ho khoutu e latelang ea 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

Mona o se o ka bona meaho e meng e tloaelehileng bakeng sa ho emela khoutu ka foromo ea SSA. Mohlomong tšobotsi e hlakileng ka ho fetisisa ea khoutu ena ke taba ea hore ha ho na litaelo tse hlophisitsoeng tsa ho laola phallo. Ho laola ho phalla ha lipalo, ho na le ho qhoma ho nang le maemo feela le ho se nang meeli, 'me, haeba re nka taelo ena e le taelo ea ho laola phallo, taelo ea ho khutla.

Ha e le hantle, mona u ka ela hloko taba ea hore lenaneo ha le arotsoe ka li-blocks ho sebelisa li-curly braces (joaloka lelapeng la C la lipuo). E arotsoe ka li-labels, tse hopotsang lipuo tsa kopano, 'me li hlahisoa ka mokhoa oa li-blocks tsa motheo. Ho SSA, li-block tsa mantlha li hlalosoa e le tatellano e kopaneng ea khoutu e qalang ka leibole le ho qetella ka litaelo tsa mantlha tsa ho phethela boloko, joalo ka − return и jump.

Lintlha tse ling tse khahlisang tsa khoutu ena li emeloa ke taeo phi. Litaelo ha li tloaelehe 'me li ka nka nako ho li utloisisa. hopola, seo S.S.A. e khutsufalitse bakeng sa Kabelo e Le 'ngoe e tsitsitseng. Ena ke pontšo e bohareng ea khoutu e sebelisoang ke bahlophisi, moo phapang e 'ngoe le e' ngoe e abeloang boleng hang feela. Sena se setle bakeng sa ho hlahisa mesebetsi e bonolo joalo ka ts'ebetso ea rona myAdde bontšitsoeng ka holimo, empa ha e loketse mesebetsi e rarahaneng joalo ka mosebetsi o tšohliloeng karolong ena sum. Haholo-holo, liphetoho li fetoha nakong ea ts'ebetso ea loop i и n.

SSA e feta thibelo ea ho fana ka boleng bo fapaneng hang ha e sebelisa seo ho thoeng ke taeo phi (lebitso la eona le nkiloe ho alfabeta ea Segerike). Taba ke hore e le hore tlhahiso ea khoutu ea SSA e hlahisoe bakeng sa lipuo tse kang C, o tlameha ho sebelisa maqheka a mang. Sephetho sa ho bitsa taelo ena ke boleng ba hajoale ba ho feto-fetoha (i kapa n), 'me lethathamo la li-blocks tsa motheo le sebelisoa e le mekhahlelo ea eona. Ka mohlala, nahana ka taelo ena:

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

Moelelo oa eona ke o latelang: haeba boloko ba mantlha bo fetileng e ne e le boloko entry (kenyeletso), he t0 ke kamehla 0, mme haeba boloko ba mantlha bo fetileng bo ne bo le for.body, joale o hloka ho nka boleng t6 ho tloha bolokong bona. Sena se ka 'na sa bonahala e le mohlolo, empa mochine ona ke oona o etsang hore SSA e sebetse. Ho ea ka pono ea batho, sena sohle se etsa hore ho be thata ho utloisisa khoutu, empa taba ea hore boleng bo bong le bo bong bo abeloa hanngoe feela bo etsa hore lintho tse ngata li be bonolo haholo.

Hlokomela hore haeba u ngola moqapi oa hau, hangata u ke ke ua tlameha ho sebetsana le mofuta ona oa lintho. Esita le Clang ha e hlahise litaelo tsena kaofela phi, e sebelisa mochine alloca (e tšoana le ho sebetsa le mefuta e tloaelehileng ea lehae). Ebe, ha o tsamaisa pase ea ntlafatso ea LLVM e bitsoa mme2 reg, litaelo alloca e fetoletsoeng ho foromo ea SSA. Leha ho le joalo, TinyGo e fumana tlhahiso ho tsoa ho Go SSA, eo, ha bonolo, e seng e fetotsoe ho foromo ea SSA.

Ntlafatso e 'ngoe ea sekhechana sa khoutu e bohareng e ntseng e nahanoa ke hore phihlello ea likaroloana ka index e emeloa ka mokhoa oa ts'ebetso ea ho bala aterese le ts'ebetso ea ho nyenyefatsa sesupa se hlahisoang. Mona o ka bona tlatsetso e tobileng ea li-constants ho khoutu ea IR (mohlala - 1:int). Mohlala o nang le ts'ebetso myAdd sena ha se e-so sebelisoe. Kaha joale re se re tlohile tseleng, ha re shebeng hore na khoutu ena e ba efe ha e fetoloa ho foromo ea 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
}

Mona, joalo ka pele, re ka bona sebopeho se tšoanang, se kenyelletsang libopeho tse ling tsa syntactic. Ka mohlala, ka mehala phi boleng le lileibole li fetotsoe. Leha ho le joalo, ho na le ho hong mona ho lokelang ho eloa hloko ka ho khethehileng.

Ho qala, mona o ka bona tshaeno ea ts'ebetso e fapaneng ka ho felletseng. LLVM ha e tšehetse lilae, 'me ka lebaka leo, e le ho ntlafatsa, moqapi oa TinyGo o hlahisitseng khoutu ena ea bohareng o arola tlhaloso ea sebopeho sena sa data likarolo. E ka emela likarolo tse tharo tsa likarolo (ptr, len и cap) joalo ka sebopeho (sebopeho), empa ho li emela e le mekhatlo e meraro e arohaneng ho lumella lintlafatso tse itseng. Bahlahisi ba bang ba ka emela selae ka litsela tse ling, ho ipapisitse le likopano tsa mehala ea mesebetsi ea sethala se shebiloeng.

Ntho e 'ngoe e thahasellisang ea khoutu ena ke tšebeliso ea litaelo getelementptr (hangata e khutsufalitsoe joalo ka GEP).

Taelo ena e sebetsa ka litsupa 'me e sebelisetsoa ho fumana pointer ho karolo ea selae. Mohlala, ha re e bapise le khoutu e latelang e ngotsoeng ho C:

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

Kapa ka tse latelang tse lekanang le sena:

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

Ntho ea bohlokoa ka ho fetisisa mona ke hore litaelo getelementptr ha e etse ts'ebetso ea ho kheloha. E mpa e lekanya pointer e ncha ho latela e teng. E ka nkoa e le litaelo mul и add boemong ba hardware. U ka bala haholoanyane ka litaelo tsa GEP mona.

Ntho e 'ngoe e thahasellisang ea khoutu ena e bohareng ke tšebeliso ea litaelo icmp. Ena ke taelo e akaretsang e sebelisoang ho kenya tšebetsong papiso e felletseng. Sephetho sa taelo ena kamehla ke boleng ba mofuta i1 - boleng bo utloahalang. Tabeng ena, papiso e etsoa ho sebelisoa lentsoe la sehlooho slt (e saennoe ka tlase ho), kaha re bapisa linomoro tse peli tse neng li emetsoe ke mofuta int. Haeba re ne re bapisa lipalo tse peli tse sa ngolisoang, re ne re tla li sebelisa icmp, 'me lentsoe la sehlooho le sebelisitsoeng papisong e ne e tla ba ult. Ho bapisa linomoro tsa lintlha tse phaphametseng, ho sebelisoa taelo e 'ngoe, fcmp, e sebetsang ka tsela e tšoanang.

Liphello

Ke lumela hore boitsebisong bona ke kentse likarolo tsa bohlokoa ka ho fetisisa tsa LLVM IR. Ehlile, ho na le tse ling tse ngata mona. Haholo-holo, boemeli ba mahareng ba khoutu bo ka ba le litlatsetso tse ngata tse lumellang ho feta ho ntlafatsa ho ela hloko likarolo tse itseng tsa khoutu e tsejoang ke moqapi e ke keng ea hlahisoa ka tsela e 'ngoe ho IR. Ka mohlala, ena ke folakha inbounds Litaelo tsa GEP, kapa lifolakha nsw и nuw, e ka kenyelletsoang litaelong add. Ho joalo le ka lentsoe la sehlooho private, e bonts'ang ho optimizer hore ts'ebetso eo e e tšoaeang e ke ke ea boleloa ho tsoa kantle ho yuniti ea hona joale ea pokello. Sena se lumella lintlafatso tse ngata tse khahlang tsa mekhoa e fapaneng joalo ka ho tlosa likhang tse sa sebelisoeng.

U ka bala ho eketsehileng ka LLVM ho litokomane, eo u tla bua ka eona hangata ha u ntse u theha sekopanyi sa hau se thehiloeng ho LLVM. Mona tsamaiso, e shebaneng le ho hlahisa moqapi oa puo e bonolo haholo. Mehloli ena ka bobeli ea tlhaiso-leseling e tla ba molemo ho uena ha u iketsetsa moqapi oa hau.

Babali ba ratehang! Na u sebelisa LLVM?

LLVM ho latela pono ea Go

Source: www.habr.com

Eketsa ka tlhaloso