From f7a54e33775fb1093fd35f4ae6ce5b06e23ef616 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Tue, 30 Apr 2024 18:42:40 +0800 Subject: [PATCH] llgo/ssa: builder.Str bugfix; runtime: NewString --- internal/runtime/llgo_autogen.ll | 15 ++++++++++++++- ssa/expr.go | 7 +++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/internal/runtime/llgo_autogen.ll b/internal/runtime/llgo_autogen.ll index e60e4268..15cc0d08 100644 --- a/internal/runtime/llgo_autogen.ll +++ b/internal/runtime/llgo_autogen.ll @@ -11,6 +11,7 @@ source_filename = "github.com/goplus/llgo/internal/runtime" @"github.com/goplus/llgo/internal/runtime.basicTypes" = global ptr null @"github.com/goplus/llgo/internal/runtime.init$guard" = global ptr null @"github.com/goplus/llgo/internal/runtime.sizeBasicTypes" = global ptr null +@0 = private unnamed_addr constant [21 x i8] c"I2Int: type mismatch\00", align 1 define ptr @"github.com/goplus/llgo/internal/runtime.Alloc"(i64 %0) { _llgo_0: @@ -104,7 +105,8 @@ _llgo_1: ; preds = %_llgo_0 ret i64 %10 _llgo_2: ; preds = %_llgo_0 - %11 = call %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llgo/internal/runtime.MakeAnyString"([21 x i8] c"I2Int: type mismatch\00") + %11 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @0, i64 20) + %12 = call %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llgo/internal/runtime.MakeAnyString"(%"github.com/goplus/llgo/internal/runtime.String" %11) unreachable } @@ -212,6 +214,17 @@ _llgo_0: ret %"github.com/goplus/llgo/internal/runtime.Slice" %7 } +define %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr %0, i64 %1) { +_llgo_0: + %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 + store ptr %0, ptr %3, align 8 + store i64 %1, ptr %4, align 4 + %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + ret %"github.com/goplus/llgo/internal/runtime.String" %5 +} + define %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NilSlice"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 diff --git a/ssa/expr.go b/ssa/expr.go index e5c585e8..545489e2 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -153,9 +153,12 @@ func (b Builder) CStr(v string) Expr { } // Str returns a Go string constant expression. -func (b Builder) Str(v string) Expr { +func (b Builder) Str(v string) (ret Expr) { + prog := b.Prog cstr := b.CStr(v) - return b.InlineCall(b.fn.pkg.rtFunc("NewString"), cstr, b.Prog.Val(len(v))) + ret = b.InlineCall(b.fn.pkg.rtFunc("NewString"), cstr, prog.Val(len(v))) + ret.Type = prog.String() + return } // -----------------------------------------------------------------------------