diff --git a/chore/llgen/llgen.go b/chore/llgen/llgen.go index c5bdaf3f..ca7ce200 100644 --- a/chore/llgen/llgen.go +++ b/chore/llgen/llgen.go @@ -26,7 +26,7 @@ import ( func main() { if len(os.Args) < 2 { - fmt.Fprintln(os.Stderr, "Usage: llgen xxx.go") + fmt.Fprintln(os.Stderr, "Usage: llgen xxx.go [pkgPath]") return } @@ -36,5 +36,9 @@ func main() { outFile := dir + "out.ll" llgen.Init() - llgen.DoFile(inFile, outFile) + if len(os.Args) >= 3 { + llgen.Do(os.Args[2], inFile, outFile) + } else { + llgen.DoFile(inFile, outFile) + } } diff --git a/cl/_testcgo/strlen/out.ll b/cl/_testcgo/strlen/out.ll index aa7b8522..706fadc8 100644 --- a/cl/_testcgo/strlen/out.ll +++ b/cl/_testcgo/strlen/out.ll @@ -1,9 +1,9 @@ ; ModuleID = 'main' source_filename = "main" -@"main.init$guard" = global ptr null @main._Cgo_always_false = global ptr null @main.format = global ptr null +@"main.init$guard" = global ptr null define void @main.init() { _llgo_0: @@ -28,10 +28,6 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -declare void @printf(ptr, ...) - -declare i32 @strlen(ptr) - define void @main() { _llgo_0: call void @main.init() @@ -39,3 +35,7 @@ _llgo_0: call void (ptr, ...) @printf(ptr @main.format, i32 %0) ret void } + +declare void @printf(ptr, ...) + +declare i32 @strlen(ptr) diff --git a/cl/_testdata/apkg/out.ll b/cl/_testdata/apkg/out.ll index 7959439a..3e1aab2d 100644 --- a/cl/_testdata/apkg/out.ll +++ b/cl/_testdata/apkg/out.ll @@ -3,6 +3,18 @@ source_filename = "apkg" @"apkg.init$guard" = global ptr null +define double @apkg.Max(double %0, double %1) { +_llgo_0: + %2 = fcmp ogt double %0, %1 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + ret double %0 + +_llgo_2: ; preds = %_llgo_0 + ret double %1 +} + define void @apkg.init() { _llgo_0: %0 = load i1, ptr @"apkg.init$guard", align 1 @@ -15,15 +27,3 @@ _llgo_1: ; preds = %_llgo_0 _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } - -define double @apkg.Max(double %0, double %1) { -_llgo_0: - %2 = fcmp ogt double %0, %1 - br i1 %2, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - ret double %0 - -_llgo_2: ; preds = %_llgo_0 - ret double %1 -} diff --git a/cl/_testdata/fncall/out.ll b/cl/_testdata/fncall/out.ll index b0325800..4adec91a 100644 --- a/cl/_testdata/fncall/out.ll +++ b/cl/_testdata/fncall/out.ll @@ -16,6 +16,13 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } +define void @main() { +_llgo_0: + call void @main.init() + %0 = call i64 @main.max(i64 1, i64 2) + ret void +} + define i64 @main.max(i64 %0, i64 %1) { _llgo_0: %2 = icmp sgt i64 %0, %1 @@ -27,10 +34,3 @@ _llgo_1: ; preds = %_llgo_0 _llgo_2: ; preds = %_llgo_0 ret i64 %1 } - -define void @main() { -_llgo_0: - call void @main.init() - %0 = call i64 @main.max(i64 1, i64 2) - ret void -} diff --git a/cl/_testdata/importpkg/out.ll b/cl/_testdata/importpkg/out.ll index de2212b5..8aa4cbb1 100644 --- a/cl/_testdata/importpkg/out.ll +++ b/cl/_testdata/importpkg/out.ll @@ -1,8 +1,8 @@ ; ModuleID = 'main' source_filename = "main" -@"main.init$guard" = global ptr null @main.hello = global ptr null +@"main.init$guard" = global ptr null define void @main.init() { _llgo_0: diff --git a/cl/_testdata/method/out.ll b/cl/_testdata/method/out.ll index d5df9805..8d3f9f96 100644 --- a/cl/_testdata/method/out.ll +++ b/cl/_testdata/method/out.ll @@ -1,8 +1,21 @@ ; ModuleID = 'main' source_filename = "main" -@"main.init$guard" = global ptr null @main.format = global ptr null +@"main.init$guard" = global ptr null + +define i64 @"(T).Add"(i64 %0, i64 %1) { +_llgo_0: + %2 = add i64 %0, %1 + ret i64 %2 +} + +define i64 @"(*T).Add"(ptr %0, i64 %1) { +_llgo_0: + %2 = load i64, ptr %0, align 4 + %3 = call i64 @"(T).Add"(i64 %2, i64 %1) + ret i64 %3 +} define void @main.init() { _llgo_0: @@ -27,25 +40,12 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -define i64 @"(main.T).Add"(i64 %0, i64 %1) { -_llgo_0: - %2 = add i64 %0, %1 - ret i64 %2 -} - -define i64 @"(*main.T).Add"(ptr %0, i64 %1) { -_llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = call i64 @"(main.T).Add"(i64 %2, i64 %1) - ret i64 %3 -} - -declare void @printf(ptr, ...) - define void @main() { _llgo_0: call void @main.init() - %0 = call i64 @"(main.T).Add"(i64 1, i64 2) + %0 = call i64 @"(T).Add"(i64 1, i64 2) call void (ptr, ...) @printf(ptr @main.format, i64 %0) ret void } + +declare void @printf(ptr, ...) diff --git a/cl/_testdata/printf/out.ll b/cl/_testdata/printf/out.ll index a5532ec5..65ac64ae 100644 --- a/cl/_testdata/printf/out.ll +++ b/cl/_testdata/printf/out.ll @@ -1,8 +1,8 @@ ; ModuleID = 'main' source_filename = "main" -@"main.init$guard" = global ptr null @main.hello = global ptr null +@"main.init$guard" = global ptr null define void @main.init() { _llgo_0: @@ -24,11 +24,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -declare void @printf(ptr, ...) - define void @main() { _llgo_0: call void @main.init() call void (ptr, ...) @printf(ptr @main.hello) ret void } + +declare void @printf(ptr, ...) diff --git a/cl/_testdata/printval/out.ll b/cl/_testdata/printval/out.ll index 62e449a3..e7fe3bd9 100644 --- a/cl/_testdata/printval/out.ll +++ b/cl/_testdata/printval/out.ll @@ -1,8 +1,8 @@ ; ModuleID = 'main' source_filename = "main" -@"main.init$guard" = global ptr null @main.format = global ptr null +@"main.init$guard" = global ptr null define void @main.init() { _llgo_0: @@ -27,11 +27,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -declare void @printf(ptr, ...) - define void @main() { _llgo_0: call void @main.init() call void (ptr, ...) @printf(ptr @main.format, i64 100) ret void } + +declare void @printf(ptr, ...) diff --git a/cl/_testdata/ptrmthd/out.ll b/cl/_testdata/ptrmthd/out.ll index 32cd1d0e..77665e9d 100644 --- a/cl/_testdata/ptrmthd/out.ll +++ b/cl/_testdata/ptrmthd/out.ll @@ -1,8 +1,14 @@ ; ModuleID = 'main' source_filename = "main" -@"main.init$guard" = global ptr null @main.format = global ptr null +@"main.init$guard" = global ptr null + +define void @"(*T).Print"(ptr %0, i64 %1) { +_llgo_0: + call void (ptr, ...) @printf(ptr %0, i64 %1) + ret void +} define void @main.init() { _llgo_0: @@ -27,17 +33,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -declare void @printf(ptr, ...) - -define void @"(*main.T).Print"(ptr %0, i64 %1) { -_llgo_0: - call void (ptr, ...) @printf(ptr %0, i64 %1) - ret void -} - define void @main() { _llgo_0: call void @main.init() - call void @"(*main.T).Print"(ptr @main.format, i64 100) + call void @"(*T).Print"(ptr @main.format, i64 100) ret void } + +declare void @printf(ptr, ...) diff --git a/cl/_testdata/varinit/out.ll b/cl/_testdata/varinit/out.ll index 3052516c..9aebe715 100644 --- a/cl/_testdata/varinit/out.ll +++ b/cl/_testdata/varinit/out.ll @@ -1,8 +1,8 @@ ; ModuleID = 'main' source_filename = "main" -@"main.init$guard" = global ptr null @main.a = global ptr null +@"main.init$guard" = global ptr null define void @main.init() { _llgo_0: diff --git a/cl/compile.go b/cl/compile.go index a499dbe8..60530630 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -428,17 +428,12 @@ func NewPackage(prog llssa.Program, pkg *ssa.Package, files []*ast.File) (ret ll val ssa.Member } - // Sort by position, so that the order of the functions in the IR matches - // the order of functions in the source file. This is useful for testing, - // for example. - var members []*namedMember + members := make([]*namedMember, 0, len(pkg.Members)) for name, v := range pkg.Members { members = append(members, &namedMember{name, v}) } sort.Slice(members, func(i, j int) bool { - iPos := members[i].val.Pos() - jPos := members[j].val.Pos() - return iPos < jPos + return members[i].name < members[j].name }) pkgProg := pkg.Prog diff --git a/cl/compile_test.go b/cl/compile_test.go index 9e832a3c..671f8cba 100644 --- a/cl/compile_test.go +++ b/cl/compile_test.go @@ -28,7 +28,7 @@ func testCompile(t *testing.T, src, expected string) { } func TestFromTestcgo(t *testing.T) { - cltest.FromDir(t, "strlen", "./_testcgo", true) + cltest.FromDir(t, "", "./_testcgo", true) } func TestFromTestdata(t *testing.T) { @@ -42,8 +42,8 @@ var a int `, `; ModuleID = 'foo' source_filename = "foo" -@"foo.init$guard" = global ptr null @foo.a = global ptr null +@"foo.init$guard" = global ptr null define void @foo.init() { _llgo_0: @@ -71,6 +71,11 @@ source_filename = "foo" @"foo.init$guard" = global ptr null +define i64 @foo.fn(i64 %0, double %1) { +_llgo_0: + ret i64 1 +} + define void @foo.init() { _llgo_0: %0 = load i1, ptr @"foo.init$guard", align 1 @@ -83,10 +88,5 @@ _llgo_1: ; preds = %_llgo_0 _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } - -define i64 @foo.fn(i64 %0, double %1) { -_llgo_0: - ret i64 1 -} `) } diff --git a/cl/import.go b/cl/import.go index 4abc9337..d73b236e 100644 --- a/cl/import.go +++ b/cl/import.go @@ -117,12 +117,18 @@ func fullName(pkg *types.Package, name string) string { } // func: pkg.name -// method: (pkg.T).name +// method: (pkg.T).name, (*pkg.T).name func funcName(pkg *types.Package, fn *ssa.Function) string { sig := fn.Signature name := fn.Name() if recv := sig.Recv(); recv != nil { - return "(" + recv.Type().String() + ")." + name + var tName string + t := recv.Type() + if tp, ok := t.(*types.Pointer); ok { + t, tName = tp.Elem(), "*" + } + tName += t.(*types.Named).Obj().Name() + return "(" + tName + ")." + name } ret := fullName(pkg, name) if ret == "main.main" { diff --git a/ssa/cl_test.go b/ssa/cl_test.go index 05bb8418..db26f209 100644 --- a/ssa/cl_test.go +++ b/ssa/cl_test.go @@ -22,6 +22,10 @@ import ( "github.com/goplus/llgo/cl/cltest" ) +func TestFromTestcgo(t *testing.T) { + cltest.FromDir(t, "", "../cl/_testcgo", true) +} + func TestFromTestdata(t *testing.T) { cltest.FromDir(t, "", "../cl/_testdata", false) } diff --git a/ssa/decl.go b/ssa/decl.go index 1be102ad..18760708 100644 --- a/ssa/decl.go +++ b/ssa/decl.go @@ -145,7 +145,8 @@ func (p Function) Param(i int) Expr { func (p Function) NewBuilder() Builder { prog := p.prog b := prog.ctx.NewBuilder() - b.Finalize() + // TODO(xsw): Finalize may cause panic, so comment it. + // b.Finalize() return &aBuilder{b, p, prog} } diff --git a/ssa/package.go b/ssa/package.go index bf0cc726..b6507c1f 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -122,7 +122,8 @@ func NewProgram(target *Target) Program { target = &Target{} } ctx := llvm.NewContext() - ctx.Finalize() + // TODO(xsw): Finalize may cause panic, so comment it. + // ctx.Finalize() td := llvm.NewTargetData("") // TODO(xsw): target config return &aProgram{ctx: ctx, target: target, td: td} } @@ -130,7 +131,8 @@ func NewProgram(target *Target) Program { // NewPackage creates a new package. func (p Program) NewPackage(name, pkgPath string) Package { mod := p.ctx.NewModule(pkgPath) - mod.Finalize() + // TODO(xsw): Finalize may cause panic, so comment it. + // mod.Finalize() fns := make(map[string]Function) gbls := make(map[string]Global) return &aPackage{mod, fns, gbls, p}