mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
180 lines
7.5 KiB
C
180 lines
7.5 KiB
C
// #target: x64-darwin
|
|
|
|
import std::io;
|
|
import std::mem;
|
|
union Baz
|
|
{
|
|
int x;
|
|
double y;
|
|
}
|
|
struct Bar
|
|
{
|
|
int x;
|
|
int y;
|
|
}
|
|
|
|
|
|
Bar[] arrbar = { { 3, 4 }, { 8, 9 }};
|
|
int[] xd = { 1, 2 };
|
|
int* fofeo = &&(int[2]{ 3, 4 });
|
|
|
|
func int main()
|
|
{
|
|
Bar w = arrbar[1];
|
|
io::printf("%d\n", arrbar[1].x);
|
|
int[] x = { 1, 2, 3 };
|
|
int* y = &&(int[3]{ 123, 234, 567 });
|
|
io::println("Start:");
|
|
io::printf("X len: %d mid element %d\n", (int)(x.len), x[1]);
|
|
io::printf("Y mid element %d\n", y[1]);
|
|
io::printf("Fofeo second element %d\n", fofeo[1]);
|
|
Baz ffe = { .x = 1 };
|
|
int[1] azz = {};
|
|
int[*] a = {};
|
|
|
|
//var $foo = { 1, 2, 3 };
|
|
bool xy = ! int[] { 1, 2, 3 };
|
|
if (!xy) io::println("Ok");
|
|
Bar b = {};
|
|
Baz z = {};
|
|
int[] sub = {};
|
|
Bar[] foo = {};
|
|
Baz[3] baz = {};
|
|
return 1;
|
|
}
|
|
|
|
// #expect: subarrays.ll
|
|
|
|
%Bar = type { i32, i32 }
|
|
%"Bar[]" = type { %Bar*, i64 }
|
|
%"int[]" = type { i32*, i64 }
|
|
%Baz = type { double }
|
|
|
|
@Baz = linkonce_odr constant i8 1
|
|
@Bar = linkonce_odr constant i8 1
|
|
@.taddr = private hidden global [2 x %Bar] [%Bar { i32 3, i32 4 }, %Bar { i32 8, i32 9 }], align 4
|
|
@subarrays.arrbar = global %"Bar[]" { %Bar* getelementptr inbounds ([2 x %Bar], [2 x %Bar]* @.taddr, i32 0, i32 0), i64 2 }, align 8
|
|
@.taddr.3 = private hidden global [2 x i32] [i32 1, i32 2], align 4
|
|
@subarrays.xd = global %"int[]" { i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr.3, i32 0, i32 0), i64 2 }, align 8
|
|
@.taddr.4 = private hidden global [2 x i32] [i32 3, i32 4], align 4
|
|
@subarrays.fofeo = global i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr.4, i32 0, i32 0), align 8
|
|
@.str = private constant [4 x i8] c"%d\0A\00", align 1
|
|
@.str.5 = private constant [7 x i8] c"Start:\00", align 1
|
|
@.str.6 = private constant [26 x i8] c"X len: %d mid element %d\0A\00", align 1
|
|
@.str.7 = private constant [18 x i8] c"Y mid element %d\0A\00", align 1
|
|
@.str.8 = private constant [25 x i8] c"Fofeo second element %d\0A\00", align 1
|
|
@.__const = private constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8
|
|
@.str.9 = private constant [3 x i8] c"Ok\00", align 1
|
|
|
|
define i32 @main() #0 {
|
|
entry:
|
|
%w = alloca %Bar, align 4
|
|
%x = alloca %"int[]", align 8
|
|
%literal = alloca [3 x i32], align 4
|
|
%y = alloca i32*, align 8
|
|
%literal3 = alloca [3 x i32], align 4
|
|
%ffe = alloca %Baz, align 8
|
|
%azz = alloca [1 x i32], align 4
|
|
%a = alloca [0 x i32], align 4
|
|
%xy = alloca i8, align 1
|
|
%literal7 = alloca [3 x i32], align 4
|
|
%b = alloca %Bar, align 4
|
|
%z = alloca %Baz, align 8
|
|
%sub = alloca %"int[]", align 8
|
|
%literal9 = alloca [0 x i32], align 4
|
|
%foo = alloca %"Bar[]", align 8
|
|
%literal10 = alloca [0 x %Bar], align 4
|
|
%baz = alloca [3 x %Baz], align 16
|
|
%saptr = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @subarrays.arrbar, i32 0, i32 0), align 8
|
|
%sarridx = getelementptr inbounds %Bar, %Bar* %saptr, i64 1
|
|
%0 = bitcast %Bar* %w to i8*
|
|
%1 = bitcast %Bar* %sarridx to i8*
|
|
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 %1, i32 8, i1 false)
|
|
%saptr1 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @subarrays.arrbar, i32 0, i32 0), align 8
|
|
%sarridx2 = getelementptr inbounds %Bar, %Bar* %saptr1, i64 1
|
|
%2 = getelementptr inbounds %Bar, %Bar* %sarridx2, i32 0, i32 0
|
|
%3 = load i32, i32* %2, align 4
|
|
%4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %3)
|
|
%5 = getelementptr inbounds i32, [3 x i32]* %literal, i32 0
|
|
store i32 1, i32* %5, align 4
|
|
%6 = getelementptr inbounds i32, [3 x i32]* %literal, i32 1
|
|
store i32 2, i32* %6, align 4
|
|
%7 = getelementptr inbounds i32, [3 x i32]* %literal, i32 2
|
|
store i32 3, i32* %7, align 4
|
|
%8 = bitcast [3 x i32]* %literal to i32*
|
|
%9 = insertvalue %"int[]" undef, i32* %8, 0
|
|
%10 = insertvalue %"int[]" %9, i64 3, 1
|
|
store %"int[]" %10, %"int[]"* %x, align 8
|
|
%11 = getelementptr inbounds i32, [3 x i32]* %literal3, i32 0
|
|
store i32 123, i32* %11, align 4
|
|
%12 = getelementptr inbounds i32, [3 x i32]* %literal3, i32 1
|
|
store i32 234, i32* %12, align 4
|
|
%13 = getelementptr inbounds i32, [3 x i32]* %literal3, i32 2
|
|
store i32 567, i32* %13, align 4
|
|
%ptrptr = bitcast [3 x i32]* %literal3 to i32*
|
|
store i32* %ptrptr, i32** %y, align 8
|
|
%14 = call i32 @"std::io.println"(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.5, i32 0, i32 0)) #3
|
|
%len = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1
|
|
%15 = load i64, i64* %len, align 8
|
|
%uisitrunc = trunc i64 %15 to i32
|
|
%subarrayptr = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0
|
|
%saptr4 = load i32*, i32** %subarrayptr, align 8
|
|
%sarridx5 = getelementptr inbounds i32, i32* %saptr4, i64 1
|
|
%16 = load i32, i32* %sarridx5, align 4
|
|
%17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.6, i32 0, i32 0), i32 %uisitrunc, i32 %16)
|
|
%18 = load i32*, i32** %y, align 8
|
|
%ptridx = getelementptr inbounds i32, i32* %18, i64 1
|
|
%19 = load i32, i32* %ptridx, align 4
|
|
%20 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.7, i32 0, i32 0), i32 %19)
|
|
%21 = load i32*, i32** @subarrays.fofeo, align 8
|
|
%ptridx6 = getelementptr inbounds i32, i32* %21, i64 1
|
|
%22 = load i32, i32* %ptridx6, align 4
|
|
%23 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.8, i32 0, i32 0), i32 %22)
|
|
%24 = bitcast %Baz* %ffe to i8*
|
|
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %24, i8* align 8 bitcast ({ i32, [4 x i8] }* @.__const to i8*), i32 8, i1 false)
|
|
%25 = bitcast [1 x i32]* %azz to i8*
|
|
call void @llvm.memset.p0i8.i64(i8* align 4 %25, i8 0, i64 4, i1 false)
|
|
%26 = bitcast [0 x i32]* %a to i8*
|
|
call void @llvm.memset.p0i8.i64(i8* align 4 %26, i8 0, i64 0, i1 false)
|
|
%27 = getelementptr inbounds i32, [3 x i32]* %literal7, i32 0
|
|
store i32 1, i32* %27, align 4
|
|
%28 = getelementptr inbounds i32, [3 x i32]* %literal7, i32 1
|
|
store i32 2, i32* %28, align 4
|
|
%29 = getelementptr inbounds i32, [3 x i32]* %literal7, i32 2
|
|
store i32 3, i32* %29, align 4
|
|
%30 = bitcast [3 x i32]* %literal7 to i32*
|
|
%31 = insertvalue %"int[]" undef, i32* %30, 0
|
|
%32 = insertvalue %"int[]" %31, i64 3, 1
|
|
%33 = extractvalue %"int[]" %32, 1
|
|
%neq = icmp ne i64 %33, 0
|
|
%not = xor i1 %neq, true
|
|
%34 = zext i1 %not to i8
|
|
store i8 %34, i8* %xy, align 1
|
|
%35 = load i8, i8* %xy, align 1
|
|
%36 = trunc i8 %35 to i1
|
|
%not8 = xor i1 %36, true
|
|
br i1 %not8, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %entry
|
|
%37 = call i32 @"std::io.println"(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0)) #3
|
|
br label %if.exit
|
|
|
|
if.exit: ; preds = %if.then, %entry
|
|
%38 = bitcast %Bar* %b to i8*
|
|
call void @llvm.memset.p0i8.i64(i8* align 4 %38, i8 0, i64 8, i1 false)
|
|
%39 = bitcast %Baz* %z to i8*
|
|
call void @llvm.memset.p0i8.i64(i8* align 8 %39, i8 0, i64 8, i1 false)
|
|
store [0 x i32] zeroinitializer, [0 x i32]* %literal9, align 4
|
|
%40 = bitcast [0 x i32]* %literal9 to i32*
|
|
%41 = insertvalue %"int[]" undef, i32* %40, 0
|
|
%42 = insertvalue %"int[]" %41, i64 0, 1
|
|
store %"int[]" %42, %"int[]"* %sub, align 8
|
|
store [0 x %Bar] zeroinitializer, [0 x %Bar]* %literal10, align 4
|
|
%43 = bitcast [0 x %Bar]* %literal10 to %Bar*
|
|
%44 = insertvalue %"Bar[]" undef, %Bar* %43, 0
|
|
%45 = insertvalue %"Bar[]" %44, i64 0, 1
|
|
store %"Bar[]" %45, %"Bar[]"* %foo, align 8
|
|
%46 = bitcast [3 x %Baz]* %baz to i8*
|
|
call void @llvm.memset.p0i8.i64(i8* align 16 %46, i8 0, i64 24, i1 false)
|
|
ret i32 1
|
|
} |