Add macro arguments &foo $foo #foo.

C ABI compatibility aarch64, win64, x86, x64
Added debug info
This commit is contained in:
Christoffer Lerno
2020-10-19 20:58:40 +02:00
committed by Christoffer Lerno
parent 4222f2731e
commit 3c15e495dd
52 changed files with 7936 additions and 2113 deletions

View File

@@ -20,49 +20,42 @@ public func void test()
// #expect: assert_variants.ll
%x = alloca i32
%y = alloca i32
%z = alloca i32
%0 = call i32 @assert_variants.foo()
store i32 %0, i32* %x
%1 = call i32 @assert_variants.foo()
store i32 %1, i32* %y
%2 = call i32 @assert_variants.foo()
store i32 %2, i32* %z
%3 = load i32, i32* %x
%gt = icmp sgt i32 %3, 0
call void @llvm.assume(i1 %gt)
%4 = load i32, i32* %y
%gt1 = icmp sgt i32 %4, 0
call void @llvm.assume(i1 %gt1)
%5 = load i32, i32* %z
%gt2 = icmp sgt i32 %5, 0
call void @llvm.assume(i1 %gt2)
%6 = load i32, i32* %x
%gt3 = icmp sgt i32 %6, 0
call void @llvm.assume(i1 %gt3)
%7 = load i32, i32* %y
%gt4 = icmp sgt i32 %7, 0
call void @llvm.assume(i1 %gt4)
%8 = load i32, i32* %z
%gt5 = icmp sgt i32 %8, 0
call void @llvm.assume(i1 %gt5)
%9 = load i32, i32* %x
%gt6 = icmp sgt i32 %9, 0
call void @llvm.assume(i1 %gt6)
%10 = load i32, i32* %x
%lt = icmp slt i32 %10, 1
%11 = icmp eq i1 %lt, false
call void @llvm.assume(i1 %11)
%12 = load i32, i32* %y
%lt7 = icmp slt i32 %12, 1
%13 = icmp eq i1 %lt7, false
call void @llvm.assume(i1 %13)
%x = alloca i32, align 4
%y = alloca i32, align 4
%z = alloca i32, align 4
%0 = call i32 @assert_variants.foo()
store i32 %0, i32* %x, align 4
%1 = call i32 @assert_variants.foo()
store i32 %1, i32* %y, align 4
%2 = call i32 @assert_variants.foo()
store i32 %2, i32* %z, align 4
%3 = load i32, i32* %x, align 4
%gt = icmp sgt i32 %3, 0
call void @llvm.assume(i1 %gt)
%4 = load i32, i32* %y, align 4
%gt1 = icmp sgt i32 %4, 0
call void @llvm.assume(i1 %gt1)
%5 = load i32, i32* %z, align 4
%gt2 = icmp sgt i32 %5, 0
call void @llvm.assume(i1 %gt2)
%6 = load i32, i32* %x, align 4
%gt3 = icmp sgt i32 %6, 0
call void @llvm.assume(i1 %gt3)
%7 = load i32, i32* %y, align 4
%gt4 = icmp sgt i32 %7, 0
call void @llvm.assume(i1 %gt4)
%8 = load i32, i32* %z, align 4
%gt5 = icmp sgt i32 %8, 0
call void @llvm.assume(i1 %gt5)
%9 = load i32, i32* %x, align 4
%gt6 = icmp sgt i32 %9, 0
call void @llvm.assume(i1 %gt6)
%10 = load i32, i32* %x, align 4
%lt = icmp slt i32 %10, 1
%not = xor i1 %lt, true
call void @llvm.assume(i1 %not)
%11 = load i32, i32* %y, align 4
%lt7 = icmp slt i32 %11, 1
%not8 = xor i1 %lt7, true
call void @llvm.assume(i1 %not8)
ret void

View File

