remove abi.Name

This commit is contained in:
xushiwei
2024-05-26 17:53:29 +08:00
parent ddabfdca3d
commit eae94c5f23
14 changed files with 333 additions and 562 deletions

View File

@@ -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())
}

View File

@@ -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)

View File

@@ -158,118 +158,85 @@ _llgo_10: ; preds = %_llgo_0
%45 = getelementptr inbounds { { i64 }, i1 }, ptr %43, i32 0, i32 1 %45 = getelementptr inbounds { { i64 }, i1 }, ptr %43, i32 0, i32 1
store i1 true, ptr %45, align 1 store i1 true, ptr %45, align 1
%46 = load { { i64 }, i1 }, ptr %43, align 4 %46 = load { { i64 }, i1 }, ptr %43, align 4
%47 = extractvalue { { i64 }, i1 } %46, 0
%48 = extractvalue { { i64 }, i1 } %46, 1
br label %_llgo_12 br label %_llgo_12
_llgo_11: ; preds = %_llgo_0 _llgo_11: ; preds = %_llgo_0
%49 = alloca { { i64 }, i1 }, align 8 %47 = alloca { { i64 }, i1 }, align 8
%50 = getelementptr inbounds { { i64 }, i1 }, ptr %49, i32 0, i32 0 %48 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 0
store { i64 } zeroinitializer, ptr %50, align 4 store { i64 } zeroinitializer, ptr %48, align 4
%51 = getelementptr inbounds { { i64 }, i1 }, ptr %49, i32 0, i32 1 %49 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 1
store i1 false, ptr %51, align 1 store i1 false, ptr %49, align 1
%52 = load { { i64 }, i1 }, ptr %49, align 4 %50 = load { { i64 }, i1 }, ptr %47, align 4
%53 = extractvalue { { i64 }, i1 } %52, 0
%54 = extractvalue { { i64 }, i1 } %52, 1
br label %_llgo_12 br label %_llgo_12
_llgo_12: ; preds = %_llgo_11, %_llgo_10 _llgo_12: ; preds = %_llgo_11, %_llgo_10
%55 = phi i64 [ %47, %_llgo_10 ], [ %53, %_llgo_11 ] %51 = phi { { i64 }, i1 } [ %46, %_llgo_10 ], [ %50, %_llgo_11 ]
%56 = phi i1 [ %48, %_llgo_10 ], [ %54, %_llgo_11 ] %52 = extractvalue { { i64 }, i1 } %51, 0
%57 = alloca { { i64 }, i1 }, align 8 store { i64 } %52, ptr %4, align 4
%58 = getelementptr inbounds { { i64 }, i1 }, ptr %57, i32 0, i32 0 %53 = extractvalue { { i64 }, i1 } %51, 1
store i64 %55, ptr %58, align 4 br i1 %53, label %_llgo_1, label %_llgo_3
%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
_llgo_13: ; preds = %_llgo_2 _llgo_13: ; preds = %_llgo_2
%63 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1 %54 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1
%64 = ptrtoint ptr %63 to i64 %55 = ptrtoint ptr %54 to i64
%65 = alloca { i64 }, align 8 %56 = alloca { i64 }, align 8
%66 = getelementptr inbounds { i64 }, ptr %65, i32 0, i32 0 %57 = getelementptr inbounds { i64 }, ptr %56, i32 0, i32 0
store i64 %64, ptr %66, align 4 store i64 %55, ptr %57, align 4
%67 = load { i64 }, ptr %65, align 4 %58 = load { i64 }, ptr %56, align 4
%68 = alloca { { i64 }, i1 }, align 8 %59 = alloca { { i64 }, i1 }, align 8
%69 = getelementptr inbounds { { i64 }, i1 }, ptr %68, i32 0, i32 0 %60 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 0
store { i64 } %67, ptr %69, align 4 store { i64 } %58, ptr %60, align 4
%70 = getelementptr inbounds { { i64 }, i1 }, ptr %68, i32 0, i32 1 %61 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 1
store i1 true, ptr %70, align 1 store i1 true, ptr %61, align 1
%71 = load { { i64 }, i1 }, ptr %68, align 4 %62 = load { { i64 }, i1 }, ptr %59, align 4
%72 = extractvalue { { i64 }, i1 } %71, 0
%73 = extractvalue { { i64 }, i1 } %71, 1
br label %_llgo_15 br label %_llgo_15
_llgo_14: ; preds = %_llgo_2 _llgo_14: ; preds = %_llgo_2
%74 = alloca { { i64 }, i1 }, align 8 %63 = alloca { { i64 }, i1 }, align 8
%75 = getelementptr inbounds { { i64 }, i1 }, ptr %74, i32 0, i32 0 %64 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 0
store { i64 } zeroinitializer, ptr %75, align 4 store { i64 } zeroinitializer, ptr %64, align 4
%76 = getelementptr inbounds { { i64 }, i1 }, ptr %74, i32 0, i32 1 %65 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 1
store i1 false, ptr %76, align 1 store i1 false, ptr %65, align 1
%77 = load { { i64 }, i1 }, ptr %74, align 4 %66 = load { { i64 }, i1 }, ptr %63, align 4
%78 = extractvalue { { i64 }, i1 } %77, 0
%79 = extractvalue { { i64 }, i1 } %77, 1
br label %_llgo_15 br label %_llgo_15
_llgo_15: ; preds = %_llgo_14, %_llgo_13 _llgo_15: ; preds = %_llgo_14, %_llgo_13
%80 = phi i64 [ %72, %_llgo_13 ], [ %78, %_llgo_14 ] %67 = phi { { i64 }, i1 } [ %62, %_llgo_13 ], [ %66, %_llgo_14 ]
%81 = phi i1 [ %73, %_llgo_13 ], [ %79, %_llgo_14 ] %68 = extractvalue { { i64 }, i1 } %67, 0
%82 = alloca { { i64 }, i1 }, align 8 store { i64 } %68, ptr %12, align 4
%83 = getelementptr inbounds { { i64 }, i1 }, ptr %82, i32 0, i32 0 %69 = extractvalue { { i64 }, i1 } %67, 1
store i64 %80, ptr %83, align 4 br i1 %69, label %_llgo_4, label %_llgo_6
%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
_llgo_16: ; preds = %_llgo_5 _llgo_16: ; preds = %_llgo_5
%88 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1 %70 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1
%89 = ptrtoint ptr %88 to i64 %71 = ptrtoint ptr %70 to i64
%90 = alloca { i64 }, align 8 %72 = alloca { i64 }, align 8
%91 = getelementptr inbounds { i64 }, ptr %90, i32 0, i32 0 %73 = getelementptr inbounds { i64 }, ptr %72, i32 0, i32 0
store i64 %89, ptr %91, align 4 store i64 %71, ptr %73, align 4
%92 = load { i64 }, ptr %90, align 4 %74 = load { i64 }, ptr %72, align 4
%93 = alloca { { i64 }, i1 }, align 8 %75 = alloca { { i64 }, i1 }, align 8
%94 = getelementptr inbounds { { i64 }, i1 }, ptr %93, i32 0, i32 0 %76 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 0
store { i64 } %92, ptr %94, align 4 store { i64 } %74, ptr %76, align 4
%95 = getelementptr inbounds { { i64 }, i1 }, ptr %93, i32 0, i32 1 %77 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 1
store i1 true, ptr %95, align 1 store i1 true, ptr %77, align 1
%96 = load { { i64 }, i1 }, ptr %93, align 4 %78 = load { { i64 }, i1 }, ptr %75, align 4
%97 = extractvalue { { i64 }, i1 } %96, 0
%98 = extractvalue { { i64 }, i1 } %96, 1
br label %_llgo_18 br label %_llgo_18
_llgo_17: ; preds = %_llgo_5 _llgo_17: ; preds = %_llgo_5
%99 = alloca { { i64 }, i1 }, align 8 %79 = alloca { { i64 }, i1 }, align 8
%100 = getelementptr inbounds { { i64 }, i1 }, ptr %99, i32 0, i32 0 %80 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 0
store { i64 } zeroinitializer, ptr %100, align 4 store { i64 } zeroinitializer, ptr %80, align 4
%101 = getelementptr inbounds { { i64 }, i1 }, ptr %99, i32 0, i32 1 %81 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 1
store i1 false, ptr %101, align 1 store i1 false, ptr %81, align 1
%102 = load { { i64 }, i1 }, ptr %99, align 4 %82 = load { { i64 }, i1 }, ptr %79, align 4
%103 = extractvalue { { i64 }, i1 } %102, 0
%104 = extractvalue { { i64 }, i1 } %102, 1
br label %_llgo_18 br label %_llgo_18
_llgo_18: ; preds = %_llgo_17, %_llgo_16 _llgo_18: ; preds = %_llgo_17, %_llgo_16
%105 = phi i64 [ %97, %_llgo_16 ], [ %103, %_llgo_17 ] %83 = phi { { i64 }, i1 } [ %78, %_llgo_16 ], [ %82, %_llgo_17 ]
%106 = phi i1 [ %98, %_llgo_16 ], [ %104, %_llgo_17 ] %84 = extractvalue { { i64 }, i1 } %83, 0
%107 = alloca { { i64 }, i1 }, align 8 store { i64 } %84, ptr %23, align 4
%108 = getelementptr inbounds { { i64 }, i1 }, ptr %107, i32 0, i32 0 %85 = extractvalue { { i64 }, i1 } %83, 1
store i64 %105, ptr %108, align 4 br i1 %85, label %_llgo_7, label %_llgo_9
%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
} }
declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64)

