LLVM mai i te tirohanga Haere

He mahi tino uaua te whakawhanake i te whakahiato. Engari, ko te waimarie, me te whakawhanaketanga o nga kaupapa penei i te LLVM, he tino ngawari te otinga ki tenei raru, ka taea e te kaitoha kotahi te hanga i tetahi reo hou e tata ana ki te mahi ki a C. Ko te mahi tahi me LLVM he uaua na te mea ko tenei Ko te punaha e whakaatuhia ana e te nui o te waehere, he iti nga tuhinga. Hei ngana ki te whakatika i tenei hapa, ko te kaituhi o te rauemi, ko te whakamaoritanga e whakaputahia ana e matou i tenei ra, ka whakaatu i nga tauira o te waehere kua tuhia ki te Haere me te whakaatu me pehea te whakamaoritanga tuatahi ki roto. Haere SSA, a ka i roto i te LLVM IR te whakamahi i te whakahiato itiGO. Ko te waehere Go SSA me te LLVM IR kua whakarereke paku ki te tango i nga mea kaore e pa ana ki nga whakamaramatanga i konei, kia marama ake ai nga whakamarama.

LLVM mai i te tirohanga Haere

Te tauira tuatahi

Ko te mahi tuatahi ka tirohia e au i konei he tikanga ngawari mo te taapiri tau:

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

He tino ngawari tenei mahi, a, kaore pea he mea ngawari ake. Ka whakamaoritia ki te waehere Go SSA e whai ake nei:

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

Ma tenei tirohanga, ka waiho nga tohu momo raraunga ki te taha matau ka taea te waiho i te nuinga o nga keehi.

Ko tenei tauira iti ka taea e koe te kite i te ngako o tetahi ahuatanga o te SSA. Arā, ina huri te waehere ki te puka SSA, ka wehea ia kii ki nga waahanga tuatahi e tito ana. I roto i to maatau, ko te whakahau return a + b, inaa, e tohu ana i nga mahi e rua: te taapiri i nga tau e rua me te whakahoki i te hua.

I tua atu, i konei ka taea e koe te kite i nga poraka taketake o te papatono; i roto i tenei waehere kotahi noa te poraka - te poraka urunga. Ka korero ake mo nga poraka kei raro nei.

Ka huri ngawari te waehere Go SSA ki te LLVM IR:

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

Ko te mea ka taea e koe te kite ko te mea ahakoa he rereke nga hanganga syntactic e whakamahia ana i konei, ko te hanganga o te mahi kaore i te rereke. Ko te waehere LLVM IR he iti ake te kaha atu i te waehere Haere SSA, he rite ki a C. I konei, i roto i te korero mahi, i te tuatahi he whakaahuatanga mo te momo raraunga ka hoki mai, ka tohuhia te momo tautohetohe i mua i te ingoa tautohe. I tua atu, hei whakangawari i te IR parsing, ko nga ingoa o nga hinonga o te ao kei mua i te tohu @, i mua i nga ingoa o te rohe he tohu % (ko tetahi mahi ka kiia he hinonga ao).

Ko tetahi mea hei tohu mo tenei waehere ko te whakatau momo tohu a Go int, ka taea te tohu hei uara 32-bit, 64-bit ranei, i runga i te kaikoipi me te whaainga o te whakahiato, ka whakaaehia ina hangaia e LLVM te waehere IR. Koinei tetahi o nga take maha e kore te LLVM IR waehere, pera i te tini o nga tangata e whakaaro ana, he turanga motuhake. Ko taua waehere, i hangaia mo te papa kotahi, e kore e taea te tango me te whakahiato mo tetahi atu papaa (mehemea kei te pai koe mo te whakaoti i tenei raru me te tino tupato).

Ko tetahi atu mea whakamere me mahara ko te momo i64 ehara i te tauoti kua hainatia: he koretake i runga i te ahua o te tohu o te tau. I runga i nga tohutohu, ka taea te tohu i nga nama kua hainatia me nga nama kore. Mo te ahua o te mahi taapiri, kaore he mea nui, na reira kaore he rereketanga o te mahi me nga nama kua hainatia, kaore ano i hainatia. I konei e hiahia ana ahau ki te mohio kei roto i te reo C, ko te puhake i te taurangi taurangi kua hainatia ka arahi ki te whanonga kore, na te Clang frontend taapiri he haki ki te mahi. nsw (kaore he takai kua hainatia), e kii ana ki te LLVM ka taea e ia te kii karekau rawa e kapi te taapiri.

