ssa: map delete, map eql nil

This commit is contained in:
visualfc
2024-06-29 21:35:20 +08:00
parent 28ebce6b65
commit 439e377111
7 changed files with 239 additions and 83 deletions

View File

@@ -5,16 +5,32 @@ func main() {
m[1] = "hello"
m[2] = "world"
m[3] = "llgo"
println(m[1], m[2], len(m))
println(m, m[1], m[2], len(m))
for k, v := range m {
println(k, ":", v)
}
s := make(map[string]int, len(m))
for k, v := range m {
s[v] = k
}
id, ok := s["llgo"]
println("llgo", id, ok)
none, ok := s["go"]
println("go", none, ok)
delete(s, "llgo")
if _, ok := s["llgo"]; ok {
panic("bad key")
}
if len(s) != 2 {
panic("bad len")
}
m2 := make(map[int]string)
println(m2, len(m2), m2 == nil, m2 != nil)
var m3 map[int]string
println(m3, len(m3), m3 == nil, m3 != nil)
}

View File

@@ -2,6 +2,7 @@
source_filename = "main"
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr }
%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 }
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
@@ -20,6 +21,9 @@ source_filename = "main"
@8 = private unnamed_addr constant [1 x i8] c":", align 1
@"map[_llgo_string]_llgo_int" = linkonce global ptr null, align 8
@9 = private unnamed_addr constant [2 x i8] c"go", align 1
@10 = private unnamed_addr constant [7 x i8] c"bad key", align 1
@_llgo_string = linkonce global ptr null, align 8
@11 = private unnamed_addr constant [7 x i8] c"bad len", align 1
define void @main.init() {
_llgo_0:
@@ -87,6 +91,8 @@ _llgo_0:
%31 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAccess1"(ptr %29, ptr %3, ptr %30)
%32 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %31, align 8
%33 = load i64, ptr %3, align 4
call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %3)
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" %28)
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" %32)
@@ -100,11 +106,11 @@ _llgo_0:
_llgo_1: ; preds = %_llgo_2, %_llgo_0
%36 = call { i1, ptr, ptr } @"github.com/goplus/llgo/internal/runtime.MapIterNext"(ptr %35)
%37 = extractvalue { i1, ptr, ptr } %36, 0
br i1 %37, label %_llgo_7, label %_llgo_8
br i1 %37, label %_llgo_11, label %_llgo_12
_llgo_2: ; preds = %_llgo_9
%38 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %110, 1
%39 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %110, 2
_llgo_2: ; preds = %_llgo_13
%38 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %157, 1
%39 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %157, 2
%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 @8, ptr %41, align 8
@@ -119,7 +125,7 @@ _llgo_2: ; preds = %_llgo_9
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
br label %_llgo_1
_llgo_3: ; preds = %_llgo_9
_llgo_3: ; preds = %_llgo_13
%44 = load i64, ptr %3, align 4
%45 = load ptr, ptr @"map[_llgo_string]_llgo_int", align 8
%46 = call ptr @"github.com/goplus/llgo/internal/runtime.MakeMap"(ptr %45, i64 %44)
@@ -130,11 +136,11 @@ _llgo_3: ; preds = %_llgo_9
_llgo_4: ; preds = %_llgo_5, %_llgo_3
%49 = call { i1, ptr, ptr } @"github.com/goplus/llgo/internal/runtime.MapIterNext"(ptr %48)
%50 = extractvalue { i1, ptr, ptr } %49, 0
br i1 %50, label %_llgo_10, label %_llgo_11
br i1 %50, label %_llgo_14, label %_llgo_15
_llgo_5: ; preds = %_llgo_12
%51 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %126, 1
%52 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %126, 2
_llgo_5: ; preds = %_llgo_16
%51 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %173, 1
%52 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %173, 2
%53 = load ptr, ptr @"map[_llgo_string]_llgo_int", align 8
%54 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %52, ptr %54, align 8
@@ -142,7 +148,7 @@ _llgo_5: ; preds = %_llgo_12
store i64 %51, ptr %55, align 4
br label %_llgo_4
_llgo_6: ; preds = %_llgo_12
_llgo_6: ; preds = %_llgo_16
%56 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%57 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %56, i32 0, i32 0
store ptr @7, ptr %57, align 8
@@ -209,69 +215,165 @@ _llgo_6: ; preds = %_llgo_12
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %91)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
%96 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%97 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %96, i32 0, i32 0
store ptr @7, ptr %97, align 8
%98 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %96, i32 0, i32 1
store i64 4, ptr %98, align 4
%99 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %96, align 8
%100 = load ptr, ptr @"map[_llgo_string]_llgo_int", align 8
%101 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %99, ptr %101, align 8
call void @"github.com/goplus/llgo/internal/runtime.MapDelete"(ptr %100, ptr %46, ptr %101)
%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 @7, 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
%106 = load ptr, ptr @"map[_llgo_string]_llgo_int", align 8
%107 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %105, ptr %107, align 8
%108 = call { ptr, i1 } @"github.com/goplus/llgo/internal/runtime.MapAccess2"(ptr %106, ptr %46, ptr %107)
%109 = extractvalue { ptr, i1 } %108, 0
%110 = load i64, ptr %109, align 4
%111 = extractvalue { ptr, i1 } %108, 1
%112 = alloca { i64, i1 }, align 8
%113 = getelementptr inbounds { i64, i1 }, ptr %112, i32 0, i32 0
store i64 %110, ptr %113, align 4
%114 = getelementptr inbounds { i64, i1 }, ptr %112, i32 0, i32 1
store i1 %111, ptr %114, align 1
%115 = load { i64, i1 }, ptr %112, align 4
%116 = extractvalue { i64, i1 } %115, 0
%117 = extractvalue { i64, i1 } %115, 1
br i1 %117, label %_llgo_7, label %_llgo_8
_llgo_7: ; preds = %_llgo_6
%118 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%119 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %118, i32 0, i32 0
store ptr @10, ptr %119, align 8
%120 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %118, i32 0, i32 1
store i64 7, ptr %120, align 4
%121 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %118, align 8
%122 = load ptr, ptr @_llgo_string, align 8
%123 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %121, ptr %123, align 8
%124 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%125 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %124, i32 0, i32 0
store ptr %122, ptr %125, align 8
%126 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %124, i32 0, i32 1
store ptr %123, ptr %126, align 8
%127 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %124, align 8
call void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface" %127)
unreachable
_llgo_8: ; preds = %_llgo_6
%128 = load i64, ptr %46, align 4
%129 = icmp ne i64 %128, 2
br i1 %129, label %_llgo_9, label %_llgo_10
_llgo_9: ; preds = %_llgo_8
%130 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%131 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %130, i32 0, i32 0
store ptr @11, ptr %131, align 8
%132 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %130, i32 0, i32 1
store i64 7, ptr %132, align 4
%133 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %130, align 8
%134 = load ptr, ptr @_llgo_string, align 8
%135 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %133, ptr %135, align 8
%136 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%137 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %136, i32 0, i32 0
store ptr %134, ptr %137, align 8
%138 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %136, i32 0, i32 1
store ptr %135, ptr %138, align 8
%139 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %136, align 8
call void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface" %139)
unreachable
_llgo_10: ; preds = %_llgo_8
%140 = load ptr, ptr @"map[_llgo_int]_llgo_string", align 8
%141 = call ptr @"github.com/goplus/llgo/internal/runtime.MakeMap"(ptr %140, i64 0)
%142 = load i64, ptr %141, align 4
call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %141)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %142)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 false)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 true)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr null)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 0)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 true)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 false)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
ret i32 0
_llgo_7: ; preds = %_llgo_1
%96 = extractvalue { i1, ptr, ptr } %36, 1
%97 = extractvalue { i1, ptr, ptr } %36, 2
%98 = load i64, ptr %96, align 4
%99 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %97, align 8
%100 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%101 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %100, i32 0, i32 0
store i1 true, ptr %101, align 1
%102 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %100, i32 0, i32 1
store i64 %98, ptr %102, align 4
%103 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %100, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" %99, ptr %103, align 8
%104 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %100, align 8
br label %_llgo_9
_llgo_11: ; preds = %_llgo_1
%143 = extractvalue { i1, ptr, ptr } %36, 1
%144 = extractvalue { i1, ptr, ptr } %36, 2
%145 = load i64, ptr %143, align 4
%146 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %144, align 8
%147 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%148 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %147, i32 0, i32 0
store i1 true, ptr %148, align 1
%149 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %147, i32 0, i32 1
store i64 %145, ptr %149, align 4
%150 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %147, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" %146, ptr %150, align 8
%151 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %147, align 8
br label %_llgo_13
_llgo_8: ; preds = %_llgo_1
%105 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%106 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %105, i32 0, i32 0
store i1 false, ptr %106, align 1
%107 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %105, i32 0, i32 1
store i64 0, ptr %107, align 4
%108 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %105, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" zeroinitializer, ptr %108, align 8
%109 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %105, align 8
br label %_llgo_9
_llgo_12: ; preds = %_llgo_1
%152 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%153 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %152, i32 0, i32 0
store i1 false, ptr %153, align 1
%154 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %152, i32 0, i32 1
store i64 0, ptr %154, align 4
%155 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %152, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" zeroinitializer, ptr %155, align 8
%156 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %152, align 8
br label %_llgo_13
_llgo_9: ; preds = %_llgo_8, %_llgo_7
%110 = phi { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } [ %104, %_llgo_7 ], [ %109, %_llgo_8 ]
%111 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %110, 0
br i1 %111, label %_llgo_2, label %_llgo_3
_llgo_13: ; preds = %_llgo_12, %_llgo_11
%157 = phi { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } [ %151, %_llgo_11 ], [ %156, %_llgo_12 ]
%158 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %157, 0
br i1 %158, label %_llgo_2, label %_llgo_3
_llgo_10: ; preds = %_llgo_4
%112 = extractvalue { i1, ptr, ptr } %49, 1
%113 = extractvalue { i1, ptr, ptr } %49, 2
%114 = load i64, ptr %112, align 4
%115 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %113, align 8
%116 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%117 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %116, i32 0, i32 0
store i1 true, ptr %117, align 1
%118 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %116, i32 0, i32 1
store i64 %114, ptr %118, align 4
%119 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %116, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" %115, ptr %119, align 8
%120 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %116, align 8
br label %_llgo_12
_llgo_14: ; preds = %_llgo_4
%159 = extractvalue { i1, ptr, ptr } %49, 1
%160 = extractvalue { i1, ptr, ptr } %49, 2
%161 = load i64, ptr %159, align 4
%162 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %160, align 8
%163 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%164 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %163, i32 0, i32 0
store i1 true, ptr %164, align 1
%165 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %163, i32 0, i32 1
store i64 %161, ptr %165, align 4
%166 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %163, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" %162, ptr %166, align 8
%167 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %163, align 8
br label %_llgo_16
_llgo_11: ; preds = %_llgo_4
%121 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%122 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %121, i32 0, i32 0
store i1 false, ptr %122, align 1
%123 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %121, i32 0, i32 1
store i64 0, ptr %123, align 4
%124 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %121, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" zeroinitializer, ptr %124, align 8
%125 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %121, align 8
br label %_llgo_12
_llgo_15: ; preds = %_llgo_4
%168 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%169 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %168, i32 0, i32 0
store i1 false, ptr %169, align 1
%170 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %168, i32 0, i32 1
store i64 0, ptr %170, align 4
%171 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %168, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" zeroinitializer, ptr %171, align 8
%172 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %168, align 8
br label %_llgo_16
_llgo_12: ; preds = %_llgo_11, %_llgo_10
%126 = phi { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } [ %120, %_llgo_10 ], [ %125, %_llgo_11 ]
%127 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %126, 0
br i1 %127, label %_llgo_5, label %_llgo_6
_llgo_16: ; preds = %_llgo_15, %_llgo_14
%173 = phi { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } [ %167, %_llgo_14 ], [ %172, %_llgo_15 ]
%174 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %173, 0
br i1 %174, label %_llgo_5, label %_llgo_6
}
declare void @"github.com/goplus/llgo/internal/runtime.init"()
@@ -468,6 +570,16 @@ _llgo_3: ; preds = %_llgo_2
br label %_llgo_4
_llgo_4: ; preds = %_llgo_3, %_llgo_2
%126 = load ptr, ptr @_llgo_string, align 8
%127 = icmp eq ptr %126, null
br i1 %127, label %_llgo_5, label %_llgo_6
_llgo_5: ; preds = %_llgo_4
%128 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24)
store ptr %128, ptr @_llgo_string, align 8
br label %_llgo_6
_llgo_6: ; preds = %_llgo_5, %_llgo_4
ret void
}
@@ -489,10 +601,12 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr, ptr, ptr)
declare ptr @"github.com/goplus/llgo/internal/runtime.MapAccess1"(ptr, ptr, ptr)
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr)
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64)
declare ptr @"github.com/goplus/llgo/internal/runtime.NewMapIter"(ptr, ptr)
@@ -502,3 +616,7 @@ declare { i1, ptr, ptr } @"github.com/goplus/llgo/internal/runtime.MapIterNext"(
declare { ptr, i1 } @"github.com/goplus/llgo/internal/runtime.MapAccess2"(ptr, ptr, ptr)
declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1)
declare void @"github.com/goplus/llgo/internal/runtime.MapDelete"(ptr, ptr, ptr)
declare void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface")