View File

@@ -20,6 +20,7 @@ func Bar(v any) (ret foo.Foo, ok bool) {
func main() { func main() {
ret, ok := Foo(nil) ret, ok := Foo(nil)
println(ret.pb, ret.f, "notOk:", !ok) println(ret.pb, ret.f, "notOk:", !ok)
ret2, ok2 := Bar(foo.Foo{}) ret2, ok2 := Bar(foo.Foo{})
println(ret2.Pb(), ret2.F, ok2) println(ret2.Pb(), ret2.F, ok2)
} }

View File

@@ -1,103 +1,77 @@
; ModuleID = 'main' ; ModuleID = 'main'
source_filename = "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 } %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/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.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 }
%"github.com/goplus/llgo/internal/abi.Name" = type { ptr }
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
@"main.init$guard" = global ptr null @"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 @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_argc = global ptr null
@__llgo_argv = global ptr null @__llgo_argv = global ptr null
@0 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1 @2 = private unnamed_addr constant [5 x i8] c"main\00", align 1
@1 = private unnamed_addr constant [3 x i8] c"pb\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 @"*_llgo_byte" = linkonce global ptr null
@2 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 @5 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
@3 = private unnamed_addr constant [2 x i8] c"F\00", align 1 @6 = private unnamed_addr constant [2 x i8] c"f\00", align 1
@4 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 @7 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1 @8 = 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 @9 = private unnamed_addr constant [9 x i8] c"main.bar\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
}
define { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" %0) { define { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" %0) {
_llgo_0: _llgo_0:
%1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 %1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%2 = load ptr, ptr @main.bar, align 8 %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0
%3 = icmp eq ptr %1, %2 store ptr @0, ptr %2, align 8
br i1 %3, label %_llgo_1, label %_llgo_2 %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 _llgo_1: ; preds = %_llgo_0
%4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 %8 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1
%5 = load %main.bar, ptr %4, align 8 %9 = load %main.bar, ptr %8, 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
%10 = alloca { %main.bar, i1 }, align 8 %10 = alloca { %main.bar, i1 }, align 8
%11 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 0 %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 %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 %13 = load { %main.bar, i1 }, ptr %10, align 8
br label %_llgo_3 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 _llgo_3: ; preds = %_llgo_2, %_llgo_1
%14 = phi { %main.bar, i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ] %18 = phi { %main.bar, i1 } [ %13, %_llgo_1 ], [ %17, %_llgo_2 ]
%15 = extractvalue { %main.bar, i1 } %14, 0 %19 = extractvalue { %main.bar, i1 } %18, 0
%16 = extractvalue { %main.bar, i1 } %14, 1 %20 = extractvalue { %main.bar, i1 } %18, 1
%mrv = insertvalue { %main.bar, i1 } poison, %main.bar %15, 0 %21 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%mrv1 = insertvalue { %main.bar, i1 } %mrv, i1 %16, 1 %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 ret { %main.bar, i1 } %mrv1
} }
@@ -108,7 +82,6 @@ _llgo_0:
_llgo_1: ; preds = %_llgo_0 _llgo_1: ; preds = %_llgo_0
store i1 true, ptr @"main.init$guard", align 1 store i1 true, ptr @"main.init$guard", align 1
call void @"github.com/goplus/llgo/cl/internal/foo.init"()
call void @"main.init$abi"() call void @"main.init$abi"()
br label %_llgo_2 br label %_llgo_2
@@ -122,62 +95,46 @@ _llgo_0:
store ptr %1, ptr @__llgo_argv, align 8 store ptr %1, ptr @__llgo_argv, align 8
call void @"github.com/goplus/llgo/internal/runtime.init"() call void @"github.com/goplus/llgo/internal/runtime.init"()
call void @main.init() call void @main.init()
%2 = alloca %main.bar, align 8 %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%3 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %2, i64 16) %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0
%4 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer) store ptr @2, ptr %3, align 8
%5 = extractvalue { %main.bar, i1 } %4, 0 %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1
store %main.bar %5, ptr %3, align 8 store i64 4, ptr %4, align 4
%6 = extractvalue { %main.bar, i1 } %4, 1 %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8
%7 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 0 call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %5)
%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)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
%17 = alloca %"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 %6 = alloca %main.bar, align 8
%18 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %17, i64 16) %7 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %6, i64 16)
%19 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 %8 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer)
%20 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) %9 = extractvalue { %main.bar, i1 } %8, 0
store %"github.com/goplus/llgo/cl/internal/foo.Foo" zeroinitializer, ptr %20, align 8 store %main.bar %9, ptr %7, align 8
%21 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %10 = extractvalue { %main.bar, i1 } %8, 1
%22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 0 %11 = getelementptr inbounds %main.bar, ptr %7, i32 0, i32 0
store ptr %19, ptr %22, align 8 %12 = load ptr, ptr %11, align 8
%23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 1 %13 = getelementptr inbounds %main.bar, ptr %7, i32 0, i32 1
store ptr %20, ptr %23, align 8 %14 = load float, ptr %13, align 4
%24 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, align 8 %15 = xor i1 %10, true
%25 = call { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %24) %16 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%26 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 0 %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 0
store %"github.com/goplus/llgo/cl/internal/foo.Foo" %26, ptr %18, align 8 store ptr @3, ptr %17, align 8
%27 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 1 %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1
%28 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, align 8 store i64 6, ptr %18, align 4
%29 = call ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo" %28) %19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8
%30 = getelementptr inbounds %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, i32 0, i32 1 call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %12)
%31 = load float, ptr %30, align 4
call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %29)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
%32 = fpext float %31 to double %20 = fpext float %14 to double
call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %32) 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.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) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
ret i32 0 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"() 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.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.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 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"() { define void @"main.init$abi"() {
_llgo_0: _llgo_0:
%0 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 %0 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%1 = icmp eq ptr %0, null %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 0
br i1 %1, label %_llgo_1, label %_llgo_2 store ptr @4, ptr %1, align 8
%2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 1
_llgo_1: ; preds = %_llgo_0 store i64 2, ptr %2, align 4
%2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %0, align 8
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 %4 = load ptr, ptr @"*_llgo_byte", align 8
store ptr @1, ptr %3, align 8 %5 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 0
store i64 2, ptr %4, align 4 store ptr @5, ptr %6, align 8
%5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1
%6 = load ptr, ptr @"*_llgo_byte", align 8 store i64 0, ptr %7, align 4
%7 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8
%8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 0 %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)
store ptr @2, ptr %8, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 1 %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 0
store i64 0, ptr %9, align 4 store ptr @6, ptr %11, align 8
%10 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %7, align 8 %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1
%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) store i64 1, ptr %12, align 4
%12 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8
%13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 0 %14 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13)
store ptr @3, ptr %13, align 8 %15 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 1 %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 0
store i64 1, ptr %14, align 4 store ptr @7, ptr %16, align 8
%15 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1
%16 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) store i64 0, ptr %17, align 4
%17 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8
%18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 0 %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)
store ptr @4, ptr %18, align 8 %20 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 1 %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 0
store i64 0, ptr %19, align 4 store ptr @8, ptr %21, align 8
%20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %17, align 8 %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 1
%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) store i64 4, ptr %22, align 4
%22 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %23 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %20, align 8
%23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 0 %24 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112)
store ptr @5, ptr %23, align 8 %25 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %24, i64 0
%24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 1 store %"github.com/goplus/llgo/internal/abi.StructField" %9, ptr %25, align 8
store i64 4, ptr %24, align 4 %26 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %24, i64 1
%25 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %22, align 8 store %"github.com/goplus/llgo/internal/abi.StructField" %19, ptr %26, align 8
%26 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48) %27 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%27 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %26, i64 0 %28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 0
store %"github.com/goplus/llgo/internal/abi.StructField" %11, ptr %27, align 8 store ptr %24, ptr %28, align 8
%28 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %26, i64 1 %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 1
store %"github.com/goplus/llgo/internal/abi.StructField" %21, ptr %28, align 8 store i64 2, ptr %29, align 4
%29 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 2
%30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 0 store i64 2, ptr %30, align 4
store ptr %26, ptr %30, align 8 %31 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, align 8
%31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 1 %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)
store i64 2, ptr %31, align 4 %33 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 2 %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 0
store i64 2, ptr %32, align 4 store ptr @9, ptr %34, align 8
%33 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, align 8 %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 1
%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) store i64 8, ptr %35, align 4
%35 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %36 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %33, align 8
%36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 0 %37 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %36, ptr %32)
store ptr @6, ptr %36, align 8 store ptr %37, ptr @main.bar, 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
ret void 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.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")

