diff --git a/cl/_testcgo/sum/out.ll b/cl/_testcgo/sum/out.ll index e69de29b..7a8cda47 100644 --- a/cl/_testcgo/sum/out.ll +++ b/cl/_testcgo/sum/out.ll @@ -0,0 +1,68 @@ +; ModuleID = 'main' +source_filename = "main" + +%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } + +@"main.init$guard" = global ptr null +@0 = private unnamed_addr constant [10 x i8] c"Hello %d\0A\00", align 1 + +define void @main.init() { +_llgo_0: + %0 = load i1, ptr @"main.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"main.init$guard", align 1 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define void @main() { +_llgo_0: + call void @main.init() + %0 = call ptr @"github.com/goplus/llgo/internal/runtime.Alloc"(i64 16) + %1 = getelementptr inbounds i64, ptr %0, i64 0 + store i64 1, ptr %1, align 4 + %2 = getelementptr inbounds i64, ptr %0, i64 1 + store i64 2, ptr %2, align 4 + %3 = getelementptr inbounds i64, ptr %0, i64 2 + store i64 3, ptr %3, align 4 + %4 = getelementptr inbounds i64, ptr %0, i64 3 + store i64 4, ptr %4, align 4 + %5 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice"(i64 4, i64 4) + %6 = call i64 @main.sum(%"github.com/goplus/llgo/internal/runtime.Slice" %5) + %7 = call i32 (ptr, ...) @printf(ptr @0, i64 %6) + ret void +} + +define i64 @main.sum(%"github.com/goplus/llgo/internal/runtime.Slice" %0) { +_llgo_0: + %1 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + br label %_llgo_1 + +_llgo_1: ; preds = %_llgo_2, %_llgo_0 + %2 = phi i64 [ 0, %_llgo_0 ], [ %8, %_llgo_2 ] + %3 = phi i64 [ -1, %_llgo_0 ], [ %4, %_llgo_2 ] + %4 = add i64 %3, 1 + %5 = icmp slt i64 %4, %1 + br i1 %5, label %_llgo_2, label %_llgo_3 + +_llgo_2: ; preds = %_llgo_1 + %6 = getelementptr inbounds i64, %"github.com/goplus/llgo/internal/runtime.Slice" %0, i64 %4 + %7 = load i64, %"github.com/goplus/llgo/internal/runtime.Slice" %6, align 4 + %8 = add i64 %2, %7 + br label %_llgo_1 + +_llgo_3: ; preds = %_llgo_1 + ret i64 %2 +} + +declare ptr @"github.com/goplus/llgo/internal/runtime.Alloc"(i64) + +declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice"(ptr, i64, i64) + +declare i32 @printf(ptr, ...) + +declare i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice") diff --git a/cl/compile_test.go b/cl/compile_test.go index 69e8c287..62f7bedb 100644 --- a/cl/compile_test.go +++ b/cl/compile_test.go @@ -29,7 +29,7 @@ func testCompile(t *testing.T, src, expected string) { } func TestFromTestcgo(t *testing.T) { - cltest.FromDir(t, "sum", "./_testcgo", true) + cltest.FromDir(t, "", "./_testcgo", true) } func TestFromTestdata(t *testing.T) { diff --git a/ssa/expr.go b/ssa/expr.go index 9ad4ee15..c9f17005 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -137,9 +137,15 @@ func (b Builder) Const(v constant.Value, typ Type) Expr { case kind == types.Bool: return prog.BoolVal(constant.BoolVal(v)) case kind >= types.Int && kind <= types.Uintptr: - if v, exact := constant.Uint64Val(v); exact { - return prog.IntVal(v, typ) + if v, exact := constant.Int64Val(v); exact { + return prog.IntVal(uint64(v), typ) } + panic("todo") + /* + if v, exact := constant.Uint64Val(v); exact { + return prog.IntVal(v, typ) + } + */ case kind == types.Float32 || kind == types.Float64: if v, exact := constant.Float64Val(v); exact { return prog.FloatVal(v, typ) @@ -148,7 +154,7 @@ func (b Builder) Const(v constant.Value, typ Type) Expr { return prog.StringVal(constant.StringVal(v)) } } - panic("todo") + panic(fmt.Sprintf("unsupported Const: %v, %v", v, typ.t)) } // CStr returns a c-style string constant expression.