From c673489461ba94c2230218e2de29f156f74482d4 Mon Sep 17 00:00:00 2001 From: visualfc Date: Fri, 31 May 2024 14:22:17 +0800 Subject: [PATCH] ssa: fix llvm named in func --- cl/_testgo/eface/in.go | 24 +++- cl/_testgo/eface/out.ll | 242 ++++++++++++++++++++++++++++++---- internal/abi/llgo_autogen.lla | Bin 3555 -> 3631 bytes ssa/package.go | 5 +- ssa/type.go | 12 +- ssa/type_cvt.go | 11 +- 6 files changed, 257 insertions(+), 37 deletions(-) diff --git a/cl/_testgo/eface/in.go b/cl/_testgo/eface/in.go index 8b04a217..339af7ce 100644 --- a/cl/_testgo/eface/in.go +++ b/cl/_testgo/eface/in.go @@ -6,6 +6,12 @@ import ( "github.com/goplus/llgo/internal/abi" ) +type T string + +func (t *T) Invoke() { + println("invoke") +} + type eface struct { _type *abi.Type data unsafe.Pointer @@ -36,6 +42,8 @@ func main() { y int z int }{}) + var t T + dump(t) } func dump(v any) { @@ -45,5 +53,19 @@ func dump(v any) { func dumpTyp(t *abi.Type, sep string) { print(sep) - println(t.Kind(), t.Size_, t.PtrBytes, t.Hash, t.TFlag, t.Align_) + println(t.Kind(), t.Size_, t.PtrBytes, t.Hash, t.TFlag, t.Align_, t.PtrToThis_, t.Uncommon()) + if t.Elem() != nil { + dumpTyp(t.Elem(), sep+"\telem: ") + } + if t.Uncommon() != nil { + dumpUncommon(t.Uncommon(), sep+"\tuncomm: ") + if t.PtrToThis_ != nil { + dumpUncommon(t.PtrToThis_.Uncommon(), sep+"\tuncomm: ") + } + } +} + +func dumpUncommon(u *abi.UncommonType, sep string) { + print(sep) + println(u.PkgPath_, u.Mcount, u.Xcount) } diff --git a/cl/_testgo/eface/out.ll b/cl/_testgo/eface/out.ll index 800ed1db..af51095f 100644 --- a/cl/_testgo/eface/out.ll +++ b/cl/_testgo/eface/out.ll @@ -1,15 +1,21 @@ ; ModuleID = 'main' source_filename = "main" +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } %"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } %main.eface = type { ptr, ptr } -%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } %"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, { ptr, ptr }, ptr, %"github.com/goplus/llgo/internal/runtime.String", ptr } +%"github.com/goplus/llgo/internal/abi.UncommonType" = type { %"github.com/goplus/llgo/internal/runtime.String", i16, i16, i32 } %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, 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.Method" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, ptr, ptr } @"main.init$guard" = global ptr null -@0 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@0 = private unnamed_addr constant [7 x i8] c"invoke\00", align 1 +@1 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@2 = private unnamed_addr constant [8 x i8] c"\09elem: \00", align 1 +@3 = private unnamed_addr constant [10 x i8] c"\09uncomm: \00", align 1 +@4 = private unnamed_addr constant [10 x i8] c"\09uncomm: \00", align 1 @__llgo_argc = global ptr null @__llgo_argv = global ptr null @_llgo_bool = linkonce global ptr null @@ -30,16 +36,34 @@ source_filename = "main" @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac" = linkonce global ptr null @"*_llgo_int" = linkonce global ptr null @"[]_llgo_int" = linkonce global ptr null -@1 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@5 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 @_llgo_string = linkonce global ptr null @"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM" = global ptr null -@2 = private unnamed_addr constant [2 x i8] c"x\00", align 1 -@3 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@4 = private unnamed_addr constant [2 x i8] c"y\00", align 1 -@5 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@6 = private unnamed_addr constant [2 x i8] c"z\00", align 1 +@6 = private unnamed_addr constant [2 x i8] c"x\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 +@8 = private unnamed_addr constant [2 x i8] c"y\00", align 1 +@9 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@10 = private unnamed_addr constant [2 x i8] c"z\00", align 1 +@11 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@12 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@13 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@_llgo_main.T = linkonce global ptr null +@14 = private unnamed_addr constant [7 x i8] c"Invoke\00", align 1 +@15 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@16 = private unnamed_addr constant [7 x i8] c"main.T\00", align 1 + +define void @"main.(*T).Invoke"(ptr %0) { +_llgo_0: + %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 6, 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) + ret void +} define void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %0) { _llgo_0: @@ -49,7 +73,7 @@ _llgo_0: %3 = load ptr, ptr %2, align 8 %4 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 0 - store ptr @0, ptr %5, align 8 + store ptr @1, ptr %5, align 8 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 0, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 @@ -71,20 +95,98 @@ _llgo_0: %10 = load i8, ptr %9, align 1 %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 4 %12 = load i8, ptr %11, align 1 + %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 10 + %14 = load ptr, ptr %13, align 8 + %15 = call ptr @"github.com/goplus/llgo/internal/abi.(*Type).Uncommon"(ptr %0) call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %2) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %4) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %6) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %13 = zext i32 %8 to i64 - call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %13) + %16 = zext i32 %8 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %16) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %14 = zext i8 %10 to i64 - call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %14) + %17 = zext i8 %10 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %17) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %15 = zext i8 %12 to i64 - call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %15) + %18 = zext i8 %12 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %18) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %14) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %15) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %19 = call ptr @"github.com/goplus/llgo/internal/abi.(*Type).Elem"(ptr %0) + %20 = icmp ne ptr %19, null + br i1 %20, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %21 = call ptr @"github.com/goplus/llgo/internal/abi.(*Type).Elem"(ptr %0) + %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 @2, ptr %23, align 8 + %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 1 + store i64 7, ptr %24, align 4 + %25 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %22, align 8 + %26 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %1, %"github.com/goplus/llgo/internal/runtime.String" %25) + call void @main.dumpTyp(ptr %21, %"github.com/goplus/llgo/internal/runtime.String" %26) + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + %27 = call ptr @"github.com/goplus/llgo/internal/abi.(*Type).Uncommon"(ptr %0) + %28 = icmp ne ptr %27, null + br i1 %28, label %_llgo_3, label %_llgo_4 + +_llgo_3: ; preds = %_llgo_2 + %29 = call ptr @"github.com/goplus/llgo/internal/abi.(*Type).Uncommon"(ptr %0) + %30 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %30, i32 0, i32 0 + store ptr @3, ptr %31, align 8 + %32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %30, i32 0, i32 1 + store i64 9, ptr %32, align 4 + %33 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %30, align 8 + %34 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %1, %"github.com/goplus/llgo/internal/runtime.String" %33) + call void @main.dumpUncommon(ptr %29, %"github.com/goplus/llgo/internal/runtime.String" %34) + %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 10 + %36 = load ptr, ptr %35, align 8 + %37 = icmp ne ptr %36, null + br i1 %37, label %_llgo_5, label %_llgo_4 + +_llgo_4: ; preds = %_llgo_5, %_llgo_3, %_llgo_2 + ret void + +_llgo_5: ; preds = %_llgo_3 + %38 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 10 + %39 = load ptr, ptr %38, align 8 + %40 = call ptr @"github.com/goplus/llgo/internal/abi.(*Type).Uncommon"(ptr %39) + %41 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %41, i32 0, i32 0 + store ptr @4, ptr %42, align 8 + %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %41, i32 0, i32 1 + store i64 9, ptr %43, align 4 + %44 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %41, align 8 + %45 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %1, %"github.com/goplus/llgo/internal/runtime.String" %44) + call void @main.dumpUncommon(ptr %40, %"github.com/goplus/llgo/internal/runtime.String" %45) + br label %_llgo_4 +} + +define void @main.dumpUncommon(ptr %0, %"github.com/goplus/llgo/internal/runtime.String" %1) { +_llgo_0: + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.UncommonType", ptr %0, i32 0, i32 0 + %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.UncommonType", ptr %0, i32 0, i32 1 + %5 = load i16, ptr %4, align 2 + %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.UncommonType", ptr %0, i32 0, i32 2 + %7 = load i16, ptr %6, align 2 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %3) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + %8 = zext i16 %5 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %8) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + %9 = zext i16 %7 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %9) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) ret void } @@ -269,7 +371,7 @@ _llgo_0: call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %99) %100 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %101 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %100, i32 0, i32 0 - store ptr @1, ptr %101, align 8 + store ptr @5, ptr %101, align 8 %102 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %100, i32 0, i32 1 store i64 5, ptr %102, align 4 %103 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %100, align 8 @@ -293,18 +395,42 @@ _llgo_0: store ptr %111, ptr %114, align 8 %115 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %112, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %115) + %116 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %117 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %116, i32 0, i32 0 + store ptr @13, ptr %117, align 8 + %118 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %116, i32 0, i32 1 + store i64 0, ptr %118, align 4 + %119 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %116, align 8 + %120 = load ptr, ptr @_llgo_main.T, align 8 + %121 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/internal/runtime.String" %119, ptr %121, align 8 + %122 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %123 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %122, i32 0, i32 0 + store ptr %120, ptr %123, align 8 + %124 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %122, i32 0, i32 1 + store ptr %121, ptr %124, align 8 + %125 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %122, align 8 + call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %125) ret i32 0 } -declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) - 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 ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) + declare i64 @"github.com/goplus/llgo/internal/abi.(*Type).Kind"(ptr) +declare ptr @"github.com/goplus/llgo/internal/abi.(*Type).Uncommon"(ptr) + declare void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64) -declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) +declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) + +declare ptr @"github.com/goplus/llgo/internal/abi.(*Type).Elem"(ptr) + +declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String") declare void @"github.com/goplus/llgo/internal/abi.init"() @@ -528,46 +654,46 @@ _llgo_38: ; preds = %_llgo_37, %_llgo_36 %74 = load ptr, ptr @_llgo_int, align 8 %75 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 0 - store ptr @2, ptr %76, align 8 + store ptr @6, ptr %76, align 8 %77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 1 store i64 1, ptr %77, align 4 %78 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %75, align 8 %79 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %80 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %79, i32 0, i32 0 - store ptr @3, ptr %80, align 8 + store ptr @7, ptr %80, align 8 %81 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %79, i32 0, i32 1 store i64 0, ptr %81, align 4 %82 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %79, align 8 %83 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %78, ptr %72, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %82, i1 false) %84 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %85 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %84, i32 0, i32 0 - store ptr @4, ptr %85, align 8 + store ptr @8, ptr %85, align 8 %86 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %84, i32 0, i32 1 store i64 1, ptr %86, align 4 %87 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %84, align 8 %88 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %89 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %88, i32 0, i32 0 - store ptr @5, ptr %89, align 8 + store ptr @9, ptr %89, align 8 %90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %88, i32 0, i32 1 store i64 0, ptr %90, align 4 %91 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %88, align 8 %92 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %87, ptr %73, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %91, i1 false) %93 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %94 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 0 - store ptr @6, ptr %94, align 8 + store ptr @10, ptr %94, align 8 %95 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 1 store i64 1, ptr %95, align 4 %96 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %93, align 8 %97 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %98 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %97, i32 0, i32 0 - store ptr @7, ptr %98, align 8 + store ptr @11, ptr %98, align 8 %99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %97, i32 0, i32 1 store i64 0, ptr %99, align 4 %100 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %97, align 8 %101 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %96, ptr %74, i64 16, %"github.com/goplus/llgo/internal/runtime.String" %100, i1 false) %102 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %103 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %102, i32 0, i32 0 - store ptr @8, ptr %103, align 8 + store ptr @12, ptr %103, align 8 %104 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %102, i32 0, i32 1 store i64 4, ptr %104, align 4 %105 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %102, align 8 @@ -588,6 +714,64 @@ _llgo_38: ; preds = %_llgo_37, %_llgo_36 %114 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, align 8 %115 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %105, i64 24, %"github.com/goplus/llgo/internal/runtime.Slice" %114) store ptr %115, ptr @"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM", align 8 + %116 = load ptr, ptr @_llgo_main.T, align 8 + %117 = icmp eq ptr %116, null + br i1 %117, label %_llgo_39, label %_llgo_40 + +_llgo_39: ; preds = %_llgo_38 + %118 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 24, i64 0, i64 1) + store ptr %118, ptr @_llgo_main.T, align 8 + br label %_llgo_40 + +_llgo_40: ; preds = %_llgo_39, %_llgo_38 + %119 = load ptr, ptr @_llgo_string, align 8 + br i1 %117, label %_llgo_41, label %_llgo_42 + +_llgo_41: ; preds = %_llgo_40 + %120 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %121 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %120, i32 0, i32 0 + store ptr @14, ptr %121, align 8 + %122 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %120, i32 0, i32 1 + store i64 6, ptr %122, align 4 + %123 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %120, align 8 + %124 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %125 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8 + %126 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %125, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %123, ptr %126, align 8 + %127 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %125, i32 0, i32 1 + store ptr %124, ptr %127, align 8 + %128 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %125, i32 0, i32 2 + store ptr @"main.(*T).Invoke", ptr %128, align 8 + %129 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %125, i32 0, i32 3 + store ptr @"main.(*T).Invoke", ptr %129, align 8 + %130 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %125, align 8 + %131 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40) + %132 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %131, i64 0 + store %"github.com/goplus/llgo/internal/abi.Method" %130, ptr %132, align 8 + %133 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %134 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 0 + store ptr %131, ptr %134, align 8 + %135 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 1 + store i64 1, ptr %135, align 4 + %136 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 2 + store i64 1, ptr %136, align 4 + %137 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, align 8 + %138 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %139 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %138, i32 0, i32 0 + store ptr @15, ptr %139, align 8 + %140 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %138, i32 0, i32 1 + store i64 4, ptr %140, align 4 + %141 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %138, align 8 + %142 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %143 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %142, i32 0, i32 0 + store ptr @16, ptr %143, align 8 + %144 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %142, i32 0, i32 1 + store i64 6, ptr %144, align 4 + %145 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %142, align 8 + call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %118, %"github.com/goplus/llgo/internal/runtime.String" %141, %"github.com/goplus/llgo/internal/runtime.String" %145, ptr %119, { ptr, i64, i64 } zeroinitializer, %"github.com/goplus/llgo/internal/runtime.Slice" %137) + br label %_llgo_42 + +_llgo_42: ; preds = %_llgo_41, %_llgo_40 ret void } @@ -611,3 +795,7 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.SliceOf"(ptr) declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice") declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1) + +declare ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64, i64, i64) + +declare void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice") diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index a0a579856ac4774ed1c5c194cd6daf14110046f5..4d1e9792d36f00740c4ec604825b2ed6702d9431 100644 GIT binary patch delta 3575 zcmV@6aWAK2moYqzgWW;r|)|W003{|000jF8~|)=XK!C&b#!lM zWo|BPY*kbV00Y}=S!Ud8kvJWHBn#FIMruly?QGbgL$3phyA1`l-7mYMP;Au^PLXr6 z)XQ4*e?LmHD2kF3QRJ7FjSN^C$CmW?A>Vs^UrO{3)-Rh?8v1YlZvAL|yAG1u^yX^0 zxqG?Z+=uD*Wf-nEFM}xYu}tE*=Tgp<#Sg* z#j*F-?|GFzDo{+vcjl?zJ134>*yBjkFZ zIHb`5a!}r8FFtxp-w>I9a=by%WG4OM-Rtq#{72onnA?$A?u^}y@{`-mO3J1-4;^#X zbiDGrBv!=H`BHgD8M{~#r_1E$zz=m`&E2NQ!2yvp_*A@X%UbhCL_c`9iKJV_0qJ6B zc1U@xf?`)&>qn`KmBR03oj*OFNW&@J7E2~QC(@R&EQ&VGmLE}nEC8WxbEIvnrjlse zrqZ^tnHbtMSK72Po1-n8Nn2K*IHB#E#Xx z^ol%vFmc$?$<@Puazn$l^*3uGoXD0u(cPXCjaL50AoBCsbvHaOzGGg0dG%9vnzI)f zor}q(^=0%SJK)3Q`;lc`WQ|?>i68oRew1XN38EWn#%kLmycCxxa#Z{= z07vayjTUJ4Fg9l!1R?nmB-pRrzv{XCNFlW~Lc6#9BZyYR03`2cobB2@temF~0*(CG zshhul)X3|@Jy`xqr)a|fiED17rHr}!HFfy)Z^7q*Fqijh&UWp7&52Zlpd;_vjTUIn zo=gEeQbK}%{d#g{si~j~KTf+jin@>E0x$by*bJrWtN4J6J}ewS%~z2zQ1W5j3RLlN zgwO>acJx5%y^4;Rau16LSM61tpv4~6!#dS^{iyuYKi05QS*|X zhRsl_-ii;n>czt8SoQWJ^M*G1NV#yP>y9%9v;b_d0cimoA+#2N9Xk*$prT_&3&0}6 zX#o`{s1|_rFzs4EMFpt^V4>*N0xBkGEdc9Fht~osl29!`2IGlq0Tpqm7JzkV?OFgw z1+N8vV4WJI1yqFKS^$<$cP)VQfb%ae4!l*cJTx4oYw+hMwevgK`5k)xaO17=#{&y& z)t%$?{V9Fli?X-rXU7(qWq)+(AA{xHy_J!rZ%oIzvAO3G`gYH7R+|o@m6-b6^GM_v zkq}&yk)|{hVMZVYR%Z-g0!TChBdAVefRJ{7u}0uyK(R3plt8kL$O^697#L3w0Y~6u zM#V7z3n%3W#GrbP0sqr3>Ii(0%8mg%y5${#4qD?e;Aw{!dIY9WwMQE0iAz2Ld#LVX zz}>ZrKO!Hz0%XADK{AlQ3a$kiAf;ardb@q|aKDKYpJweIe%?yae@J3)nSAoXv`?IW z&X|!BRIbBp*E_c%g%WcU=R%AfC#Vc(atpTz18`@AFTV>r+xlod6r43 zBWY;Xq|}`D3^b-vIpe&+lTwbVYgp5ohBYfOrD3jD&D?P&QZY<30gEHNo|c$wRZKgD z?4uWM{qm%a%1QI~&4u<|(Dq&LhCzFOL#8U%q@SY>o)ZceJ(J*W3WSyjt36zfLL989z-2)RGD8sr86B_`2u0IT1nlKY2IMWMLxF^? ziVs@Sf{q-Bn8nzbk+GnFZ~_*i1eLC!zNKBXVoZ>76%>hXp^6bfOH@!VI=nc4#W+G` zDG7)tE=V!nP$>%P%GyP!iV0qRg1R$Ecw&6uk`t5;;_jnj!|ltfN_0YzDR%aL989jN z^xK;{*P;p$W>E@6g?}1S-fZT|gkHU8bbD89XN*=F-mzVik3wmvsKAv52{J=b8Wu=Jg9OAAR~i^^sL}v+W$j8s#RRW3K;0RnG%!AJr2$F@vgZl= z)){nl%YVJiQPj6Q8F+;&MQ12AE=LGl<%015>RgVEfl3$bT%cN)XN0bQcEKYEQtxtn z%v8K!NVuApBL%H`!G5N_?&Y{3D_<}c-L)@A1zr7uJ?ilFFUJyE0ZV~A@fw(84y}U0 zZmqoz=DFZ2VX$k1YGIBMycz}*Lae-VU(9@Y_2%xzU#)=4@BG(5w<4O>*5CsoE~*o5 zbz4h|(Kj4C+2ZHB4(c6$V?>(azsveKv>BcaUYwEQGZ=M-V}zDxz<@gHGkxhm_dG$f z(Z1mcPsW6F1r9za?TV)a7q7r$2%}zcgbc}7U`#;$ierTpu)yA?U%}$YKqV|N80{Js z#|188f&FR#Di%i*D`QEaJarw5qmC7_z|O5-$>PZvkg~uIj?%J!I7)ai3(N>|cZUh} zU_TN;y;`)XSGhQ|^&gUa&kEa0HdzCCA98w*4heNYeX=vTEZfSq#NF-0Lgu3bY{gQJ zoG1-Lts9pVtySuhN5u$D*LbR=*WTm)e|z<~qj&Qi1jJ@=BU@|gJ{-9+Tlox zWEWxvny{2J>26Ld>e?hjWrAuzX5QbO?f_<~T@+;KB=!1vlKQmPYrI?RgKXnyu3Hqb znTrv#t}&wgmK54s4x2E4E(3?t5;&$xJf4umhf?Nf-eVM5<~X%7hc;F$bA;a0x+`eD znW;+H>aY}l01a5=v;&qwLEdC|b9#g~yYv(OJD{A}&ck9c1&j*H8o_=z*EM~h?;UA1 zH6btksT*#VUY`?kCsHch+bx|pWbJLTiFd(h(pI|XwLR1d!mP+5O?eySH6N0TVqd9` z=Cwu<7Az57Uq9ltm-M>PFw-x395z!}>?1^5h%MxQ3Z&Z-M|DgPTde8(Fzb5{sDZW7 z4l7#1Oo+73g!(Sx$t-e0r!MYkPhFH(B!@mBA+-rfR;V0sLIUa6e3qlj2O2`6Tlayd zz7N6GvJhgIvmvE{v}MtQjoH1*Epv|ffR<0v^GOGb7g|h=SPh(tzd z+LH$tTSG>fb%1DBOQ{kmWlzuBZ7HR;03@cA#!@fWsS;UbA4CmVW!?p1&pW)cHTv%I zYB?|5-5s`jxU<;)dJ8LX_^Up0YYg{*?@X+8?6T5fLxaZItlZ&7hL|d`WsP(nefHyj zO%Mf1KwCtA*H;cHC+(;Ehuwfy^p9ijJ~gdLk2AK&M-QPNXRCb2EA)~<2)(vprMJ6C z;;mM%Z~f(es%PcLMbw`4Qe;U{l&eqWJBFM}80BJ)T?;zubK$c2#Xz^V$ zM0vok{{Ql0obncYQgrEb*R?a(b!NqXui0O+IGj}}#V>9TNxd*Io6s81fQQd~*_ zXTBk3KKnWIooMDG1Im2lIr9mbPs0c#y+)udX1{EN(DNoVc9#ojTwu!v2en{#+b_K$ zDI+EQc(TbyOMYuub_{*R7rQRk-cOrg)v>`@4mo=vnmMtAeWALa?3;D!#j7)aemQNI zQALTcp>}D@sJmcCtRzl-Jq>8j{YvSUjKx_%)^9zR^PB5b=!Y}Au8gs@e$CIwlIB&a z-MEw%%e|^K6lF_kJ;k-1iE?FY4r$) zYJY#I<`VTHGQUUWuJ z=mQ-??rWuIUvTjg{-nc@`$Rr~3bxd001@6aWAK2mpCRzgQKj6qPRx0017|000jF8~|)=XK!C&b#!lM zWo|BPY*kbV00U(kS!QP&kvJWH1Pj&-Mruly?QGbgL$3phyA1`l-7mYMP;503PLXr6 z+{;?@e?LmHNQ#mZQRJ7FjSN^C$CgBX9^ZR>UrO{3&M)iLHV)tZ-TBe^_9n`1x7U}; z_1(*x^?khEyo}?U^~)&9!ZZoum%(-P?P#;!rpxfd$0!by;4Y-copm^W?rbzV@AA3J zpVBn=>-WFz!!vs3jQ;CIXf6LM+xjEY%-l2WcfxMNiZCYg_9_>5P@q?^T_DtBj^{+P+*yuR0wTB~kXx%{EAX3m3YH*VjQ@IAOAl zaVfem|R@ zepO`fqjs)F4~%;lD_jOaNPPrJ?KkdU^%~|#A+>eFxVQa(BT81o0Hp3`LfegdSXDF* z0*(6EsW*TBs8N@9da(SJPSJ(|64%{EPZ@LdYnt%u-=fb0VXp4iLfeh|wNPUYf{wat zH+o<^d$I!lNC`>pHOO%ByzEn9GnA^2^8puqSU7;1kCU-b@?qTy zRPhOf&;=iVcJx5%Jx<3?xrarBtM)i2Xt9U&uuipJKPvwWk2UP@mYa?@=<*lqONXz1 zIZ0^otAg>wYhO+rTKZxg+IZzFP{9|zSf>Wny_^ud?8WkdRK3;24PEuJ3F47dy#g0_ z)vLm0C{-`#1Fm|pa5`4K{m8tbojy`7Leovh84Fr}05;fwv;ct+S_{CA9f%gd>DbW% zu!wM40OthN0;!rIB>(Iuv z0D%f#3&1)xNDJVE;93BdPj@YV^nmlPAdP}mv^+E%t!s$qC$;l?`T0G1{&*d%il=)@ zZ2ZoDar*w0z8@s{+w`+zhs^Rn`t*;{^6uWr$yQS;vIRtX?T&U$Bi}on|NFtYPeW?+AFH!} zOe!78K({89=Co&^F_p?27ag8da#UTzn$|R|S%qmE7kbsqALk+!!!(nyc+%@>g~`>$ zv{T4F2Jt4WPU`8LwCLYl>fbr--_>pyw0C5xb4`jzy!s;Frs6ir`}JqpGycBweoX&( zK4*XNocDrIxagS#cT*s=L|DzVjzk=PVp^zTM9>ly)Qb);PBD&9 zSxN!oi3?JUH&lv(y0UQ*iZj8>Pf<2~Ug*?w5OU$wem=nQ~))-p9cd zs!Gp2wR0`16k!&XKveptCFRX!u1x6Fdq%f+<$k1SrQsdh_Vg%}22KU8G$@c6iqgR7 zfRzR)8i3NkxL8mcpbiC68aN-c(f}Pf5T${!v7s)!UUYb+fpLT?4GIu{Ph4qWyrD`1)Rm1Z4V(#HX@I&jNNHev;7S9O4rI?0 z_N_JO>Xv^!&XLr&A{lsvt3+ogHLgGiT;+oC0P0+UjfF}V>|CH)S7d~)cEKYEQtt|U z>{Ps9NVu9;AO)>@!G31E?iIKoD_<}c)3vWa1zr7uJ?ilFufP&o0V{!jJnU=FQ< z!ESB54i>rKD`Bu}gKA-c5xg1(6GE)K3*W1Harx%%I$W)Q%kSd1xV9pi*4E%7A}^{F zVRhR`kI^?AJlW&tyAJAxu_DcgUqyQy+Kk8sFU~0O8H_q3Fha{SU_c%9nZ9(Od!C@# z7~k+jBx6Im0tX+Ib|q4Of{Rz+F@#aC1VWbND=;RYekHKN3RqxoGp}F?WS|lj7>scZ zOW*<*vA}*c02NE1iIuUGP@cMuB~Zr-SzzZjuVjg2EJ#^k2S;gH0wuhd1!e@fyTgWh zupfz}UM%4=a4|zRDhk`nwKiQdFRDETCTjK6^Vj=U<0k&eP zMozMgW1}0Fl)cq5$)jR~p=&%<(i^vU_}^X@_snj-gZ!duwi9&W&GZ9&6CSR$GV__) zE~nU?+Sl#a<6lL_b_bIB<+t{0W@N{n!eH~Zv9sV~XD&wv>9ucUBcFT=q+Jf4umhf?Mk-eVM5=6JO-hjvyjb0q5--4(Rh z%v2|Abyy031}t*g0n4HwZ!^4kJ;Iw?`HA=)P+o24VY!$BMg?t+U_YFznm*9?jIgta1%G}Ud8S7Jymi+wE{ z&1;<^ELbAEzJA2(AnSFbVXj~FIBce|*hh%55L?O>NVg@P?wBC1T+{bq*7qJz3u~ht zR%LHUHsFYx@fOR4t+vGY7>%wyihsdgal&OVwPjd2O2`6U-yBh zz7N4SvJm1{vmvd4v|-VMjoH1*Epv|ffR<0T9ooAvvM$2bVj8v=h7xFPejew?l99j~xU1|jUamX+P^qDZh>y}k{X|KZQZkIR@n>!rYwvIy6I zpT2htIa~-8Vvbu2I{Gu=u5IyK+A^)TW!6J`@0ua11AYzvR~+M2x7?G`q|=>gXTI;v z%3t%p|`OWj+HV zkn|dXuAKey5kk+K(b!!roC$#~9~`uQ1-sjP=@m&8De1?vbun6sTfy>U=qs_<^@aX^ zT1Tsn9nN#e*$cUu6Gz$ys{6^lx!DHk>P%cd+htT)8f@rX#xm+I*byg7x1pI1wC8@U zbW6taEFiaA&*l5(x)l0h%&se8Y;E80GqI$36~6nH)`P2V?ZN84x7)W`1ipcP)R3*B zeqVsh%dI`CY|=81J}LTamPa0|#n}Y9S=MP;L_oFQ9=iF&!n0FDwu*s=&2X6ozA@O4 zEu-!)5-wZ}>-=!nvvD4MAPyJRpwD>?*)Upn_U(^ky7oYBy>?pW;G}SQ1-;?hkS(Gf zx$3m`$1L2#U2QgmKI%1O16q7nhR)S^&c$T(gg(GAWLs-J>w=4)@FyFFY!meWD&cC4 zpvyQ&F(K5%lX5-Q2`+l|N^d1*Ts~#h{Bbe*KTt~n0v-bt000080C_~eSQV-il`jnd Y03P0x-VG=MWgC+S4j~434FCWD0F9}u)c^nh diff --git a/ssa/package.go b/ssa/package.go index cac873e6..8ddd4865 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -112,7 +112,8 @@ type aProgram struct { target *Target td llvm.TargetData // tm llvm.TargetMachine - named map[string]llvm.Type + named map[string]llvm.Type + fnnamed map[string]int intType llvm.Type int1Type llvm.Type @@ -195,7 +196,7 @@ func NewProgram(target *Target) Program { return &aProgram{ ctx: ctx, gocvt: newGoTypes(), target: target, td: td, is32Bits: is32Bits, - ptrSize: td.PointerSize(), named: make(map[string]llvm.Type), + ptrSize: td.PointerSize(), named: make(map[string]llvm.Type), fnnamed: make(map[string]int), } } diff --git a/ssa/type.go b/ssa/type.go index e7e4c65e..f75b9fe3 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -451,10 +451,20 @@ func (p Program) retType(raw *types.Signature) Type { } } +func (p Program) llvmNameOf(named *types.Named) (name string) { + name = NameOf(named) + if obj := named.Obj(); obj != nil && obj.Parent() != nil && obj.Parent() != obj.Pkg().Scope() { + index := p.fnnamed[name] + p.fnnamed[name] = index + 1 + name += fmt.Sprintf("#%v", index) + } + return name +} + func (p Program) toNamed(raw *types.Named) Type { switch t := raw.Underlying().(type) { case *types.Struct: - name := NameOf(raw) + name := p.llvmNameOf(raw) return &aType{p.toLLVMNamedStruct(name, t), rawType{raw}, vkStruct} default: typ := p.rawType(t) diff --git a/ssa/type_cvt.go b/ssa/type_cvt.go index 22ba6ea9..dc462c0c 100644 --- a/ssa/type_cvt.go +++ b/ssa/type_cvt.go @@ -27,12 +27,12 @@ import ( type goTypes struct { typs map[unsafe.Pointer]unsafe.Pointer - named map[string]*types.Named + named map[*types.Named]*types.Named // named => raw } func newGoTypes() goTypes { typs := make(map[unsafe.Pointer]unsafe.Pointer) - named := make(map[string]*types.Named) + named := make(map[*types.Named]*types.Named) return goTypes{typs, named} } @@ -121,8 +121,7 @@ func (p goTypes) cvtNamed(t *types.Named) (raw *types.Named, cvt bool) { defer func() { p.typs[unsafe.Pointer(t)] = unsafe.Pointer(raw) }() - id := t.String() - if named, ok := p.named[id]; ok { + if named, ok := p.named[t]; ok { return named, false } @@ -133,8 +132,8 @@ func (p goTypes) cvtNamed(t *types.Named) (raw *types.Named, cvt bool) { methods[i] = m } named := types.NewNamed(t.Obj(), types.Typ[types.Int], methods) - p.named[id] = named - defer delete(p.named, id) + p.named[t] = named + defer delete(p.named, t) if tund, cvt := p.cvtType(t.Underlying()); cvt { named.SetUnderlying(tund) return named, true