Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 75 additions & 20 deletions cl/_testdata/foo/foo.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,40 @@
// LITTEST
package foo

// CHECK-LABEL: define %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"{{.*}}.Bar"(){{.*}} {
// CHECK: ret %"github.com/goplus/llgo/runtime/internal/runtime.eface"
// CHECK-LINE: @6 = private unnamed_addr constant [43 x i8] c"{{.*}}/cl/_testdata/foo.Foo", align 1
// CHECK-LINE: @7 = private unnamed_addr constant [2 x i8] c"Pb", align 1
// CHECK-LINE: @8 = private unnamed_addr constant [4 x i8] c"load", align 1

// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/cl/_testdata/foo.Bar"(){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %0 = alloca { i64 }, align 8
// CHECK-NEXT: call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false)
// CHECK-NEXT: %1 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0
// CHECK-NEXT: store i64 1, ptr %1, align 8
// CHECK-NEXT: %2 = load { i64 }, ptr %0, align 8
// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8)
// CHECK-NEXT: store { i64 } %2, ptr %3, align 8
// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", ptr undef }, ptr %3, 1
// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.eface" %4
// CHECK-NEXT: }

func Bar() any {
return struct{ V int }{1}
}

// CHECK-LABEL: define %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"{{.*}}.F"(){{.*}} {
// CHECK: ret %"github.com/goplus/llgo/runtime/internal/runtime.eface"
// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/cl/_testdata/foo.F"(){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %0 = alloca { i64 }, align 8
// CHECK-NEXT: call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false)
// CHECK-NEXT: %1 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0
// CHECK-NEXT: store i64 1, ptr %1, align 8
// CHECK-NEXT: %2 = load { i64 }, ptr %0, align 8
// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8)
// CHECK-NEXT: store { i64 } %2, ptr %3, align 8
// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr undef }, ptr %3, 1
// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.eface" %4
// CHECK-NEXT: }

func F() any {
return struct{ v int }{1}
}
Expand All @@ -18,21 +44,16 @@ type Foo struct {
F float32
}

// CHECK-LABEL: define ptr @"{{.*}}.Foo.Pb"(%"{{.*}}.Foo" %0){{.*}} {
// CHECK-LABEL: define ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"(%"{{.*}}/cl/_testdata/foo.Foo" %0){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %1 = alloca %"{{.*}}.Foo", align 8
// CHECK-NEXT: %1 = alloca %"{{.*}}/cl/_testdata/foo.Foo", align 8
// CHECK-NEXT: call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false)
// CHECK-NEXT: store %"{{.*}}.Foo" %0, ptr %1, align 8
// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}.Foo", ptr %1, i32 0, i32 0
// CHECK-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %0, ptr %1, align 8
// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/cl/_testdata/foo.Foo", ptr %1, i32 0, i32 0
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
// CHECK-NEXT: ret ptr %3
// CHECK-NEXT: }
// CHECK-LABEL: define ptr @"{{.*}}.(*Foo).Pb"(ptr %0){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %1 = load %"{{.*}}.Foo", ptr %0, align 8
// CHECK-NEXT: %2 = call ptr @"{{.*}}.Foo.Pb"(%"{{.*}}.Foo" %1)
// CHECK-NEXT: ret ptr %2
// CHECK-NEXT: }

