ssa: index take addr

This commit is contained in:
visualfc
2024-07-02 21:14:36 +08:00
parent 46423ed166
commit 28d8c56534
9 changed files with 466 additions and 91 deletions

View File

@@ -1,5 +1,7 @@
package main
type N [1]int
func main() {
m := make(map[int]string)
m[1] = "hello"
@@ -33,4 +35,13 @@ func main() {
println(m2, len(m2), m2 == nil, m2 != nil)
var m3 map[int]string
println(m3, len(m3), m3 == nil, m3 != nil)
n := make(map[any]int)
n[N{1}] = 100
n[N{2}] = 200
n[N{3}] = 300
n[N{2}] = -200
for k, v := range n {
println(k.(N)[0], v)
}
}

View File

@@ -5,6 +5,7 @@ source_filename = "main"
%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr }
%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 }
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
%"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, { ptr, ptr }, ptr, %"github.com/goplus/llgo/internal/runtime.String", ptr }
@"main.init$guard" = global i1 false, align 1
@__llgo_argc = global i32 0, align 4
@@ -24,6 +25,12 @@ source_filename = "main"
@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
@"map[_llgo_any]_llgo_int" = linkonce global ptr null, align 8
@_llgo_main.N = linkonce global ptr null, align 8
@_llgo_int = linkonce global ptr null, align 8
@"[1]_llgo_int" = linkonce global ptr null, align 8
@12 = private unnamed_addr constant [1 x i8] c"N", align 1
@13 = private unnamed_addr constant [21 x i8] c"type assertion failed", align 1
define void @main.init() {
_llgo_0:
@@ -106,11 +113,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_11, label %_llgo_12
br i1 %37, label %_llgo_14, label %_llgo_15
_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
_llgo_2: ; preds = %_llgo_16
%38 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %224, 1
%39 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %224, 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
@@ -125,7 +132,7 @@ _llgo_2: ; preds = %_llgo_13
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
br label %_llgo_1
_llgo_3: ; preds = %_llgo_13
_llgo_3: ; preds = %_llgo_16
%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)
@@ -136,11 +143,11 @@ _llgo_3: ; preds = %_llgo_13
_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_14, label %_llgo_15
br i1 %50, label %_llgo_17, label %_llgo_18
_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
_llgo_5: ; preds = %_llgo_19
%51 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %240, 1
%52 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %240, 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
@@ -148,7 +155,7 @@ _llgo_5: ; preds = %_llgo_16
store i64 %51, ptr %55, align 4
br label %_llgo_4
_llgo_6: ; preds = %_llgo_16
_llgo_6: ; preds = %_llgo_19
%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
@@ -311,69 +318,224 @@ _llgo_10: ; preds = %_llgo_8
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)
%143 = load ptr, ptr @"map[_llgo_any]_llgo_int", align 8
%144 = call ptr @"github.com/goplus/llgo/internal/runtime.MakeMap"(ptr %143, i64 0)
%145 = alloca [1 x i64], align 8
%146 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %145, i64 8)
%147 = getelementptr inbounds i64, ptr %146, i64 0
store i64 1, ptr %147, align 4
%148 = load [1 x i64], ptr %146, align 4
%149 = load ptr, ptr @_llgo_main.N, align 8
%150 = extractvalue [1 x i64] %148, 0
%151 = inttoptr i64 %150 to ptr
%152 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%153 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %152, i32 0, i32 0
store ptr %149, ptr %153, align 8
%154 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %152, i32 0, i32 1
store ptr %151, ptr %154, align 8
%155 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %152, align 8
%156 = load ptr, ptr @"map[_llgo_any]_llgo_int", align 8
%157 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.eface" %155, ptr %157, align 8
%158 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr %156, ptr %144, ptr %157)
store i64 100, ptr %158, align 4
%159 = alloca [1 x i64], align 8
%160 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %159, i64 8)
%161 = getelementptr inbounds i64, ptr %160, i64 0
store i64 2, ptr %161, align 4
%162 = load [1 x i64], ptr %160, align 4
%163 = load ptr, ptr @_llgo_main.N, align 8
%164 = extractvalue [1 x i64] %162, 0
%165 = inttoptr i64 %164 to ptr
%166 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%167 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %166, i32 0, i32 0
store ptr %163, ptr %167, align 8
%168 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %166, i32 0, i32 1
store ptr %165, ptr %168, align 8
%169 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %166, align 8
%170 = load ptr, ptr @"map[_llgo_any]_llgo_int", align 8
%171 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.eface" %169, ptr %171, align 8
%172 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr %170, ptr %144, ptr %171)
store i64 200, ptr %172, align 4
%173 = alloca [1 x i64], align 8
%174 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %173, i64 8)
%175 = getelementptr inbounds i64, ptr %174, i64 0
store i64 3, ptr %175, align 4
%176 = load [1 x i64], ptr %174, align 4
%177 = load ptr, ptr @_llgo_main.N, align 8
%178 = extractvalue [1 x i64] %176, 0
%179 = inttoptr i64 %178 to ptr
%180 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%181 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %180, i32 0, i32 0
store ptr %177, ptr %181, align 8
%182 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %180, i32 0, i32 1
store ptr %179, ptr %182, align 8
%183 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %180, align 8
%184 = load ptr, ptr @"map[_llgo_any]_llgo_int", align 8
%185 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.eface" %183, ptr %185, align 8
%186 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr %184, ptr %144, ptr %185)
store i64 300, ptr %186, align 4
%187 = alloca [1 x i64], align 8
%188 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %187, i64 8)
%189 = getelementptr inbounds i64, ptr %188, i64 0
store i64 2, ptr %189, align 4
%190 = load [1 x i64], ptr %188, align 4
%191 = load ptr, ptr @_llgo_main.N, align 8
%192 = extractvalue [1 x i64] %190, 0
%193 = inttoptr i64 %192 to ptr
%194 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%195 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %194, i32 0, i32 0
store ptr %191, ptr %195, align 8
%196 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %194, i32 0, i32 1
store ptr %193, ptr %196, align 8
%197 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %194, align 8
%198 = load ptr, ptr @"map[_llgo_any]_llgo_int", align 8
%199 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.eface" %197, ptr %199, align 8
%200 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr %198, ptr %144, ptr %199)
store i64 -200, ptr %200, align 4
%201 = load ptr, ptr @"map[_llgo_any]_llgo_int", align 8
%202 = call ptr @"github.com/goplus/llgo/internal/runtime.NewMapIter"(ptr %201, ptr %144)
br label %_llgo_11
_llgo_11: ; preds = %_llgo_23, %_llgo_10
%203 = call { i1, ptr, ptr } @"github.com/goplus/llgo/internal/runtime.MapIterNext"(ptr %202)
%204 = extractvalue { i1, ptr, ptr } %203, 0
br i1 %204, label %_llgo_20, label %_llgo_21
_llgo_12: ; preds = %_llgo_22
%205 = extractvalue { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 } %256, 1
%206 = extractvalue { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 } %256, 2
%207 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %205, 0
%208 = load ptr, ptr @_llgo_main.N, align 8
%209 = icmp eq ptr %207, %208
br i1 %209, label %_llgo_23, label %_llgo_24
_llgo_13: ; preds = %_llgo_22
ret i32 0
_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_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_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_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
_llgo_14: ; preds = %_llgo_1
%210 = extractvalue { i1, ptr, ptr } %36, 1
%211 = extractvalue { i1, ptr, ptr } %36, 2
%212 = load i64, ptr %210, align 4
%213 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %211, align 8
%214 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%215 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %214, i32 0, i32 0
store i1 true, ptr %215, align 1
%216 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %214, i32 0, i32 1
store i64 %212, ptr %216, align 4
%217 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %214, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" %213, ptr %217, align 8
%218 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %214, align 8
br label %_llgo_16
_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
_llgo_15: ; preds = %_llgo_1
%219 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%220 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %219, i32 0, i32 0
store i1 false, ptr %220, align 1
%221 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %219, i32 0, i32 1
store i64 0, ptr %221, align 4
%222 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %219, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" zeroinitializer, ptr %222, align 8
%223 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %219, align 8
br label %_llgo_16
_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
%224 = phi { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } [ %218, %_llgo_14 ], [ %223, %_llgo_15 ]
%225 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %224, 0
br i1 %225, label %_llgo_2, label %_llgo_3
_llgo_17: ; preds = %_llgo_4
%226 = extractvalue { i1, ptr, ptr } %49, 1
%227 = extractvalue { i1, ptr, ptr } %49, 2
%228 = load i64, ptr %226, align 4
%229 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %227, align 8
%230 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%231 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %230, i32 0, i32 0
store i1 true, ptr %231, align 1
%232 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %230, i32 0, i32 1
store i64 %228, ptr %232, align 4
%233 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %230, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" %229, ptr %233, align 8
%234 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %230, align 8
br label %_llgo_19
_llgo_18: ; preds = %_llgo_4
%235 = alloca { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, align 8
%236 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %235, i32 0, i32 0
store i1 false, ptr %236, align 1
%237 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %235, i32 0, i32 1
store i64 0, ptr %237, align 4
%238 = getelementptr inbounds { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %235, i32 0, i32 2
store %"github.com/goplus/llgo/internal/runtime.String" zeroinitializer, ptr %238, align 8
%239 = load { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %235, align 8
br label %_llgo_19
_llgo_19: ; preds = %_llgo_18, %_llgo_17
%240 = phi { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } [ %234, %_llgo_17 ], [ %239, %_llgo_18 ]
%241 = extractvalue { i1, i64, %"github.com/goplus/llgo/internal/runtime.String" } %240, 0
br i1 %241, label %_llgo_5, label %_llgo_6
_llgo_20: ; preds = %_llgo_11
%242 = extractvalue { i1, ptr, ptr } %203, 1
%243 = extractvalue { i1, ptr, ptr } %203, 2
%244 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %242, align 8
%245 = load i64, ptr %243, align 4
%246 = alloca { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, align 8
%247 = getelementptr inbounds { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, ptr %246, i32 0, i32 0
store i1 true, ptr %247, align 1
%248 = getelementptr inbounds { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, ptr %246, i32 0, i32 1
store %"github.com/goplus/llgo/internal/runtime.eface" %244, ptr %248, align 8
%249 = getelementptr inbounds { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, ptr %246, i32 0, i32 2
store i64 %245, ptr %249, align 4
%250 = load { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, ptr %246, align 8
br label %_llgo_22
_llgo_21: ; preds = %_llgo_11
%251 = alloca { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, align 8
%252 = getelementptr inbounds { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, ptr %251, i32 0, i32 0
store i1 false, ptr %252, align 1
%253 = getelementptr inbounds { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, ptr %251, i32 0, i32 1
store %"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer, ptr %253, align 8
%254 = getelementptr inbounds { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, ptr %251, i32 0, i32 2
store i64 0, ptr %254, align 4
%255 = load { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 }, ptr %251, align 8
br label %_llgo_22
_llgo_22: ; preds = %_llgo_21, %_llgo_20
%256 = phi { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 } [ %250, %_llgo_20 ], [ %255, %_llgo_21 ]
%257 = extractvalue { i1, %"github.com/goplus/llgo/internal/runtime.eface", i64 } %256, 0
br i1 %257, label %_llgo_12, label %_llgo_13
_llgo_23: ; preds = %_llgo_12
%258 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %205, 1
%259 = ptrtoint ptr %258 to i64
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %259)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %206)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
br label %_llgo_11
_llgo_24: ; preds = %_llgo_12
%260 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%261 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %260, i32 0, i32 0
store ptr @13, ptr %261, align 8
%262 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %260, i32 0, i32 1
store i64 21, ptr %262, align 4
%263 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %260, align 8
%264 = load ptr, ptr @_llgo_string, align 8
%265 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %263, ptr %265, align 8
%266 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%267 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %266, i32 0, i32 0
store ptr %264, ptr %267, align 8
%268 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %266, i32 0, i32 1
store ptr %265, ptr %268, align 8
%269 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %266, align 8
call void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface" %269)
unreachable
}
declare void @"github.com/goplus/llgo/internal/runtime.init"()
@@ -580,6 +742,206 @@ _llgo_5: ; preds = %_llgo_4
br label %_llgo_6
_llgo_6: ; preds = %_llgo_5, %_llgo_4
%129 = load ptr, ptr @"map[_llgo_any]_llgo_int", align 8
%130 = icmp eq ptr %129, null
br i1 %130, label %_llgo_7, label %_llgo_8
_llgo_7: ; preds = %_llgo_6
%131 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
%132 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%133 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %132, i32 0, i32 0
store ptr %131, ptr %133, align 8
%134 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %132, i32 0, i32 1
store i64 0, ptr %134, align 4
%135 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %132, i32 0, i32 2
store i64 0, ptr %135, align 4
%136 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %132, align 8
%137 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%138 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %137, i32 0, i32 0
store ptr @4, ptr %138, align 8
%139 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %137, i32 0, i32 1
store i64 4, ptr %139, align 4
%140 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %137, align 8
%141 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%142 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %141, i32 0, i32 0
store ptr null, ptr %142, align 8
%143 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %141, i32 0, i32 1
store i64 0, ptr %143, align 4
%144 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %141, align 8
%145 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %140, %"github.com/goplus/llgo/internal/runtime.String" %144, %"github.com/goplus/llgo/internal/runtime.Slice" %136)
%146 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2)
%147 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%148 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %147, i32 0, i32 0
store ptr @0, ptr %148, align 8
%149 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %147, i32 0, i32 1
store i64 7, ptr %149, align 4
%150 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %147, align 8
%151 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%152 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %151, i32 0, i32 0
store ptr null, ptr %152, align 8
%153 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %151, i32 0, i32 1
store i64 0, ptr %153, align 4
%154 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %151, align 8
%155 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8)
%156 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 8, ptr %155)
%157 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %150, ptr %156, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %154, i1 false)
%158 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%159 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %158, i32 0, i32 0
store ptr @1, ptr %159, align 8
%160 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %158, i32 0, i32 1
store i64 4, ptr %160, align 4
%161 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %158, align 8
%162 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%163 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %162, i32 0, i32 0
store ptr null, ptr %163, align 8
%164 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %162, i32 0, i32 1
store i64 0, ptr %164, align 4
%165 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %162, align 8
%166 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
%167 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%168 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %167, i32 0, i32 0
store ptr %166, ptr %168, align 8
%169 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %167, i32 0, i32 1
store i64 0, ptr %169, align 4
%170 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %167, i32 0, i32 2
store i64 0, ptr %170, align 4
%171 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %167, align 8
%172 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%173 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %172, i32 0, i32 0
store ptr @4, ptr %173, align 8
%174 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %172, i32 0, i32 1
store i64 4, ptr %174, align 4
%175 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %172, align 8
%176 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%177 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %176, i32 0, i32 0
store ptr null, ptr %177, align 8
%178 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %176, i32 0, i32 1
store i64 0, ptr %178, align 4
%179 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %176, align 8
%180 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %175, %"github.com/goplus/llgo/internal/runtime.String" %179, %"github.com/goplus/llgo/internal/runtime.Slice" %171)
%181 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 8, ptr %180)
%182 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %161, ptr %181, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %165, i1 false)
%183 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%184 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %183, i32 0, i32 0
store ptr @2, ptr %184, align 8
%185 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %183, i32 0, i32 1
store i64 5, ptr %185, align 4
%186 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %183, align 8
%187 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%188 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %187, i32 0, i32 0
store ptr null, ptr %188, align 8
%189 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %187, i32 0, i32 1
store i64 0, ptr %189, align 4
%190 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %187, align 8
%191 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2)
%192 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 8, ptr %191)
%193 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %186, ptr %192, i64 136, %"github.com/goplus/llgo/internal/runtime.String" %190, i1 false)
%194 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%195 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %194, i32 0, i32 0
store ptr @3, ptr %195, align 8
%196 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %194, i32 0, i32 1
store i64 8, ptr %196, align 4
%197 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %194, align 8
%198 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%199 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %198, i32 0, i32 0
store ptr null, ptr %199, align 8
%200 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %198, i32 0, i32 1
store i64 0, ptr %200, align 4
%201 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %198, align 8
%202 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 26)
%203 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %197, ptr %202, i64 200, %"github.com/goplus/llgo/internal/runtime.String" %201, i1 false)
%204 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%205 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %204, i32 0, i32 0
store ptr @4, ptr %205, align 8
%206 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %204, i32 0, i32 1
store i64 4, ptr %206, align 4
%207 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %204, align 8
%208 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 224)
%209 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %208, i64 0
store %"github.com/goplus/llgo/internal/abi.StructField" %157, ptr %209, align 8
%210 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %208, i64 1
store %"github.com/goplus/llgo/internal/abi.StructField" %182, ptr %210, align 8
%211 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %208, i64 2
store %"github.com/goplus/llgo/internal/abi.StructField" %193, ptr %211, align 8
%212 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %208, i64 3
store %"github.com/goplus/llgo/internal/abi.StructField" %203, ptr %212, align 8
%213 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%214 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %213, i32 0, i32 0
store ptr %208, ptr %214, align 8
%215 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %213, i32 0, i32 1
store i64 4, ptr %215, align 4
%216 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %213, i32 0, i32 2
store i64 4, ptr %216, align 4
%217 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %213, align 8
%218 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %207, i64 208, %"github.com/goplus/llgo/internal/runtime.Slice" %217)
%219 = call ptr @"github.com/goplus/llgo/internal/runtime.MapOf"(ptr %145, ptr %146, ptr %218, i64 24)
store ptr %219, ptr @"map[_llgo_any]_llgo_int", align 8
br label %_llgo_8
_llgo_8: ; preds = %_llgo_7, %_llgo_6
%220 = load ptr, ptr @_llgo_main.N, align 8
%221 = icmp eq ptr %220, null
br i1 %221, label %_llgo_9, label %_llgo_10
_llgo_9: ; preds = %_llgo_8
%222 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 17, i64 0, i64 0)
%223 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %222, i32 0, i32 6
%224 = load i8, ptr %223, align 1
%225 = or i8 %224, 32
store i8 %225, ptr %223, align 1
store ptr %222, ptr @_llgo_main.N, align 8
br label %_llgo_10
_llgo_10: ; preds = %_llgo_9, %_llgo_8
%226 = load ptr, ptr @_llgo_int, align 8
%227 = icmp eq ptr %226, null
br i1 %227, label %_llgo_11, label %_llgo_12
_llgo_11: ; preds = %_llgo_10
%228 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2)
%229 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %228, i32 0, i32 6
%230 = load i8, ptr %229, align 1
%231 = or i8 %230, 32
store i8 %231, ptr %229, align 1
store ptr %228, ptr @_llgo_int, align 8
br label %_llgo_12
_llgo_12: ; preds = %_llgo_11, %_llgo_10
%232 = load ptr, ptr @"[1]_llgo_int", align 8
%233 = icmp eq ptr %232, null
br i1 %233, label %_llgo_13, label %_llgo_14
_llgo_13: ; preds = %_llgo_12
%234 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2)
%235 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 1, ptr %234)
%236 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %235, i32 0, i32 6
%237 = load i8, ptr %236, align 1
%238 = or i8 %237, 32
store i8 %238, ptr %236, align 1
store ptr %235, ptr @"[1]_llgo_int", align 8
br label %_llgo_14
_llgo_14: ; preds = %_llgo_13, %_llgo_12
%239 = load ptr, ptr @"[1]_llgo_int", align 8
br i1 %221, label %_llgo_15, label %_llgo_16
_llgo_15: ; preds = %_llgo_14
%240 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%241 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %240, i32 0, i32 0
store ptr @4, ptr %241, align 8
%242 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %240, i32 0, i32 1
store i64 4, ptr %242, align 4
%243 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %240, align 8
%244 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%245 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %244, i32 0, i32 0
store ptr @12, ptr %245, align 8
%246 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %244, i32 0, i32 1
store i64 1, ptr %246, align 4
%247 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %244, align 8
call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %222, %"github.com/goplus/llgo/internal/runtime.String" %243, %"github.com/goplus/llgo/internal/runtime.String" %247, ptr %239, { ptr, i64, i64 } zeroinitializer, { ptr, i64, i64 } zeroinitializer)
br label %_llgo_16
_llgo_16: ; preds = %_llgo_15, %_llgo_14
ret void
}
@@ -620,3 +982,11 @@ 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")
declare ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.Slice")
declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64)
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")