He mea nui pea tenei mo etahi arotautanga. Hei tauira, te taapiri i nga uara e rua i16 i runga i te papa 32-bit (me nga rehita 32-bit) me whai, i muri i te taapiri, he mahi roha tohu kia noho tonu ai i16. Na tenei, he pai ake te mahi i nga mahi tauoti i runga i nga rahi rehita miihini.

Ko nga mea ka tupu i muri mai me tenei waehere IR ehara i te mea tino pai ki a maatau inaianei. Ka whakatikahia te waehere (engari mo te tauira ngawari penei i a maatau, kaore he mea e arotau ana) ka huri hei waehere miihini.

Tauira tuarua

Ko te tauira e whai ake nei ka tirohia e tatou he uaua ake. Ara, e korero ana tatou mo tetahi mahi e whakahiato ana i te waahanga tauoti:

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

Ka huri tenei waehere ki te waehere Go SSA e whai ake 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 konei ka taea e koe te kite i etahi atu hanganga e tohu ana i te waehere i roto i te puka SSA. Ko te ahua tino kitea o tenei waehere ko te kore o nga whakahau whakahaere rerenga hanganga. Hei whakahaere i te rere o nga tatauranga, he peke here me te kore here, a, ki te whakaarohia tenei whakahau hei whakahau ki te whakahaere i te rere, he whakahau whakahoki.

Inaa, i konei ka taea e koe te aro ki te meka kaore e wehewehea te kaupapa ki nga poraka ma te whakamahi i nga awhi mirimiri (penei i te whanau C o nga reo). Ka wehewehea e nga tapanga, he rite ki nga reo huihuinga, ka whakaatuhia ki te ahua o nga poraka taketake. I roto i te SSA, kua tautuhia nga poraka taketake hei raupapa piripono o te waehere timata mai i te tapanga ka mutu ki nga tohutohu whakaoti paraka taketake, penei i te − return и jump.

Ko tetahi atu korero whakamere o tenei waehere e tohuhia ana e te ako phi. He rereke nga tohutohu, ka roa pea te maarama. mahara, e SSA he poto mo te Taumahi Takitahi. He tohu takawaenga tenei o te waehere e whakamahia ana e nga kaikoipi, ka tohua he uara ki ia taurangi kotahi anake. He pai tenei mo te whakaatu i nga mahi ngawari penei i a maatau mahi myAddkua whakaatuhia i runga ake nei, engari kaore e pai mo nga mahi uaua ake penei i te mahi kua korerohia i tenei waahanga sum. Ina koa, ka huri nga taurangi i te wa e mahia ana te kapiti i и n.

Ka takahia e te SSA te herenga ki te tautapa i nga uara taurangi kotahi ma te whakamahi i te mea e kiia nei he tohutohu phi (i tangohia tona ingoa i te piapa Kariki). Ko te meka ko te tikanga kia hangaia te tohu SSA mo nga reo penei i te C, me whai koe ki etahi tinihanga. Ko te hua o te karanga i tenei tohutohu ko te uara o naianei o te taurangi (i ranei n), ka whakamahia he rarangi o nga poraka taketake hei tawhā. Hei tauira, whakaarohia tenei tohutohu:

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

Ko tona tikanga e whai ake nei: mena he poraka te poraka taketake o mua entry (whakauru), katahi t0 he taumau 0, a mehemea ko te poraka taketake o mua ko for.body, ka hiahia koe ki te tango i te uara t6 mai i tenei poraka. He ahua ngaro noa tenei, engari ko tenei tikanga te mahi a te SSA. Mai i te tirohanga a te tangata, na tenei katoa ka uaua te maarama ki te waehere, engari na te mea ka tukuna ia uara kotahi anake ka ngawari ake te maha o nga arotautanga.

Kia mahara, ki te tuhi koe i a koe ake kaitoi, karekau koe e mahi ki tenei momo mea. Ahakoa kaore a Clang e whakaputa i enei tohutohu katoa phi, ka whakamahia he tikanga alloca (he rite ki te mahi me nga taurangi rohe noa). Na, i te wa e whakahaerehia ana he paahitanga arotautanga LLVM ka karangahia mem2reg, tohutohu alloca kua hurihia ki te puka SSA. Heoi, ka whiwhi a TinyGo i te urunga mai i a Go SSA, he pai, kua huri ke ki te puka SSA.

