From df2f13c9b688050d60564207c175a484209b0da8 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 16 Jun 2024 23:07:42 +0800 Subject: [PATCH] patch runtime, sync (use llgo:skipall) --- cl/_testlibgo/atomic/in.go | 3 +- cl/_testlibgo/atomic/out.ll | 46 ++++++++++++++++++++++++++++++ cl/compile.go | 15 ++-------- internal/build/build.go | 4 ++- internal/lib/runtime/runtime.go | 22 ++++++++++++++ internal/lib/sync/atomic/atomic.go | 1 - internal/lib/sync/sync.go | 22 ++++++++++++++ 7 files changed, 96 insertions(+), 17 deletions(-) create mode 100644 cl/_testlibgo/atomic/out.ll create mode 100644 internal/lib/runtime/runtime.go create mode 100644 internal/lib/sync/sync.go diff --git a/cl/_testlibgo/atomic/in.go b/cl/_testlibgo/atomic/in.go index be7974ac..c6879d7e 100644 --- a/cl/_testlibgo/atomic/in.go +++ b/cl/_testlibgo/atomic/in.go @@ -6,6 +6,5 @@ import ( func main() { var v int64 = 100 - atomic.AddInt64(&v, 1) - println(v) + println(atomic.AddInt64(&v, 1)) } diff --git a/cl/_testlibgo/atomic/out.ll b/cl/_testlibgo/atomic/out.ll new file mode 100644 index 00000000..2155a116 --- /dev/null +++ b/cl/_testlibgo/atomic/out.ll @@ -0,0 +1,46 @@ +; ModuleID = 'main' +source_filename = "main" + +@"main.init$guard" = global i1 false, align 1 +@__llgo_argc = global i32 0, align 4 +@__llgo_argv = global ptr null, align 8 + +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 @"sync/atomic.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 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 8) + store i64 100, ptr %2, align 4 + %3 = call i64 @"sync/atomic.AddInt64"(ptr %2, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %3) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + ret i32 0 +} + +declare void @"sync/atomic.init"() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) + +declare i64 @"sync/atomic.AddInt64"(ptr, i64) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) diff --git a/cl/compile.go b/cl/compile.go index 2d20d234..b73e96ce 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -96,23 +96,12 @@ func ignoreName(name string) bool { return true } */ - if strings.HasPrefix(name, "internal/") || strings.HasPrefix(name, "crypto/") || + return strings.HasPrefix(name, "internal/") || strings.HasPrefix(name, "crypto/") || strings.HasPrefix(name, "arena.") || strings.HasPrefix(name, "maps.") || strings.HasPrefix(name, "time.") || strings.HasPrefix(name, "syscall.") || strings.HasPrefix(name, "os.") || strings.HasPrefix(name, "plugin.") || strings.HasPrefix(name, "reflect.") || strings.HasPrefix(name, "errors.") || - strings.HasPrefix(name, "sync.") { - return true // TODO(xsw) - } - return inPkg(name, "runtime") -} - -func inPkg(name, pkg string) bool { - if len(name) > len(pkg) && strings.HasPrefix(name, pkg) { - c := name[len(pkg)] - return c == '.' || c == '/' - } - return false + strings.HasPrefix(name, "runtime/") } // ----------------------------------------------------------------------------- diff --git a/internal/build/build.go b/internal/build/build.go index d5398aba..caec4e85 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -399,7 +399,7 @@ func buildPkg(prog llssa.Program, aPkg *aPackage, mode Mode, verbose bool) { func canSkipToBuild(pkgPath string) bool { switch pkgPath { - case "unsafe", "runtime", "errors", "sync": + case "unsafe", "errors": return true default: return strings.HasPrefix(pkgPath, "internal/") || @@ -419,7 +419,9 @@ type none struct{} var hasAltPkg = map[string]none{ "math": {}, + "sync": {}, "sync/atomic": {}, + "runtime": {}, } type importer = func(pkgPath string) *packages.Package diff --git a/internal/lib/runtime/runtime.go b/internal/lib/runtime/runtime.go new file mode 100644 index 00000000..e8492442 --- /dev/null +++ b/internal/lib/runtime/runtime.go @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package runtime + +// llgo:skipall +import ( + _ "unsafe" +) diff --git a/internal/lib/sync/atomic/atomic.go b/internal/lib/sync/atomic/atomic.go index 42e74b7d..24c3ecb1 100644 --- a/internal/lib/sync/atomic/atomic.go +++ b/internal/lib/sync/atomic/atomic.go @@ -16,7 +16,6 @@ package atomic -// llgo:skipall import ( _ "unsafe" ) diff --git a/internal/lib/sync/sync.go b/internal/lib/sync/sync.go new file mode 100644 index 00000000..56822964 --- /dev/null +++ b/internal/lib/sync/sync.go @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sync + +// llgo:skipall +import ( + _ "unsafe" +)