diff --git a/cl/_testrt/map/out.ll b/cl/_testrt/map/out.ll index 19de1043..a2e179d1 100644 --- a/cl/_testrt/map/out.ll +++ b/cl/_testrt/map/out.ll @@ -30,12 +30,16 @@ _llgo_0: call void @main.init() %2 = call ptr @"github.com/goplus/llgo/internal/runtime.MakeSmallMap"() %3 = load ptr, ptr @"map[_llgo_int]_llgo_int", align 8 - %4 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr %3, ptr %2, i64 23) - store i64 100, ptr %4, align 4 - %5 = load ptr, ptr @"map[_llgo_int]_llgo_int", align 8 - %6 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr %5, ptr %2, i64 7) - store i64 29, ptr %6, align 4 - %7 = call i32 (ptr, ...) @printf(ptr @0, ) + %4 = alloca i8, i64 48, align 1 + store ptr %2, ptr %4, align 8 + %5 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr %3, ptr %4, i64 23) + store i64 100, ptr %5, align 4 + %6 = load ptr, ptr @"map[_llgo_int]_llgo_int", align 8 + %7 = alloca i8, i64 48, align 1 + store ptr %2, ptr %7, align 8 + %8 = call ptr @"github.com/goplus/llgo/internal/runtime.MapAssign"(ptr %6, ptr %7, i64 7) + store i64 29, ptr %8, align 4 + %9 = call i32 (ptr, ...) @printf(ptr @0, ) ret i32 0 } diff --git a/ssa/datastruct.go b/ssa/datastruct.go index 0070e160..bac55714 100644 --- a/ssa/datastruct.go +++ b/ssa/datastruct.go @@ -366,7 +366,8 @@ func (b Builder) MapUpdate(m, k, v Expr) { } tabi := b.abiType(t.raw.Type) prog := b.Prog - ptrimpl := b.InlineCall(b.Pkg.rtFunc("MapAssign"), tabi, m, k).impl + mptr := b.dupAlloca(m) + ptrimpl := b.InlineCall(b.Pkg.rtFunc("MapAssign"), tabi, mptr, k).impl ptr := Expr{ptrimpl, prog.Pointer(v.Type)} b.Store(ptr, v) // TODO(xsw): indirect store } diff --git a/ssa/memory.go b/ssa/memory.go index d63df457..8ece634c 100644 --- a/ssa/memory.go +++ b/ssa/memory.go @@ -107,16 +107,15 @@ func aggregateInit(b llvm.Builder, ptr llvm.Value, tll llvm.Type, flds ...llvm.V } } -/* -func (b Builder) dupMalloc(v Expr) Expr { +func (b Builder) dupAlloca(v Expr) Expr { prog := b.Prog n := prog.SizeOf(v.Type) tptr := prog.Pointer(v.Type) - ptr := b.malloc(prog.Val(uintptr(n))).impl - b.Store(Expr{ptr, tptr}, v) - return Expr{ptr, tptr} + ptr := b.Alloca(prog.Val(uintptr(n))).impl + ret := Expr{ptr, tptr} + b.Store(ret, v) + return ret } -*/ // -----------------------------------------------------------------------------