array.c
#include <stdio.h>
int main() {
int numArr[] = {1, 2, 3};
int numArr2[3] = {1, 2, 3};
int numArr3[3];
numArr3[0] = 1;
numArr3[1] = 2;
numArr3[2] = 3;
}
array.ll
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
entry:
%numArr = alloca [3 x i32], align 4
%numArr2 = alloca [3 x i32], align 4
%numArr3 = alloca [3 x i32], align 4
%0 = bitcast [3 x i32]* %numArr to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @__const.main.numArr to i8*), i64 12, i1 false)
%1 = bitcast [3 x i32]* %numArr2 to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %1, i8* align 4 bitcast ([3 x i32]* @__const.main.numArr2 to i8*), i64 12, i1 false)
%arrayidx = getelementptr inbounds [3 x i32], [3 x i32]* %numArr3, i64 0, i64 0
store i32 1, i32* %arrayidx, align 4
%arrayidx1 = getelementptr inbounds [3 x i32], [3 x i32]* %numArr3, i64 0, i64 1
store i32 2, i32* %arrayidx1, align 4
%arrayidx2 = getelementptr inbounds [3 x i32], [3 x i32]* %numArr3, i64 0, i64 2
store i32 3, i32* %arrayidx2, align 4
ret i32 0
}
- i8: int 8비트
- @__const.main: ???
- memcpy: copy a block of memory from the source location to the destination location
- getelementptr: array element 가리키는 pointer getter
1) alloca로 로컬 변수 numArr 스택 메모리 할당
2) alloca로 로컬 변수 numArr2 스택 메모리 할당
3) alloca로 로컬 변수 numArr3 스택 메모리 할당
4) bitcast
5) bitcast를 위한 memcpy 함수 call
6)
7)
8) %arrayidx 변수에 numArr3의 0번 index 값을 가리키는 포인터를 담음
9) store로 로컬 변수 a 할당한 주소에 값 1 저장
10) %arrayidx 변수에 numArr3의 1번 index 값을 가리키는 포인터를 담음
11) store로 로컬 변수 a 할당한 주소에 값 2 저장
12) %arrayidx 변수에 numArr3의 2번 index 값을 가리키는 포인터를 담음
13)store로 로컬 변수 a 할당한 주소에 값 3 저장
14) return 0