View File

@@ -25,37 +25,26 @@ _llgo_0:
%4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1
store i64 0, ptr %4, align 4 store i64 0, ptr %4, align 4
%5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 %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 br label %_llgo_1
_llgo_1: ; preds = %_llgo_2, %_llgo_0 _llgo_1: ; preds = %_llgo_2, %_llgo_0
%8 = phi ptr [ %6, %_llgo_0 ], [ %22, %_llgo_2 ] %6 = phi %"github.com/goplus/llgo/internal/runtime.String" [ %5, %_llgo_0 ], [ %14, %_llgo_2 ]
%9 = phi i64 [ %7, %_llgo_0 ], [ %23, %_llgo_2 ] %7 = phi i64 [ -1, %_llgo_0 ], [ %8, %_llgo_2 ]
%10 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %8 = add i64 %7, 1
%11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 0 %9 = icmp slt i64 %8, %1
store ptr %8, ptr %11, align 8 br i1 %9, label %_llgo_2, label %_llgo_3
%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
_llgo_2: ; preds = %_llgo_1 _llgo_2: ; preds = %_llgo_1
%17 = icmp slt i64 %15, 0 %10 = icmp slt i64 %8, 0
call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %17) call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %10)
%18 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 %11 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0
%19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i64 %15 %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i64 %8
%20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8 %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, 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) %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)
%22 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %21, 0
%23 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %21, 1
br label %_llgo_1 br label %_llgo_1
_llgo_3: ; preds = %_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) { define %"github.com/goplus/llgo/internal/runtime.String" @main.info(%"github.com/goplus/llgo/internal/runtime.String" %0) {

Binary file not shown.

View File

@@ -20,6 +20,15 @@ import (
"unsafe" "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. // Type is the runtime representation of a Go type.
@@ -46,7 +55,7 @@ type Type struct {
// If the KindGCProg bit is set in kind, GCData is a GC program. // If the KindGCProg bit is set in kind, GCData is a GC program.
// Otherwise it is a ptrmask bitmap. See mbitmap.go for details. // Otherwise it is a ptrmask bitmap. See mbitmap.go for details.
GCData *byte GCData *byte
Str_ Name // string form Str_ string // string form
PtrToThis_ *Type // type for pointer to this type, may be nil PtrToThis_ *Type // type for pointer to this type, may be nil
} }
@@ -209,24 +218,33 @@ func (p *FuncType) Variadic() bool {
} }
type StructField struct { type StructField struct {
Name Name // name is always non-empty Name_ string // name is always non-empty
Typ *Type // type of field Typ *Type // type of field
Offset uintptr // byte offset of field Offset uintptr // byte offset of field
Tag_ string
Embedded_ bool
} }
// Embedded reports whether the field is embedded.
func (f *StructField) Embedded() bool { 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 StructType struct {
Type Type
PkgPath Name PkgPath_ string
Fields []StructField Fields []StructField
} }
type InterfaceType struct { type InterfaceType struct {
Type Type
PkgPath Name // import path PkgPath_ string // import path
Methods []Imethod // sorted by hash Methods []Imethod // sorted by hash
} }
@@ -234,7 +252,7 @@ type Text = unsafe.Pointer // TODO(xsw): to be confirmed
// Method on non-interface type // Method on non-interface type
type Method struct { type Method struct {
Name_ Name // name of method Name_ string // name of method
Mtyp_ *FuncType // method type (without receiver) Mtyp_ *FuncType // method type (without receiver)
Ifn_ Text // fn used in interface call (one-word receiver) Ifn_ Text // fn used in interface call (one-word receiver)
Tfn_ Text // fn used for normal method call Tfn_ Text // fn used for normal method call
@@ -242,7 +260,7 @@ type Method struct {
// Exported reports whether the method is exported. // Exported reports whether the method is exported.
func (p *Method) Exported() bool { func (p *Method) Exported() bool {
return p.Name_.IsExported() return IsExported(p.Name_)
} }
// UncommonType is present only for defined types or types with methods // 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 // Using a pointer to this struct reduces the overall size required
// to describe a non-defined type with no methods. // to describe a non-defined type with no methods.
type UncommonType struct { 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 Mcount uint16 // number of methods
Xcount uint16 // number of exported methods Xcount uint16 // number of exported methods
Moff uint32 // offset from this uncommontype to [mcount]Method 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 // Imethod represents a method on an interface type
type Imethod struct { type Imethod struct {
Name_ Name // name of method Name_ string // name of method
Typ_ *FuncType // .(*FuncType) underneath 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) return unsafe.Pointer(uintptr(p) + x)
} }
/*
// Name is an encoded type Name with optional extra data. // Name is an encoded type Name with optional extra data.
// //
// The first byte is a bit field containing: // 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]} return Name{Bytes: &b[0]}
} }
*/
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

Binary file not shown.

View File

@@ -86,7 +86,7 @@ func Func(in, out []*Type, variadic bool) *FuncType {
} }
// Imethod returns an interface method. // Imethod returns an interface method.
func Imethod(name Name, typ *FuncType) abi.Imethod { func Imethod(name string, typ *FuncType) abi.Imethod {
return abi.Imethod{ return abi.Imethod{
Name_: name, Name_: name,
Typ_: typ, Typ_: typ,
@@ -94,7 +94,7 @@ func Imethod(name Name, typ *FuncType) abi.Imethod {
} }
// Method returns a method. // 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{ return abi.Method{
Name_: name, Name_: name,
Mtyp_: typ, Mtyp_: typ,
@@ -104,11 +104,11 @@ func Method(name Name, typ *FuncType, ifn, tfn abi.Text) abi.Method {
} }
// Named returns a named type. // 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 tflag := underlying.TFlag
size := typeHdrSize size := typeHdrSize
n := len(methods) n := len(methods)
if n > 0 || pkgPath.Bytes != nil { if n > 0 || pkgPath != "" {
size += uncommonTypeHdrSize + uintptr(n)*methodSize size += uncommonTypeHdrSize + uintptr(n)*methodSize
tflag |= abi.TFlagUncommon tflag |= abi.TFlagUncommon
} }
@@ -139,14 +139,14 @@ func Named(pkgPath, name Name, underlying *Type, methods []abi.Method) *Type {
} }
// Interface returns an interface 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{ ret := &abi.InterfaceType{
Type: Type{ Type: Type{
Size_: unsafe.Sizeof(eface{}), Size_: unsafe.Sizeof(eface{}),
Hash: uint32(abi.Interface), // TODO(xsw): hash Hash: uint32(abi.Interface), // TODO(xsw): hash
Kind_: uint8(abi.Interface), Kind_: uint8(abi.Interface),
}, },
PkgPath: pkgPath, PkgPath_: pkgPath,
Methods: methods, Methods: methods,
} }
return &ret.Type return &ret.Type
@@ -168,7 +168,7 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab {
ret.fun[0] = 0 ret.fun[0] = 0
} else { } else {
data := (*uintptr)(c.Advance(ptr, int(itabHdrSize))) data := (*uintptr)(c.Advance(ptr, int(itabHdrSize)))
mthds := methods(u, inter.PkgPath) mthds := methods(u, inter.PkgPath_)
for i, m := range inter.Methods { for i, m := range inter.Methods {
fn := findMethod(mthds, m) fn := findMethod(mthds, m)
if fn == nil { if fn == nil {
@@ -182,9 +182,9 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab {
} }
func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text {
imName := im.Name_.Name() imName := im.Name_
for _, m := range mthds { for _, m := range mthds {
mName := m.Name_.Name() mName := m.Name_
if mName >= imName { if mName >= imName {
if mName == imName && m.Mtyp_ == im.Typ_ { if mName == imName && m.Mtyp_ == im.Typ_ {
return m.Ifn_ return m.Ifn_
@@ -195,8 +195,8 @@ func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text {
return nil return nil
} }
func methods(u *abi.UncommonType, from abi.Name) []abi.Method { func methods(u *abi.UncommonType, from string) []abi.Method {
if u.PkgPath_.Name() == from.Name() { if u.PkgPath_ == from {
return u.Methods() return u.Methods()
} }
return u.ExportedMethods() return u.ExportedMethods()

View File

@@ -23,11 +23,13 @@ import (
) )
type Kind = abi.Kind type Kind = abi.Kind
type Name = abi.Name
type Type = abi.Type type Type = abi.Type
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
/*
type Name = abi.Name
// NewName creates a new name. // NewName creates a new name.
func NewName(name string, exported bool) Name { func NewName(name string, exported bool) Name {
return abi.NewName(name, "", exported, false) return abi.NewName(name, "", exported, false)
@@ -40,6 +42,7 @@ func NewPkgName(pkgPath string) (ret Name) {
} }
return return
} }
*/
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
@@ -102,24 +105,25 @@ func basicType(kind abi.Kind) *Type {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// StructField returns a struct field. // StructField returns a struct field.
func StructField(name string, typ *Type, off uintptr, tag string, exported, embedded bool) abi.StructField { func StructField(name string, typ *Type, off uintptr, tag string, embedded bool) abi.StructField {
n := abi.NewName(name, tag, exported, embedded)
return abi.StructField{ return abi.StructField{
Name: n, Name_: name,
Typ: typ, Typ: typ,
Offset: off, Offset: off,
Tag_: tag,
Embedded_: embedded,
} }
} }
// Struct returns a struct type. // 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{ ret := &abi.StructType{
Type: Type{ Type: Type{
Size_: size, Size_: size,
Hash: uint32(abi.Struct), // TODO(xsw): hash Hash: uint32(abi.Struct), // TODO(xsw): hash
Kind_: uint8(abi.Struct), Kind_: uint8(abi.Struct),
}, },
PkgPath: pkgPath, PkgPath_: pkgPath,
Fields: fields, Fields: fields,
} }
return &ret.Type return &ret.Type

View File

@@ -26,7 +26,7 @@ import (
) )
func TestFromTestgo(t *testing.T) { func TestFromTestgo(t *testing.T) {
cltest.FromDir(t, "strucintf", "../cl/_testgo", false) cltest.FromDir(t, "", "../cl/_testgo", false)
} }
func TestFromTestpy(t *testing.T) { func TestFromTestpy(t *testing.T) {

View File

@@ -91,6 +91,8 @@ func (p Program) Zero(t Type) Expr {
flds[i] = p.Zero(p.rawType(u.Field(i).Type())).impl flds[i] = p.Zero(p.rawType(u.Field(i).Type())).impl
} }
ret = llvm.ConstStruct(flds, false) ret = llvm.ConstStruct(flds, false)
case *types.Slice:
ret = p.Zero(p.rtType("Slice")).impl
default: default:
log.Panicln("todo:", u) log.Panicln("todo:", u)
} }
@@ -193,7 +195,8 @@ func (b Builder) Str(v string) (ret Expr) {
func (b Builder) pkgName(pkgPath string) Expr { func (b Builder) pkgName(pkgPath string) Expr {
// TODO(xsw): use a global cache // 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 // unsafeString(data *byte, size int) string
@@ -513,20 +516,23 @@ func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock {
type aPhi struct { type aPhi struct {
Expr Expr
phis []llvm.Value // phis []llvm.Value
} }
// Phi represents a phi node. // Phi represents a phi node.
type Phi = *aPhi type Phi = *aPhi
/*
func (b Builder) newPhi(t Type, phis []llvm.Value) Phi { func (b Builder) newPhi(t Type, phis []llvm.Value) Phi {
ret := b.aggregateValue(t, phis...) ret := b.aggregateValue(t, phis...)
return &aPhi{ret, phis} return &aPhi{ret, phis}
} }
*/
// AddIncoming adds incoming values to a phi node. // AddIncoming adds incoming values to a phi node.
func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicBlock) Expr) { func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicBlock) Expr) {
bs := llvmPredBlocks(preds) bs := llvmPredBlocks(preds)
/*
phis := p.phis phis := p.phis
if phis != nil { if phis != nil {
vals := make([][]llvm.Value, len(phis)) vals := make([][]llvm.Value, len(phis))
@@ -544,7 +550,8 @@ func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicB
for i, phi := range phis { for i, phi := range phis {
phi.AddIncoming(vals[i], bs) phi.AddIncoming(vals[i], bs)
} }
} else { } else */
{
vals := make([]llvm.Value, len(preds)) vals := make([]llvm.Value, len(preds))
for iblk, blk := range preds { for iblk, blk := range preds {
vals[iblk] = f(iblk, blk).impl vals[iblk] = f(iblk, blk).impl
@@ -556,6 +563,7 @@ func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicB
// Phi returns a phi node. // Phi returns a phi node.
func (b Builder) Phi(t Type) Phi { func (b Builder) Phi(t Type) Phi {
impl := b.impl impl := b.impl
/*
switch tund := t.raw.Type.Underlying().(type) { switch tund := t.raw.Type.Underlying().(type) {
case *types.Basic: case *types.Basic:
kind := tund.Kind() kind := tund.Kind()
@@ -570,10 +578,12 @@ func (b Builder) Phi(t Type) Phi {
default: default:
log.Panicf("todo: %T\n", tund) log.Panicf("todo: %T\n", tund)
} }
*/
phi := llvm.CreatePHI(impl, t.ll) 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 { func createStringPhis(b llvm.Builder, phis []llvm.Value, prog Program) []llvm.Value {
phis = append(phis, llvm.CreatePHI(b, prog.tyVoidPtr())) phis = append(phis, llvm.CreatePHI(b, prog.tyVoidPtr()))
return append(phis, llvm.CreatePHI(b, prog.tyInt())) 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) phi := llvm.CreatePHI(b, tll)
return append(phis, phi) return append(phis, phi)
} }
*/
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@@ -59,10 +59,19 @@ func (b Builder) abiTypeOf(t types.Type) Expr {
panic("todo") panic("todo")
} }
// func Named(pkgPath, name string, underlying *Type, methods []abi.Method)
func (b Builder) abiNamedOf(t *types.Named) Expr { func (b Builder) abiNamedOf(t *types.Named) Expr {
under := b.abiTypeOf(t.Underlying()) under := b.abiTypeOf(t.Underlying())
name := NameOf(t) 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 { 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) 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 { func (b Builder) abiStructOf(t *types.Struct) Expr {
pkg := b.Pkg pkg := b.Pkg
prog := b.Prog 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)) flds[i] = b.structField(sfAbi, prog, f, off, t.Tag(i))
} }
pkgPath := b.pkgName(pkg.Path()) pkgPath := b.pkgName(pkg.Path())
params := strucAbi.raw.Type.(*types.Signature).Params() tSlice := lastParamType(prog, strucAbi)
tSlice := prog.rawType(params.At(params.Len() - 1).Type().(*types.Slice))
fldSlice := b.SliceLit(tSlice, flds...) fldSlice := b.SliceLit(tSlice, flds...)
size := prog.IntVal(prog.SizeOf(typ), prog.Uintptr()) size := prog.IntVal(prog.SizeOf(typ), prog.Uintptr())
return b.Call(strucAbi, pkgPath, size, fldSlice) 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 { func (b Builder) structField(sfAbi Expr, prog Program, f *types.Var, offset uintptr, tag string) Expr {
name := b.Str(f.Name()) name := b.Str(f.Name())
typ := b.abiType(f.Type()) typ := b.abiType(f.Type())
exported := prog.Val(f.Exported())
embedded := prog.Val(f.Embedded()) 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. // abiType returns the abi type of the specified type.