Ko tetahi atu mea hou o te kongakonga o te waehere takawaenga e whakaarohia ana ko te urunga ki nga huānga poro ma te taurangi ka whakaatuhia i roto i te ahua o te mahi tatau i te wahitau me te mahi whakapohehe i te tohu tohu. I konei ka kite koe i te taapiri tika o nga taumau ki te waehere IR (hei tauira - 1:int). I roto i te tauira me te mahi myAdd kare ano tenei i whakamahia. Inaianei kua kore enei ahuatanga, me titiro ki te ahua o tenei waehere ka huri ki te puka 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
}

I konei, pera i mua, ka kite tatou i te ahua ano, kei roto etahi atu hanganga syntactic. Hei tauira, i roto i nga waea phi kua hurihia nga uara me nga tapanga. Heoi ano, kei konei tetahi mea e tika ana kia aro nui.

Hei timata, i konei ka kite koe i tetahi waitohu mahi tino rereke. Kaore a LLVM i te tautoko i nga poro, a, na te mea ko te arotautanga, ka wehewehea e te Kaihanga TinyGo nana tenei waehere takawaenga te whakaahuatanga o tenei hanganga raraunga ki etahi waahanga. Ka tohu pea i nga huānga poro e toru (ptr, len и cap) hei hanganga (struct), engari hei tohu mo ratou hei hinonga motuhake e toru ka taea etahi arotautanga. Ko etahi atu kaikoipi hei tohu i te poro ki etahi atu huarahi, i runga ano i nga tikanga karanga o nga mahi a te papaapapa.

Ko tetahi atu mea whakamiharo o tenei waehere ko te whakamahinga o te ako getelementptr (he maha nga wa ka whakapotohia ko GEP).

Ka mahi tenei tohutohu me nga tohu, ka whakamahia hei tiki tohu ki tetahi huānga poro. Hei tauira, me whakataurite ki te waehere e whai ake nei i tuhia ki C:

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

Me te rite ranei e whai ake nei ki tenei:

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

Ko te mea nui i konei ko nga tohutohu getelementptr karekau e mahi i nga mahi whakaheke. Ka tatau noa i te atatohu hou i runga i te tohu o mua. Ka taea te tango hei tohutohu mul и add i te taumata taputapu. Ka taea e koe te panui atu mo nga tohutohu GEP konei.

Ko tetahi atu mea whakamiharo o tenei waehere takawaenga ko te whakamahi i te ako icmp. He tohutohu kaupapa whaanui tenei hei whakatinana i nga whakataurite tauoti. Ko te hua o tenei tohutohu he momo uara tonu i1 — uara arorau. I tenei keehi, ka mahia he whakataurite ma te whakamahi i te kupu matua slt (he iti ake te hainatanga), i te mea e whakataurite ana matou i nga tau e rua i tohuhia i mua e te momo int. Mena kei te whakatairitehia e matou nga tauoti e rua kaore i hainatia, ka whakamahia e matou icmp, a ko te kupu matua i whakamahia i roto i te whakatairite ko ult. Hei whakataurite i nga tau ira maangi, ka whakamahia tetahi atu tohutohu, fcmp, he rite tonu te mahi.

Ngā putanga

E whakapono ana ahau kei roto i tenei rauemi kua hipokina e au nga ahuatanga tino nui o LLVM IR. Ko te tikanga, he nui noa atu kei konei. Ina koa, kei roto pea i te tohu takawaenga o te waehere te maha o nga korero e taea ai e nga paahitanga arotautanga te whai whakaaro ki etahi ahuatanga o te waehere e mohiotia ana e te kaitoi kaore e taea te whakaatu ki te IR. Hei tauira, he haki tenei inbounds Tohutohu GEP, haki ranei nsw и nuw, ka taea te taapiri atu ki nga tohutohu add. He pera ano mo te kupu matua private, e tohu ana ki te kaihoroi ko te mahi e tohuhia ana e kore e tohutoro mai i waho o te waahanga whakahiato o naianei. Ka taea e tenei te maha o nga mahi arotautanga whakamere penei i te whakakore i nga tautohetohe kaore i whakamahia.

Ka taea e koe te panui atu mo LLVM i roto tuhinga, ka korerohia e koe i te wa e whakawhanake ana koe i to ake kohinga LLVM. I konei rangatira, e titiro ana ki te whakawhanake i te whakahiato mo te reo tino ngawari. Ko enei puna korero e rua ka whai hua ki a koe i te wa e hanga ana koe i to ake kaitoha.

E nga kaipānui aroha! Kei te whakamahi koe i te LLVM?

LLVM mai i te tirohanga Haere

Source: will.com

Tāpiri i te kōrero