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
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.
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 myAdd
zomwe 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 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
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
Wokondedwa owerenga! Kodi mukugwiritsa ntchito LLVM?
Source: www.habr.com