@@ -8,20 +8,22 @@ func void! test()
// #expect: rethrow.ll
%i = alloca i32
%i1 = alloca i128
%0 = alloca i128
store i128 0, i128* %i1
%1 = load i128, i128* %i1
%2 = icmp eq i128 %1, 0
br i1 %2, label %after_check, label %error
%i1 = alloca { i64, i64 }, align 8
%error_var = alloca { i64, i64 }, align 8
store { i64, i64 } zeroinitializer, { i64, i64 }* %i1
store i32 0, i32* %i
%0 = load { i64, i64 }, { i64, i64 }* %i1
%1 = extractvalue { i64, i64 } %0, 0
%noerr = icmp eq i64 %1, 0
br i1 %noerr, label %after_check, label %error
error:
store i128 %1, i128* %0
store { i64, i64 } %0, { i64, i64 }* %error_var
br label %guard_block
after_check:
%3 = load i32, i32* %i
%2 = load i32, i32* %i, align 4
br label %noerr_block
guard_block:
%4 = load i128, i128* %0
ret i128 %4
%3 = load { i64, i64 }, { i64, i64 }* %error_var
ret { i64, i64 } %3
noerr_block:
ret i128 0
ret { i64, i64 } zeroinitializer

View File

@@ -3,11 +3,18 @@ func int* elvis(int *x, int *y)
return x ?: y;
}
func int* elvis2(int *x, int *y)
{
return x ?: (y ?: x);
}
func bool elvis3(bool x, bool y)
{
return x ?: y;
}
// #expect: elvis.ll
store i32* %0, i32** %x

View File

@@ -0,0 +1,42 @@
func void test(int* foo)
{
foo++;
foo--;
int y = 10;
y++;
y--;
float z = 2.0;
z++;
++z;
z--;
}
// #expect: incdec.ll
%foo = alloca i32*, align 8
%y = alloca i32, align 4
%z = alloca float, align 4
store i32* %0, i32** %foo
%1 = load i32*, i32** %foo, align 8
%ptrincdec = getelementptr i32, i32* %1, i8 1
store i32* %ptrincdec, i32** %foo, align 8
%2 = load i32*, i32** %foo, align 8
%ptrincdec1 = getelementptr i32, i32* %2, i8 -1
store i32* %ptrincdec1, i32** %foo, align 8
store i32 10, i32* %y, align 4
%3 = load i32, i32* %y, align 4
%add = add nsw i32 %3, 1
store i32 %add, i32* %y, align 4
%4 = load i32, i32* %y, align 4
%sub = sub nsw i32 %4, 1
store i32 %sub, i32* %y, align 4
store float 2.000000e+00, float* %z, align 4
%5 = load float, float* %z, align 4
%fincdec = fadd float %5, 1.000000e+00
store float %fincdec, float* %z, align 4
%6 = load float, float* %z, align 4
%fincdec2 = fadd float %6, 1.000000e+00
store float %fincdec2, float* %z, align 4
%7 = load float, float* %z, align 4
%fincdec3 = fadd float %7, -1.000000e+00
store float %fincdec3, float* %z, align 4

View File

