From e7e98d50083f34d42a964d54101c6309fc76f77b Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 22 Jul 2026 20:20:24 +0800 Subject: [PATCH 1/2] internal/build: fix linkname support main.sym --- _demo/go/mainlink/main.go | 14 ++++++++++++++ internal/build/build.go | 6 ++++++ internal/build/main_module.go | 11 +++++++++-- ssa/abi/abi.go | 3 +++ ssa/abitype.go | 2 +- 5 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 _demo/go/mainlink/main.go diff --git a/_demo/go/mainlink/main.go b/_demo/go/mainlink/main.go new file mode 100644 index 0000000000..5be31d544b --- /dev/null +++ b/_demo/go/mainlink/main.go @@ -0,0 +1,14 @@ +package main + +import _ "unsafe" + +func main() { + linkdemo() +} + +func demo() { + println("demo") +} + +//go:linkname linkdemo main.demo +func linkdemo() diff --git a/internal/build/build.go b/internal/build/build.go index 2de1f96536..4c1ba9f079 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -689,6 +689,9 @@ func filterTestPackages(initial []*packages.Package, outFile string) ([]*package if needLink(pkg, ModeTest) { filtered = append(filtered, pkg) } + if pkg.Types.Name() == "main" { + pkg.Types.SetName("main.test") + } } if len(filtered) > 1 && outFile != "" { return nil, fmt.Errorf("cannot use -o flag with multiple packages") @@ -1132,6 +1135,9 @@ func linkMainPkg(ctx *context, pkg *packages.Package, pkgs []*aPackage, outputPa methodByName := make(map[string]none) allPkgs := []*packages.Package{pkg} for _, v := range pkgs { + if v.PkgPath != pkg.PkgPath && v.Types.Name() == "main" { + continue + } allPkgs = append(allPkgs, v.Package) } visitRoots := allPkgs diff --git a/internal/build/main_module.go b/internal/build/main_module.go index 5dbf0ad81f..285a4af970 100644 --- a/internal/build/main_module.go +++ b/internal/build/main_module.go @@ -110,8 +110,15 @@ func genMainModule(ctx *context, rtPkgPath string, pkg *packages.Package, cfg *g }) } - mainInit := declareNoArgFunc(mainPkg, pkg.PkgPath+".init") - mainMain := declareNoArgFunc(mainPkg, pkg.PkgPath+".main") + var pkgPath string + if pkg.Types.Name() == "main" { + pkgPath = "main" + } else { + pkgPath = pkg.PkgPath + } + + mainInit := declareNoArgFunc(mainPkg, pkgPath+".init") + mainMain := declareNoArgFunc(mainPkg, pkgPath+".main") entryFn := defineEntryFunction(ctx, mainPkg, argcVar, argvVar, argvValueType, entryFunctions{ runtimeStub: runtimeStub, diff --git a/ssa/abi/abi.go b/ssa/abi/abi.go index 78e00d18f1..544ff0b801 100644 --- a/ssa/abi/abi.go +++ b/ssa/abi/abi.go @@ -284,6 +284,9 @@ func PathOf(pkg *types.Package) string { if pkg == nil { return "" } + if pkg.Name() == "main" { + return "main" + } return strings.TrimPrefix(pkg.Path(), PatchPathPrefix) } diff --git a/ssa/abitype.go b/ssa/abitype.go index a42d944a59..bd6ffaa822 100644 --- a/ssa/abitype.go +++ b/ssa/abitype.go @@ -506,7 +506,7 @@ func methodExprSignature(sig *types.Signature) *types.Signature { func (b Builder) abiMethodFunc(anonymous bool, mPkg *types.Package, mName string, mSig *types.Signature) Function { var fullName string if anonymous { - fullName = b.Pkg.Path() + "." + mSig.Recv().Type().String() + "." + mName + fullName = b.Pkg.Path() + "." + types.TypeString(mSig.Recv().Type(), abi.PathOf) + "." + mName } else { fullName = FuncName(mPkg, mName, mSig.Recv(), false) } From 5cdaa13a667464c1a184dacc3ea91727eff5136d Mon Sep 17 00:00:00 2001 From: visualfc Date: Fri, 24 Jul 2026 10:52:21 +0800 Subject: [PATCH 2/2] _demo/go/export: export main.sym --- _demo/go/export/libexport.h.want | 2 +- _demo/go/export/use/main.c | 2 +- internal/build/build.go | 2 +- internal/cabi/cabi_test.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_demo/go/export/libexport.h.want b/_demo/go/export/libexport.h.want index 67deee32be..88a7ed27dc 100644 --- a/_demo/go/export/libexport.h.want +++ b/_demo/go/export/libexport.h.want @@ -311,7 +311,7 @@ GoString TwoParams(intptr_t a, GoString b); void -github_com_goplus_llgo__demo_go_export_init(void) GO_SYMBOL_RENAME("github.com/goplus/llgo/_demo/go/export.init") +main_init(void) GO_SYMBOL_RENAME("main.init") diff --git a/_demo/go/export/use/main.c b/_demo/go/export/use/main.c index 4e1a911b45..c81c9e2887 100644 --- a/_demo/go/export/use/main.c +++ b/_demo/go/export/use/main.c @@ -36,7 +36,7 @@ int main() { // Initialize packages - call init functions first github_com_goplus_llgo__demo_go_export_c_init(); - github_com_goplus_llgo__demo_go_export_init(); + main_init(); // Verify that funcinfo is not merely linkable: runtime.Callers must yield // a symbolized frame and runtime.FuncForPC must resolve that PC's details. diff --git a/internal/build/build.go b/internal/build/build.go index 4c1ba9f079..d742e44afb 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -689,7 +689,7 @@ func filterTestPackages(initial []*packages.Package, outFile string) ([]*package if needLink(pkg, ModeTest) { filtered = append(filtered, pkg) } - if pkg.Types.Name() == "main" { + if pkg.Types != nil && pkg.Types.Name() == "main" { pkg.Types.SetName("main.test") } } diff --git a/internal/cabi/cabi_test.go b/internal/cabi/cabi_test.go index cae8cdf68c..0b4e450467 100644 --- a/internal/cabi/cabi_test.go +++ b/internal/cabi/cabi_test.go @@ -155,7 +155,7 @@ func testModule(t *testing.T, ctx context, td llvm.TargetData, m llvm.Module, c // check c linkname testFunc(t, ctx, td, m.NamedFunction(fn.Name()), fn) // check go - testFunc(t, ctx, td, m.NamedFunction("command-line-arguments."+fn.Name()), fn) + testFunc(t, ctx, td, m.NamedFunction("main."+fn.Name()), fn) } }