mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
324 lines
9.7 KiB
Plaintext
324 lines
9.7 KiB
Plaintext
// #target: macos-x64
|
|
module foo;
|
|
import std::io;
|
|
import libc;
|
|
fault Foo
|
|
{
|
|
X,
|
|
Y,
|
|
Z,
|
|
W,
|
|
W1
|
|
|
|
|
|
}
|
|
|
|
fault Foob
|
|
{
|
|
X1,
|
|
Y2
|
|
}
|
|
|
|
distinct Bar = int;
|
|
|
|
enum MyEnum
|
|
{
|
|
A,
|
|
B
|
|
}
|
|
|
|
fn void Foo.hello(Foo *f)
|
|
{
|
|
io::printn("Hello from Foo");
|
|
}
|
|
|
|
fn void Bar.hello(Bar *b)
|
|
{
|
|
io::printn("Hello from Bar");
|
|
}
|
|
|
|
fn void MyEnum.hello(MyEnum *myenum)
|
|
{
|
|
io::printn("Hello from MyEnum");
|
|
}
|
|
fn void main()
|
|
{
|
|
Foo f = Foo.X;
|
|
Foo ef = Foo.Y;
|
|
anyfault x = f;
|
|
ulong z = (ulong)(x);
|
|
libc::printf("1: %p\n", z);
|
|
x = ef;
|
|
z = (ulong)(x);
|
|
libc::printf("2: %p\n", z);
|
|
x = Foo.W;
|
|
z = (ulong)(x);
|
|
libc::printf("21: %p\n", z);
|
|
x = Foo.W1;
|
|
z = (ulong)(x);
|
|
libc::printf("22: %p\n", z);
|
|
x = Foob.X1;
|
|
z = (ulong)(x);
|
|
libc::printf("3: %p\n", z);
|
|
x = Foob.Y2;
|
|
z = (ulong)(x);
|
|
libc::printf("4: %p\n", z);
|
|
Bar b;
|
|
MyEnum a = MyEnum.A;
|
|
f.hello();
|
|
b.hello();
|
|
a.hello();
|
|
}
|
|
|
|
/* #expect: foo.ll
|
|
|
|
define void @foo.Foo.hello(ptr %0) #0 {
|
|
entry:
|
|
%len = alloca i64, align 8
|
|
%error_var = alloca i64, align 8
|
|
%retparam = alloca i64, align 8
|
|
%error_var2 = alloca i64, align 8
|
|
%error_var8 = alloca i64, align 8
|
|
%1 = call ptr @std.io.stdout()
|
|
%2 = call i64 @std.io.File.write(ptr %retparam, ptr %1, ptr @.str.12, i64 14)
|
|
%not_err = icmp eq i64 %2, 0
|
|
%3 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %3, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %entry
|
|
store i64 %2, ptr %error_var, align 8
|
|
br label %guard_block
|
|
|
|
after_check: ; preds = %entry
|
|
br label %noerr_block
|
|
|
|
guard_block: ; preds = %assign_optional
|
|
br label %voiderr
|
|
|
|
noerr_block: ; preds = %after_check
|
|
%4 = load i64, ptr %retparam, align 8
|
|
store i64 %4, ptr %len, align 8
|
|
%5 = call i64 @std.io.File.write_byte(ptr %1, i8 zeroext 10)
|
|
%not_err3 = icmp eq i64 %5, 0
|
|
%6 = call i1 @llvm.expect.i1(i1 %not_err3, i1 true)
|
|
br i1 %6, label %after_check5, label %assign_optional4
|
|
|
|
assign_optional4: ; preds = %noerr_block
|
|
store i64 %5, ptr %error_var2, align 8
|
|
br label %guard_block6
|
|
|
|
after_check5: ; preds = %noerr_block
|
|
br label %noerr_block7
|
|
|
|
guard_block6: ; preds = %assign_optional4
|
|
br label %voiderr
|
|
|
|
noerr_block7: ; preds = %after_check5
|
|
%7 = call i64 @std.io.File.flush(ptr %1)
|
|
%not_err9 = icmp eq i64 %7, 0
|
|
%8 = call i1 @llvm.expect.i1(i1 %not_err9, i1 true)
|
|
br i1 %8, label %after_check11, label %assign_optional10
|
|
|
|
assign_optional10: ; preds = %noerr_block7
|
|
store i64 %7, ptr %error_var8, align 8
|
|
br label %guard_block12
|
|
|
|
after_check11: ; preds = %noerr_block7
|
|
br label %noerr_block13
|
|
|
|
guard_block12: ; preds = %assign_optional10
|
|
br label %voiderr
|
|
|
|
noerr_block13: ; preds = %after_check11
|
|
%9 = load i64, ptr %len, align 8
|
|
%add = add i64 %9, 1
|
|
br label %voiderr
|
|
|
|
voiderr: ; preds = %noerr_block13, %guard_block12, %guard_block6, %guard_block
|
|
ret void
|
|
}
|
|
|
|
|
|
define void @foo.Bar.hello(ptr %0) #0 {
|
|
entry:
|
|
%len = alloca i64, align 8
|
|
%error_var = alloca i64, align 8
|
|
%retparam = alloca i64, align 8
|
|
%error_var2 = alloca i64, align 8
|
|
%error_var8 = alloca i64, align 8
|
|
%1 = call ptr @std.io.stdout()
|
|
%2 = call i64 @std.io.File.write(ptr %retparam, ptr %1, ptr @.str.13, i64 14)
|
|
%not_err = icmp eq i64 %2, 0
|
|
%3 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %3, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %entry
|
|
store i64 %2, ptr %error_var, align 8
|
|
br label %guard_block
|
|
|
|
after_check: ; preds = %entry
|
|
br label %noerr_block
|
|
|
|
guard_block: ; preds = %assign_optional
|
|
br label %voiderr
|
|
|
|
noerr_block: ; preds = %after_check
|
|
%4 = load i64, ptr %retparam, align 8
|
|
store i64 %4, ptr %len, align 8
|
|
%5 = call i64 @std.io.File.write_byte(ptr %1, i8 zeroext 10)
|
|
%not_err3 = icmp eq i64 %5, 0
|
|
%6 = call i1 @llvm.expect.i1(i1 %not_err3, i1 true)
|
|
br i1 %6, label %after_check5, label %assign_optional4
|
|
|
|
assign_optional4: ; preds = %noerr_block
|
|
store i64 %5, ptr %error_var2, align 8
|
|
br label %guard_block6
|
|
|
|
after_check5: ; preds = %noerr_block
|
|
br label %noerr_block7
|
|
|
|
guard_block6: ; preds = %assign_optional4
|
|
br label %voiderr
|
|
|
|
noerr_block7: ; preds = %after_check5
|
|
%7 = call i64 @std.io.File.flush(ptr %1)
|
|
%not_err9 = icmp eq i64 %7, 0
|
|
%8 = call i1 @llvm.expect.i1(i1 %not_err9, i1 true)
|
|
br i1 %8, label %after_check11, label %assign_optional10
|
|
|
|
assign_optional10: ; preds = %noerr_block7
|
|
store i64 %7, ptr %error_var8, align 8
|
|
br label %guard_block12
|
|
|
|
after_check11: ; preds = %noerr_block7
|
|
br label %noerr_block13
|
|
|
|
guard_block12: ; preds = %assign_optional10
|
|
br label %voiderr
|
|
|
|
noerr_block13: ; preds = %after_check11
|
|
%9 = load i64, ptr %len, align 8
|
|
%add = add i64 %9, 1
|
|
br label %voiderr
|
|
|
|
voiderr: ; preds = %noerr_block13, %guard_block12, %guard_block6, %guard_block
|
|
ret void
|
|
}
|
|
|
|
|
|
define void @foo.MyEnum.hello(ptr %0) #0 {
|
|
entry:
|
|
%len = alloca i64, align 8
|
|
%error_var = alloca i64, align 8
|
|
%retparam = alloca i64, align 8
|
|
%error_var2 = alloca i64, align 8
|
|
%error_var8 = alloca i64, align 8
|
|
%1 = call ptr @std.io.stdout()
|
|
%2 = call i64 @std.io.File.write(ptr %retparam, ptr %1, ptr @.str.14, i64 17)
|
|
%not_err = icmp eq i64 %2, 0
|
|
%3 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %3, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %entry
|
|
store i64 %2, ptr %error_var, align 8
|
|
br label %guard_block
|
|
|
|
after_check: ; preds = %entry
|
|
br label %noerr_block
|
|
|
|
guard_block: ; preds = %assign_optional
|
|
br label %voiderr
|
|
|
|
noerr_block: ; preds = %after_check
|
|
%4 = load i64, ptr %retparam, align 8
|
|
store i64 %4, ptr %len, align 8
|
|
%5 = call i64 @std.io.File.write_byte(ptr %1, i8 zeroext 10)
|
|
%not_err3 = icmp eq i64 %5, 0
|
|
%6 = call i1 @llvm.expect.i1(i1 %not_err3, i1 true)
|
|
br i1 %6, label %after_check5, label %assign_optional4
|
|
|
|
assign_optional4: ; preds = %noerr_block
|
|
store i64 %5, ptr %error_var2, align 8
|
|
br label %guard_block6
|
|
|
|
after_check5: ; preds = %noerr_block
|
|
br label %noerr_block7
|
|
|
|
guard_block6: ; preds = %assign_optional4
|
|
br label %voiderr
|
|
|
|
noerr_block7: ; preds = %after_check5
|
|
%7 = call i64 @std.io.File.flush(ptr %1)
|
|
%not_err9 = icmp eq i64 %7, 0
|
|
%8 = call i1 @llvm.expect.i1(i1 %not_err9, i1 true)
|
|
br i1 %8, label %after_check11, label %assign_optional10
|
|
|
|
assign_optional10: ; preds = %noerr_block7
|
|
store i64 %7, ptr %error_var8, align 8
|
|
br label %guard_block12
|
|
|
|
after_check11: ; preds = %noerr_block7
|
|
br label %noerr_block13
|
|
|
|
guard_block12: ; preds = %assign_optional10
|
|
br label %voiderr
|
|
|
|
noerr_block13: ; preds = %after_check11
|
|
%9 = load i64, ptr %len, align 8
|
|
%add = add i64 %9, 1
|
|
br label %voiderr
|
|
|
|
voiderr: ; preds = %noerr_block13, %guard_block12, %guard_block6, %guard_block
|
|
ret void
|
|
}
|
|
|
|
|
|
define void @foo.main() #0 {
|
|
entry:
|
|
%f = alloca i64, align 8
|
|
%ef = alloca i64, align 8
|
|
%x = alloca i64, align 8
|
|
%z = alloca i64, align 8
|
|
%b = alloca i32, align 4
|
|
%a = alloca i32, align 4
|
|
store i64 ptrtoint (ptr @"foo.Foo$X" to i64), ptr %f, align 8
|
|
store i64 ptrtoint (ptr @"foo.Foo$Y" to i64), ptr %ef, align 8
|
|
%0 = load i64, ptr %f, align 8
|
|
store i64 %0, ptr %x, align 8
|
|
%1 = load i64, ptr %x, align 8
|
|
store i64 %1, ptr %z, align 8
|
|
%2 = load i64, ptr %z, align 8
|
|
%3 = call i32 (ptr, ...) @printf(ptr @.str, i64 %2)
|
|
%4 = load i64, ptr %ef, align 8
|
|
store i64 %4, ptr %x, align 8
|
|
%5 = load i64, ptr %x, align 8
|
|
store i64 %5, ptr %z, align 8
|
|
%6 = load i64, ptr %z, align 8
|
|
%7 = call i32 (ptr, ...) @printf(ptr @.str.7, i64 %6)
|
|
store i64 ptrtoint (ptr @"foo.Foo$W" to i64), ptr %x, align 8
|
|
%8 = load i64, ptr %x, align 8
|
|
store i64 %8, ptr %z, align 8
|
|
%9 = load i64, ptr %z, align 8
|
|
%10 = call i32 (ptr, ...) @printf(ptr @.str.8, i64 %9)
|
|
store i64 ptrtoint (ptr @"foo.Foo$W1" to i64), ptr %x, align 8
|
|
%11 = load i64, ptr %x, align 8
|
|
store i64 %11, ptr %z, align 8
|
|
%12 = load i64, ptr %z, align 8
|
|
%13 = call i32 (ptr, ...) @printf(ptr @.str.9, i64 %12)
|
|
store i64 ptrtoint (ptr @"foo.Foob$X1" to i64), ptr %x, align 8
|
|
%14 = load i64, ptr %x, align 8
|
|
store i64 %14, ptr %z, align 8
|
|
%15 = load i64, ptr %z, align 8
|
|
%16 = call i32 (ptr, ...) @printf(ptr @.str.10, i64 %15)
|
|
store i64 ptrtoint (ptr @"foo.Foob$Y2" to i64), ptr %x, align 8
|
|
%17 = load i64, ptr %x, align 8
|
|
store i64 %17, ptr %z, align 8
|
|
%18 = load i64, ptr %z, align 8
|
|
%19 = call i32 (ptr, ...) @printf(ptr @.str.11, i64 %18)
|
|
store i32 0, ptr %b, align 4
|
|
store i32 0, ptr %a, align 4
|
|
call void @foo.Foo.hello(ptr %f)
|
|
call void @foo.Bar.hello(ptr %b)
|
|
call void @foo.MyEnum.hello(ptr %a)
|
|
ret void
|
|
} |