ssa: temp disable Finalize; cl: decls sort by name

This commit is contained in:
xushiwei
2024-04-26 03:25:11 +08:00
parent a3d6a94600
commit 91d1d71f6d
16 changed files with 92 additions and 80 deletions

View File

@@ -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)
}
}

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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:

View File

@@ -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, ...)

View File

@@ -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, ...)

View File

@@ -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, ...)

View File

@@ -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, ...)

View File

@@ -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:

View File

@@ -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

View File

@@ -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
}
`)
}

View File

@@ -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" {

View File

@@ -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)
}

View File

@@ -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}
}

View File

@@ -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}