ืคืืชืื ืืืืจ ืืื ืืฉืืื ืงืฉื ืืืื. ืืื, ืืืจืื ืืืื, ืขื ืืคืืชืื ืฉื ืคืจืืืงืืื ืืื LLVM, ืืคืชืจืื ืืืขืื ืื ืืคืืฉื ืืืื, ืื ืฉืืืคืฉืจ ืืคืืื ืืืชืื ืช ืืืื ืืืฆืืจ ืฉืคื ืืืฉื ืฉืงืจืืื ืืืืฆืืขืื ื-C. ืืขืืืื ืขื LLVM ืืกืืืืช ืืืื ืืขืืืื ืฉืื ืืืขืจืืช ืืืืฆืืช ืขื ืืื ืืืืช ืขืฆืืื ืฉื ืงืื, ืืฆืืืืช ืืชืืขืื ืืืขื. ืืื ืื ืกืืช ืืชืงื ืืช ืืืืกืจืื ืืื, ืืืืจ ืืืืืจ, ืฉืืช ืชืจืืืื ืื ื ืืคืจืกืืื ืืืื, ืขืืื ืืืืืื ืืืืืืืช ืืงืื ืฉื ืืชื ื-Go ืืืืจืืืช ืืืฆื ืื ืืชืืจืืืื ืืจืืฉืื ื ื
ืืืืื ืจืืฉืื ื
ืืคืื ืงืฆืื ืืจืืฉืื ื ืฉืื ื ืืืื ืืืกืชืื ืขืืื ืืื ืื ืื ืื ืคืฉืื ืืืืกืคืช ืืกืคืจืื:
func myAdd(a, b int) int{
return a + b
}
ืคืื ืงืฆืื ืื ืคืฉืืื ืืืื, ืืืืื ืฉืื ืืืจ ืื ืืืื ืืืืืช ืคืฉืื ืืืชืจ. ืื ืืชืืจืื ืืงืื Go SSA ืืื:
func myAdd(a int, b int) int:
entry:
t0 = a + b int
return t0
ืืชืฆืืื ืื, ืืจืืืื ืืกืื ืื ืชืื ืื ืืืืงืืื ืืฆื ืืืื ืื ืืชื ืืืชืขืื ืืื ืืจืื ืืืงืจืื.
ืืืืื ืงืื ื ืื ืืืจ ืืืคืฉืจืช ืื ืืจืืืช ืืช ืืืืืช ืฉื ืืืื ืืื ืฉื SSA. ืืืืืจ, ืืขืช ืืืจืช ืงืื ืืฆืืจืช SSA, ืื ืืืืื ืืคืืจืง ืืืืงืื ืืืกืืกืืื ืืืืชืจ ืืื ืืื ืืืจืื. ืืืงืจื ืฉืื ื, ืืคืงืืื return a + b
, ืืืขืฉื, ืืืืฆื ืฉืชื ืคืขืืืืช: ืืืกืคืช ืฉื ื ืืกืคืจืื ืืืืืจืช ืืชืืฆืื.
ืื ืืกืฃ, ืืื ืืชื ืืืื ืืจืืืช ืืช ืืืืืงืื ืืืกืืกืืื ืฉื ืืชืืื ืืช, ืืงืื ืื ืืฉ ืจืง ืืืืง ืืื - ืืืืง ืืื ืืกื. ื ืืืจ ืืืชืจ ืขื ืืืืงืื ืืืืฉื.
ืงืื Go SSA ืืืืจ ืืงืืืช ื-LLVM IR:
define i64 @myAdd(i64 %a, i64 %b) {
entry:
%0 = add i64 %a, %b
ret i64 %0
}
ืื ืฉืืชื ืืืื ืืฉืื ืื ืืื ืฉืืืจืืช ืฉืืื ืื ืชืืืืจืืื ืฉืื ืื ืืฉืืฉืื ืืื, ืืื ื ืืคืื ืงืฆืื ืืื ืืขืฆื ืืื ืฉืื ืื. ืงืื LLVM IR ืงืฆืช ืืืชืจ ืืืง ืืงืื Go SSA, ืืืืื ื-C. ืืื, ืืืฆืืจืช ืืคืื ืงืฆืื, ืจืืฉืืช ืืฉ ืชืืืืจ ืฉื ืกืื ืื ืชืื ืื ืฉืืื ืืืืืจ, ืกืื ืืืจืืืื ื ืืฆืืื ืืคื ื ืฉื ืืืจืืืื ื. ืื ืืกืฃ, ืืื ืืคืฉื ืืช ื ืืชืื ื-IR, ืืคื ื ืืฉืืืช ืฉื ืืฉืืืืช ืืืืืืืืช ืืืคืืข ืืกืื @
, ืืืคื ื ืฉืืืช ืืงืืืืื ืืฉ ืกืื %
(ืคืื ืงืฆืื ื ืืฉืืช ืื ืืืฉืืช ืืืืืืืช).
ืืืจ ืืื ืฉืืฉ ืืฉืื ืื ืืงืื ืื ืืื ืฉืืืืืช ืืกืื ืฉื Go int
, ืฉืืืื ืืืืืช ืืืืฆื ืืขืจื ืฉื 32 ืกืืืืืช ืื 64 ืกืืืืืช, ืืืชืื ืืืืืจ ืืืืืจืช ืืืืืืจ, ืืชืงืื ืืืฉืจ LLVM ืืืืฆืจ ืืช ืงืื ื-IR. ืื ืืืช ืืกืืืืช ืืจืืืช ืืื ืฉืงืื IR ืฉื LLVM ืืื ื, ืืคื ืฉืื ืฉืื ืจืืื ืืืฉืืื, ืืืชื ืชืืื ืืคืืืคืืจืื. ืงืื ืืื, ืฉื ืืฆืจ ืขืืืจ ืคืืืคืืจืื ืืืช, ืื ื ืืชื ืคืฉืื ืืงืืช ืืืืจืืื ืขืืืจ ืคืืืคืืจืื ืืืจืช (ืืื ืื ืื ืืชื ืืชืืื ืืคืชืจืื ืืขืื ืื
ื ืงืืื ืืขื ืืื ืช ื ืืกืคืช ืฉืืืื ืืฆืืื ืืื ืฉืืกืื i64
ืืื ื ืืกืคืจ ืฉืื ืืกืืื: ืืื ื ืืืจืื ืืืืื ืช ืืืฆืื ืืกืืื ืฉื ืืืกืคืจ. ืืืชืื ืืืืจืื, ืื ืืืื ืืืืฆื ืื ืืกืคืจืื ืืชืืืื ืืื ืื ืืชืืืื. ืืืงืจื ืฉื ืืืฆืื ืคืขืืืช ืืืืืืจ, ืื ืื ืืฉื ื, ืืืื ืืื ืืืื ืืขืืืื ืขื ืืกืคืจืื ืืชืืืื ืื ืื ืืชืืืื. ืืื ืื ื ืจืืฆื ืืฆืืื ืฉืืฉืคืช C, ืืฆืคืช ืืฉืชื ื ืฉื ืืกืคืจ ืฉืื ืืกืืื ืืืืืื ืืืชื ืืืืช ืื ืืืืืจืช, ืืืื ื-frontend Clang ืืืกืืฃ ืืื ืืคืขืืื nsw
(ืืื ืขืืืคื ืืชืืื), ืื ืฉืืืืจ ื-LLVM ืฉืืื ืืืืื ืืื ืื ืฉืืชืืกืคืช ืืขืืื ืืื ื ืขืืื ืขื ืืืืชืื.
ืื ืขืฉืื ืืืืืช ืืฉืื ืขืืืจ ืืืคืืืืืืฆืืืช ืืกืืืืืช. ืืืืืื, ืืืกืคืช ืฉื ื ืขืจืืื i16
ืืคืืืคืืจืืช 32 ืกืืืืืช (ืขื ืืืืจืื ืฉื 32 ืกืืืืืช) ื ืืจืฉืช, ืืืืจ ืืืกืคื, ืคืขืืืช ืืจืืืช ืกืืื ืขื ืื ืช ืืืืฉืืจ ืืืืื i16
. ืืืื ืื, ืืขืชืื ืงืจืืืืช ืืืชืจ ืืขืื ืืืฆืข ืคืขืืืืช ืฉืืืื ืืืืืกืกืื ืขื ืืืื ืืืืจ ืืืื ื.
ืื ืฉืงืืจื ืืืจ ืื ืขื ืงืื ื-IR ืืื ืื ืืขื ืืื ืืืชื ื ืืืืืื ืขืืฉืื. ืืงืื ืขืืืจ ืืืคืืืืืืฆืื (ืืื ืืืงืจื ืฉื ืืืืื ืคืฉืืื ืืื ืฉืื ื, ืฉืื ืืืจ ืื ืขืืืจ ืืืคืืืืืืฆืื) ืืื ืืืืจ ืืงืื ืืืื ื.
ืืืืื ืฉื ืื
ืืืืืื ืืืื ืฉื ืกืชืื ืขืืื ืชืืื ืงืฆืช ืืืชืจ ืืกืืืืช. ืืืืืจ, ืื ืื ื ืืืืจืื ืขื ืคืื ืงืฆืื ืฉืืกืืืช ืคืจืืกื ืฉื ืืกืคืจืื ืฉืืืื:
func sum(numbers []int) int {
n := 0
for i := 0; i < len(numbers); i++ {
n += numbers[i]
}
return n
}
ืงืื ืื ืืืืจ ืืงืื 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
ืืื ืืชื ืืืจ ืืืื ืืจืืืช ืขืื ืงืื ืกืืจืืงืฆืืืช ืืืคืืื ืืืช ืืืืฆืื ืงืื ืืืืคืก SSA. ืืืื ืืชืืื ื ืืืจืืจื ืืืืชืจ ืฉื ืงืื ืื ืืื ืืขืืืื ืฉืืื ืคืงืืืืช ืืงืจืช ืืจืืื ืืืื ืืช. ืืื ืืฉืืื ืืืจืืืช ืืืืฉืืืื, ืืฉ ืจืง ืงืคืืฆืืช ืืืชื ืืช ืืืืชื ืืืชื ืืช, ืืื ื ืืงื ืืืฉืืื ืคืงืืื ืื ืืคืงืืื ืืฉืืื ืืืจืืื, ืคืงืืืช ืืืจื.
ืืืขืฉื, ืืื ื ืืชื ืืฉืื ืื ืืขืืืื ืฉืืชืืื ื ืืื ื ืืืืืงืช ืืืืืงืื ืืืืฆืขืืช ืคืืื ืืชืืืชืืช (ืืื ืืืฉืคืืช ืืฉืคืืช C). ืืื ืืืืืง ืขื ืืื ืชืืืืืช, ืืืืืืจืืช ืฉืคืืช ืืกืืืืื ื, ืืืืฆื ืืฆืืจื ืฉื ืืืืงืื ืืกืืกืืื. ื-SSA, ืืืืงืื ืืกืืกืืื ืืืืืจืื ืืจืฆืคืื ืจืฆืืคืื ืฉื ืงืื ืฉืืชืืืืื ืืชืืืืช ืืืกืชืืืืื ืืืืจืืืช ืืฉืืืช ืืืืง ืืกืืกืืืช, ืืืื - return
ะธ jump
.
ืคืจื ืืขื ืืื ื ืืกืฃ ืฉื ืงืื ืื ืืืืฆื ืขื ืืื ืืืืจืื phi
. ืืืืจืืืช ืื ืืจืืืืช ืืขืฉืืืืช ืืงืืช ืงืฆืช ืืื ืืืืื. ืืืืจ ืืช ืื myAdd
ืืืฆื ืืขืื, ืื ืืื ื ืืชืืื ืืคืื ืงืฆืืืช ืืืจืืืืช ืืืชืจ ืืืื ืืคืื ืงืฆืื ืื ืืื ื ืืกืขืืฃ ืื sum
. ืืืืืื ืืฉืชื ืื ืืฉืชื ืื ืืืืื ืืืฆืืข ืืืืืื i
ะธ n
.
SSA ืขืืงืฃ ืืช ืืืืืื ืขื ืืงืฆืืช ืขืจืื ืืฉืชื ืื ืคืขื ืืืช ืืืืฆืขืืช ืื ืฉื ืงืจื ืืืจืื phi
(ืฉืื ื ืืงื ืืืืืคืืืช ืืืืื ื). ืืขืืืื ืืื ืฉืืื ืฉืืืฆืื SSA ืฉื ืงืื ืืืคืง ืขืืืจ ืฉืคืืช ืืื C, ืืชื ืฆืจืื ืื ืงืื ืืืื ืืจืืงืื. ืืชืืฆืื ืฉื ืงืจืืืช ืืืจืื ืื ืืื ืืขืจื ืื ืืืื ืฉื ืืืฉืชื ื (i
ืื n
), ืืจืฉืืืช ืืืืงืื ืืกืืกืืื ืืฉืืฉืช ืืคืจืืืจืื ืฉืื. ืืืืืื, ืฉืงืื ืืืจืื ืื:
t0 = phi [entry: 0:int, for.body: t6] #n
ืืืฉืืขืืช ืฉืื ืืื ืืืืงืื: ืื ืืืืืง ืืืกืืกื ืืงืืื ืืื ืืืืง entry
(ืงืื), ืื t0
ืืื ืงืืืข 0
, ืืื ืืืืืง ืืืกืืกื ืืงืืื ืืื for.body
, ืื ืืชื ืฆืจืื ืืงืืช ืืช ืืขืจื t6
ืืืืืฉ ืืื. ืื ืื ืืืื ื ืจืื ืื ืืกืชืืจื, ืืื ืืื ืื ืื ืืื ืืื ืื ืฉืืืจื ื-SSA ืืขืืื. ืื ืงืืืช ืืื ืื ืืฉืืช, ืื ืื ืืงืฉื ืขื ืืื ืช ืืงืื, ืื ืืขืืืื ืฉืื ืขืจื ืืืงืฆื ืจืง ืคืขื ืืืช ืืงืื ืืืจืื ืขื ืืืคืืืืืืฆืืืช ืจืืืช.
ืฉืื ืื ืฉืื ืืชื ืืืชื ืืืืจ ืืฉืื, ืืืจื ืืื ืื ืชืฆืืจื ืืืชืืืื ืขื ืืืจืื ืืืกืื ืืื. ืืคืืื ืงืืื ื ืื ืืืืฆืจ ืืช ืื ืืืืจืืืช ืืืื phi
, ืืื ืืฉืชืืฉ ืืื ืื ืื alloca
(ืื ืืืื ืืขืืืื ืขื ืืฉืชื ืื ืืงืืืืื ืจืืืืื). ืืืืจ ืืื, ืืขืช ืืคืขืืช ืืจืืืก ืืืคืืืืืืฆืื ืฉื LLVM ื ืงืจื alloca
ืืืืจ ืืืืคืก SSA. ืขื ืืืช, TinyGo ืืงืืืช ืงืื ื- Go SSA, ืฉืืืืคื ื ืื, ืืืจ ืืืืจ ืืฆืืจืช SSA.
ืืืืืฉ ื ืืกืฃ ืฉื ืงืืข ืงืื ืืืื ืืื ืื ืืื ืืื ืฉืืืฉื ืืจืืืื ืคืจืืกื ืืคื ืืื ืืงืก ืืืืฆืืช ืืฆืืจื ืฉื ืคืขืืืช ืืืฉืื ืืืชืืืช ืืคืขืืื ืฉื ืืืืื ืืืฆืืืข ืืืชืงืื. ืืื ืืชื ืืืื ืืจืืืช ืืช ืืชืืกืคืช ืืืฉืืจื ืฉื ืงืืืขืื ืืงืื ื-IR (ืืืืืื - 1:int
). ืืืืืื ืขื ืืคืื ืงืฆืื myAdd
ืื ืื ืืื ืืฉืืืืฉ. ืืขืช, ืืืืจ ืฉืืืจืื ื ืืช ืืชืืื ืืช ืืืื, ืืืื ื ืกืชืื ืขื ืื ืฉืืงืื ืืื ืืืคื ืืืฉืจ ืืืืจ ืืฆืืจืช 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
}
ืืื, ืืื ืืขืืจ, ื ืืื ืืจืืืช ืืช ืืืชื ืืื ื, ืืืืื ืืื ืื ืชืืืืจืืื ื ืืกืคืื. ืืืฉื ืืฉืืืืช phi
ืขืจืืื ืืชืืืืืช ืืืืืคื. ืขื ืืืช, ืืฉ ืืื ืืฉืื ืฉืืืื ืืฉืื ืืืื ืื ืืืืืื.
ืืืืชืืืื, ืืื ืืชื ืืืื ืืจืืืช ืืชืืืช ืคืื ืงืฆืื ืฉืื ื ืืืืืืื. LLVM ืืื ื ืชืืื ืืคืจืืกืืช, ืืืชืืฆืื ืืื, ืืืืคืืืืืืฆืื, ืืืืจ TinyGo ืฉืืฆืจ ืืช ืงืื ืืืื ืืื ืืื ืคืืฆื ืืช ืืชืืืืจ ืฉื ืืื ื ืื ืชืื ืื ืืื ืืืืงืื. ืื ืืืื ืืืืฆื ืฉืืืฉื ืจืืืื ืคืจืืกื (ptr
, len
ะธ cap
) ืืืื ื (struct), ืื ืืืฆืืื ืืฉืืืฉ ืืฉืืืืช ื ืคืจืืืช ืืืคืฉืจ ืืืคืืืืืืฆืืืช ืืกืืืืืช. ืืืืจืื ืืืจืื ืขืฉืืืื ืืืืฆื ืืช ืืคืจืืกื ืืืจืืื ืืืจืืช, ืืืชืื ืืืืกืืืืช ืืงืจืืื ืฉื ืคืื ืงืฆืืืช ืคืืืคืืจืืช ืืืขื.
ืชืืื ื ืืขื ืืื ืช ื ืืกืคืช ืฉื ืงืื ืื ืืื ืืฉืืืืฉ ืืืืจืื getelementptr
(ืืขืชืื ืงืจืืืืช ืืงืืฆืจ GEP).
ืืืจืื ืื ืขืืืืช ืขื ืืฆืืืขืื ืืืฉืืฉืช ืืืฉืืช ืืฆืืืข ืืืืื ื ืคืจืืกื. ืืืืืื, ืืื ื ืฉืืื ืืช ืื ืขื ืืงืื ืืื ืฉื ืืชื ื-C:
int* sliceptr(int *ptr, int index) {
return &ptr[index];
}
ืื ืขื ืืืงืืืื ืืืื ืืื:
int* sliceptr(int *ptr, int index) {
return ptr + index;
}
ืืืืจ ืืืฉืื ืืืืชืจ ืืื ืืื ืฉืืืืจืืืช getelementptr
ืืื ื ืืืฆืข ืคืขืืืืช ืืจืืงื. ืื ืจืง ืืืฉื ืืฆืืืข ืืืฉ ืขื ืกืื ืืงืืื. ืืคืฉืจ ืืงืืช ืืช ืื ืืืืจืืืช mul
ะธ add
ืืจืืช ืืืืืจื. ืืชื ืืืื ืืงืจืื ืขืื ืขื ืืืจืืืช GEP
ืชืืื ื ืืขื ืืื ืช ื ืืกืคืช ืฉื ืงืื ืืื ืืื ืื ืืื ืืฉืืืืฉ ืืืืจืื icmp
. ืืืื ืืืจืื ืืืืืช ืืืฉืืฉืช ืืืืฉืื ืืฉืืืืืช ืืกืคืจืื ืฉืืืื. ืืชืืฆืื ืฉื ืืืจืื ืื ืืื ืชืืื ืขืจื ืืกืื i1
- ืขืจื ืืืื. ืืืงืจื ืื, ืืชืืฆืขืช ืืฉืืืื ืืืืฆืขืืช ืืืืช ืืืคืชื slt
(ืืชืื ืคืืืช ื), ืืืืืื ืฉืื ื ืืฉืืืื ืฉื ื ืืกืคืจืื ืฉืืืฆืื ืืขืืจ ืขื ืืื ืืืืคืืก int
. ืื ืืืื ื ืืฉืืืื ืฉื ื ืืกืคืจืื ืฉืืืื ืืื ืกืืื ืื, ืื ืืืื ื ืืฉืชืืฉืื icmp
, ืืืืืช ืืืคืชื ืฉืื ื ืขืฉื ืฉืืืืฉ ืืืฉืืืื ืชืืื ult
. ืืื ืืืฉืืืช ืืกืคืจื ื ืงืืื ืฆืคื, ื ืขืฉื ืฉืืืืฉ ืืืืจืื ืืืจืช, fcmp
, ืฉืขืืื ืืฆืืจื ืืืื.
ืชืืฆืืืช ืฉื
ืื ื ืืืืื ืฉืืืืืจ ืื ืืืกืืชื ืืช ืืชืืื ืืช ืืืฉืืืืช ืืืืชืจ ืฉื LLVM IR. ืืืืื, ืืฉ ืืื ืืจืื ืืืชืจ. ืืคืจื, ืืืฆืื ืืืื ืืื ืฉื ืืงืื ืขืฉืื ืืืืื ืืขืจืืช ืจืืืช ืืืืคืฉืจืืช ืืขืืจื ืืืคืืืืืืฆืื ืืงืืช ืืืฉืืื ืชืืื ืืช ืืกืืืืืช ืฉื ืืงืื ืืืืืจืืช ืืงืืืคืืืืจ ืฉืืื ื ืืืืืืช ืืืชืืื ืืืจืช ื-IR. ืืืืืื, ืืื ืืื inbounds
ืืืจืืืช GEP, ืื ืืืืื nsw
ะธ nuw
, ืฉื ืืชื ืืืืกืืฃ ืืืืจืืืช add
. ืืืชื ืืืจ ืืืื ืืืืช ืืืคืชื private
, ืืืฆืืื ืืืืืื ืฉืืคืื ืงืฆืื ืฉืืื ืืกืื ืื ืชืืคื ื ืืืืฅ ืืืืืืช ืืืืืืจ ืื ืืืืืช. ืื ืืืคืฉืจ ืืจืื ืืืคืืืืืืฆืืืช ืืื-ืคืจืืฆืืืจืืืืช ืืขื ืืื ืืช ืืื ืืืืื ืืืขืื ืื ืฉืืื ื ืืฉืืืืฉ.
ืืชื ืืืื ืืงืจืื ืขืื ืขื LLVM ื
ืงืืจืืื ืืงืจืื! ืืื ืืชื ืืฉืชืืฉ ื-LLVM?
ืืงืืจ: www.habr.com