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/_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..d742e44afb 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 != nil && 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/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) } } 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) }