From 2fce2318ed89dc6b5a61e186f9f5a4fa06ea03cf Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 5 Jun 2024 22:24:51 +0800 Subject: [PATCH] ssa: set method.name to pkg.name if private --- cl/_testdata/vargs/out.ll | 24 +- cl/_testgo/interface/in.go | 27 ++ cl/_testgo/interface/out.ll | 584 ++++++++++++++++++++++++++++++ cl/_testgo/invoke/in.go | 5 +- cl/_testgo/invoke/out.ll | 214 +++++++++++ cl/_testrt/any/out.ll | 41 ++- cl/internal/foo/foo.go | 15 + internal/abi/llgo_autogen.lla | Bin 3631 -> 4157 bytes internal/abi/type.go | 47 ++- internal/runtime/llgo_autogen.lla | Bin 13082 -> 14110 bytes internal/runtime/z_face.go | 56 +++ ssa/abitype.go | 50 ++- ssa/expr.go | 2 - ssa/interface.go | 23 +- 14 files changed, 1056 insertions(+), 32 deletions(-) create mode 100644 cl/_testgo/interface/in.go create mode 100644 cl/_testgo/interface/out.ll diff --git a/cl/_testdata/vargs/out.ll b/cl/_testdata/vargs/out.ll index 1c06f3f1..668d704b 100644 --- a/cl/_testdata/vargs/out.ll +++ b/cl/_testdata/vargs/out.ll @@ -12,6 +12,7 @@ source_filename = "main" @_llgo_int = linkonce global ptr null @0 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @1 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 +@_llgo_string = linkonce global ptr null define void @main.init() { _llgo_0: @@ -123,7 +124,16 @@ _llgo_5: ; preds = %_llgo_2 %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1 store i64 21, ptr %17, align 4 %18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8 - call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.String" %18) + %19 = load ptr, ptr @_llgo_string, align 8 + %20 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/internal/runtime.String" %18, ptr %20, align 8 + %21 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 0 + store ptr %19, ptr %22, align 8 + %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 1 + store ptr %20, ptr %23, align 8 + %24 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, align 8 + call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface" %24) unreachable } @@ -143,6 +153,16 @@ _llgo_1: ; preds = %_llgo_0 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 + %3 = load ptr, ptr @_llgo_string, align 8 + %4 = icmp eq ptr %3, null + br i1 %4, label %_llgo_3, label %_llgo_4 + +_llgo_3: ; preds = %_llgo_2 + %5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + store ptr %5, ptr @_llgo_string, align 8 + br label %_llgo_4 + +_llgo_4: ; preds = %_llgo_3, %_llgo_2 ret void } @@ -150,6 +170,8 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) declare void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + declare void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface") declare i32 @printf(ptr, ...) diff --git a/cl/_testgo/interface/in.go b/cl/_testgo/interface/in.go new file mode 100644 index 00000000..46b026e4 --- /dev/null +++ b/cl/_testgo/interface/in.go @@ -0,0 +1,27 @@ +package main + +import ( + "github.com/goplus/llgo/cl/internal/foo" +) + +type Game1 struct { + *foo.Game +} + +type Game2 struct { +} + +func (p *Game2) initGame() { +} + +func main() { + var g1 any = &Game1{&foo.Game{}} + var g2 any = &Game2{} + v1, ok := g1.(foo.Gamer) + println("OK", v1, ok) + if ok { + v1.Load() + } + v2, ok := g2.(foo.Gamer) + println("FAIL", v2, ok) +} diff --git a/cl/_testgo/interface/out.ll b/cl/_testgo/interface/out.ll new file mode 100644 index 00000000..63c1ea92 --- /dev/null +++ b/cl/_testgo/interface/out.ll @@ -0,0 +1,584 @@ +; ModuleID = 'main' +source_filename = "main" + +%main.Game1 = type { ptr } +%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } +%"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr } +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } +%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } +%"github.com/goplus/llgo/internal/abi.Method" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, ptr, ptr } +%"github.com/goplus/llgo/internal/abi.Imethod" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr } +%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 } + +@"main.init$guard" = global ptr null +@__llgo_argc = global ptr null +@__llgo_argv = global ptr null +@"*_llgo_main.Game1" = linkonce global ptr null +@_llgo_main.Game1 = linkonce global ptr null +@_llgo_int = linkonce global ptr null +@0 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@1 = private unnamed_addr constant [11 x i8] c"main.Game1\00", align 1 +@"*_llgo_main.Game2" = linkonce global ptr null +@_llgo_main.Game2 = linkonce global ptr null +@"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw" = linkonce global ptr null +@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@3 = private unnamed_addr constant [9 x i8] c"initGame\00", align 1 +@4 = private unnamed_addr constant [14 x i8] c"main.initGame\00", align 1 +@"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac" = linkonce global ptr null +@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@6 = private unnamed_addr constant [11 x i8] c"main.Game2\00", align 1 +@"_llgo_github.com/goplus/llgo/cl/internal/foo.Gamer" = linkonce global ptr null +@7 = private unnamed_addr constant [5 x i8] c"Load\00", align 1 +@8 = private unnamed_addr constant [48 x i8] c"github.com/goplus/llgo/cl/internal/foo.initGame\00", align 1 +@9 = private unnamed_addr constant [39 x i8] c"github.com/goplus/llgo/cl/internal/foo\00", align 1 +@10 = private unnamed_addr constant [45 x i8] c"github.com/goplus/llgo/cl/internal/foo.Gamer\00", align 1 +@"main.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg" = global ptr null +@11 = private unnamed_addr constant [5 x i8] c"Load\00", align 1 +@12 = private unnamed_addr constant [48 x i8] c"github.com/goplus/llgo/cl/internal/foo.initGame\00", align 1 +@13 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@14 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@15 = private unnamed_addr constant [3 x i8] c"OK\00", align 1 +@16 = private unnamed_addr constant [5 x i8] c"FAIL\00", align 1 + +define void @main.Game1.Load(%main.Game1 %0) { +_llgo_0: + %1 = alloca %main.Game1, align 8 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %1, i64 8) + store %main.Game1 %0, ptr %2, align 8 + %3 = getelementptr inbounds %main.Game1, ptr %2, i32 0, i32 0 + %4 = load ptr, ptr %3, align 8 + call void @"github.com/goplus/llgo/cl/internal/foo.(*Game).Load"(ptr %4) + ret void +} + +define void @main.Game1.initGame(%main.Game1 %0) { +_llgo_0: + %1 = alloca %main.Game1, align 8 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %1, i64 8) + store %main.Game1 %0, ptr %2, align 8 + %3 = getelementptr inbounds %main.Game1, ptr %2, i32 0, i32 0 + %4 = load ptr, ptr %3, align 8 + call void @"github.com/goplus/llgo/cl/internal/foo.(*Game).initGame"(ptr %4) + ret void +} + +define void @"main.(*Game1).Load"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %main.Game1, ptr %0, i32 0, i32 0 + %2 = load ptr, ptr %1, align 8 + call void @"github.com/goplus/llgo/cl/internal/foo.(*Game).Load"(ptr %2) + ret void +} + +define void @"main.(*Game1).initGame"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %main.Game1, ptr %0, i32 0, i32 0 + %2 = load ptr, ptr %1, align 8 + call void @"github.com/goplus/llgo/cl/internal/foo.(*Game).initGame"(ptr %2) + ret void +} + +define void @"main.(*Game2).initGame"(ptr %0) { +_llgo_0: + ret void +} + +define void @main.init() { +_llgo_0: + %0 = load i1, ptr @"main.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"main.init$guard", align 1 + call void @"github.com/goplus/llgo/cl/internal/foo.init"() + call void @"main.init$after"() + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define i32 @main(i32 %0, ptr %1) { +_llgo_0: + store i32 %0, ptr @__llgo_argc, align 4 + store ptr %1, ptr @__llgo_argv, align 8 + call void @"github.com/goplus/llgo/internal/runtime.init"() + call void @main.init() + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 8) + %3 = getelementptr inbounds %main.Game1, ptr %2, i32 0, i32 0 + %4 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 0) + store ptr %4, ptr %3, align 8 + %5 = load ptr, ptr @"*_llgo_main.Game1", align 8 + %6 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %6, i32 0, i32 0 + store ptr %5, ptr %7, align 8 + %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %6, i32 0, i32 1 + store ptr %2, ptr %8, align 8 + %9 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %6, align 8 + %10 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 0) + %11 = load ptr, ptr @"*_llgo_main.Game2", align 8 + %12 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %12, i32 0, i32 0 + store ptr %11, ptr %13, align 8 + %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %12, i32 0, i32 1 + store ptr %10, ptr %14, align 8 + %15 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %12, align 8 + %16 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %9, 0 + %17 = load ptr, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Gamer", align 8 + %18 = call i1 @"github.com/goplus/llgo/internal/runtime.Implements"(ptr %17, ptr %16) + br i1 %18, label %_llgo_3, label %_llgo_4 + +_llgo_1: ; preds = %_llgo_5 + %19 = call ptr @"github.com/goplus/llgo/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/internal/runtime.iface" %48) + %20 = extractvalue %"github.com/goplus/llgo/internal/runtime.iface" %48, 0 + %21 = getelementptr ptr, ptr %20, i64 3 + %22 = load ptr, ptr %21, align 8 + %23 = alloca { ptr, ptr }, align 8 + %24 = getelementptr inbounds { ptr, ptr }, ptr %23, i32 0, i32 0 + store ptr %22, ptr %24, align 8 + %25 = getelementptr inbounds { ptr, ptr }, ptr %23, i32 0, i32 1 + store ptr %19, ptr %25, align 8 + %26 = load { ptr, ptr }, ptr %23, align 8 + %27 = extractvalue { ptr, ptr } %26, 1 + %28 = extractvalue { ptr, ptr } %26, 0 + call void %28(ptr %27) + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_5 + %29 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %15, 0 + %30 = load ptr, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Gamer", align 8 + %31 = call i1 @"github.com/goplus/llgo/internal/runtime.Implements"(ptr %30, ptr %29) + br i1 %31, label %_llgo_6, label %_llgo_7 + +_llgo_3: ; preds = %_llgo_0 + %32 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %9, 1 + %33 = load ptr, ptr @"main.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg", align 8 + %34 = call ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr %33, ptr %16) + %35 = alloca %"github.com/goplus/llgo/internal/runtime.iface", align 8 + %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %35, i32 0, i32 0 + store ptr %34, ptr %36, align 8 + %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %35, i32 0, i32 1 + store ptr %32, ptr %37, align 8 + %38 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %35, align 8 + %39 = alloca { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, align 8 + %40 = getelementptr inbounds { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %39, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.iface" %38, ptr %40, align 8 + %41 = getelementptr inbounds { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %39, i32 0, i32 1 + store i1 true, ptr %41, align 1 + %42 = load { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %39, align 8 + br label %_llgo_5 + +_llgo_4: ; preds = %_llgo_0 + %43 = alloca { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, align 8 + %44 = getelementptr inbounds { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %43, i32 0, i32 0 + store { ptr, ptr } zeroinitializer, ptr %44, align 8 + %45 = getelementptr inbounds { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %43, i32 0, i32 1 + store i1 false, ptr %45, align 1 + %46 = load { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %43, align 8 + br label %_llgo_5 + +_llgo_5: ; preds = %_llgo_4, %_llgo_3 + %47 = phi { %"github.com/goplus/llgo/internal/runtime.iface", i1 } [ %42, %_llgo_3 ], [ %46, %_llgo_4 ] + %48 = extractvalue { %"github.com/goplus/llgo/internal/runtime.iface", i1 } %47, 0 + %49 = extractvalue { %"github.com/goplus/llgo/internal/runtime.iface", i1 } %47, 1 + %50 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %51 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %50, i32 0, i32 0 + store ptr @15, ptr %51, align 8 + %52 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %50, i32 0, i32 1 + store i64 2, ptr %52, align 4 + %53 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %50, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %53) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface" %48) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %49) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + br i1 %49, label %_llgo_1, label %_llgo_2 + +_llgo_6: ; preds = %_llgo_2 + %54 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %15, 1 + %55 = load ptr, ptr @"main.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg", align 8 + %56 = call ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr %55, ptr %29) + %57 = alloca %"github.com/goplus/llgo/internal/runtime.iface", align 8 + %58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %57, i32 0, i32 0 + store ptr %56, ptr %58, align 8 + %59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %57, i32 0, i32 1 + store ptr %54, ptr %59, align 8 + %60 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %57, align 8 + %61 = alloca { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, align 8 + %62 = getelementptr inbounds { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %61, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.iface" %60, ptr %62, align 8 + %63 = getelementptr inbounds { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %61, i32 0, i32 1 + store i1 true, ptr %63, align 1 + %64 = load { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %61, align 8 + br label %_llgo_8 + +_llgo_7: ; preds = %_llgo_2 + %65 = alloca { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, align 8 + %66 = getelementptr inbounds { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %65, i32 0, i32 0 + store { ptr, ptr } zeroinitializer, ptr %66, align 8 + %67 = getelementptr inbounds { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %65, i32 0, i32 1 + store i1 false, ptr %67, align 1 + %68 = load { %"github.com/goplus/llgo/internal/runtime.iface", i1 }, ptr %65, align 8 + br label %_llgo_8 + +_llgo_8: ; preds = %_llgo_7, %_llgo_6 + %69 = phi { %"github.com/goplus/llgo/internal/runtime.iface", i1 } [ %64, %_llgo_6 ], [ %68, %_llgo_7 ] + %70 = extractvalue { %"github.com/goplus/llgo/internal/runtime.iface", i1 } %69, 0 + %71 = extractvalue { %"github.com/goplus/llgo/internal/runtime.iface", i1 } %69, 1 + %72 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %73 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %72, i32 0, i32 0 + store ptr @16, ptr %73, align 8 + %74 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %72, i32 0, i32 1 + store i64 4, ptr %74, align 4 + %75 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %72, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %75) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface" %70) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %71) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + ret i32 0 +} + +declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) + +declare void @"github.com/goplus/llgo/cl/internal/foo.(*Game).Load"(ptr) + +declare void @"github.com/goplus/llgo/cl/internal/foo.(*Game).initGame"(ptr) + +declare void @"github.com/goplus/llgo/cl/internal/foo.init"() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) + +define void @"main.init$after"() { +_llgo_0: + %0 = load ptr, ptr @_llgo_main.Game1, align 8 + %1 = icmp eq ptr %0, null + br i1 %1, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 2, i64 0, i64 0) + store ptr %2, ptr @_llgo_main.Game1, align 8 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + %3 = load ptr, ptr @_llgo_int, align 8 + %4 = icmp eq ptr %3, null + br i1 %4, label %_llgo_3, label %_llgo_4 + +_llgo_3: ; preds = %_llgo_2 + %5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + store ptr %5, ptr @_llgo_int, align 8 + br label %_llgo_4 + +_llgo_4: ; preds = %_llgo_3, %_llgo_2 + %6 = load ptr, ptr @_llgo_int, align 8 + br i1 %1, label %_llgo_5, label %_llgo_6 + +_llgo_5: ; preds = %_llgo_4 + %7 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 0 + store ptr @0, ptr %8, align 8 + %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 1 + store i64 4, ptr %9, align 4 + %10 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %7, align 8 + %11 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i32 0, i32 0 + store ptr @1, ptr %12, align 8 + %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i32 0, i32 1 + store i64 10, ptr %13, align 4 + %14 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %11, align 8 + call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %2, %"github.com/goplus/llgo/internal/runtime.String" %10, %"github.com/goplus/llgo/internal/runtime.String" %14, ptr %6, { ptr, i64, i64 } zeroinitializer, { ptr, i64, i64 } zeroinitializer) + br label %_llgo_6 + +_llgo_6: ; preds = %_llgo_5, %_llgo_4 + %15 = load ptr, ptr @_llgo_main.Game1, align 8 + %16 = load ptr, ptr @"*_llgo_main.Game1", align 8 + %17 = icmp eq ptr %16, null + br i1 %17, label %_llgo_7, label %_llgo_8 + +_llgo_7: ; preds = %_llgo_6 + %18 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %15) + store ptr %18, ptr @"*_llgo_main.Game1", align 8 + br label %_llgo_8 + +_llgo_8: ; preds = %_llgo_7, %_llgo_6 + %19 = load ptr, ptr @_llgo_main.Game2, align 8 + %20 = icmp eq ptr %19, null + br i1 %20, label %_llgo_9, label %_llgo_10 + +_llgo_9: ; preds = %_llgo_8 + %21 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 0, i64 1) + store ptr %21, ptr @_llgo_main.Game2, align 8 + br label %_llgo_10 + +_llgo_10: ; preds = %_llgo_9, %_llgo_8 + %22 = load ptr, ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", align 8 + %23 = icmp eq ptr %22, null + br i1 %23, label %_llgo_11, label %_llgo_12 + +_llgo_11: ; preds = %_llgo_10 + %24 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %24, i32 0, i32 0 + store ptr @2, ptr %25, align 8 + %26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %24, i32 0, i32 1 + store i64 4, ptr %26, align 4 + %27 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %24, align 8 + %28 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) + %29 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 0 + store ptr %28, ptr %30, align 8 + %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 1 + store i64 0, ptr %31, align 4 + %32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 2 + store i64 0, ptr %32, align 4 + %33 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, align 8 + %34 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %27, i64 0, %"github.com/goplus/llgo/internal/runtime.Slice" %33) + store ptr %34, ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", align 8 + br label %_llgo_12 + +_llgo_12: ; preds = %_llgo_11, %_llgo_10 + %35 = load ptr, ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", align 8 + br i1 %20, label %_llgo_13, label %_llgo_14 + +_llgo_13: ; preds = %_llgo_12 + %36 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %36, i32 0, i32 0 + store ptr @3, ptr %37, align 8 + %38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %36, i32 0, i32 1 + store i64 8, ptr %38, align 4 + %39 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %36, align 8 + %40 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %40, i32 0, i32 0 + store ptr @4, ptr %41, align 8 + %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %40, i32 0, i32 1 + store i64 13, ptr %42, align 4 + %43 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %40, align 8 + %44 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %45 = icmp eq ptr %44, null + br i1 %45, label %_llgo_15, label %_llgo_16 + +_llgo_14: ; preds = %_llgo_16, %_llgo_12 + %46 = load ptr, ptr @_llgo_main.Game2, align 8 + %47 = load ptr, ptr @"*_llgo_main.Game2", align 8 + %48 = icmp eq ptr %47, null + br i1 %48, label %_llgo_17, label %_llgo_18 + +_llgo_15: ; preds = %_llgo_13 + %49 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) + %50 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %51 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %50, i32 0, i32 0 + store ptr %49, ptr %51, align 8 + %52 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %50, i32 0, i32 1 + store i64 0, ptr %52, align 4 + %53 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %50, i32 0, i32 2 + store i64 0, ptr %53, align 4 + %54 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %50, align 8 + %55 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) + %56 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %57 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %56, i32 0, i32 0 + store ptr %55, ptr %57, align 8 + %58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %56, i32 0, i32 1 + store i64 0, ptr %58, align 4 + %59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %56, i32 0, i32 2 + store i64 0, ptr %59, align 4 + %60 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %56, align 8 + %61 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %54, %"github.com/goplus/llgo/internal/runtime.Slice" %60, i1 false) + store ptr %61, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + br label %_llgo_16 + +_llgo_16: ; preds = %_llgo_15, %_llgo_13 + %62 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %63 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8 + %64 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %63, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %43, ptr %64, align 8 + %65 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %63, i32 0, i32 1 + store ptr %62, ptr %65, align 8 + %66 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %63, i32 0, i32 2 + store ptr @"main.(*Game2).initGame", ptr %66, align 8 + %67 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %63, i32 0, i32 3 + store ptr @"main.(*Game2).initGame", ptr %67, align 8 + %68 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %63, align 8 + %69 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40) + %70 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %69, i64 0 + store %"github.com/goplus/llgo/internal/abi.Method" %68, ptr %70, align 8 + %71 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %72 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %71, i32 0, i32 0 + store ptr %69, ptr %72, align 8 + %73 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %71, i32 0, i32 1 + store i64 1, ptr %73, align 4 + %74 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %71, i32 0, i32 2 + store i64 1, ptr %74, align 4 + %75 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %71, align 8 + %76 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %76, i32 0, i32 0 + store ptr @5, ptr %77, align 8 + %78 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %76, i32 0, i32 1 + store i64 4, ptr %78, align 4 + %79 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %76, align 8 + %80 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %81 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %80, i32 0, i32 0 + store ptr @6, ptr %81, align 8 + %82 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %80, i32 0, i32 1 + store i64 10, ptr %82, align 4 + %83 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %80, align 8 + call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %21, %"github.com/goplus/llgo/internal/runtime.String" %79, %"github.com/goplus/llgo/internal/runtime.String" %83, ptr %35, { ptr, i64, i64 } zeroinitializer, %"github.com/goplus/llgo/internal/runtime.Slice" %75) + br label %_llgo_14 + +_llgo_17: ; preds = %_llgo_14 + %84 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %46) + store ptr %84, ptr @"*_llgo_main.Game2", align 8 + br label %_llgo_18 + +_llgo_18: ; preds = %_llgo_17, %_llgo_14 + %85 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %86 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %87 = load ptr, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Gamer", align 8 + %88 = icmp eq ptr %87, null + br i1 %88, label %_llgo_19, label %_llgo_20 + +_llgo_19: ; preds = %_llgo_18 + %89 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %89, i32 0, i32 0 + store ptr @7, ptr %90, align 8 + %91 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %89, i32 0, i32 1 + store i64 4, ptr %91, align 4 + %92 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %89, align 8 + %93 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8 + %94 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %93, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %92, ptr %94, align 8 + %95 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %93, i32 0, i32 1 + store ptr %85, ptr %95, align 8 + %96 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %93, align 8 + %97 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %98 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %97, i32 0, i32 0 + store ptr @8, ptr %98, align 8 + %99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %97, i32 0, i32 1 + store i64 47, ptr %99, align 4 + %100 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %97, align 8 + %101 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8 + %102 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %101, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %100, ptr %102, align 8 + %103 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %101, i32 0, i32 1 + store ptr %86, ptr %103, align 8 + %104 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %101, align 8 + %105 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48) + %106 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %105, i64 0 + store %"github.com/goplus/llgo/internal/abi.Imethod" %96, ptr %106, align 8 + %107 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %105, i64 1 + store %"github.com/goplus/llgo/internal/abi.Imethod" %104, ptr %107, align 8 + %108 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %109 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %108, i32 0, i32 0 + store ptr %105, ptr %109, align 8 + %110 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %108, i32 0, i32 1 + store i64 2, ptr %110, align 4 + %111 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %108, i32 0, i32 2 + store i64 2, ptr %111, align 4 + %112 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %108, align 8 + %113 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %114 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %113, i32 0, i32 0 + store ptr @9, ptr %114, align 8 + %115 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %113, i32 0, i32 1 + store i64 38, ptr %115, align 4 + %116 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %113, align 8 + %117 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %118 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %117, i32 0, i32 0 + store ptr @10, ptr %118, align 8 + %119 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %117, i32 0, i32 1 + store i64 44, ptr %119, align 4 + %120 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %117, align 8 + %121 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %116, %"github.com/goplus/llgo/internal/runtime.String" %120, %"github.com/goplus/llgo/internal/runtime.Slice" %112) + store ptr %121, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Gamer", align 8 + br label %_llgo_20 + +_llgo_20: ; preds = %_llgo_19, %_llgo_18 + %122 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %123 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %124 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %125 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %124, i32 0, i32 0 + store ptr @11, ptr %125, align 8 + %126 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %124, i32 0, i32 1 + store i64 4, ptr %126, align 4 + %127 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %124, align 8 + %128 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8 + %129 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %128, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %127, ptr %129, align 8 + %130 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %128, i32 0, i32 1 + store ptr %122, ptr %130, align 8 + %131 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %128, align 8 + %132 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %133 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %132, i32 0, i32 0 + store ptr @12, ptr %133, align 8 + %134 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %132, i32 0, i32 1 + store i64 47, ptr %134, align 4 + %135 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %132, align 8 + %136 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8 + %137 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %136, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %135, ptr %137, align 8 + %138 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %136, i32 0, i32 1 + store ptr %123, ptr %138, align 8 + %139 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %136, align 8 + %140 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48) + %141 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %140, i64 0 + store %"github.com/goplus/llgo/internal/abi.Imethod" %131, ptr %141, align 8 + %142 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %140, i64 1 + store %"github.com/goplus/llgo/internal/abi.Imethod" %139, ptr %142, align 8 + %143 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %144 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %143, i32 0, i32 0 + store ptr %140, ptr %144, align 8 + %145 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %143, i32 0, i32 1 + store i64 2, ptr %145, align 4 + %146 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %143, i32 0, i32 2 + store i64 2, ptr %146, align 4 + %147 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %143, align 8 + %148 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %149 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %148, i32 0, i32 0 + store ptr @13, ptr %149, align 8 + %150 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %148, i32 0, i32 1 + store i64 4, ptr %150, align 4 + %151 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %148, align 8 + %152 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %153 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %152, i32 0, i32 0 + store ptr @14, ptr %153, align 8 + %154 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %152, i32 0, i32 1 + store i64 0, ptr %154, align 4 + %155 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %152, align 8 + %156 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %151, %"github.com/goplus/llgo/internal/runtime.String" %155, %"github.com/goplus/llgo/internal/runtime.Slice" %147) + store ptr %156, ptr @"main.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg", align 8 + ret void +} + +declare ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64, i64, i64) + +declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) + +declare void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice") + +declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) + +declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice") + +declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1) + +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + +declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1) + +declare ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.Slice") + +declare i1 @"github.com/goplus/llgo/internal/runtime.Implements"(ptr, ptr) + +declare ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr, ptr) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) + +declare ptr @"github.com/goplus/llgo/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/internal/runtime.iface") diff --git a/cl/_testgo/invoke/in.go b/cl/_testgo/invoke/in.go index a6716183..d4f9e93a 100644 --- a/cl/_testgo/invoke/in.go +++ b/cl/_testgo/invoke/in.go @@ -53,7 +53,10 @@ func main() { println(i, m) m = &t invoke(m) - // panic + var a any = T{"world"} + invoke(a.(I)) + invoke(a.(interface{}).(interface{ Invoke() int })) + //panic invoke(nil) } diff --git a/cl/_testgo/invoke/out.ll b/cl/_testgo/invoke/out.ll index 3397cae1..12c97a0c 100644 --- a/cl/_testgo/invoke/out.ll +++ b/cl/_testgo/invoke/out.ll @@ -5,6 +5,7 @@ source_filename = "main" %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } %"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr } %"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, { ptr, ptr }, ptr, %"github.com/goplus/llgo/internal/runtime.String", ptr } +%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } %"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 } %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } %"github.com/goplus/llgo/internal/abi.Method" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, ptr, ptr } @@ -58,6 +59,17 @@ source_filename = "main" @25 = private unnamed_addr constant [7 x i8] c"Method\00", align 1 @26 = private unnamed_addr constant [5 x i8] c"main\00", align 1 @27 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@28 = private unnamed_addr constant [6 x i8] c"world\00", align 1 +@_llgo_main.I = linkonce global ptr null +@29 = private unnamed_addr constant [7 x i8] c"Invoke\00", align 1 +@30 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@31 = private unnamed_addr constant [7 x i8] c"main.I\00", align 1 +@32 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 +@_llgo_any = linkonce global ptr null +@33 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@34 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@35 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 +@36 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 define i64 @main.T.Invoke(%main.T %0) { _llgo_0: @@ -326,8 +338,129 @@ _llgo_0: store ptr %88, ptr %93, align 8 %94 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %91, align 8 call void @main.invoke(%"github.com/goplus/llgo/internal/runtime.iface" %94) + %95 = alloca %main.T, align 8 + %96 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %95, i64 16) + %97 = getelementptr inbounds %main.T, ptr %96, i32 0, i32 0 + %98 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %98, i32 0, i32 0 + store ptr @28, ptr %99, align 8 + %100 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %98, i32 0, i32 1 + store i64 5, ptr %100, align 4 + %101 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %98, align 8 + store %"github.com/goplus/llgo/internal/runtime.String" %101, ptr %97, align 8 + %102 = load %main.T, ptr %96, align 8 + %103 = load ptr, ptr @_llgo_main.T, align 8 + %104 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %main.T %102, ptr %104, align 8 + %105 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %106 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %105, i32 0, i32 0 + store ptr %103, ptr %106, align 8 + %107 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %105, i32 0, i32 1 + store ptr %104, ptr %107, align 8 + %108 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %105, align 8 + %109 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %108, 0 + %110 = load ptr, ptr @_llgo_main.I, align 8 + %111 = call i1 @"github.com/goplus/llgo/internal/runtime.Implements"(ptr %110, ptr %109) + br i1 %111, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %112 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %108, 1 + %113 = load ptr, ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", align 8 + %114 = call ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr %113, ptr %109) + %115 = alloca %"github.com/goplus/llgo/internal/runtime.iface", align 8 + %116 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %115, i32 0, i32 0 + store ptr %114, ptr %116, align 8 + %117 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %115, i32 0, i32 1 + store ptr %112, ptr %117, align 8 + %118 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %115, align 8 + call void @main.invoke(%"github.com/goplus/llgo/internal/runtime.iface" %118) + %119 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %108, 0 + %120 = load ptr, ptr @_llgo_any, align 8 + br i1 true, label %_llgo_3, label %_llgo_4 + +_llgo_2: ; preds = %_llgo_0 + %121 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %122 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %121, i32 0, i32 0 + store ptr @32, ptr %122, align 8 + %123 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %121, i32 0, i32 1 + store i64 21, ptr %123, align 4 + %124 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %121, align 8 + %125 = load ptr, ptr @_llgo_string, align 8 + %126 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/internal/runtime.String" %124, ptr %126, align 8 + %127 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %128 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %127, i32 0, i32 0 + store ptr %125, ptr %128, align 8 + %129 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %127, i32 0, i32 1 + store ptr %126, ptr %129, align 8 + %130 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %127, align 8 + call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface" %130) + unreachable + +_llgo_3: ; preds = %_llgo_1 + %131 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %108, 1 + %132 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %133 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %132, i32 0, i32 0 + store ptr %119, ptr %133, align 8 + %134 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %132, i32 0, i32 1 + store ptr %131, ptr %134, align 8 + %135 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %132, align 8 + %136 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %135, 0 + %137 = load ptr, ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", align 8 + %138 = call i1 @"github.com/goplus/llgo/internal/runtime.Implements"(ptr %137, ptr %136) + br i1 %138, label %_llgo_5, label %_llgo_6 + +_llgo_4: ; preds = %_llgo_1 + %139 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %140 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %139, i32 0, i32 0 + store ptr @35, ptr %140, align 8 + %141 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %139, i32 0, i32 1 + store i64 21, ptr %141, align 4 + %142 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %139, align 8 + %143 = load ptr, ptr @_llgo_string, align 8 + %144 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/internal/runtime.String" %142, ptr %144, align 8 + %145 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %146 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %145, i32 0, i32 0 + store ptr %143, ptr %146, align 8 + %147 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %145, i32 0, i32 1 + store ptr %144, ptr %147, align 8 + %148 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %145, align 8 + call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface" %148) + unreachable + +_llgo_5: ; preds = %_llgo_3 + %149 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %135, 1 + %150 = load ptr, ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", align 8 + %151 = call ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr %150, ptr %136) + %152 = alloca %"github.com/goplus/llgo/internal/runtime.iface", align 8 + %153 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %152, i32 0, i32 0 + store ptr %151, ptr %153, align 8 + %154 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %152, i32 0, i32 1 + store ptr %149, ptr %154, align 8 + %155 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %152, align 8 + call void @main.invoke(%"github.com/goplus/llgo/internal/runtime.iface" %155) call void @main.invoke(%"github.com/goplus/llgo/internal/runtime.iface" zeroinitializer) ret i32 0 + +_llgo_6: ; preds = %_llgo_3 + %156 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %157 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %156, i32 0, i32 0 + store ptr @36, ptr %157, align 8 + %158 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %156, i32 0, i32 1 + store i64 21, ptr %158, align 4 + %159 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %156, align 8 + %160 = load ptr, ptr @_llgo_string, align 8 + %161 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/internal/runtime.String" %159, ptr %161, align 8 + %162 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %163 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %162, i32 0, i32 0 + store ptr %160, ptr %163, align 8 + %164 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %162, i32 0, i32 1 + store ptr %161, ptr %164, align 8 + %165 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %162, align 8 + call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface" %165) + unreachable } declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) @@ -945,6 +1078,83 @@ _llgo_39: ; preds = %_llgo_38 br label %_llgo_40 _llgo_40: ; preds = %_llgo_39, %_llgo_38 + %317 = load ptr, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", align 8 + %318 = load ptr, ptr @_llgo_main.I, align 8 + %319 = icmp eq ptr %318, null + br i1 %319, label %_llgo_41, label %_llgo_42 + +_llgo_41: ; preds = %_llgo_40 + %320 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %321 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %320, i32 0, i32 0 + store ptr @29, ptr %321, align 8 + %322 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %320, i32 0, i32 1 + store i64 6, ptr %322, align 4 + %323 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %320, align 8 + %324 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8 + %325 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %324, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %323, ptr %325, align 8 + %326 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %324, i32 0, i32 1 + store ptr %317, ptr %326, align 8 + %327 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %324, align 8 + %328 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) + %329 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %328, i64 0 + store %"github.com/goplus/llgo/internal/abi.Imethod" %327, ptr %329, align 8 + %330 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %331 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %330, i32 0, i32 0 + store ptr %328, ptr %331, align 8 + %332 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %330, i32 0, i32 1 + store i64 1, ptr %332, align 4 + %333 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %330, i32 0, i32 2 + store i64 1, ptr %333, align 4 + %334 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %330, align 8 + %335 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %336 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %335, i32 0, i32 0 + store ptr @30, ptr %336, align 8 + %337 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %335, i32 0, i32 1 + store i64 4, ptr %337, align 4 + %338 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %335, align 8 + %339 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %340 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %339, i32 0, i32 0 + store ptr @31, ptr %340, align 8 + %341 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %339, i32 0, i32 1 + store i64 6, ptr %341, align 4 + %342 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %339, align 8 + %343 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %338, %"github.com/goplus/llgo/internal/runtime.String" %342, %"github.com/goplus/llgo/internal/runtime.Slice" %334) + store ptr %343, ptr @_llgo_main.I, align 8 + br label %_llgo_42 + +_llgo_42: ; preds = %_llgo_41, %_llgo_40 + %344 = load ptr, ptr @_llgo_any, align 8 + %345 = icmp eq ptr %344, null + br i1 %345, label %_llgo_43, label %_llgo_44 + +_llgo_43: ; preds = %_llgo_42 + %346 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) + %347 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %348 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %347, i32 0, i32 0 + store ptr %346, ptr %348, align 8 + %349 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %347, i32 0, i32 1 + store i64 0, ptr %349, align 4 + %350 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %347, i32 0, i32 2 + store i64 0, ptr %350, align 4 + %351 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %347, align 8 + %352 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %353 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %352, i32 0, i32 0 + store ptr @33, ptr %353, align 8 + %354 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %352, i32 0, i32 1 + store i64 4, ptr %354, align 4 + %355 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %352, align 8 + %356 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %357 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %356, i32 0, i32 0 + store ptr @34, ptr %357, align 8 + %358 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %356, i32 0, i32 1 + store i64 0, ptr %358, align 4 + %359 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %356, align 8 + %360 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %355, %"github.com/goplus/llgo/internal/runtime.String" %359, %"github.com/goplus/llgo/internal/runtime.Slice" %351) + store ptr %360, ptr @_llgo_any, align 8 + br label %_llgo_44 + +_llgo_44: ; preds = %_llgo_43, %_llgo_42 ret void } @@ -971,3 +1181,7 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) declare ptr @"github.com/goplus/llgo/internal/runtime.IfaceType"(%"github.com/goplus/llgo/internal/runtime.iface") declare void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface") + +declare i1 @"github.com/goplus/llgo/internal/runtime.Implements"(ptr, ptr) + +declare void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface") diff --git a/cl/_testrt/any/out.ll b/cl/_testrt/any/out.ll index ff63980b..b55c4afc 100644 --- a/cl/_testrt/any/out.ll +++ b/cl/_testrt/any/out.ll @@ -9,6 +9,7 @@ source_filename = "main" @"*_llgo_int8" = linkonce global ptr null @_llgo_int8 = linkonce global ptr null @0 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 +@_llgo_string = linkonce global ptr null @_llgo_int = linkonce global ptr null @1 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 @__llgo_argc = global ptr null @@ -34,7 +35,16 @@ _llgo_2: ; preds = %_llgo_0 %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1 store i64 21, ptr %7, align 4 %8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8 - call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.String" %8) + %9 = load ptr, ptr @_llgo_string, align 8 + %10 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/internal/runtime.String" %8, ptr %10, align 8 + %11 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %11, i32 0, i32 0 + store ptr %9, ptr %12, align 8 + %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %11, i32 0, i32 1 + store ptr %10, ptr %13, align 8 + %14 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %11, align 8 + call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface" %14) unreachable } @@ -58,7 +68,16 @@ _llgo_2: ; preds = %_llgo_0 %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 1 store i64 21, ptr %9, align 4 %10 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %7, align 8 - call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.String" %10) + %11 = load ptr, ptr @_llgo_string, align 8 + %12 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/internal/runtime.String" %10, ptr %12, align 8 + %13 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %13, i32 0, i32 0 + store ptr %11, ptr %14, align 8 + %15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %13, i32 0, i32 1 + store ptr %12, ptr %15, align 8 + %16 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %13, align 8 + call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface" %16) unreachable } @@ -129,16 +148,26 @@ _llgo_3: ; preds = %_llgo_2 br label %_llgo_4 _llgo_4: ; preds = %_llgo_3, %_llgo_2 - %7 = load ptr, ptr @_llgo_int, align 8 + %7 = load ptr, ptr @_llgo_string, align 8 %8 = icmp eq ptr %7, null br i1 %8, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %9 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - store ptr %9, ptr @_llgo_int, align 8 + %9 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + store ptr %9, ptr @_llgo_string, align 8 br label %_llgo_6 _llgo_6: ; preds = %_llgo_5, %_llgo_4 + %10 = load ptr, ptr @_llgo_int, align 8 + %11 = icmp eq ptr %10, null + br i1 %11, label %_llgo_7, label %_llgo_8 + +_llgo_7: ; preds = %_llgo_6 + %12 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + store ptr %12, ptr @_llgo_int, align 8 + br label %_llgo_8 + +_llgo_8: ; preds = %_llgo_7, %_llgo_6 ret void } @@ -146,6 +175,8 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + declare void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface") declare void @"github.com/goplus/llgo/internal/runtime.init"() diff --git a/cl/internal/foo/foo.go b/cl/internal/foo/foo.go index 0c4e7d33..c3a4cd4e 100644 --- a/cl/internal/foo/foo.go +++ b/cl/internal/foo/foo.go @@ -16,3 +16,18 @@ type Foo struct { func (v Foo) Pb() *byte { return v.pb } + +type Gamer interface { + initGame() + Load() +} + +type Game struct { +} + +func (g *Game) initGame() { +} + +func (g *Game) Load() { + println("load") +} diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index 55b792624dca0ee630e76101c83d9f5f5dd0bb6e..17d02dd30d22212f4f65297c12ed42a56a1d182f 100644 GIT binary patch delta 4132 zcmV+<5Zmvs9K9faP)h>@6aWAK2mtM}#aK3`PZ)_0007|t0RRsG8~|)=XK!C&b#!lM zWo|BPY*kbV00Z81U}oTSU}klA3jhHG^#K3?1QY-O0PS6CZ`(!|{jOg@I5ipJIAZ>wQ*F~`1-7nc7pe05oN>eUHW!(h%?@JEFnch{HQbr)^cFQRCrU!oLo`9jsTI zWFCC@7)C+t-v-%nCoPUU84OO_eDC~KlK6l9>#w`uBs+7O{dT@M?T(}e4V}9*+5QNp zW9Mtj%Su;&%nluHe|T>8l~q`f#Q&w0@Ofxa~q^LtA!FK+LMP~Fn{sUp9hvy zQOXF>MK02ne`m%;&>vN6W_C`d)cV^CWk#z*L7J9-SALr&9pPwwDXJ)I7fX}PJpDBc zA``GuJJmQiB#Htbi`(I zGB~B#Vv*TABg&Gou#FbYRi9DJ0ik8{lx5?&D_XX(vTQ8%LyI<17OjltXvwC^l2sEY zw0tvvT+nC|Yw)twVPPDm-z+zNLSyhUT3!1QjpFepiUu!7*_(Gs_{mQLXA|cY;o^h8 zSR~GT6|Yl2PMvqIbDw2Y@16O{cmExYGI{+dT*eL=yd;kwOgwgUdVW7&W$xPfn=_J5 z_!!0ktqIy;{QNuSI?m2t<)=A$o( zI&;1ZKI8{{82vDCoYNe!Wsn9@a2v#F{+%$s&c?D>Yxt<*5=EdZf8`g+(VY8Hq%?xM z@Z>BzSrVl5G^g(1D?=v#SO*yxhGY zHm=$Tj9VB>{Ca_q`V5lfH*R0mgy29yY8r%bYx{c`FZuzHx}6EK8@I4B+3f{1>T{U=Htj%DEY8v1*-T2 zgwO>acJ@H(J&ul@at{j;uG-@`L5n@Cg|({n^icUnaHwvFOK#fVpvzyZE$zShR!a^>Tc`RWBBtmQ}AFGQVVlK2Tf)(M|gq3tRx!*?_nJ0UToM>hLlJfy->%O%;zdcbe*L(QtL`@2<= z2Dr4XyyNv@*eNWUx5DO77bsqoC@Z?h$X};FuhNs}I`QPJR2|h)@MqzFP&55~PXs-U zt)vA^tNH&1r;WLL*+S7Xf@slqX#+dEZ4>p*%uGD7f1k1|Sq>GnuSfm=Qn zU;^}gB#fZV9}5T>?*K`E_*iHIS#V0AUXY9xx*=p?K0&%d5>9qnLl(fo^@k+HpiLqR z_Gi3PB;kW>7g>PEbk9ga2i-WbU}^jB9!Z#D$s$!ikGzj0VGnI4Sul6w9VHnbd|Sza z$%A@J5?1gAlLe&AcbVR-d5=TG&KpszusS*?E$A5v6m1)?-2ApwzIyMwK0FxXHpa%4 z#@MukX%o>V*mN??$zKN3RD#8mUXM$d+^#Tf+c_WoXdRR%^}3vtj&CN7?=&0V<#rl0 z4`kfsni)Le)i1JtPwsBQd|dB}k@3%+_rvVX(;0imbKVPGtqaW{xJ`l36d~VT?jXoP zjtZO>R6wRLgdjr)Oa(%rX-NWV*^&i%3u;gxVvFO0rnI0l2SR2sZ0yijP=Ig*7DEY2 zT|sTjIBCT&LDE%FNK6w|3=uR%1+}96lT!>wC@rM`;*k@7QVee>6$LeA<0KTv1W!Lf z%^5^IF?`^Z6BHf9lIAO03u~{Q*40{DS9@h+S?%5w`n3A*Y4xA=Rkc@^7S%pk)st2A z!K!rE)V?jA6ojVA-?9f19RyX*QGrwC3dr<@Dre|`sd6YZ0IHnfVu31$8We~s=lGzh za_G!~P~{AN8#`1v6d)W`&QO9<ym?J2PJQ z3b-IEUob4DYhM8sboC3isQuT!0+!GUSP94@uYm>3p;a*0tc};fA};t!7;M_0T3Emc zUJZj0LM$CCP^bCs+4(QG*TG@|Tt6mUtr?Q)IHh6MI37_7uGXh3vdIk(oOMXTd9q6WAXl#t{*d-!k zgSrAc9~5^bq68>P{Na0V2mKEJ8ZBAyCIR- ztBWS~ijp(y;6A0BF1b#+$_FUgkf%926xf08$NjmJuQ;~Fn-j#bpSXLk3vPKL})rO}$%^O2}EXJ6pE$Z@Wfsn5)R zesA=dO_Qzzd-ws}Yjmy8_Pgc98ORkxc0qU4*%Rq{2L~^`()%Wr6gh0qJow(#%jVyHBEN6Vjf5 zw2bV99DznG@@xTA-PCt8>zWEVT`T3{6rmpOVzaxnApPard$hu|2hP zgw39hn6~v1<+DRGZFwwV{#-f^ufcKXZc5OK67NfyV|bHnWSQet%A9Pla+xE4Y0v1k z)^s=SE^ezuD*)=S$ZAXcf-os^Pg5>~ycAt>QS5ip z(X28k!ki_->Z?b*_Vsq?%lQj`jl-rLntg;AbFl?ofizp!Opg~S&|IwPzbQ`5dc*k4+I?2C-Lqeohx z$BAzP4G+?QpGcw-*|i`W9-XtO%`>+RfUdzlMy+Esk@^_2zp3>xh><=9A!d3;n`d4d z2pL~Q6hh1nwNIMnpg_uzNv-uGzrmLuC4cAsmnv1 zi)$dFOk05H@>Z%sNZFxzw<)Al8bESLskM3qr7A>~T_75WDzi2qYOe6kd-Uz;)iN*K zt`6JY+*xc)zJ?Vz;#D758YA4`JC!RPx2$y7)X4m7UhW7pLk^XH*s?}hN1uaa6~1|Jv_>0Bs zn_&J2zgK=(c@Hm1U~I#kY+R#@utO}`8&BE&a0H-kBJ7QUI>^cwALfw{v#iGihNIzuaA+> zeTsZX8u>_%A|H8*d{X2yFawF!40Pq_m(P&wylLjU%SM{u*z(DdNx+_kcS=f6nSDK7 z(b+$$JeS2BInusR?N9c9&2r->ixaV(wvDJVMOb6I zj78L~vm;KLYyvX_Xpa4z!figKs#!p;H?4Mlmq#%+W@wd%aOs?M$g{BZ=9;hUY(Ue@ zjcVi4yx8T&k6f;k^2S4czNST+om!XGnL*vc-AzcZ@Q&uG<)_a3Vg8QC-XYF=<}&i! zcD)Q37(#M?E7SKfXX+YhV0vX5XJ9r}Z);meX=PY6ina85<=J1Y*FloLi5J2BKmB+a zoIIy@#+^Nq7_t=u+o*LqE_1l*f`W_6f&zZK*mgN%mVAw;gWY$F)yoa;7mn)LgCEGFp1kOnR~}@$-x8tt;h^=d>!U!6m6P8;gGPdW#-Z z6hc}ak(XoC6S9cNN|S9ON28vpOp!*&1A-?H@bvfP+19As1M~?q?i0Ly`UF>#;MtQ` z&|P$YU0+Rz-a@DC`bD-P+we|Cq<$4oJ;7_*Zpf`{hoyUybfZS#+y3@hE9$GcWxU+V z22&W3__gORQ_9DTB z^I>oDufR8vJ}%`nVTSW+(A_!ute8&sW9{~TWL@=v+%WsN)WMO$#TE26-F?=Gy638* zwcBUmw&ZBiA#{U|J}c1T&L?h%-3d&3Pv~v;eb#lS9SU&%6MjE>pLL?{Kqa^uJ?K30 z6O0QrvA>B1^?Rl@s&4D$hQ;0(^&f&T29`bO4b6V@MI8VC0Z>Z;0v-bt000080PV63 i#aK3`PZ)_0007|t0h8YiCj#DdlL!tW2GS1z0000K+}v~k delta 3606 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 0 && s[i] != '.' { + i-- + } + return i +} + // ----------------------------------------------------------------------------- diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index f66c4e86e50a1b106af492f9408d82e2308c39ab..4cb3ec4a802fd13d1e6599900d61d0bf4a2dad02 100644 GIT binary patch literal 14110 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 W3jz5*>7f4|_5W=Be*_E&$o~h|&Q>h| diff --git a/internal/runtime/z_face.go b/internal/runtime/z_face.go index ca546843..ea464e91 100644 --- a/internal/runtime/z_face.go +++ b/internal/runtime/z_face.go @@ -266,4 +266,60 @@ func IfacePtrData(i iface) unsafe.Pointer { return i.data } +// Implements reports whether the type V implements the interface type T. +func Implements(T, V *abi.Type) bool { + if T.Kind() != abi.Interface { + return false + } + t := (*abi.InterfaceType)(unsafe.Pointer(T)) + + if len(t.Methods) == 0 { + return true + } + + // The same algorithm applies in both cases, but the + // method tables for an interface type and a concrete type + // are different, so the code is duplicated. + // In both cases the algorithm is a linear scan over the two + // lists - T's methods and V's methods - simultaneously. + // Since method tables are stored in a unique sorted order + // (alphabetical, with no duplicate method names), the scan + // through V's methods must hit a match for each of T's + // methods along the way, or else V does not implement T. + // This lets us run the scan in overall linear time instead of + // the quadratic time a naive search would require. + // See also ../runtime/iface.go. + if V.Kind() == abi.Interface { + v := (*abi.InterfaceType)(unsafe.Pointer(V)) + i := 0 + for j := 0; j < len(v.Methods); j++ { + tm := &t.Methods[i] + vm := &v.Methods[j] + if vm.Name_ == tm.Name_ && vm.Typ_ == tm.Typ_ { + if i++; i >= len(t.Methods) { + return true + } + } + } + return false + } + + v := V.Uncommon() + if v == nil { + return false + } + i := 0 + vmethods := v.Methods() + for j := 0; j < int(v.Mcount); j++ { + tm := &t.Methods[i] + vm := vmethods[j] + if vm.Name_ == tm.Name_ && vm.Mtyp_ == tm.Typ_ { + if i++; i >= len(t.Methods) { + return true + } + } + } + return false +} + // ----------------------------------------------------------------------------- diff --git a/ssa/abitype.go b/ssa/abitype.go index 309f58da..e41fda58 100644 --- a/ssa/abitype.go +++ b/ssa/abitype.go @@ -22,6 +22,7 @@ import ( "github.com/goplus/llgo/ssa/abi" "github.com/goplus/llvm" + "golang.org/x/tools/go/types/typeutil" ) // ----------------------------------------------------------------------------- @@ -54,9 +55,13 @@ func (b Builder) abiTypeOf(t types.Type) func() Expr { case *types.Struct: return b.abiStructOf(t) case *types.Named: + if iface, ok := t.Underlying().(*types.Interface); ok { + obj := t.Obj() + return b.abiInterfaceOf(abi.PathOf(obj.Pkg()), abi.TypeName(obj), iface) + } return b.abiNamedOf(t) case *types.Interface: - return b.abiInterfaceOf("", t) + return b.abiInterfaceOf("", "", t) case *types.Signature: return b.abiFuncOf(t) case *types.Slice: @@ -100,15 +105,14 @@ func (b Builder) abiImethodOf(mName string, typ Expr) Expr { return b.aggregateValue(prog.rtType("Imethod"), name.impl, typ.impl) } -func (b Builder) abiMethods(t *types.Named) (ret int) { - n := t.NumMethods() - for i := 0; i < n; i++ { - m := t.Method(i) - mSig := m.Type().(*types.Signature) - recvType := mSig.Recv().Type() - if _, ok := recvType.(*types.Pointer); !ok { - ret++ +func (b Builder) abiMethods(t *types.Named) (ret, pret int) { + methods := typeutil.IntuitiveMethodSet(t, nil) + pret = len(methods) + for _, m := range methods { + if _, ok := m.Recv().(*types.Pointer); ok { + continue } + ret++ } return } @@ -120,6 +124,9 @@ func (b Builder) abiMethodOf(m *types.Func /*, bg Background = InGo */) (mthd, p mSig := m.Type().(*types.Signature) name := b.Str(mName).impl + if !token.IsExported(mName) { + name = b.Str(abi.FullName(mPkg, m.Name())).impl + } abiSigGo := types.NewSignatureType(nil, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) abiSig := prog.FuncDecl(abiSigGo, InGo).raw.Type abiTyp := b.abiType(abiSig) @@ -149,7 +156,7 @@ func (b Builder) abiMthd(mPkg *types.Package, mName string, mSig *types.Signatur } // func Interface(pkgPath, name string, methods []abi.Imethod) -func (b Builder) abiInterfaceOf(name string, t *types.Interface) func() Expr { +func (b Builder) abiInterfaceOf(pkgPath string, name string, t *types.Interface) func() Expr { n := t.NumMethods() typs := make([]Expr, n) for i := 0; i < n; i++ { @@ -161,11 +168,17 @@ func (b Builder) abiInterfaceOf(name string, t *types.Interface) func() Expr { methods := make([]Expr, n) for i := 0; i < n; i++ { m := t.Method(i) - methods[i] = b.abiImethodOf(m.Name(), typs[i]) + mName := m.Name() + if !token.IsExported(mName) { + mName = abi.FullName(m.Pkg(), mName) + } + methods[i] = b.abiImethodOf(mName, typs[i]) } pkg := b.Pkg fn := pkg.rtFunc("Interface") - pkgPath := pkg.Path() + if pkgPath == "" { + pkgPath = pkg.Path() + } tSlice := lastParamType(prog, fn) methodSlice := b.SliceLit(tSlice, methods...) return b.Call(fn, b.Str(pkgPath), b.Str(name), methodSlice) @@ -178,8 +191,7 @@ func (b Builder) abiNamedOf(t *types.Named) func() Expr { pkg := b.Pkg tunder := t.Underlying() kind := int(abi.UnderlyingKind(tunder)) - numMethods := b.abiMethods(t) - numPtrMethods := t.NumMethods() + numMethods, numPtrMethods := b.abiMethods(t) newNamed := pkg.rtFunc("NewNamed") return b.Call(newNamed, b.Prog.Val(kind), b.Prog.Val(numMethods), b.Prog.Val(numPtrMethods)) } @@ -193,10 +205,10 @@ func (b Builder) abiInitNamed(ret Expr, t *types.Named) func() Expr { prog := b.Prog path := abi.PathOf(t.Obj().Pkg()) name := NameOf(t) - var initNamed = pkg.rtFunc("InitNamed") var tSlice = lastParamType(prog, initNamed) - var n = t.NumMethods() + mset := typeutil.IntuitiveMethodSet(t, nil) + n := len(mset) var methods, ptrMethods Expr if n == 0 { methods = prog.Zero(tSlice) @@ -205,7 +217,7 @@ func (b Builder) abiInitNamed(ret Expr, t *types.Named) func() Expr { var mthds []Expr var ptrMthds = make([]Expr, 0, n) for i := 0; i < n; i++ { - m := t.Method(i) + m := mset[i].Obj().(*types.Func) mthd, ptrMthd := b.abiMethodOf(m) if !mthd.IsNil() { mthds = append(mthds, mthd) @@ -304,6 +316,10 @@ func (p Package) abiTypeInit(g Global, t types.Type, pub bool) { b.blk.last = blks[1].last } if t, ok := t.(*types.Named); ok { + // skip interface + if _, ok := t.Underlying().(*types.Interface); ok { + return + } tabi = b.abiInitNamed(vexpr, t) if pub { blks = b.Func.MakeBlocks(2) diff --git a/ssa/expr.go b/ssa/expr.go index c085054d..960f1cde 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -113,7 +113,6 @@ func (p Program) Zero(t Type) Expr { ret = llvm.ConstStruct(flds, false) case *types.Slice: ret = p.Zero(p.rtType("Slice")).impl - /* TODO(xsw): case *types.Interface: var name string if u.Empty() { @@ -122,7 +121,6 @@ func (p Program) Zero(t Type) Expr { name = "Iface" } ret = p.Zero(p.rtType(name)).impl - */ default: log.Panicln("todo:", u) } diff --git a/ssa/interface.go b/ssa/interface.go index 39da9775..67d1ca34 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -234,7 +234,21 @@ func (b Builder) TypeAssert(x Expr, assertedTyp Type, commaOk bool) Expr { } tx := b.faceAbiType(x) tabi := b.abiType(assertedTyp.raw.Type) - eq := b.BinOp(token.EQL, tx, tabi) + + var eq Expr + var val func() Expr + if rawIntf, ok := assertedTyp.raw.Type.Underlying().(*types.Interface); ok { + if rawIntf.Empty() { + eq = b.Prog.BoolVal(true) + } else { + eq = b.InlineCall(b.Pkg.rtFunc("Implements"), tabi, tx) + } + val = func() Expr { return Expr{b.unsafeInterface(rawIntf, tx, b.faceData(x.impl)), assertedTyp} } + } else { + eq = b.BinOp(token.EQL, tx, tabi) + val = func() Expr { return b.valFromData(assertedTyp, b.faceData(x.impl)) } + } + if commaOk { prog := b.Prog t := prog.Struct(assertedTyp, prog.Bool()) @@ -246,8 +260,7 @@ func (b Builder) TypeAssert(x Expr, assertedTyp Type, commaOk bool) Expr { phi.AddIncoming(b, blks[:2], func(i int, blk BasicBlock) Expr { b.SetBlockEx(blk, AtEnd, false) if i == 0 { - val := b.valFromData(assertedTyp, b.faceData(x.impl)) - valTrue := aggregateValue(b.impl, t.ll, val.impl, prog.BoolVal(true).impl) + valTrue := aggregateValue(b.impl, t.ll, val().impl, prog.BoolVal(true).impl) b.Jump(blks[2]) return Expr{valTrue, t} } @@ -263,10 +276,10 @@ func (b Builder) TypeAssert(x Expr, assertedTyp Type, commaOk bool) Expr { blks := b.Func.MakeBlocks(2) b.If(eq, blks[0], blks[1]) b.SetBlockEx(blks[1], AtEnd, false) - b.Panic(b.Str("type assertion failed")) + b.Panic(b.MakeInterface(b.Prog.Any(), b.Str("type assertion failed"))) b.SetBlockEx(blks[0], AtEnd, false) b.blk.last = blks[0].last - return b.valFromData(assertedTyp, b.faceData(x.impl)) + return val() } // ChangeInterface constructs a value of one interface type from a