From eae94c5f23ad4289e31f54da23bfee04a2069f16 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 May 2024 17:53:29 +0800 Subject: [PATCH] remove abi.Name --- cl/_testgo/abiname/in.go | 16 -- cl/_testgo/abiname/out.ll | 104 -------- cl/_testgo/strucintf/out.ll | 147 +++++------ cl/_testgo/struczero/in.go | 1 + cl/_testgo/struczero/out.ll | 401 +++++++++++------------------- cl/_testrt/concat/out.ll | 35 +-- internal/abi/llgo_autogen.lla | Bin 6546 -> 3353 bytes internal/abi/type.go | 44 +++- internal/runtime/llgo_autogen.lla | Bin 12124 -> 11825 bytes internal/runtime/z_face.go | 24 +- internal/runtime/z_type.go | 22 +- ssa/cl_test.go | 2 +- ssa/expr.go | 73 +++--- ssa/interface.go | 26 +- 14 files changed, 333 insertions(+), 562 deletions(-) delete mode 100644 cl/_testgo/abiname/in.go delete mode 100644 cl/_testgo/abiname/out.ll diff --git a/cl/_testgo/abiname/in.go b/cl/_testgo/abiname/in.go deleted file mode 100644 index eea265b5..00000000 --- a/cl/_testgo/abiname/in.go +++ /dev/null @@ -1,16 +0,0 @@ -package main - -import "github.com/goplus/llgo/internal/abi" - -// NewPkgName creates a package name. -func NewPkgName(pkgPath string) (ret abi.Name) { - if len(pkgPath) > 0 { - ret = abi.NewName(pkgPath, "", false, false) - } - return -} - -func main() { - n := NewPkgName("pkgPath") - println(n.Name(), n.Tag(), n.IsExported(), n.IsEmbedded(), n.IsBlank()) -} diff --git a/cl/_testgo/abiname/out.ll b/cl/_testgo/abiname/out.ll deleted file mode 100644 index 4330a755..00000000 --- a/cl/_testgo/abiname/out.ll +++ /dev/null @@ -1,104 +0,0 @@ -; ModuleID = 'main' -source_filename = "main" - -%"github.com/goplus/llgo/internal/abi.Name" = type { ptr } -%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } - -@"main.init$guard" = global ptr null -@0 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@__llgo_argc = global ptr null -@__llgo_argv = global ptr null -@1 = private unnamed_addr constant [8 x i8] c"pkgPath\00", align 1 - -define %"github.com/goplus/llgo/internal/abi.Name" @main.NewPkgName(%"github.com/goplus/llgo/internal/runtime.String" %0) { -_llgo_0: - %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %0, 1 - %2 = icmp sgt i64 %1, 0 - br i1 %2, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %3 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 0 - store ptr @0, ptr %4, align 8 - %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 1 - store i64 0, ptr %5, align 4 - %6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8 - %7 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String" %0, %"github.com/goplus/llgo/internal/runtime.String" %6, i1 false, i1 false) - %8 = extractvalue %"github.com/goplus/llgo/internal/abi.Name" %7, 0 - br label %_llgo_2 - -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - %9 = phi ptr [ null, %_llgo_0 ], [ %8, %_llgo_1 ] - %10 = alloca %"github.com/goplus/llgo/internal/abi.Name", align 8 - %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Name", ptr %10, i32 0, i32 0 - store ptr %9, ptr %11, align 8 - %12 = load %"github.com/goplus/llgo/internal/abi.Name", ptr %10, align 8 - ret %"github.com/goplus/llgo/internal/abi.Name" %12 -} - -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/internal/abi.init"() - 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 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 - store ptr @1, ptr %3, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 - store i64 7, ptr %4, align 4 - %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 - %6 = call %"github.com/goplus/llgo/internal/abi.Name" @main.NewPkgName(%"github.com/goplus/llgo/internal/runtime.String" %5) - %7 = call %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Name"(%"github.com/goplus/llgo/internal/abi.Name" %6) - %8 = call %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Tag"(%"github.com/goplus/llgo/internal/abi.Name" %6) - %9 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsExported"(%"github.com/goplus/llgo/internal/abi.Name" %6) - %10 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsEmbedded"(%"github.com/goplus/llgo/internal/abi.Name" %6) - %11 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsBlank"(%"github.com/goplus/llgo/internal/abi.Name" %6) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %7) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %8) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %9) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %10) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %11) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - ret i32 0 -} - -declare %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", i1, i1) - -declare void @"github.com/goplus/llgo/internal/abi.init"() - -declare void @"github.com/goplus/llgo/internal/runtime.init"() - -declare %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Name"(%"github.com/goplus/llgo/internal/abi.Name") - -declare %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Tag"(%"github.com/goplus/llgo/internal/abi.Name") - -declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsExported"(%"github.com/goplus/llgo/internal/abi.Name") - -declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsEmbedded"(%"github.com/goplus/llgo/internal/abi.Name") - -declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsBlank"(%"github.com/goplus/llgo/internal/abi.Name") - -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.PrintBool"(i1) diff --git a/cl/_testgo/strucintf/out.ll b/cl/_testgo/strucintf/out.ll index 964328d1..e9932f44 100644 --- a/cl/_testgo/strucintf/out.ll +++ b/cl/_testgo/strucintf/out.ll @@ -158,118 +158,85 @@ _llgo_10: ; preds = %_llgo_0 %45 = getelementptr inbounds { { i64 }, i1 }, ptr %43, i32 0, i32 1 store i1 true, ptr %45, align 1 %46 = load { { i64 }, i1 }, ptr %43, align 4 - %47 = extractvalue { { i64 }, i1 } %46, 0 - %48 = extractvalue { { i64 }, i1 } %46, 1 br label %_llgo_12 _llgo_11: ; preds = %_llgo_0 - %49 = alloca { { i64 }, i1 }, align 8 - %50 = getelementptr inbounds { { i64 }, i1 }, ptr %49, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %50, align 4 - %51 = getelementptr inbounds { { i64 }, i1 }, ptr %49, i32 0, i32 1 - store i1 false, ptr %51, align 1 - %52 = load { { i64 }, i1 }, ptr %49, align 4 - %53 = extractvalue { { i64 }, i1 } %52, 0 - %54 = extractvalue { { i64 }, i1 } %52, 1 + %47 = alloca { { i64 }, i1 }, align 8 + %48 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %48, align 4 + %49 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 1 + store i1 false, ptr %49, align 1 + %50 = load { { i64 }, i1 }, ptr %47, align 4 br label %_llgo_12 _llgo_12: ; preds = %_llgo_11, %_llgo_10 - %55 = phi i64 [ %47, %_llgo_10 ], [ %53, %_llgo_11 ] - %56 = phi i1 [ %48, %_llgo_10 ], [ %54, %_llgo_11 ] - %57 = alloca { { i64 }, i1 }, align 8 - %58 = getelementptr inbounds { { i64 }, i1 }, ptr %57, i32 0, i32 0 - store i64 %55, ptr %58, align 4 - %59 = getelementptr inbounds { { i64 }, i1 }, ptr %57, i32 0, i32 1 - store i1 %56, ptr %59, align 1 - %60 = load { { i64 }, i1 }, ptr %57, align 4 - %61 = extractvalue { { i64 }, i1 } %60, 0 - store { i64 } %61, ptr %4, align 4 - %62 = extractvalue { { i64 }, i1 } %60, 1 - br i1 %62, label %_llgo_1, label %_llgo_3 + %51 = phi { { i64 }, i1 } [ %46, %_llgo_10 ], [ %50, %_llgo_11 ] + %52 = extractvalue { { i64 }, i1 } %51, 0 + store { i64 } %52, ptr %4, align 4 + %53 = extractvalue { { i64 }, i1 } %51, 1 + br i1 %53, label %_llgo_1, label %_llgo_3 _llgo_13: ; preds = %_llgo_2 - %63 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1 - %64 = ptrtoint ptr %63 to i64 - %65 = alloca { i64 }, align 8 - %66 = getelementptr inbounds { i64 }, ptr %65, i32 0, i32 0 - store i64 %64, ptr %66, align 4 - %67 = load { i64 }, ptr %65, align 4 - %68 = alloca { { i64 }, i1 }, align 8 - %69 = getelementptr inbounds { { i64 }, i1 }, ptr %68, i32 0, i32 0 - store { i64 } %67, ptr %69, align 4 - %70 = getelementptr inbounds { { i64 }, i1 }, ptr %68, i32 0, i32 1 - store i1 true, ptr %70, align 1 - %71 = load { { i64 }, i1 }, ptr %68, align 4 - %72 = extractvalue { { i64 }, i1 } %71, 0 - %73 = extractvalue { { i64 }, i1 } %71, 1 + %54 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1 + %55 = ptrtoint ptr %54 to i64 + %56 = alloca { i64 }, align 8 + %57 = getelementptr inbounds { i64 }, ptr %56, i32 0, i32 0 + store i64 %55, ptr %57, align 4 + %58 = load { i64 }, ptr %56, align 4 + %59 = alloca { { i64 }, i1 }, align 8 + %60 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 0 + store { i64 } %58, ptr %60, align 4 + %61 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 1 + store i1 true, ptr %61, align 1 + %62 = load { { i64 }, i1 }, ptr %59, align 4 br label %_llgo_15 _llgo_14: ; preds = %_llgo_2 - %74 = alloca { { i64 }, i1 }, align 8 - %75 = getelementptr inbounds { { i64 }, i1 }, ptr %74, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %75, align 4 - %76 = getelementptr inbounds { { i64 }, i1 }, ptr %74, i32 0, i32 1 - store i1 false, ptr %76, align 1 - %77 = load { { i64 }, i1 }, ptr %74, align 4 - %78 = extractvalue { { i64 }, i1 } %77, 0 - %79 = extractvalue { { i64 }, i1 } %77, 1 + %63 = alloca { { i64 }, i1 }, align 8 + %64 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %64, align 4 + %65 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 1 + store i1 false, ptr %65, align 1 + %66 = load { { i64 }, i1 }, ptr %63, align 4 br label %_llgo_15 _llgo_15: ; preds = %_llgo_14, %_llgo_13 - %80 = phi i64 [ %72, %_llgo_13 ], [ %78, %_llgo_14 ] - %81 = phi i1 [ %73, %_llgo_13 ], [ %79, %_llgo_14 ] - %82 = alloca { { i64 }, i1 }, align 8 - %83 = getelementptr inbounds { { i64 }, i1 }, ptr %82, i32 0, i32 0 - store i64 %80, ptr %83, align 4 - %84 = getelementptr inbounds { { i64 }, i1 }, ptr %82, i32 0, i32 1 - store i1 %81, ptr %84, align 1 - %85 = load { { i64 }, i1 }, ptr %82, align 4 - %86 = extractvalue { { i64 }, i1 } %85, 0 - store { i64 } %86, ptr %12, align 4 - %87 = extractvalue { { i64 }, i1 } %85, 1 - br i1 %87, label %_llgo_4, label %_llgo_6 + %67 = phi { { i64 }, i1 } [ %62, %_llgo_13 ], [ %66, %_llgo_14 ] + %68 = extractvalue { { i64 }, i1 } %67, 0 + store { i64 } %68, ptr %12, align 4 + %69 = extractvalue { { i64 }, i1 } %67, 1 + br i1 %69, label %_llgo_4, label %_llgo_6 _llgo_16: ; preds = %_llgo_5 - %88 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1 - %89 = ptrtoint ptr %88 to i64 - %90 = alloca { i64 }, align 8 - %91 = getelementptr inbounds { i64 }, ptr %90, i32 0, i32 0 - store i64 %89, ptr %91, align 4 - %92 = load { i64 }, ptr %90, align 4 - %93 = alloca { { i64 }, i1 }, align 8 - %94 = getelementptr inbounds { { i64 }, i1 }, ptr %93, i32 0, i32 0 - store { i64 } %92, ptr %94, align 4 - %95 = getelementptr inbounds { { i64 }, i1 }, ptr %93, i32 0, i32 1 - store i1 true, ptr %95, align 1 - %96 = load { { i64 }, i1 }, ptr %93, align 4 - %97 = extractvalue { { i64 }, i1 } %96, 0 - %98 = extractvalue { { i64 }, i1 } %96, 1 + %70 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1 + %71 = ptrtoint ptr %70 to i64 + %72 = alloca { i64 }, align 8 + %73 = getelementptr inbounds { i64 }, ptr %72, i32 0, i32 0 + store i64 %71, ptr %73, align 4 + %74 = load { i64 }, ptr %72, align 4 + %75 = alloca { { i64 }, i1 }, align 8 + %76 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 0 + store { i64 } %74, ptr %76, align 4 + %77 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 1 + store i1 true, ptr %77, align 1 + %78 = load { { i64 }, i1 }, ptr %75, align 4 br label %_llgo_18 _llgo_17: ; preds = %_llgo_5 - %99 = alloca { { i64 }, i1 }, align 8 - %100 = getelementptr inbounds { { i64 }, i1 }, ptr %99, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %100, align 4 - %101 = getelementptr inbounds { { i64 }, i1 }, ptr %99, i32 0, i32 1 - store i1 false, ptr %101, align 1 - %102 = load { { i64 }, i1 }, ptr %99, align 4 - %103 = extractvalue { { i64 }, i1 } %102, 0 - %104 = extractvalue { { i64 }, i1 } %102, 1 + %79 = alloca { { i64 }, i1 }, align 8 + %80 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %80, align 4 + %81 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 1 + store i1 false, ptr %81, align 1 + %82 = load { { i64 }, i1 }, ptr %79, align 4 br label %_llgo_18 _llgo_18: ; preds = %_llgo_17, %_llgo_16 - %105 = phi i64 [ %97, %_llgo_16 ], [ %103, %_llgo_17 ] - %106 = phi i1 [ %98, %_llgo_16 ], [ %104, %_llgo_17 ] - %107 = alloca { { i64 }, i1 }, align 8 - %108 = getelementptr inbounds { { i64 }, i1 }, ptr %107, i32 0, i32 0 - store i64 %105, ptr %108, align 4 - %109 = getelementptr inbounds { { i64 }, i1 }, ptr %107, i32 0, i32 1 - store i1 %106, ptr %109, align 1 - %110 = load { { i64 }, i1 }, ptr %107, align 4 - %111 = extractvalue { { i64 }, i1 } %110, 0 - store { i64 } %111, ptr %23, align 4 - %112 = extractvalue { { i64 }, i1 } %110, 1 - br i1 %112, label %_llgo_7, label %_llgo_9 + %83 = phi { { i64 }, i1 } [ %78, %_llgo_16 ], [ %82, %_llgo_17 ] + %84 = extractvalue { { i64 }, i1 } %83, 0 + store { i64 } %84, ptr %23, align 4 + %85 = extractvalue { { i64 }, i1 } %83, 1 + br i1 %85, label %_llgo_7, label %_llgo_9 } declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) diff --git a/cl/_testgo/struczero/in.go b/cl/_testgo/struczero/in.go index 589b75f2..ce583d11 100644 --- a/cl/_testgo/struczero/in.go +++ b/cl/_testgo/struczero/in.go @@ -20,6 +20,7 @@ func Bar(v any) (ret foo.Foo, ok bool) { func main() { ret, ok := Foo(nil) println(ret.pb, ret.f, "notOk:", !ok) + ret2, ok2 := Bar(foo.Foo{}) println(ret2.Pb(), ret2.F, ok2) } diff --git a/cl/_testgo/struczero/out.ll b/cl/_testgo/struczero/out.ll index 60b85986..a47925bb 100644 --- a/cl/_testgo/struczero/out.ll +++ b/cl/_testgo/struczero/out.ll @@ -1,103 +1,77 @@ ; ModuleID = 'main' source_filename = "main" -%"github.com/goplus/llgo/cl/internal/foo.Foo" = type { ptr, float } -%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } %main.bar = type { ptr, float } +%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } -%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/abi.Name", ptr, i64 } -%"github.com/goplus/llgo/internal/abi.Name" = type { 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 } @"main.init$guard" = global ptr null -@"github.com/goplus/llgo/cl/internal/foo.Foo" = linkonce global ptr null +@0 = private unnamed_addr constant [4 x i8] c"Foo\00", align 1 @main.bar = global ptr null +@1 = private unnamed_addr constant [9 x i8] c"Foo done\00", align 1 @__llgo_argc = global ptr null @__llgo_argv = global ptr null -@0 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1 -@1 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 +@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@3 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1 +@4 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 @"*_llgo_byte" = linkonce global ptr null -@2 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@3 = private unnamed_addr constant [2 x i8] c"F\00", align 1 -@4 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@6 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/internal/foo.Foo\00", align 1 -@7 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 -@8 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@9 = private unnamed_addr constant [2 x i8] c"f\00", align 1 -@10 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@11 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@12 = private unnamed_addr constant [9 x i8] c"main.bar\00", align 1 - -define { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %0) { -_llgo_0: - %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %2 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %3 = icmp eq ptr %1, %2 - br i1 %3, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 - %5 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %4, align 8 - %6 = alloca { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, align 8 - %7 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, i32 0, i32 0 - store %"github.com/goplus/llgo/cl/internal/foo.Foo" %5, ptr %7, align 8 - %8 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, i32 0, i32 1 - store i1 true, ptr %8, align 1 - %9 = load { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, align 8 - br label %_llgo_3 - -_llgo_2: ; preds = %_llgo_0 - %10 = alloca { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, align 8 - %11 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, i32 0, i32 0 - store { ptr, double } zeroinitializer, ptr %11, align 8 - %12 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, i32 0, i32 1 - store i1 false, ptr %12, align 1 - %13 = load { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, align 8 - br label %_llgo_3 - -_llgo_3: ; preds = %_llgo_2, %_llgo_1 - %14 = phi { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ] - %15 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %14, 0 - %16 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %14, 1 - %mrv = insertvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } poison, %"github.com/goplus/llgo/cl/internal/foo.Foo" %15, 0 - %mrv1 = insertvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %mrv, i1 %16, 1 - ret { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %mrv1 -} +@5 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@6 = private unnamed_addr constant [2 x i8] c"f\00", align 1 +@7 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@8 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@9 = private unnamed_addr constant [9 x i8] c"main.bar\00", align 1 define { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" %0) { _llgo_0: - %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %2 = load ptr, ptr @main.bar, align 8 - %3 = icmp eq ptr %1, %2 - br i1 %3, label %_llgo_1, label %_llgo_2 + %1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0 + store ptr @0, ptr %2, align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1 + store i64 3, ptr %3, align 4 + %4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %4) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %5 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 + %6 = load ptr, ptr @main.bar, align 8 + %7 = icmp eq ptr %5, %6 + br i1 %7, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 - %5 = load %main.bar, ptr %4, align 8 - %6 = alloca { %main.bar, i1 }, align 8 - %7 = getelementptr inbounds { %main.bar, i1 }, ptr %6, i32 0, i32 0 - store %main.bar %5, ptr %7, align 8 - %8 = getelementptr inbounds { %main.bar, i1 }, ptr %6, i32 0, i32 1 - store i1 true, ptr %8, align 1 - %9 = load { %main.bar, i1 }, ptr %6, align 8 - br label %_llgo_3 - -_llgo_2: ; preds = %_llgo_0 + %8 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 + %9 = load %main.bar, ptr %8, align 8 %10 = alloca { %main.bar, i1 }, align 8 %11 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 0 - store { ptr, double } zeroinitializer, ptr %11, align 8 + store %main.bar %9, ptr %11, align 8 %12 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 1 - store i1 false, ptr %12, align 1 + store i1 true, ptr %12, align 1 %13 = load { %main.bar, i1 }, ptr %10, align 8 br label %_llgo_3 +_llgo_2: ; preds = %_llgo_0 + %14 = alloca { %main.bar, i1 }, align 8 + %15 = getelementptr inbounds { %main.bar, i1 }, ptr %14, i32 0, i32 0 + store { ptr, double } zeroinitializer, ptr %15, align 8 + %16 = getelementptr inbounds { %main.bar, i1 }, ptr %14, i32 0, i32 1 + store i1 false, ptr %16, align 1 + %17 = load { %main.bar, i1 }, ptr %14, align 8 + br label %_llgo_3 + _llgo_3: ; preds = %_llgo_2, %_llgo_1 - %14 = phi { %main.bar, i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ] - %15 = extractvalue { %main.bar, i1 } %14, 0 - %16 = extractvalue { %main.bar, i1 } %14, 1 - %mrv = insertvalue { %main.bar, i1 } poison, %main.bar %15, 0 - %mrv1 = insertvalue { %main.bar, i1 } %mrv, i1 %16, 1 + %18 = phi { %main.bar, i1 } [ %13, %_llgo_1 ], [ %17, %_llgo_2 ] + %19 = extractvalue { %main.bar, i1 } %18, 0 + %20 = extractvalue { %main.bar, i1 } %18, 1 + %21 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 0 + store ptr @1, ptr %22, align 8 + %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 1 + store i64 8, ptr %23, align 4 + %24 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %21, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %24) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %mrv = insertvalue { %main.bar, i1 } poison, %main.bar %19, 0 + %mrv1 = insertvalue { %main.bar, i1 } %mrv, i1 %20, 1 ret { %main.bar, i1 } %mrv1 } @@ -108,7 +82,6 @@ _llgo_0: _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$abi"() br label %_llgo_2 @@ -122,62 +95,46 @@ _llgo_0: store ptr %1, ptr @__llgo_argv, align 8 call void @"github.com/goplus/llgo/internal/runtime.init"() call void @main.init() - %2 = alloca %main.bar, align 8 - %3 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %2, i64 16) - %4 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer) - %5 = extractvalue { %main.bar, i1 } %4, 0 - store %main.bar %5, ptr %3, align 8 - %6 = extractvalue { %main.bar, i1 } %4, 1 - %7 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - %9 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 1 - %10 = load float, ptr %9, align 4 - %11 = xor i1 %6, true - %12 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 0 - store ptr @0, ptr %13, align 8 - %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 1 - store i64 6, ptr %14, align 4 - %15 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 - call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %8) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %16 = fpext float %10 to double - call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %16) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %15) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %11) + %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 + store ptr @2, ptr %3, align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 + store i64 4, ptr %4, align 4 + %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %5) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - %17 = alloca %"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %18 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %17, i64 16) - %19 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %20 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/cl/internal/foo.Foo" zeroinitializer, 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 - %25 = call { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %24) - %26 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 0 - store %"github.com/goplus/llgo/cl/internal/foo.Foo" %26, ptr %18, align 8 - %27 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 1 - %28 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, align 8 - %29 = call ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo" %28) - %30 = getelementptr inbounds %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, i32 0, i32 1 - %31 = load float, ptr %30, align 4 - call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %29) + %6 = alloca %main.bar, align 8 + %7 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %6, i64 16) + %8 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer) + %9 = extractvalue { %main.bar, i1 } %8, 0 + store %main.bar %9, ptr %7, align 8 + %10 = extractvalue { %main.bar, i1 } %8, 1 + %11 = getelementptr inbounds %main.bar, ptr %7, i32 0, i32 0 + %12 = load ptr, ptr %11, align 8 + %13 = getelementptr inbounds %main.bar, ptr %7, i32 0, i32 1 + %14 = load float, ptr %13, align 4 + %15 = xor i1 %10, true + %16 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 0 + store ptr @3, ptr %17, align 8 + %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1 + store i64 6, ptr %18, align 4 + %19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %12) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %32 = fpext float %31 to double - call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %32) + %20 = fpext float %14 to double + call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %20) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %27) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %19) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %15) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) ret i32 0 } -declare void @"github.com/goplus/llgo/cl/internal/foo.init"() +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.init"() @@ -185,147 +142,77 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) -declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) - declare void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double) -declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") - declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) -declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) - -declare ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo") - define void @"main.init$abi"() { _llgo_0: - %0 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %1 = icmp eq ptr %0, null - br i1 %1, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 - store ptr @1, ptr %3, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 - store i64 2, ptr %4, align 4 - %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 - %6 = load ptr, ptr @"*_llgo_byte", align 8 - %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 @2, ptr %8, align 8 - %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 1 - store i64 0, ptr %9, align 4 - %10 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %7, align 8 - %11 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %5, ptr %6, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %10, i1 false, i1 false) - %12 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 0 - store ptr @3, ptr %13, align 8 - %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 1 - store i64 1, ptr %14, align 4 - %15 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 - %16 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) - %17 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 0 - store ptr @4, ptr %18, align 8 - %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 1 - store i64 0, ptr %19, align 4 - %20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %17, align 8 - %21 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %15, ptr %16, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %20, i1 true, i1 false) - %22 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 0 - store ptr @5, ptr %23, align 8 - %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 1 - store i64 4, ptr %24, align 4 - %25 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %22, align 8 - %26 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48) - %27 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %26, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %11, ptr %27, align 8 - %28 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %26, i64 1 - store %"github.com/goplus/llgo/internal/abi.StructField" %21, ptr %28, align 8 - %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 %26, ptr %30, align 8 - %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 1 - store i64 2, ptr %31, align 4 - %32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 2 - store i64 2, 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" %25, %"github.com/goplus/llgo/internal/runtime.Slice" %33) - %35 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 0 - store ptr @6, ptr %36, align 8 - %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 1 - store i64 42, ptr %37, align 4 - %38 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %35, align 8 - %39 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %38, ptr %34) - store ptr %39, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - br label %_llgo_2 - -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - %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 @7, ptr %41, align 8 - %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %40, i32 0, i32 1 - store i64 2, ptr %42, align 4 - %43 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %40, align 8 - %44 = load ptr, ptr @"*_llgo_byte", align 8 - %45 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %46 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %45, i32 0, i32 0 - store ptr @8, ptr %46, align 8 - %47 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %45, i32 0, i32 1 - store i64 0, ptr %47, align 4 - %48 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %45, align 8 - %49 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %43, ptr %44, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %48, i1 false, i1 false) - %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 @9, ptr %51, align 8 - %52 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %50, i32 0, i32 1 - store i64 1, ptr %52, align 4 - %53 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %50, align 8 - %54 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) - %55 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %56 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %55, i32 0, i32 0 - store ptr @10, ptr %56, align 8 - %57 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %55, i32 0, i32 1 - store i64 0, ptr %57, align 4 - %58 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %55, align 8 - %59 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %53, ptr %54, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %58, i1 false, i1 false) - %60 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %61 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %60, i32 0, i32 0 - store ptr @11, ptr %61, align 8 - %62 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %60, i32 0, i32 1 - store i64 4, ptr %62, align 4 - %63 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %60, align 8 - %64 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48) - %65 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %64, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %49, ptr %65, align 8 - %66 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %64, i64 1 - store %"github.com/goplus/llgo/internal/abi.StructField" %59, ptr %66, align 8 - %67 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %67, i32 0, i32 0 - store ptr %64, ptr %68, align 8 - %69 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %67, i32 0, i32 1 - store i64 2, ptr %69, align 4 - %70 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %67, i32 0, i32 2 - store i64 2, ptr %70, align 4 - %71 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %67, align 8 - %72 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %63, %"github.com/goplus/llgo/internal/runtime.Slice" %71) - %73 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %74 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %73, i32 0, i32 0 - store ptr @12, ptr %74, align 8 - %75 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %73, i32 0, i32 1 - store i64 8, ptr %75, align 4 - %76 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %73, align 8 - %77 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %76, ptr %72) - store ptr %77, ptr @main.bar, align 8 + %0 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 0 + store ptr @4, ptr %1, align 8 + %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 1 + store i64 2, ptr %2, align 4 + %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %0, align 8 + %4 = load ptr, ptr @"*_llgo_byte", align 8 + %5 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 0 + store ptr @5, ptr %6, align 8 + %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1 + store i64 0, ptr %7, align 4 + %8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8 + %9 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %3, ptr %4, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %8, i1 false) + %10 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 0 + store ptr @6, ptr %11, align 8 + %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 + store i64 1, ptr %12, align 4 + %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 + %14 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %15 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 0 + store ptr @7, ptr %16, align 8 + %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1 + store i64 0, ptr %17, align 4 + %18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8 + %19 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %13, ptr %14, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %18, i1 false) + %20 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 0 + store ptr @8, ptr %21, align 8 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 1 + store i64 4, ptr %22, align 4 + %23 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %20, align 8 + %24 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112) + %25 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %24, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %9, ptr %25, align 8 + %26 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %24, i64 1 + store %"github.com/goplus/llgo/internal/abi.StructField" %19, ptr %26, align 8 + %27 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 0 + store ptr %24, ptr %28, align 8 + %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 1 + store i64 2, ptr %29, align 4 + %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 2 + store i64 2, ptr %30, align 4 + %31 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, align 8 + %32 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %23, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %31) + %33 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 0 + store ptr @9, ptr %34, align 8 + %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 1 + store i64 8, ptr %35, align 4 + %36 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %33, align 8 + %37 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %36, ptr %32) + store ptr %37, ptr @main.bar, align 8 ret void } -declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(i64, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.Slice") +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, i1) +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.Basic"(i64) -declare ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String", ptr) +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + +declare ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice") diff --git a/cl/_testrt/concat/out.ll b/cl/_testrt/concat/out.ll index 7217f45f..1ef2685d 100644 --- a/cl/_testrt/concat/out.ll +++ b/cl/_testrt/concat/out.ll @@ -25,37 +25,26 @@ _llgo_0: %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 store i64 0, ptr %4, align 4 %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 - %6 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %5, 0 - %7 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %5, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %8 = phi ptr [ %6, %_llgo_0 ], [ %22, %_llgo_2 ] - %9 = phi i64 [ %7, %_llgo_0 ], [ %23, %_llgo_2 ] - %10 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 0 - store ptr %8, ptr %11, align 8 - %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 - store i64 %9, ptr %12, align 4 - %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 - %14 = phi i64 [ -1, %_llgo_0 ], [ %15, %_llgo_2 ] - %15 = add i64 %14, 1 - %16 = icmp slt i64 %15, %1 - br i1 %16, label %_llgo_2, label %_llgo_3 + %6 = phi %"github.com/goplus/llgo/internal/runtime.String" [ %5, %_llgo_0 ], [ %14, %_llgo_2 ] + %7 = phi i64 [ -1, %_llgo_0 ], [ %8, %_llgo_2 ] + %8 = add i64 %7, 1 + %9 = icmp slt i64 %8, %1 + br i1 %9, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %17 = icmp slt i64 %15, 0 - call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %17) - %18 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 - %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i64 %15 - %20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8 - %21 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %13, %"github.com/goplus/llgo/internal/runtime.String" %20) - %22 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %21, 0 - %23 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %21, 1 + %10 = icmp slt i64 %8, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %10) + %11 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 + %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i64 %8 + %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 + %14 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %6, %"github.com/goplus/llgo/internal/runtime.String" %13) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 - ret %"github.com/goplus/llgo/internal/runtime.String" %13 + ret %"github.com/goplus/llgo/internal/runtime.String" %6 } define %"github.com/goplus/llgo/internal/runtime.String" @main.info(%"github.com/goplus/llgo/internal/runtime.String" %0) { diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index 728e9013c16896b9ccc271fed5c09ccbf53ba072..2eb6053511a49bb313d97512712d91116676dc0d 100644 GIT binary patch literal 3353 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 diff --git a/internal/abi/type.go b/internal/abi/type.go index a6a01d85..8cf09096 100644 --- a/internal/abi/type.go +++ b/internal/abi/type.go @@ -20,6 +20,15 @@ import ( "unsafe" ) +// IsExported reports whether name starts with an upper-case letter. +func IsExported(name string) bool { + if len(name) > 0 { + c := name[0] + return 'A' <= c && c <= 'Z' + } + return false +} + // ----------------------------------------------------------------------------- // Type is the runtime representation of a Go type. @@ -46,8 +55,8 @@ type Type struct { // If the KindGCProg bit is set in kind, GCData is a GC program. // Otherwise it is a ptrmask bitmap. See mbitmap.go for details. GCData *byte - Str_ Name // string form - PtrToThis_ *Type // type for pointer to this type, may be nil + Str_ string // string form + PtrToThis_ *Type // type for pointer to this type, may be nil } // A Kind represents the specific kind of type that a Type represents. @@ -209,32 +218,41 @@ func (p *FuncType) Variadic() bool { } type StructField struct { - Name Name // name is always non-empty + Name_ string // name is always non-empty Typ *Type // type of field Offset uintptr // byte offset of field + + Tag_ string + Embedded_ bool } +// Embedded reports whether the field is embedded. func (f *StructField) Embedded() bool { - return f.Name.IsEmbedded() + return f.Embedded_ +} + +// Exported reports whether the field is exported. +func (f *StructField) Exported() bool { + return IsExported(f.Name_) } type StructType struct { Type - PkgPath Name - Fields []StructField + PkgPath_ string + Fields []StructField } type InterfaceType struct { Type - PkgPath Name // import path - Methods []Imethod // sorted by hash + PkgPath_ string // import path + Methods []Imethod // sorted by hash } type Text = unsafe.Pointer // TODO(xsw): to be confirmed // Method on non-interface type type Method struct { - Name_ Name // name of method + Name_ string // name of method Mtyp_ *FuncType // method type (without receiver) Ifn_ Text // fn used in interface call (one-word receiver) Tfn_ Text // fn used for normal method call @@ -242,7 +260,7 @@ type Method struct { // Exported reports whether the method is exported. func (p *Method) Exported() bool { - return p.Name_.IsExported() + return IsExported(p.Name_) } // UncommonType is present only for defined types or types with methods @@ -250,7 +268,7 @@ func (p *Method) Exported() bool { // Using a pointer to this struct reduces the overall size required // to describe a non-defined type with no methods. type UncommonType struct { - PkgPath_ Name // import path; empty for built-in types like int, string + PkgPath_ string // import path; empty for built-in types like int, string Mcount uint16 // number of methods Xcount uint16 // number of exported methods Moff uint32 // offset from this uncommontype to [mcount]Method @@ -272,7 +290,7 @@ func (t *UncommonType) ExportedMethods() []Method { // Imethod represents a method on an interface type type Imethod struct { - Name_ Name // name of method + Name_ string // name of method Typ_ *FuncType // .(*FuncType) underneath } @@ -438,6 +456,7 @@ func addChecked(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer { return unsafe.Pointer(uintptr(p) + x) } +/* // Name is an encoded type Name with optional extra data. // // The first byte is a bit field containing: @@ -588,5 +607,6 @@ func NewName(n, tag string, exported, embedded bool) Name { return Name{Bytes: &b[0]} } +*/ // ----------------------------------------------------------------------------- diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index 8bb2787b03ac6770f8fa5d0e706047807095e08c..6b78845551b7b49e62343c1d21c6b722bb3c9053 100644 GIT binary patch literal 11825 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 Q|App%b@V?l91QG#0rq0k1poj5 literal 12124 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 CK*34? diff --git a/internal/runtime/z_face.go b/internal/runtime/z_face.go index 01907b0a..c7611fd3 100644 --- a/internal/runtime/z_face.go +++ b/internal/runtime/z_face.go @@ -86,7 +86,7 @@ func Func(in, out []*Type, variadic bool) *FuncType { } // Imethod returns an interface method. -func Imethod(name Name, typ *FuncType) abi.Imethod { +func Imethod(name string, typ *FuncType) abi.Imethod { return abi.Imethod{ Name_: name, Typ_: typ, @@ -94,7 +94,7 @@ func Imethod(name Name, typ *FuncType) abi.Imethod { } // Method returns a method. -func Method(name Name, typ *FuncType, ifn, tfn abi.Text) abi.Method { +func Method(name string, typ *FuncType, ifn, tfn abi.Text) abi.Method { return abi.Method{ Name_: name, Mtyp_: typ, @@ -104,11 +104,11 @@ func Method(name Name, typ *FuncType, ifn, tfn abi.Text) abi.Method { } // Named returns a named type. -func Named(pkgPath, name Name, underlying *Type, methods []abi.Method) *Type { +func Named(pkgPath, name string, underlying *Type, methods []abi.Method) *Type { tflag := underlying.TFlag size := typeHdrSize n := len(methods) - if n > 0 || pkgPath.Bytes != nil { + if n > 0 || pkgPath != "" { size += uncommonTypeHdrSize + uintptr(n)*methodSize tflag |= abi.TFlagUncommon } @@ -139,15 +139,15 @@ func Named(pkgPath, name Name, underlying *Type, methods []abi.Method) *Type { } // Interface returns an interface type. -func Interface(pkgPath Name, methods []abi.Imethod) *Type { +func Interface(pkgPath string, methods []abi.Imethod) *Type { ret := &abi.InterfaceType{ Type: Type{ Size_: unsafe.Sizeof(eface{}), Hash: uint32(abi.Interface), // TODO(xsw): hash Kind_: uint8(abi.Interface), }, - PkgPath: pkgPath, - Methods: methods, + PkgPath_: pkgPath, + Methods: methods, } return &ret.Type } @@ -168,7 +168,7 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { ret.fun[0] = 0 } else { data := (*uintptr)(c.Advance(ptr, int(itabHdrSize))) - mthds := methods(u, inter.PkgPath) + mthds := methods(u, inter.PkgPath_) for i, m := range inter.Methods { fn := findMethod(mthds, m) if fn == nil { @@ -182,9 +182,9 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { } func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { - imName := im.Name_.Name() + imName := im.Name_ for _, m := range mthds { - mName := m.Name_.Name() + mName := m.Name_ if mName >= imName { if mName == imName && m.Mtyp_ == im.Typ_ { return m.Ifn_ @@ -195,8 +195,8 @@ func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { return nil } -func methods(u *abi.UncommonType, from abi.Name) []abi.Method { - if u.PkgPath_.Name() == from.Name() { +func methods(u *abi.UncommonType, from string) []abi.Method { + if u.PkgPath_ == from { return u.Methods() } return u.ExportedMethods() diff --git a/internal/runtime/z_type.go b/internal/runtime/z_type.go index dfe2a4d4..aa4431bb 100644 --- a/internal/runtime/z_type.go +++ b/internal/runtime/z_type.go @@ -23,11 +23,13 @@ import ( ) type Kind = abi.Kind -type Name = abi.Name type Type = abi.Type // ----------------------------------------------------------------------------- +/* +type Name = abi.Name + // NewName creates a new name. func NewName(name string, exported bool) Name { return abi.NewName(name, "", exported, false) @@ -40,6 +42,7 @@ func NewPkgName(pkgPath string) (ret Name) { } return } +*/ // ----------------------------------------------------------------------------- @@ -102,25 +105,26 @@ func basicType(kind abi.Kind) *Type { // ----------------------------------------------------------------------------- // StructField returns a struct field. -func StructField(name string, typ *Type, off uintptr, tag string, exported, embedded bool) abi.StructField { - n := abi.NewName(name, tag, exported, embedded) +func StructField(name string, typ *Type, off uintptr, tag string, embedded bool) abi.StructField { return abi.StructField{ - Name: n, - Typ: typ, - Offset: off, + Name_: name, + Typ: typ, + Offset: off, + Tag_: tag, + Embedded_: embedded, } } // Struct returns a struct type. -func Struct(pkgPath Name, size uintptr, fields ...abi.StructField) *Type { +func Struct(pkgPath string, size uintptr, fields ...abi.StructField) *Type { ret := &abi.StructType{ Type: Type{ Size_: size, Hash: uint32(abi.Struct), // TODO(xsw): hash Kind_: uint8(abi.Struct), }, - PkgPath: pkgPath, - Fields: fields, + PkgPath_: pkgPath, + Fields: fields, } return &ret.Type } diff --git a/ssa/cl_test.go b/ssa/cl_test.go index e65de0f7..513944c1 100644 --- a/ssa/cl_test.go +++ b/ssa/cl_test.go @@ -26,7 +26,7 @@ import ( ) func TestFromTestgo(t *testing.T) { - cltest.FromDir(t, "strucintf", "../cl/_testgo", false) + cltest.FromDir(t, "", "../cl/_testgo", false) } func TestFromTestpy(t *testing.T) { diff --git a/ssa/expr.go b/ssa/expr.go index ca48328e..5e7b50af 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -91,6 +91,8 @@ func (p Program) Zero(t Type) Expr { flds[i] = p.Zero(p.rawType(u.Field(i).Type())).impl } ret = llvm.ConstStruct(flds, false) + case *types.Slice: + ret = p.Zero(p.rtType("Slice")).impl default: log.Panicln("todo:", u) } @@ -193,7 +195,8 @@ func (b Builder) Str(v string) (ret Expr) { func (b Builder) pkgName(pkgPath string) Expr { // TODO(xsw): use a global cache - return b.Call(b.Pkg.rtFunc("NewPkgName"), b.Str(pkgPath)) + // return b.Call(b.Pkg.rtFunc("NewPkgName"), b.Str(pkgPath)) + return b.Str(pkgPath) } // unsafeString(data *byte, size int) string @@ -513,38 +516,42 @@ func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock { type aPhi struct { Expr - phis []llvm.Value + // phis []llvm.Value } // Phi represents a phi node. type Phi = *aPhi +/* func (b Builder) newPhi(t Type, phis []llvm.Value) Phi { ret := b.aggregateValue(t, phis...) return &aPhi{ret, phis} } +*/ // AddIncoming adds incoming values to a phi node. func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicBlock) Expr) { bs := llvmPredBlocks(preds) - phis := p.phis - if phis != nil { - vals := make([][]llvm.Value, len(phis)) - for iblk, blk := range preds { - val := f(iblk, blk).impl - impl := b.impl - b.SetBlockEx(blk, BeforeLast, false) - for i := range phis { - if iblk == 0 { - vals[i] = make([]llvm.Value, len(preds)) + /* + phis := p.phis + if phis != nil { + vals := make([][]llvm.Value, len(phis)) + for iblk, blk := range preds { + val := f(iblk, blk).impl + impl := b.impl + b.SetBlockEx(blk, BeforeLast, false) + for i := range phis { + if iblk == 0 { + vals[i] = make([]llvm.Value, len(preds)) + } + vals[i][iblk] = llvm.CreateExtractValue(impl, val, i) } - vals[i][iblk] = llvm.CreateExtractValue(impl, val, i) } - } - for i, phi := range phis { - phi.AddIncoming(vals[i], bs) - } - } else { + for i, phi := range phis { + phi.AddIncoming(vals[i], bs) + } + } else */ + { vals := make([]llvm.Value, len(preds)) for iblk, blk := range preds { vals[iblk] = f(iblk, blk).impl @@ -556,24 +563,27 @@ func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicB // Phi returns a phi node. func (b Builder) Phi(t Type) Phi { impl := b.impl - switch tund := t.raw.Type.Underlying().(type) { - case *types.Basic: - kind := tund.Kind() - switch kind { - case types.String: - phis := createStringPhis(impl, make([]llvm.Value, 0, 2), b.Prog) + /* + switch tund := t.raw.Type.Underlying().(type) { + case *types.Basic: + kind := tund.Kind() + switch kind { + case types.String: + phis := createStringPhis(impl, make([]llvm.Value, 0, 2), b.Prog) + return b.newPhi(t, phis) + } + case *types.Struct: + phis := createStrucPhis(impl, nil, tund, b.Prog) return b.newPhi(t, phis) + default: + log.Panicf("todo: %T\n", tund) } - case *types.Struct: - phis := createStrucPhis(impl, nil, tund, b.Prog) - return b.newPhi(t, phis) - default: - log.Panicf("todo: %T\n", tund) - } + */ phi := llvm.CreatePHI(impl, t.ll) - return &aPhi{Expr{phi, t}, nil} + return &aPhi{Expr{phi, t}} //, nil} } +/* func createStringPhis(b llvm.Builder, phis []llvm.Value, prog Program) []llvm.Value { phis = append(phis, llvm.CreatePHI(b, prog.tyVoidPtr())) return append(phis, llvm.CreatePHI(b, prog.tyInt())) @@ -611,6 +621,7 @@ func createBasicPhi(b llvm.Builder, phis []llvm.Value, t types.Type, prog Progra phi := llvm.CreatePHI(b, tll) return append(phis, phi) } +*/ // ----------------------------------------------------------------------------- diff --git a/ssa/interface.go b/ssa/interface.go index 696a782f..217d231a 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -59,10 +59,19 @@ func (b Builder) abiTypeOf(t types.Type) Expr { panic("todo") } +// func Named(pkgPath, name string, underlying *Type, methods []abi.Method) func (b Builder) abiNamedOf(t *types.Named) Expr { under := b.abiTypeOf(t.Underlying()) name := NameOf(t) - return b.Call(b.Pkg.rtFunc("Named"), b.Str(name), under) + + prog := b.Prog + pkg := b.Pkg + pkgPath := b.pkgName(pkg.Path()) + fn := pkg.rtFunc("Named") + tSlice := lastParamType(prog, fn) + // TODO(xsw): methods + methods := prog.Zero(tSlice) + return b.Call(fn, pkgPath, b.Str(name), under, methods) } func (b Builder) abiPointerOf(t *types.Pointer) Expr { @@ -70,7 +79,7 @@ func (b Builder) abiPointerOf(t *types.Pointer) Expr { return b.Call(b.Pkg.rtFunc("Pointer"), elem) } -// func Struct(size uintptr, pkgPath string, fields []abi.StructField) *abi.Type +// func Struct(pkgPath string, size uintptr, fields []abi.StructField) func (b Builder) abiStructOf(t *types.Struct) Expr { pkg := b.Pkg prog := b.Prog @@ -85,20 +94,23 @@ func (b Builder) abiStructOf(t *types.Struct) Expr { flds[i] = b.structField(sfAbi, prog, f, off, t.Tag(i)) } pkgPath := b.pkgName(pkg.Path()) - params := strucAbi.raw.Type.(*types.Signature).Params() - tSlice := prog.rawType(params.At(params.Len() - 1).Type().(*types.Slice)) + tSlice := lastParamType(prog, strucAbi) fldSlice := b.SliceLit(tSlice, flds...) size := prog.IntVal(prog.SizeOf(typ), prog.Uintptr()) return b.Call(strucAbi, pkgPath, size, fldSlice) } -// func StructField(name string, typ *abi.Type, off uintptr, tag string, exported, embedded bool) abi.StructField +func lastParamType(prog Program, fn Expr) Type { + params := fn.raw.Type.(*types.Signature).Params() + return prog.rawType(params.At(params.Len() - 1).Type()) +} + +// func StructField(name string, typ *abi.Type, off uintptr, tag string, embedded bool) abi.StructField func (b Builder) structField(sfAbi Expr, prog Program, f *types.Var, offset uintptr, tag string) Expr { name := b.Str(f.Name()) typ := b.abiType(f.Type()) - exported := prog.Val(f.Exported()) embedded := prog.Val(f.Embedded()) - return b.Call(sfAbi, name, typ, prog.Val(offset), b.Str(tag), exported, embedded) + return b.Call(sfAbi, name, typ, prog.Val(offset), b.Str(tag), embedded) } // abiType returns the abi type of the specified type.