func (v Foo) Pb() *byte {
return v.pb
}
Expand All @@ -48,12 +69,46 @@ type Game struct {
func (g *Game) initGame() {
}

// CHECK-LABEL: define void @"{{.*}}.(*Game).Load"(ptr %0){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: call void @"{{.*}}.PrintString"(%"{{.*}}.String" { ptr @6, i64 4 })
// CHECK-NEXT: call void @"{{.*}}.PrintByte"(i8 10)
// CHECK-NEXT: ret void
// CHECK-NEXT: }
func (g *Game) Load() {
println("load")
}

// CHECK-LABEL: define ptr @"{{.*}}/cl/_testdata/foo.(*Foo).Pb"(ptr %0){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %1 = icmp eq ptr %0, null
// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 43 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 2 })
// CHECK-NEXT: %2 = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %0, align 8
// CHECK-NEXT: %3 = call ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"(%"{{.*}}/cl/_testdata/foo.Foo" %2)
// CHECK-NEXT: ret ptr %3
// CHECK-NEXT: }

// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/foo.(*Game).Load"(ptr %0){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @8, i64 4 })
// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10)
// CHECK-NEXT: ret void
// CHECK-NEXT: }

// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/foo.(*Game).initGame"(ptr %0){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: ret void
// CHECK-NEXT: }

// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/foo.init"(){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %0 = load i1, ptr @"{{.*}}/cl/_testdata/foo.init$guard", align 1
// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1
// CHECK-EMPTY:
// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0
// CHECK-NEXT: store i1 true, ptr @"{{.*}}/cl/_testdata/foo.init$guard", align 1
// CHECK-NEXT: br label %_llgo_2
// CHECK-EMPTY:
// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0
// CHECK-NEXT: ret void
// CHECK-NEXT: }

// CHECK-LABEL: define linkonce i1 @"__llgo_stub.{{.*}}/runtime/internal/runtime.memequal64"(ptr %0, ptr %1, ptr %2){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %3 = tail call i1 @"{{.*}}/runtime/internal/runtime.memequal64"(ptr %1, ptr %2)
// CHECK-NEXT: ret i1 %3
// CHECK-NEXT: }
57 changes: 44 additions & 13 deletions cl/_testdata/method/in.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,17 @@ package main

import _ "unsafe"

// CHECK-LINE: @0 = private unnamed_addr constant [44 x i8] c"{{.*}}/cl/_testdata/method.T", align 1
// CHECK-LINE: @1 = private unnamed_addr constant [3 x i8] c"Add", align 1

type T int

// CHECK-LABEL: define i64 @"{{.*}}.T.Add"(i64 %0, i64 %1){{.*}} {
// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/method.T.Add"(i64 %0, i64 %1){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %2 = add i64 %0, %1
// CHECK-NEXT: ret i64 %2
// CHECK-NEXT: }
// CHECK-LABEL: define i64 @"{{.*}}.(*T).Add"(ptr %0, i64 %1){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %2 = load i64, ptr %0, align 8
// CHECK-NEXT: %3 = call i64 @"{{.*}}.T.Add"(i64 %2, i64 %1)
// CHECK-NEXT: ret i64 %3
// CHECK-NEXT: }

func (a T) Add(b T) T {
return a + b
}
Expand All @@ -25,13 +23,46 @@ func printf(format *int8, __llgo_va_list ...any)

var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}

// CHECK-LABEL: define void @"{{.*}}.main"(){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %0 = call i64 @"{{.*}}.T.Add"(i64 1, i64 2)
// CHECK-NEXT: call void (ptr, ...) @printf(ptr @"{{.*}}.format", i64 %0)
// CHECK-NEXT: ret void
// CHECK-NEXT: }
func main() {
a := T(1)
printf(&format[0], a.Add(2))
}

// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/method.(*T).Add"(ptr %0, i64 %1){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %2 = icmp eq ptr %0, null
// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %2, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 44 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 3 })
// CHECK-NEXT: %3 = load i64, ptr %0, align 8
// CHECK-NEXT: %4 = call i64 @"{{.*}}/cl/_testdata/method.T.Add"(i64 %3, i64 %1)
// CHECK-NEXT: ret i64 %4
// CHECK-NEXT: }

// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/method.init"(){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %0 = load i1, ptr @"{{.*}}/cl/_testdata/method.init$guard", align 1
// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1
// CHECK-EMPTY:
// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0
// CHECK-NEXT: store i1 true, ptr @"{{.*}}/cl/_testdata/method.init$guard", align 1
// CHECK-NEXT: store i8 72, ptr @"{{.*}}/cl/_testdata/method.format", align 1
// CHECK-NEXT: store i8 101, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 1), align 1
// CHECK-NEXT: store i8 108, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 2), align 1
// CHECK-NEXT: store i8 108, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 3), align 1
// CHECK-NEXT: store i8 111, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 4), align 1
// CHECK-NEXT: store i8 32, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 5), align 1
// CHECK-NEXT: store i8 37, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 6), align 1
// CHECK-NEXT: store i8 100, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 7), align 1
// CHECK-NEXT: store i8 10, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 8), align 1
// CHECK-NEXT: store i8 0, ptr getelementptr inbounds (i8, ptr @"{{.*}}/cl/_testdata/method.format", i64 9), align 1
// CHECK-NEXT: br label %_llgo_2
// CHECK-EMPTY:
// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0
// CHECK-NEXT: ret void
// CHECK-NEXT: }

// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/method.main"(){{.*}} {
// CHECK-NEXT: _llgo_0:
// CHECK-NEXT: %0 = call i64 @"{{.*}}/cl/_testdata/method.T.Add"(i64 1, i64 2)
// CHECK-NEXT: call void (ptr, ...) @printf(ptr @"{{.*}}/cl/_testdata/method.format", i64 %0)
// CHECK-NEXT: ret void
// CHECK-NEXT: }
Loading
Loading