mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
90 lines
2.6 KiB
C
90 lines
2.6 KiB
C
// #target: macos-x64
|
|
import std::io;
|
|
import libc;
|
|
union Baz
|
|
{
|
|
int x;
|
|
double y;
|
|
}
|
|
struct Bar
|
|
{
|
|
int x;
|
|
int y;
|
|
}
|
|
|
|
|
|
fn void test()
|
|
{
|
|
Bar[] b = { { 1, 2 } };
|
|
static Bar[] c = { { 1, 2 } };
|
|
libc::printf("%d %d\n", b[0].y, c[0].y);
|
|
b[0].y += 1;
|
|
c[0].y += 1;
|
|
|
|
}
|
|
fn int main()
|
|
{
|
|
test();
|
|
test();
|
|
test();
|
|
return 1;
|
|
}
|
|
|
|
/* #expect: statics.ll
|
|
|
|
%Bar = type { i32, i32 }
|
|
%"Bar[]" = type { ptr, i64 }
|
|
|
|
@"$ct.statics.Baz" = linkonce global %.introspect { i8 11, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
|
|
@"$ct.statics.Bar" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
|
|
@.taddr = private global [1 x %Bar] [%Bar { i32 1, i32 2 }], align 8
|
|
@"test$c" = internal unnamed_addr global %"Bar[]" { ptr @.taddr, i64 1 }, align 8
|
|
@.str = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1
|
|
|
|
define void @statics.test() #0 {
|
|
entry:
|
|
%b = alloca %"Bar[]", align 8
|
|
%literal = alloca [1 x %Bar], align 4
|
|
%0 = getelementptr inbounds [1 x %Bar], ptr %literal, i64 0, i64 0
|
|
%1 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 0
|
|
store i32 1, ptr %1, align 4
|
|
%2 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 1
|
|
store i32 2, ptr %2, align 4
|
|
%3 = insertvalue %"Bar[]" undef, ptr %literal, 0
|
|
%4 = insertvalue %"Bar[]" %3, i64 1, 1
|
|
store %"Bar[]" %4, ptr %b, align 8
|
|
%5 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0
|
|
%6 = load ptr, ptr %5, align 8
|
|
%ptroffset = getelementptr inbounds %Bar, ptr %6, i64 0
|
|
%7 = getelementptr inbounds %Bar, ptr %ptroffset, i32 0, i32 1
|
|
%8 = load i32, ptr %7, align 4
|
|
%9 = load ptr, ptr @"test$c", align 8
|
|
%ptroffset1 = getelementptr inbounds %Bar, ptr %9, i64 0
|
|
%10 = getelementptr inbounds %Bar, ptr %ptroffset1, i32 0, i32 1
|
|
%11 = load i32, ptr %10, align 4
|
|
%12 = call i32 (ptr, ...) @printf(ptr @.str, i32 %8, i32 %11)
|
|
%13 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0
|
|
%14 = load ptr, ptr %13, align 8
|
|
%ptroffset2 = getelementptr inbounds %Bar, ptr %14, i64 0
|
|
%15 = getelementptr inbounds %Bar, ptr %ptroffset2, i32 0, i32 1
|
|
%16 = load i32, ptr %15, align 4
|
|
%add = add i32 %16, 1
|
|
store i32 %add, ptr %15, align 4
|
|
%17 = load ptr, ptr @"test$c", align 8
|
|
%ptroffset3 = getelementptr inbounds %Bar, ptr %17, i64 0
|
|
%18 = getelementptr inbounds %Bar, ptr %ptroffset3, i32 0, i32 1
|
|
%19 = load i32, ptr %18, align 4
|
|
%add4 = add i32 %19, 1
|
|
store i32 %add4, ptr %18, align 4
|
|
ret void
|
|
}
|
|
|
|
define i32 @main() #0 {
|
|
entry:
|
|
call void @statics.test()
|
|
call void @statics.test()
|
|
call void @statics.test()
|
|
ret i32 1
|
|
}
|
|
|
|
declare i32 @printf(ptr, ...)
|