@@ -44,40 +44,40 @@ func void testSimple()
@ExtraSimple = linkonce_odr constant i8 1
entry:
%a = alloca %pointer_access.ExtraSimple
%literal = alloca %pointer_access.ExtraSimple
%0 = bitcast %pointer_access.ExtraSimple* %literal to i8*
call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 72, i1 false)
%c = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %literal, i32 0, i32 2
%double = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c, i32 0, i32 4
store double 3.300000e+00, double* %double
%1 = load %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %literal
store %pointer_access.ExtraSimple %1, %pointer_access.ExtraSimple* %a
%c1 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
%j = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c1, i32 0, i32 4
store double 3.400000e+00, double* %j
%a2 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 0
%2 = load i32, i32* %a2
%c3 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
%e = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c3, i32 0, i32 0
%3 = load double, double* %e
%c4 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
%f = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c4, i32 0, i32 3
%4 = load double, double* %f
%c5 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
%j6 = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c5, i32 0, i32 4
%5 = load double, double* %j6
%g = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 5
%6 = load i32, i32* %g
%anon = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 4
%o0 = bitcast %pointer_access.anon.0* %anon to double*
%7 = load double, double* %o0
%anon7 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3
%r = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon7, i32 0, i32 0
%8 = load i32, i32* %r
%anon8 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3
%s = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon8, i32 0, i32 1
%9 = load i32, i32* %s
call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @0, i32 0, i32 0), i32 %2, double %3, double %4, double %5, i32 %6, double %7, i32 %8, i32 %9)
ret void
}
%a = alloca %pointer_access.ExtraSimple, align 8
%literal = alloca %pointer_access.ExtraSimple, align 8
%0 = bitcast %pointer_access.ExtraSimple* %literal to i8*
call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 72, i1 false)
%c = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %literal, i32 0, i32 2
%double = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c, i32 0, i32 4
store double 3.300000e+00, double* %double
%1 = bitcast %pointer_access.ExtraSimple* %a to i8*
%2 = bitcast %pointer_access.ExtraSimple* %literal to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 %2, i32 72, i1 false)
%c1 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
%j = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c1, i32 0, i32 4
store double 3.400000e+00, double* %j, align 8
%a2 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 0
%3 = load i32, i32* %a2, align 4
%c3 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
%e = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c3, i32 0, i32 0
%4 = load double, double* %e, align 8
%c4 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
%f = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c4, i32 0, i32 3
%5 = load double, double* %f, align 8
%c5 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
%j6 = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c5, i32 0, i32 4
%6 = load double, double* %j6, align 8
%g = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 5
%7 = load i32, i32* %g, align 4
%anon = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 4
%o0 = bitcast %pointer_access.anon.0* %anon to double*
%8 = load double, double* %o0, align 8
%anon7 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3
%r = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon7, i32 0, i32 0
%9 = load i32, i32* %r, align 4
%anon8 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3
%s = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon8, i32 0, i32 1
%10 = load i32, i32* %s, align 4
call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @0, i32 0, i32 0), i32 %3, double %4, double %5, double %6, i32 %7, double %8, i32 %9, i32 %10)
ret void

View File

@@ -0,0 +1,24 @@
macro int cofefe(#a)
{
int y = 0;
return #a + #a;
}
int abc = 1;
public func int xx()
{
abc++;
return abc;
}
public func void main()
{
define $x = 0;
int x = 0;
@cofefe(x += 1);
@cofefe(xx());
@cofefe($x += 1); // #error: Cannot modify '$x' inside of a runtime scope.
@cofefe(y += 1); // #error: Identifier 'y' could not be found.
}

View File

@@ -0,0 +1,42 @@
module foo;
public func void test1(int* x)
{
int a = x[0];
int b = *x;
int c = x[1];
int d = x[-1];
}
public func void test2(byte* x)
{
byte a = x[0];
byte b = *x;
byte c = x[1];
}
public func void test3(long* x)
{
long a = x[0];
long b = *x;
long c = x[1];
}
// #expect: pointer_index.ll
%x = alloca i64*, align 8
%a = alloca i64, align 8
%b = alloca i64, align 8
%c = alloca i64, align 8
store i64* %0, i64** %x
%1 = load i64*, i64** %x, align 8
%ptridx = getelementptr inbounds i64, i64* %1, i64 0
%2 = load i64, i64* %ptridx, align 8
store i64 %2, i64* %a, align 8
%3 = load i64*, i64** %x, align 8
%4 = load i64, i64* %3, align 8
store i64 %4, i64* %b, align 8
%5 = load i64*, i64** %x, align 8
%ptridx1 = getelementptr inbounds i64, i64* %5, i64 1
%6 = load i64, i64* %ptridx1, align 8
store i64 %6, i64* %c, align 8

View File

@@ -22,7 +22,8 @@ func void test(int i)
// #expect: defer_break_switch.ll
switch.case:
%4 = load i1, i1* %b
%3 = load i8, i8* %b, align 1
%4 = trunc i8 %3 to i1
br i1 %4, label %if.then, label %if.exit
if.then:

View File

@@ -22,7 +22,8 @@ func void test(int i)
// #expect: defer_next_switch.ll
switch.case:
%4 = load i1, i1* %b
%3 = load i8, i8* %b, align 1
%4 = trunc i8 %3 to i1
br i1 %4, label %if.then, label %if.exit
if.then:

View File

@@ -17,8 +17,8 @@ func int testReturnSwitch()
// #expect: return_switch.ll
switch.entry:
%2 = load i32, i32* %0
switch i32 %2, label %switch.default [
%1 = load i32, i32* %switch
switch i32 %1, label %switch.default [
i32 0, label %switch.case
i32 3, label %switch.case
i32 1, label %switch.case

View File

@@ -18,7 +18,7 @@ func void test1()
@Point = linkonce_odr constant i8 1
entry:
%p = alloca %test.Point
%0 = load %test.Point, %test.Point* @0
store %test.Point %0, %test.Point* %p
%p = alloca %test.Point, align 4
%0 = bitcast %test.Point* %p to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%test.Point* @0 to i8*), i32 8, i1 false)

View File

@@ -6,12 +6,12 @@ func void test()
// #expect: slice_offset.ll
%x = alloca [3 x i32]
%y = alloca %"int[]"
%0 = load [3 x i32], [3 x i32]* @0
store [3 x i32] %0, [3 x i32]* %x
%x = alloca [3 x i32], align 4
%y = alloca %"int[]", align 8
%0 = bitcast [3 x i32]* %x to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @0 to i8*), i32 12, i1 false)
%1 = bitcast [3 x i32]* %x to i32*
%offset = getelementptr inbounds i32, i32* %1, i64 1
%2 = insertvalue %"int[]" undef, i32* %offset, 0
%3 = insertvalue %"int[]" %2, i64 1, 1
store %"int[]" %3, %"int[]"* %y
store %"int[]" %3, %"int[]"* %y, align 8