View File

@@ -57,6 +57,14 @@ func MapAccess2(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, bool)
return mapaccess2(t, h, key)
}
func MapDelete(t *maptype, h *hmap, key unsafe.Pointer) {
mapdelete(t, h, key)
}
func MapClear(t *maptype, h *hmap) {
mapclear(t, h)
}
func NewMapIter(t *maptype, h *hmap) *hiter {
var it hiter
mapiterinit(t, h, &it)

View File

@@ -289,22 +289,14 @@ func (b Builder) abiChanOf(t *types.Chan) func() Expr {
func (b Builder) abiMapOf(t *types.Map) func() Expr {
key := b.abiTypeOf(t.Key())
elem := b.abiTypeOf(t.Elem())
bucket := b.abiTypeOf(b.bucketType(t))
flags := abi.MapTypeFlags(t, (*goProgram)(b.Prog))
sizes := (*goProgram)(b.Prog)
bucket := b.abiTypeOf(abi.MapBucketType(t, sizes))
flags := abi.MapTypeFlags(t, sizes)
return func() Expr {
return b.Call(b.Pkg.rtFunc("MapOf"), key(), elem(), bucket(), b.Prog.Val(flags))
}
}
func (b Builder) bucketType(t *types.Map) types.Type {
if bucket, ok := b.Pkg.bucket[t]; ok {
return bucket
}
bucket := abi.MapBucketType(t, (*goProgram)(b.Prog))
b.Pkg.bucket[t] = bucket
return bucket
}
// func StructField(name string, typ *abi.Type, off uintptr, tag string, embedded bool)
// func Struct(pkgPath string, size uintptr, fields []abi.StructField)
func (b Builder) abiStructOf(t *types.Struct) func() Expr {

View File

@@ -150,6 +150,9 @@ func (b Builder) MapLen(x Expr) Expr {
log.Printf("MapLen %v\n", x.impl)
}
prog := b.Prog
if x.impl.IsNull() {
return prog.Val(0)
}
x.Type = prog.Pointer(prog.Int())
return b.Load(x)
}
@@ -607,7 +610,6 @@ func (b Builder) Next(typ Type, iter Expr, isString bool) Expr {
b.SetBlockEx(blks[2], AtEnd, false)
b.blk.last = blks[2].last
return phi.Expr
}
// The MakeChan instruction creates a new channel object and yields a

View File

@@ -596,6 +596,13 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr {
case token.NEQ:
return Expr{b.impl.CreateICmp(llvm.IntNE, dx, dy, ""), tret}
}
case vkMap:
switch op {
case token.EQL:
return b.Prog.BoolVal(x.impl.IsNull() == y.impl.IsNull())
case token.NEQ:
return b.Prog.BoolVal(x.impl.IsNull() != y.impl.IsNull())
}
case vkIface, vkEface:
toEface := func(x Expr, emtpy bool) Expr {
if emtpy {
@@ -1082,6 +1089,21 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
return b.StringData(args[0]) // TODO(xsw): check return type
case "SliceData":
return b.SliceData(args[0]) // TODO(xsw): check return type
case "delete":
if len(args) == 2 && args[0].kind == vkMap {
m := args[0]
t := b.abiType(m.raw.Type)
ptr := b.mapKeyPtr(args[1])
b.Call(b.Pkg.rtFunc("MapDelete"), t, m, ptr)
return
}
case "clear":
if len(args) == 1 && args[0].kind == vkMap {
m := args[0]
t := b.abiType(m.raw.Type)
b.Call(b.Pkg.rtFunc("MapClear"), t, m)
return
}
}
panic("todo: " + fn)
}

View File

@@ -326,13 +326,12 @@ func (p Program) NewPackage(name, pkgPath string) Package {
pymods := make(map[string]Global)
strs := make(map[string]llvm.Value)
named := make(map[types.Type]Expr)
bucket := make(map[*types.Map]types.Type)
p.NeedRuntime = false
// Don't need reset p.needPyInit here
// p.needPyInit = false
ret := &aPackage{
mod: mod, vars: gbls, fns: fns, stubs: stubs,
pyobjs: pyobjs, pymods: pymods, strs: strs, named: named, bucket: bucket, Prog: p}
pyobjs: pyobjs, pymods: pymods, strs: strs, named: named, Prog: p}
ret.abi.Init(pkgPath)
return ret
}
@@ -577,7 +576,6 @@ type aPackage struct {
pymods map[string]Global
strs map[string]llvm.Value
named map[types.Type]Expr
bucket map[*types.Map]types.Type
afterb unsafe.Pointer
patch func(types.Type) types.Type