mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
94 lines
2.9 KiB
C
94 lines
2.9 KiB
C
// #target: x64-darwin
|
|
import std::io;
|
|
import std::mem;
|
|
union Baz
|
|
{
|
|
int x;
|
|
double y;
|
|
}
|
|
struct Bar
|
|
{
|
|
int x;
|
|
int y;
|
|
}
|
|
|
|
|
|
func void test()
|
|
{
|
|
Bar[] b = { { 1, 2 } };
|
|
static Bar[] c = { { 1, 2 } };
|
|
io::printf("%d %d\n", b[0].y, c[0].y);
|
|
b[0].y += 1;
|
|
c[0].y += 1;
|
|
|
|
}
|
|
func int main()
|
|
{
|
|
test();
|
|
test();
|
|
test();
|
|
return 1;
|
|
}
|
|
|
|
// #expect: statics.ll
|
|
|
|
%Bar = type { i32, i32 }
|
|
%"Bar[]" = type { %Bar*, i64 }
|
|
|
|
@Baz = linkonce_odr constant i8 1
|
|
@Bar = linkonce_odr constant i8 1
|
|
@.taddr = private hidden global [1 x %Bar] [%Bar { i32 1, i32 2 }], align 4
|
|
@test.c = hidden global %"Bar[]" { %Bar* getelementptr inbounds ([1 x %Bar], [1 x %Bar]* @.taddr, i32 0, i32 0), i64 1 }, align 8
|
|
@.str = private constant [7 x i8] c"%d %d\0A\00", align 1
|
|
|
|
declare i32 @printf(i8*, ...)
|
|
|
|
; Function Attrs: nounwind
|
|
define void @statics.test() #0 {
|
|
entry:
|
|
%b = alloca %"Bar[]", align 8
|
|
%literal = alloca [1 x %Bar], align 4
|
|
%0 = getelementptr inbounds %Bar, [1 x %Bar]* %literal, i32 0
|
|
%1 = getelementptr inbounds %Bar, %Bar* %0, i32 0, i32 0
|
|
store i32 1, i32* %1, align 4
|
|
%2 = getelementptr inbounds %Bar, %Bar* %0, i32 0, i32 1
|
|
store i32 2, i32* %2, align 4
|
|
%3 = bitcast [1 x %Bar]* %literal to %Bar*
|
|
%4 = insertvalue %"Bar[]" undef, %Bar* %3, 0
|
|
%5 = insertvalue %"Bar[]" %4, i64 1, 1
|
|
store %"Bar[]" %5, %"Bar[]"* %b, align 8
|
|
%subarrayptr = getelementptr inbounds %"Bar[]", %"Bar[]"* %b, i32 0, i32 0
|
|
%saptr = load %Bar*, %Bar** %subarrayptr, align 8
|
|
%sarridx = getelementptr inbounds %Bar, %Bar* %saptr, i64 0
|
|
%6 = getelementptr inbounds %Bar, %Bar* %sarridx, i32 0, i32 1
|
|
%7 = load i32, i32* %6, align 4
|
|
%saptr1 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @test.c, i32 0, i32 0), align 8
|
|
%sarridx2 = getelementptr inbounds %Bar, %Bar* %saptr1, i64 0
|
|
%8 = getelementptr inbounds %Bar, %Bar* %sarridx2, i32 0, i32 1
|
|
%9 = load i32, i32* %8, align 4
|
|
%10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i32 %7, i32 %9)
|
|
%subarrayptr3 = getelementptr inbounds %"Bar[]", %"Bar[]"* %b, i32 0, i32 0
|
|
%saptr4 = load %Bar*, %Bar** %subarrayptr3, align 8
|
|
%sarridx5 = getelementptr inbounds %Bar, %Bar* %saptr4, i64 0
|
|
%11 = getelementptr inbounds %Bar, %Bar* %sarridx5, i32 0, i32 1
|
|
%12 = load i32, i32* %11, align 4
|
|
%add = add i32 %12, 1
|
|
store i32 %add, i32* %11, align 4
|
|
%saptr6 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @test.c, i32 0, i32 0), align 8
|
|
%sarridx7 = getelementptr inbounds %Bar, %Bar* %saptr6, i64 0
|
|
%13 = getelementptr inbounds %Bar, %Bar* %sarridx7, i32 0, i32 1
|
|
%14 = load i32, i32* %13, align 4
|
|
%add8 = add i32 %14, 1
|
|
store i32 %add8, i32* %13, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define i32 @main() #0 {
|
|
entry:
|
|
call void @statics.test()
|
|
call void @statics.test()
|
|
call void @statics.test()
|
|
ret i32 1
|
|
}
|