Files
c3c/test/test_suite/initializer_lists/subarrays.c3t
Christoffer Lerno 09d50ebf6c New import rules.
2022-06-04 01:41:23 +02:00

181 lines
7.7 KiB
C

// #target: macos-x64
import std::io;
import std::mem;
import libc;
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 });
fn int main()
{
Bar w = arrbar[1];
libc::printf("%d\n", arrbar[1].x);
int[] x = { 1, 2, 3 };
int* y = &&(int[3]{ 123, 234, 567 });
io::println("Start:");
libc::printf("X len: %d mid element %d\n", (int)(x.len), x[1]);
libc::printf("Y mid element %d\n", y[1]);
libc::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 }
@introspect.Baz = linkonce constant i8 1
@introspect.Bar = linkonce constant i8 1
@.taddr = private global [2 x %Bar] [%Bar { i32 3, i32 4 }, %Bar { i32 8, i32 9 }], align 4
@subarrays.arrbar = local_unnamed_addr global %"Bar[]" { %Bar* getelementptr inbounds ([2 x %Bar], [2 x %Bar]* @.taddr, i32 0, i32 0), i64 2 }, align 8
@.taddr.3 = private global [2 x i32] [i32 1, i32 2], align 4
@subarrays.xd = local_unnamed_addr global %"int[]" { i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr.3, i32 0, i32 0), i64 2 }, align 8
@.taddr.4 = private global [2 x i32] [i32 3, i32 4], align 4
@subarrays.fofeo = local_unnamed_addr global i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr.4, i32 0, i32 0), align 8
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
@.str.5 = private unnamed_addr constant [7 x i8] c"Start:\00", align 1
@.str.6 = private unnamed_addr constant [26 x i8] c"X len: %d mid element %d\0A\00", align 1
@.str.7 = private unnamed_addr constant [18 x i8] c"Y mid element %d\0A\00", align 1
@.str.8 = private unnamed_addr constant [25 x i8] c"Fofeo second element %d\0A\00", align 1
@.__const = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8
@.str.9 = private unnamed_addr 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
%literal2 = 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
%literal6 = alloca [3 x i32], align 4
%b = alloca %Bar, align 4
%z = alloca %Baz, align 8
%sub = alloca %"int[]", align 8
%literal8 = alloca [0 x i32], align 4
%foo = alloca %"Bar[]", align 8
%literal9 = alloca [0 x %Bar], align 4
%baz = alloca [3 x %Baz], align 16
%0 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @subarrays.arrbar, i32 0, i32 0), align 8
%ptroffset = getelementptr inbounds %Bar, %Bar* %0, i64 1
%1 = bitcast %Bar* %w to i8*
%2 = bitcast %Bar* %ptroffset to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 %2, i32 8, i1 false)
%3 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @subarrays.arrbar, i32 0, i32 0), align 8
%ptroffset1 = getelementptr inbounds %Bar, %Bar* %3, i64 1
%4 = getelementptr inbounds %Bar, %Bar* %ptroffset1, i32 0, i32 0
%5 = load i32, i32* %4, align 4
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %5)
%7 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 0
store i32 1, i32* %7, align 4
%8 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 1
store i32 2, i32* %8, align 4
%9 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 2
store i32 3, i32* %9, align 4
%10 = bitcast [3 x i32]* %literal to i32*
%11 = insertvalue %"int[]" undef, i32* %10, 0
%12 = insertvalue %"int[]" %11, i64 3, 1
store %"int[]" %12, %"int[]"* %x, align 8
%13 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 0
store i32 123, i32* %13, align 4
%14 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 1
store i32 234, i32* %14, align 4
%15 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 2
store i32 567, i32* %15, align 4
%ptrptr = bitcast [3 x i32]* %literal2 to i32*
store i32* %ptrptr, i32** %y, align 8
%16 = call i32 @"std::io.println"(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.5, i32 0, i32 0)) #3
%17 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1
%18 = load i64, i64* %17, align 8
%uisitrunc = trunc i64 %18 to i32
%19 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0
%20 = load i32*, i32** %19, align 8
%ptroffset3 = getelementptr inbounds i32, i32* %20, i64 1
%21 = load i32, i32* %ptroffset3, align 4
%22 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.6, i32 0, i32 0), i32 %uisitrunc, i32 %21)
%23 = load i32*, i32** %y, align 8
%ptroffset4 = getelementptr inbounds i32, i32* %23, i64 1
%24 = load i32, i32* %ptroffset4, align 4
%25 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.7, i32 0, i32 0), i32 %24)
%26 = load i32*, i32** @subarrays.fofeo, align 8
%ptroffset5 = getelementptr inbounds i32, i32* %26, i64 1
%27 = load i32, i32* %ptroffset5, align 4
%28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.8, i32 0, i32 0), i32 %27)
%29 = bitcast %Baz* %ffe to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %29, i8* align 8 bitcast ({ i32, [4 x i8] }* @.__const to i8*), i32 8, i1 false)
%30 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0
store i32 0, i32* %30, align 4
%31 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 0
store i32 1, i32* %31, align 4
%32 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 1
store i32 2, i32* %32, align 4
%33 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 2
store i32 3, i32* %33, align 4
%34 = bitcast [3 x i32]* %literal6 to i32*
%35 = insertvalue %"int[]" undef, i32* %34, 0
%36 = insertvalue %"int[]" %35, i64 3, 1
%len = extractvalue %"int[]" %36, 1
%not = icmp eq i64 %len, 0
%37 = zext i1 %not to i8
store i8 %37, i8* %xy, align 1
%38 = load i8, i8* %xy, align 1
%39 = trunc i8 %38 to i1
%not7 = xor i1 %39, true
br i1 %not7, label %if.then, label %if.exit
if.then: ; preds = %entry
%40 = 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
%41 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0
store i32 0, i32* %41, align 4
%42 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1
store i32 0, i32* %42, align 4
%43 = bitcast %Baz* %z to i8*
call void @llvm.memset.p0i8.i64(i8* align 8 %43, i8 0, i64 8, i1 false)
store [0 x i32] zeroinitializer, [0 x i32]* %literal8, align 4
%44 = bitcast [0 x i32]* %literal8 to i32*
%45 = insertvalue %"int[]" undef, i32* %44, 0
%46 = insertvalue %"int[]" %45, i64 0, 1
store %"int[]" %46, %"int[]"* %sub, align 8
store [0 x %Bar] zeroinitializer, [0 x %Bar]* %literal9, align 4
%47 = bitcast [0 x %Bar]* %literal9 to %Bar*
%48 = insertvalue %"Bar[]" undef, %Bar* %47, 0
%49 = insertvalue %"Bar[]" %48, i64 0, 1
store %"Bar[]" %49, %"Bar[]"* %foo, align 8
%50 = bitcast [3 x %Baz]* %baz to i8*
call void @llvm.memset.p0i8.i64(i8* align 16 %50, i8 0, i64 24, i1 false)
ret i32 1
}