cl: linkname of varName

This commit is contained in:
xushiwei
2024-05-01 20:56:51 +08:00
parent 8f15fd45f2
commit 8d3cb246c2
4 changed files with 17 additions and 9 deletions

View File

@@ -2,7 +2,7 @@
source_filename = "main" source_filename = "main"
@"main.init$guard" = global ptr null @"main.init$guard" = global ptr null
@"github.com/goplus/llgo/internal/runtime/c.Stderr" = 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
define void @main.init() { define void @main.init() {
@@ -22,7 +22,7 @@ define void @main() {
_llgo_0: _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 @"github.com/goplus/llgo/internal/runtime/c.Stderr", align 8 %0 = load ptr, ptr @__stderrp, align 8
%1 = call i32 (ptr, ptr, ...) @fprintf(ptr %0, ptr @0, i64 100) %1 = call i32 (ptr, ptr, ...) @fprintf(ptr %0, ptr @0, i64 100)
ret void ret void
} }

View File

@@ -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 := llssa.FullName(gbl.Pkg.Pkg, gbl.Name()) name := p.varName(gbl.Pkg.Pkg, gbl)
if ignoreName(name) || checkCgo(gbl.Name()) { if ignoreName(name) || checkCgo(gbl.Name()) {
return return
} }

View File

@@ -29,7 +29,7 @@ func testCompile(t *testing.T, src, expected string) {
} }
func TestFromTestrt(t *testing.T) { func TestFromTestrt(t *testing.T) {
cltest.FromDir(t, "fprintf", "./_testrt", true) cltest.FromDir(t, "", "./_testrt", true)
} }
func TestFromTestdata(t *testing.T) { func TestFromTestdata(t *testing.T) {

View File

@@ -210,6 +210,14 @@ 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 {
name := llssa.FullName(pkg, v.Name())
if v, ok := p.link[name]; ok {
return v
}
return name
}
// funcOf returns a function by name and set ftype = goFunc, cFunc, etc. // funcOf returns a function by name and set ftype = goFunc, cFunc, etc.
// or returns nil and set ftype = llgoCstr, llgoAlloca, llgoUnreachable, etc. // or returns nil and set ftype = llgoCstr, llgoAlloca, llgoUnreachable, etc.
func (p *context) funcOf(fn *ssa.Function) (ret llssa.Function, ftype int) { func (p *context) funcOf(fn *ssa.Function) (ret llssa.Function, ftype int) {
@@ -235,14 +243,14 @@ func (p *context) funcOf(fn *ssa.Function) (ret llssa.Function, ftype int) {
return return
} }
func (p *context) varOf(v *ssa.Global) 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 := llssa.FullName(pkgTypes, v.Name()) name := p.varName(pkgTypes, v)
if ret := pkg.VarOf(name); ret != nil { if ret = pkg.VarOf(name); ret == nil {
return ret ret = pkg.NewVar(name, v.Type())
} }
return pkg.NewVar(name, v.Type()) return
} }
func (p *context) ensureLoaded(pkgTypes *types.Package) *types.Package { func (p *context) ensureLoaded(pkgTypes *types.Package) *types.Package {