diff --git a/cl/_testlibgo/_errors/in.go b/cl/_testlibgo/errors/in.go similarity index 100% rename from cl/_testlibgo/_errors/in.go rename to cl/_testlibgo/errors/in.go diff --git a/cl/_testlibgo/errors/out.ll b/cl/_testlibgo/errors/out.ll new file mode 100644 index 000000000..ffce31e6c --- /dev/null +++ b/cl/_testlibgo/errors/out.ll @@ -0,0 +1,60 @@ +; ModuleID = 'main' +source_filename = "main" + +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } +%"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr } +%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } + +@"main.init$guard" = global i1 false, align 1 +@__llgo_argc = global i32 0, align 4 +@__llgo_argv = global ptr null, align 8 +@0 = private unnamed_addr constant [5 x i8] c"error", 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 + call void @errors.init() + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define i32 @main(i32 %0, ptr %1) { +_llgo_0: + store i32 %0, ptr @__llgo_argc, align 4 + store ptr %1, ptr @__llgo_argv, align 8 + call void @"github.com/goplus/llgo/internal/runtime.init"() + call void @main.init() + %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 + store ptr @0, ptr %3, align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 + store i64 5, ptr %4, align 4 + %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + %6 = call %"github.com/goplus/llgo/internal/runtime.iface" @errors.New(%"github.com/goplus/llgo/internal/runtime.String" %5) + %7 = call ptr @"github.com/goplus/llgo/internal/runtime.IfaceType"(%"github.com/goplus/llgo/internal/runtime.iface" %6) + %8 = extractvalue %"github.com/goplus/llgo/internal/runtime.iface" %6, 1 + %9 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %9, i32 0, i32 0 + store ptr %7, ptr %10, align 8 + %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %9, i32 0, i32 1 + store ptr %8, ptr %11, align 8 + %12 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %9, align 8 + call void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface" %12) + unreachable +} + +declare void @errors.init() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare %"github.com/goplus/llgo/internal/runtime.iface" @errors.New(%"github.com/goplus/llgo/internal/runtime.String") + +declare ptr @"github.com/goplus/llgo/internal/runtime.IfaceType"(%"github.com/goplus/llgo/internal/runtime.iface") + +declare void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface") diff --git a/internal/build/build.go b/internal/build/build.go index fb591d896..e7174e3ed 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -35,6 +35,7 @@ import ( "github.com/goplus/llgo/cl" "github.com/goplus/llgo/internal/packages" + "github.com/goplus/llgo/ssa/abi" "github.com/goplus/llgo/xtool/clang" "github.com/goplus/llgo/xtool/env" @@ -400,7 +401,7 @@ func buildPkg(ctx *context, aPkg *aPackage) { } const ( - altPkgPathPrefix = "github.com/goplus/llgo/internal/lib/" + altPkgPathPrefix = abi.PatchPathPrefix ) func altPkgs(initial []*packages.Package, alts ...string) []string { diff --git a/ssa/abi/abi.go b/ssa/abi/abi.go index 28e065b3a..25298272f 100644 --- a/ssa/abi/abi.go +++ b/ssa/abi/abi.go @@ -23,6 +23,7 @@ import ( "go/types" "hash" "log" + "strings" "github.com/goplus/llgo/internal/abi" ) @@ -168,6 +169,10 @@ func (b *Builder) TypeName(t types.Type) (ret string, pub bool) { return } +const ( + PatchPathPrefix = "github.com/goplus/llgo/internal/lib/" +) + // PathOf returns the package path of the specified package. func PathOf(pkg *types.Package) string { if pkg == nil { @@ -176,7 +181,7 @@ func PathOf(pkg *types.Package) string { if pkg.Name() == "main" { return "main" } - return pkg.Path() + return strings.TrimPrefix(pkg.Path(), PatchPathPrefix) } // FullName returns the full name of a package member.