View File

@@ -6,12 +6,13 @@ func void test()
// #expect: slice_offset_neg_end.ll
%x = alloca [3 x i32]
%y = alloca %"int[]"
%0 = load [3 x i32], [3 x i32]* @0
store [3 x i32] %0, [3 x i32]* %x
%x = alloca [3 x i32], align 4
%y = alloca %"int[]", align 8
%0 = bitcast [3 x i32]* %x to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @0 to i8*), i32 12, i1 false)
%1 = bitcast [3 x i32]* %x to i32*
%offset = getelementptr inbounds i32, i32* %1, i64 1
%2 = insertvalue %"int[]" undef, i32* %offset, 0
%3 = insertvalue %"int[]" %2, i64 1, 1
store %"int[]" %3, %"int[]"* %y
store %"int[]" %3, %"int[]"* %y, align 8

View File

@@ -6,12 +6,12 @@ func void test()
// #expect: slice_offset_neg_start.ll
%x = alloca [3 x i32]
%y = alloca %"int[]"
%0 = load [3 x i32], [3 x i32]* @0
store [3 x i32] %0, [3 x i32]* %x
%x = alloca [3 x i32], align 4
%y = alloca %"int[]", align 8
%0 = bitcast [3 x i32]* %x to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @0 to i8*), i32 12, i1 false)
%1 = bitcast [3 x i32]* %x to i32*
%offset = getelementptr inbounds i32, i32* %1, i64 1
%2 = insertvalue %"int[]" undef, i32* %offset, 0
%3 = insertvalue %"int[]" %2, i64 1, 1
store %"int[]" %3, %"int[]"* %y
store %"int[]" %3, %"int[]"* %y, align 8

View File

@@ -6,12 +6,12 @@ func void test()
// #expect: slice_start.ll
%x = alloca [3 x i32]
%y = alloca %"int[]"
%0 = load [3 x i32], [3 x i32]* @0
store [3 x i32] %0, [3 x i32]* %x
%1 = bitcast [3 x i32]* %x to i32*
%offset = getelementptr inbounds i32, i32* %1, i64 0
%2 = insertvalue %"int[]" undef, i32* %offset, 0
%3 = insertvalue %"int[]" %2, i64 3, 1
store %"int[]" %3, %"int[]"* %y
%x = alloca [3 x i32], align 4
%y = alloca %"int[]", align 8
%0 = bitcast [3 x i32]* %x to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @0 to i8*), i32 12, i1 false)
%1 = bitcast [3 x i32]* %x to i32*
%offset = getelementptr inbounds i32, i32* %1, i64 0
%2 = insertvalue %"int[]" undef, i32* %offset, 0
%3 = insertvalue %"int[]" %2, i64 3, 1
store %"int[]" %3, %"int[]"* %y, align 8