View File

@@ -493,17 +493,12 @@ func (p *context) compileInstrOrValue(b llssa.Builder, iv instrOrValue, asValue
case *ssa.Index:
x := p.compileValue(b, v.X)
idx := p.compileValue(b, v.Index)
ret = b.Index(x, idx, func(e llssa.Expr) (ret llssa.Expr, zero bool) {
if e == x {
ret = b.Index(x, idx, func() (r llssa.Expr) {
switch n := v.X.(type) {
case *ssa.Const:
zero = true
return
case *ssa.UnOp:
return p.compileValue(b, n.X), false
return p.compileValue(b, n.X)
}
}
panic(fmt.Errorf("todo: addr of %v", e))
return
})
case *ssa.Lookup:
x := p.compileValue(b, v.X)

View File

@@ -135,6 +135,7 @@ func InitNamed(ret *Type, pkgPath, name string, underlying *Type, methods, ptrMe
doInitNamed(ret, pkgPath, name, underlying, methods)
doInitNamed(ptr, pkgPath, name, newPointer(ret), ptrMethods)
ret.PtrToThis_ = ptr
ret.Equal = underlying.Equal
ptr.TFlag |= abi.TFlagExtraStar
}

View File

@@ -405,6 +405,8 @@ func (b Builder) abiType(t types.Type) Expr {
switch t := t.(type) {
case *types.Pointer:
b.loadType(t.Elem())
case *types.Array:
b.loadType(t.Elem())
}
g := b.loadType(t)
return b.Load(g.Expr)

View File

@@ -286,7 +286,7 @@ func (b Builder) checkIndex(idx Expr, max Expr) Expr {
// Example printed form:
//
// t2 = t0[t1]
func (b Builder) Index(x, idx Expr, addr func(Expr) (Expr, bool)) Expr {
func (b Builder) Index(x, idx Expr, takeAddr func() Expr) Expr {
if debugInstr {
log.Printf("Index %v, %v\n", x.impl, idx.impl)
}
@@ -294,7 +294,6 @@ func (b Builder) Index(x, idx Expr, addr func(Expr) (Expr, bool)) Expr {
var telem Type
var ptr Expr
var max Expr
var zero bool
switch t := x.raw.Type.Underlying().(type) {
case *types.Basic:
if t.Kind() != types.String {
@@ -305,21 +304,12 @@ func (b Builder) Index(x, idx Expr, addr func(Expr) (Expr, bool)) Expr {
max = b.StringLen(x)
case *types.Array:
telem = prog.Index(x.Type)
if addr != nil {
ptr, zero = addr(x)
} else {
/*
size := SizeOf(prog, telem, t.Len())
ptr = b.Alloca(size)
b.Store(ptr, x)
*/
panic("unreachable")
}
ptr = takeAddr()
max = prog.IntVal(uint64(t.Len()), prog.Int())
}
idx = b.checkIndex(idx, max)
if zero {
return Expr{llvm.ConstNull(telem.ll), telem}
if ptr.IsNil() {
return Expr{llvm.ConstExtractElement(x.impl, idx.impl), telem}
}
pt := prog.Pointer(telem)
indices := []llvm.Value{idx.impl}

View File

@@ -138,6 +138,8 @@ func (p Program) Zero(t Type) Expr {
ret = llvm.ConstStruct(flds, false)
case *types.Slice:
ret = p.Zero(p.rtType("Slice")).impl
case *types.Array:
ret = llvm.ConstNull(t.ll)
case *types.Interface:
var name string
if u.Empty() {

View File

@@ -179,6 +179,10 @@ func (b Builder) buildVal(typ Type, val llvm.Value, lvl int) Expr {
telem := b.Prog.rawType(t.Field(0).Type())
elem := b.buildVal(telem, val, lvl-1)
return Expr{aggregateValue(b.impl, typ.ll, elem.impl), typ}
case *types.Array:
telem := b.Prog.rawType(t.Elem())
elem := b.buildVal(telem, val, lvl-1)
return Expr{llvm.ConstArray(typ.ll, []llvm.Value{elem.impl}), typ}
}
panic("todo")
}

View File

@@ -358,7 +358,7 @@ func (p Program) toType(raw types.Type) Type {
case *types.Slice:
return &aType{p.rtSlice(), typ, vkSlice}
case *types.Map:
return &aType{p.rtMap(), typ, vkMap}
return &aType{llvm.PointerType(p.rtMap(), 0), typ, vkMap}
case *types.Struct:
ll, kind := p.toLLVMStruct(t)
return &aType{ll, typ, kind}