cl: initLinknameByDoc
This commit is contained in:
9
cl/_testrt/concat/in.go
Normal file
9
cl/_testrt/concat/in.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/goplus/llgo/internal/runtime/c"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
c.Fprintf(c.Stderr, c.Str("Hello %d\n"), 100)
|
||||||
|
}
|
||||||
32
cl/_testrt/concat/out.ll
Normal file
32
cl/_testrt/concat/out.ll
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
; ModuleID = 'main'
|
||||||
|
source_filename = "main"
|
||||||
|
|
||||||
|
@"main.init$guard" = global ptr null
|
||||||
|
@__stderrp = external global ptr
|
||||||
|
@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 @"github.com/goplus/llgo/internal/runtime.init"()
|
||||||
|
call void @main.init()
|
||||||
|
%0 = load ptr, ptr @__stderrp, align 8
|
||||||
|
%1 = call i32 (ptr, ptr, ...) @fprintf(ptr %0, ptr @0, i64 100)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||||
|
|
||||||
|
declare i32 @fprintf(ptr, ptr, ...)
|
||||||
@@ -1,9 +1,16 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import "unsafe"
|
||||||
"github.com/goplus/llgo/internal/runtime/c"
|
|
||||||
)
|
//go:linkname cstr llgo.cstr
|
||||||
|
func cstr(string) *int8
|
||||||
|
|
||||||
|
//go:linkname stderr __stderrp
|
||||||
|
var stderr unsafe.Pointer
|
||||||
|
|
||||||
|
//go:linkname fprintf C.fprintf
|
||||||
|
func fprintf(fp unsafe.Pointer, format *int8, __llgo_va_list ...any)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
c.Fprintf(c.Stderr, c.Str("Hello %d\n"), 100)
|
fprintf(stderr, cstr("Hello %d\n"), 100)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ source_filename = "main"
|
|||||||
@__stderrp = external global ptr
|
@__stderrp = external global ptr
|
||||||
@0 = private unnamed_addr constant [10 x i8] c"Hello %d\0A\00", align 1
|
@0 = private unnamed_addr constant [10 x i8] c"Hello %d\0A\00", align 1
|
||||||
|
|
||||||
|
declare void @fprintf(ptr, ptr, ...)
|
||||||
|
|
||||||
define void @main.init() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
%0 = load i1, ptr @"main.init$guard", align 1
|
%0 = load i1, ptr @"main.init$guard", align 1
|
||||||
@@ -23,10 +25,8 @@ _llgo_0:
|
|||||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||||
call void @main.init()
|
call void @main.init()
|
||||||
%0 = load ptr, ptr @__stderrp, align 8
|
%0 = load ptr, ptr @__stderrp, align 8
|
||||||
%1 = call i32 (ptr, ptr, ...) @fprintf(ptr %0, ptr @0, i64 100)
|
call void (ptr, ptr, ...) @fprintf(ptr %0, ptr @0, i64 100)
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||||
|
|
||||||
declare i32 @fprintf(ptr, ptr, ...)
|
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ func (p *context) compileMethods(pkg llssa.Package, typ types.Type) {
|
|||||||
// Global variable.
|
// Global variable.
|
||||||
func (p *context) compileGlobal(pkg llssa.Package, gbl *ssa.Global) {
|
func (p *context) compileGlobal(pkg llssa.Package, gbl *ssa.Global) {
|
||||||
typ := gbl.Type()
|
typ := gbl.Type()
|
||||||
name := p.varName(gbl.Pkg.Pkg, gbl)
|
name, isDef := p.varName(gbl.Pkg.Pkg, gbl)
|
||||||
if ignoreName(name) || checkCgo(gbl.Name()) {
|
if ignoreName(name) || checkCgo(gbl.Name()) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -185,7 +185,9 @@ func (p *context) compileGlobal(pkg llssa.Package, gbl *ssa.Global) {
|
|||||||
log.Println("==> NewVar", name, typ)
|
log.Println("==> NewVar", name, typ)
|
||||||
}
|
}
|
||||||
g := pkg.NewVar(name, typ)
|
g := pkg.NewVar(name, typ)
|
||||||
g.Init(p.prog.Null(g.Type))
|
if isDef {
|
||||||
|
g.Init(p.prog.Null(g.Type))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *context) compileFunc(pkg llssa.Package, pkgTypes *types.Package, f *ssa.Function) {
|
func (p *context) compileFunc(pkg llssa.Package, pkgTypes *types.Package, f *ssa.Function) {
|
||||||
|
|||||||
31
cl/import.go
31
cl/import.go
@@ -107,20 +107,29 @@ func (p *context) importPkg(pkg *types.Package, i *pkgInfo) {
|
|||||||
func (p *context) initFiles(pkgPath string, files []*ast.File) {
|
func (p *context) initFiles(pkgPath string, files []*ast.File) {
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
for _, decl := range file.Decls {
|
for _, decl := range file.Decls {
|
||||||
if decl, ok := decl.(*ast.FuncDecl); ok {
|
switch decl := decl.(type) {
|
||||||
|
case *ast.FuncDecl:
|
||||||
if decl.Recv == nil {
|
if decl.Recv == nil {
|
||||||
if doc := decl.Doc; doc != nil {
|
p.initLinknameByDoc(decl.Doc, pkgPath, false)
|
||||||
if n := len(doc.List); n > 0 {
|
}
|
||||||
line := doc.List[n-1].Text
|
case *ast.GenDecl:
|
||||||
p.initLinkname(pkgPath, line, false)
|
if decl.Tok == token.VAR && len(decl.Specs) == 1 {
|
||||||
}
|
p.initLinknameByDoc(decl.Doc, pkgPath, true)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *context) initLinknameByDoc(doc *ast.CommentGroup, pkgPath string, isVar bool) {
|
||||||
|
if doc != nil {
|
||||||
|
if n := len(doc.List); n > 0 {
|
||||||
|
line := doc.List[n-1].Text
|
||||||
|
p.initLinkname(pkgPath, line, isVar)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (p *context) initLinknameByPos(fset *token.FileSet, pos token.Pos, pkgPath string, contents contentMap, isVar bool) {
|
func (p *context) initLinknameByPos(fset *token.FileSet, pos token.Pos, pkgPath string, contents contentMap, isVar bool) {
|
||||||
f := fset.File(pos)
|
f := fset.File(pos)
|
||||||
if fp := f.Position(pos); fp.Line > 2 {
|
if fp := f.Position(pos); fp.Line > 2 {
|
||||||
@@ -210,12 +219,12 @@ func (p *context) funcName(pkg *types.Package, fn *ssa.Function, ignore bool) (s
|
|||||||
return name, goFunc
|
return name, goFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *context) varName(pkg *types.Package, v *ssa.Global) string {
|
func (p *context) varName(pkg *types.Package, v *ssa.Global) (vName string, isDef bool) {
|
||||||
name := llssa.FullName(pkg, v.Name())
|
name := llssa.FullName(pkg, v.Name())
|
||||||
if v, ok := p.link[name]; ok {
|
if v, ok := p.link[name]; ok {
|
||||||
return v
|
return v, false
|
||||||
}
|
}
|
||||||
return name
|
return name, true
|
||||||
}
|
}
|
||||||
|
|
||||||
// funcOf returns a function by name and set ftype = goFunc, cFunc, etc.
|
// funcOf returns a function by name and set ftype = goFunc, cFunc, etc.
|
||||||
@@ -246,7 +255,7 @@ func (p *context) funcOf(fn *ssa.Function) (ret llssa.Function, ftype int) {
|
|||||||
func (p *context) varOf(v *ssa.Global) (ret llssa.Global) {
|
func (p *context) varOf(v *ssa.Global) (ret llssa.Global) {
|
||||||
pkgTypes := p.ensureLoaded(v.Pkg.Pkg)
|
pkgTypes := p.ensureLoaded(v.Pkg.Pkg)
|
||||||
pkg := p.pkg
|
pkg := p.pkg
|
||||||
name := p.varName(pkgTypes, v)
|
name, _ := p.varName(pkgTypes, v)
|
||||||
if ret = pkg.VarOf(name); ret == nil {
|
if ret = pkg.VarOf(name); ret == nil {
|
||||||
ret = pkg.NewVar(name, v.Type())
|
ret = pkg.NewVar(name, v.Type())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user