ssa: temp disable Finalize; cl: decls sort by name
This commit is contained in:
@@ -26,7 +26,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if len(os.Args) < 2 {
|
if len(os.Args) < 2 {
|
||||||
fmt.Fprintln(os.Stderr, "Usage: llgen xxx.go")
|
fmt.Fprintln(os.Stderr, "Usage: llgen xxx.go [pkgPath]")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,5 +36,9 @@ func main() {
|
|||||||
outFile := dir + "out.ll"
|
outFile := dir + "out.ll"
|
||||||
|
|
||||||
llgen.Init()
|
llgen.Init()
|
||||||
|
if len(os.Args) >= 3 {
|
||||||
|
llgen.Do(os.Args[2], inFile, outFile)
|
||||||
|
} else {
|
||||||
llgen.DoFile(inFile, outFile)
|
llgen.DoFile(inFile, outFile)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
; ModuleID = 'main'
|
; ModuleID = 'main'
|
||||||
source_filename = "main"
|
source_filename = "main"
|
||||||
|
|
||||||
@"main.init$guard" = global ptr null
|
|
||||||
@main._Cgo_always_false = global ptr null
|
@main._Cgo_always_false = global ptr null
|
||||||
@main.format = global ptr null
|
@main.format = global ptr null
|
||||||
|
@"main.init$guard" = global ptr null
|
||||||
|
|
||||||
define void @main.init() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
@@ -28,10 +28,6 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
|||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
declare void @printf(ptr, ...)
|
|
||||||
|
|
||||||
declare i32 @strlen(ptr)
|
|
||||||
|
|
||||||
define void @main() {
|
define void @main() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
call void @main.init()
|
call void @main.init()
|
||||||
@@ -39,3 +35,7 @@ _llgo_0:
|
|||||||
call void (ptr, ...) @printf(ptr @main.format, i32 %0)
|
call void (ptr, ...) @printf(ptr @main.format, i32 %0)
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare void @printf(ptr, ...)
|
||||||
|
|
||||||
|
declare i32 @strlen(ptr)
|
||||||
|
|||||||
@@ -3,6 +3,18 @@ source_filename = "apkg"
|
|||||||
|
|
||||||
@"apkg.init$guard" = global ptr null
|
@"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() {
|
define void @apkg.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
%0 = load i1, ptr @"apkg.init$guard", align 1
|
%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
|
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||||
ret void
|
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
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -16,6 +16,13 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
|||||||
ret void
|
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) {
|
define i64 @main.max(i64 %0, i64 %1) {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
%2 = icmp sgt i64 %0, %1
|
%2 = icmp sgt i64 %0, %1
|
||||||
@@ -27,10 +34,3 @@ _llgo_1: ; preds = %_llgo_0
|
|||||||
_llgo_2: ; preds = %_llgo_0
|
_llgo_2: ; preds = %_llgo_0
|
||||||
ret i64 %1
|
ret i64 %1
|
||||||
}
|
}
|
||||||
|
|
||||||
define void @main() {
|
|
||||||
_llgo_0:
|
|
||||||
call void @main.init()
|
|
||||||
%0 = call i64 @main.max(i64 1, i64 2)
|
|
||||||
ret void
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
; ModuleID = 'main'
|
; ModuleID = 'main'
|
||||||
source_filename = "main"
|
source_filename = "main"
|
||||||
|
|
||||||
@"main.init$guard" = global ptr null
|
|
||||||
@main.hello = global ptr null
|
@main.hello = global ptr null
|
||||||
|
@"main.init$guard" = global ptr null
|
||||||
|
|
||||||
define void @main.init() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
|
|||||||
@@ -1,8 +1,21 @@
|
|||||||
; ModuleID = 'main'
|
; ModuleID = 'main'
|
||||||
source_filename = "main"
|
source_filename = "main"
|
||||||
|
|
||||||
@"main.init$guard" = global ptr null
|
|
||||||
@main.format = 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() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
@@ -27,25 +40,12 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
|||||||
ret void
|
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() {
|
define void @main() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
call void @main.init()
|
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)
|
call void (ptr, ...) @printf(ptr @main.format, i64 %0)
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare void @printf(ptr, ...)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
; ModuleID = 'main'
|
; ModuleID = 'main'
|
||||||
source_filename = "main"
|
source_filename = "main"
|
||||||
|
|
||||||
@"main.init$guard" = global ptr null
|
|
||||||
@main.hello = global ptr null
|
@main.hello = global ptr null
|
||||||
|
@"main.init$guard" = global ptr null
|
||||||
|
|
||||||
define void @main.init() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
@@ -24,11 +24,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
|||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
declare void @printf(ptr, ...)
|
|
||||||
|
|
||||||
define void @main() {
|
define void @main() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
call void @main.init()
|
call void @main.init()
|
||||||
call void (ptr, ...) @printf(ptr @main.hello)
|
call void (ptr, ...) @printf(ptr @main.hello)
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare void @printf(ptr, ...)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
; ModuleID = 'main'
|
; ModuleID = 'main'
|
||||||
source_filename = "main"
|
source_filename = "main"
|
||||||
|
|
||||||
@"main.init$guard" = global ptr null
|
|
||||||
@main.format = global ptr null
|
@main.format = global ptr null
|
||||||
|
@"main.init$guard" = global ptr null
|
||||||
|
|
||||||
define void @main.init() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
@@ -27,11 +27,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
|||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
declare void @printf(ptr, ...)
|
|
||||||
|
|
||||||
define void @main() {
|
define void @main() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
call void @main.init()
|
call void @main.init()
|
||||||
call void (ptr, ...) @printf(ptr @main.format, i64 100)
|
call void (ptr, ...) @printf(ptr @main.format, i64 100)
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare void @printf(ptr, ...)
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
; ModuleID = 'main'
|
; ModuleID = 'main'
|
||||||
source_filename = "main"
|
source_filename = "main"
|
||||||
|
|
||||||
@"main.init$guard" = global ptr null
|
|
||||||
@main.format = 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() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
@@ -27,17 +33,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
|||||||
ret void
|
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() {
|
define void @main() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
call void @main.init()
|
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
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare void @printf(ptr, ...)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
; ModuleID = 'main'
|
; ModuleID = 'main'
|
||||||
source_filename = "main"
|
source_filename = "main"
|
||||||
|
|
||||||
@"main.init$guard" = global ptr null
|
|
||||||
@main.a = global ptr null
|
@main.a = global ptr null
|
||||||
|
@"main.init$guard" = global ptr null
|
||||||
|
|
||||||
define void @main.init() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
|
|||||||
@@ -428,17 +428,12 @@ func NewPackage(prog llssa.Program, pkg *ssa.Package, files []*ast.File) (ret ll
|
|||||||
val ssa.Member
|
val ssa.Member
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort by position, so that the order of the functions in the IR matches
|
members := make([]*namedMember, 0, len(pkg.Members))
|
||||||
// the order of functions in the source file. This is useful for testing,
|
|
||||||
// for example.
|
|
||||||
var members []*namedMember
|
|
||||||
for name, v := range pkg.Members {
|
for name, v := range pkg.Members {
|
||||||
members = append(members, &namedMember{name, v})
|
members = append(members, &namedMember{name, v})
|
||||||
}
|
}
|
||||||
sort.Slice(members, func(i, j int) bool {
|
sort.Slice(members, func(i, j int) bool {
|
||||||
iPos := members[i].val.Pos()
|
return members[i].name < members[j].name
|
||||||
jPos := members[j].val.Pos()
|
|
||||||
return iPos < jPos
|
|
||||||
})
|
})
|
||||||
|
|
||||||
pkgProg := pkg.Prog
|
pkgProg := pkg.Prog
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func testCompile(t *testing.T, src, expected string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFromTestcgo(t *testing.T) {
|
func TestFromTestcgo(t *testing.T) {
|
||||||
cltest.FromDir(t, "strlen", "./_testcgo", true)
|
cltest.FromDir(t, "", "./_testcgo", true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFromTestdata(t *testing.T) {
|
func TestFromTestdata(t *testing.T) {
|
||||||
@@ -42,8 +42,8 @@ var a int
|
|||||||
`, `; ModuleID = 'foo'
|
`, `; ModuleID = 'foo'
|
||||||
source_filename = "foo"
|
source_filename = "foo"
|
||||||
|
|
||||||
@"foo.init$guard" = global ptr null
|
|
||||||
@foo.a = global ptr null
|
@foo.a = global ptr null
|
||||||
|
@"foo.init$guard" = global ptr null
|
||||||
|
|
||||||
define void @foo.init() {
|
define void @foo.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
@@ -71,6 +71,11 @@ source_filename = "foo"
|
|||||||
|
|
||||||
@"foo.init$guard" = global ptr null
|
@"foo.init$guard" = global ptr null
|
||||||
|
|
||||||
|
define i64 @foo.fn(i64 %0, double %1) {
|
||||||
|
_llgo_0:
|
||||||
|
ret i64 1
|
||||||
|
}
|
||||||
|
|
||||||
define void @foo.init() {
|
define void @foo.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
%0 = load i1, ptr @"foo.init$guard", align 1
|
%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
|
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
define i64 @foo.fn(i64 %0, double %1) {
|
|
||||||
_llgo_0:
|
|
||||||
ret i64 1
|
|
||||||
}
|
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|||||||
10
cl/import.go
10
cl/import.go
@@ -117,12 +117,18 @@ func fullName(pkg *types.Package, name string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// func: pkg.name
|
// func: pkg.name
|
||||||
// method: (pkg.T).name
|
// method: (pkg.T).name, (*pkg.T).name
|
||||||
func funcName(pkg *types.Package, fn *ssa.Function) string {
|
func funcName(pkg *types.Package, fn *ssa.Function) string {
|
||||||
sig := fn.Signature
|
sig := fn.Signature
|
||||||
name := fn.Name()
|
name := fn.Name()
|
||||||
if recv := sig.Recv(); recv != nil {
|
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)
|
ret := fullName(pkg, name)
|
||||||
if ret == "main.main" {
|
if ret == "main.main" {
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ import (
|
|||||||
"github.com/goplus/llgo/cl/cltest"
|
"github.com/goplus/llgo/cl/cltest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestFromTestcgo(t *testing.T) {
|
||||||
|
cltest.FromDir(t, "", "../cl/_testcgo", true)
|
||||||
|
}
|
||||||
|
|
||||||
func TestFromTestdata(t *testing.T) {
|
func TestFromTestdata(t *testing.T) {
|
||||||
cltest.FromDir(t, "", "../cl/_testdata", false)
|
cltest.FromDir(t, "", "../cl/_testdata", false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,7 +145,8 @@ func (p Function) Param(i int) Expr {
|
|||||||
func (p Function) NewBuilder() Builder {
|
func (p Function) NewBuilder() Builder {
|
||||||
prog := p.prog
|
prog := p.prog
|
||||||
b := prog.ctx.NewBuilder()
|
b := prog.ctx.NewBuilder()
|
||||||
b.Finalize()
|
// TODO(xsw): Finalize may cause panic, so comment it.
|
||||||
|
// b.Finalize()
|
||||||
return &aBuilder{b, p, prog}
|
return &aBuilder{b, p, prog}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,8 @@ func NewProgram(target *Target) Program {
|
|||||||
target = &Target{}
|
target = &Target{}
|
||||||
}
|
}
|
||||||
ctx := llvm.NewContext()
|
ctx := llvm.NewContext()
|
||||||
ctx.Finalize()
|
// TODO(xsw): Finalize may cause panic, so comment it.
|
||||||
|
// ctx.Finalize()
|
||||||
td := llvm.NewTargetData("") // TODO(xsw): target config
|
td := llvm.NewTargetData("") // TODO(xsw): target config
|
||||||
return &aProgram{ctx: ctx, target: target, td: td}
|
return &aProgram{ctx: ctx, target: target, td: td}
|
||||||
}
|
}
|
||||||
@@ -130,7 +131,8 @@ func NewProgram(target *Target) Program {
|
|||||||
// NewPackage creates a new package.
|
// NewPackage creates a new package.
|
||||||
func (p Program) NewPackage(name, pkgPath string) Package {
|
func (p Program) NewPackage(name, pkgPath string) Package {
|
||||||
mod := p.ctx.NewModule(pkgPath)
|
mod := p.ctx.NewModule(pkgPath)
|
||||||
mod.Finalize()
|
// TODO(xsw): Finalize may cause panic, so comment it.
|
||||||
|
// mod.Finalize()
|
||||||
fns := make(map[string]Function)
|
fns := make(map[string]Function)
|
||||||
gbls := make(map[string]Global)
|
gbls := make(map[string]Global)
|
||||||
return &aPackage{mod, fns, gbls, p}
|
return &aPackage{mod, fns, gbls, p}
|
||||||
|
|||||||
Reference in New Issue
Block a user