Skip to content

Commit

Permalink
Merge pull request #366 from xushiwei/q
Browse files Browse the repository at this point in the history
patch: syscall
  • Loading branch information
xushiwei authored Jun 19, 2024
2 parents 686186d + 1566a83 commit 2e6312e
Show file tree
Hide file tree
Showing 9 changed files with 78 additions and 9 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ Here are the Go packages that can be imported correctly:
* [unicode/utf16](https://pkg.go.dev/unicode/utf16)
* [math/bits](https://pkg.go.dev/math/bits)
* [math](https://pkg.go.dev/math)
* [syscall](https://pkg.go.dev/syscall) (partially)
* [sync](https://pkg.go.dev/sync) (partially)
* [sync/atomic](https://pkg.go.dev/sync/atomic) (partially)

Expand Down
11 changes: 11 additions & 0 deletions _demo/syscall/syscall.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package main

import "syscall"

func main() {
wd, err := syscall.Getwd()
if err != nil {
panic(err)
}
println("cwd:", wd)
}
3 changes: 3 additions & 0 deletions cl/_testrt/strlen/out.ll
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ _llgo_0:

_llgo_1: ; preds = %_llgo_0
store i1 true, ptr @"main.init$guard", align 1
call void @syscall.init()
store i8 72, ptr @main.format, align 1
store i8 101, ptr getelementptr inbounds (i8, ptr @main.format, i64 1), align 1
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 2), align 1
Expand Down Expand Up @@ -40,6 +41,8 @@ _llgo_0:
ret i32 0
}

declare void @syscall.init()

declare void @"github.com/goplus/llgo/internal/runtime.init"()

declare i32 @strlen(ptr)
Expand Down
3 changes: 3 additions & 0 deletions cl/_testrt/struct/out.ll
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ _llgo_0:

_llgo_1: ; preds = %_llgo_0
store i1 true, ptr @"main.init$guard", align 1
call void @syscall.init()
store i8 72, ptr @main.format, align 1
store i8 101, ptr getelementptr inbounds (i8, ptr @main.format, i64 1), align 1
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 2), align 1
Expand Down Expand Up @@ -78,4 +79,6 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64)

declare void @printf(ptr, ...)

declare void @syscall.init()

declare void @"github.com/goplus/llgo/internal/runtime.init"()
3 changes: 3 additions & 0 deletions cl/_testrt/typalias/out.ll
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ _llgo_0:

_llgo_1: ; preds = %_llgo_0
store i1 true, ptr @"main.init$guard", align 1
call void @syscall.init()
store i8 72, ptr @main.format, align 1
store i8 101, ptr getelementptr inbounds (i8, ptr @main.format, i64 1), align 1
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 2), align 1
Expand Down Expand Up @@ -62,6 +63,8 @@ _llgo_0:

declare void @printf(ptr, ...)

declare void @syscall.init()

declare void @"github.com/goplus/llgo/internal/runtime.init"()

declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
7 changes: 3 additions & 4 deletions cl/import.go
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ func (p *context) ensureLoaded(pkgTypes *types.Package) *types.Package {

func pkgKindByPath(pkgPath string) int {
switch pkgPath {
case "syscall", "runtime/cgo", "unsafe":
case "runtime/cgo", "unsafe":
return PkgDeclOnly
}
return PkgNormal
Expand All @@ -520,9 +520,8 @@ func ignoreName(name string) bool {
*/
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, "plugin.") || strings.HasPrefix(name, "reflect.") ||
strings.HasPrefix(name, "runtime/")
strings.HasPrefix(name, "time.") || strings.HasPrefix(name, "runtime/") ||
strings.HasPrefix(name, "plugin.") || strings.HasPrefix(name, "reflect.")
}

// -----------------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions internal/build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -724,6 +724,7 @@ var hasAltPkg = map[string]none{
"math": {},
"sync": {},
"sync/atomic": {},
"syscall": {},
"os": {},
"runtime": {},
}
Expand Down
46 changes: 46 additions & 0 deletions internal/lib/syscall/syscall.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* 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 syscall

// llgo:skipall
import (
"unsafe"

"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/os"
)

func errnoErr(errno c.Int) error {
panic("todo")
}

func Getcwd(buf []byte) (n int, err error) {
ptr := unsafe.Pointer(unsafe.SliceData(buf))
ret := os.Getcwd(ptr, uintptr(len(buf)))
if ret != nil {
return int(c.Strlen(ret)), nil
}
return 0, errnoErr(os.Errno)
}

func Getwd() (string, error) {
wd := os.Getcwd(c.Alloca(os.PATH_MAX), os.PATH_MAX)
if wd != nil {
return c.GoString(wd), nil
}
return "", errnoErr(os.Errno)
}
12 changes: 7 additions & 5 deletions ssa/expr.go
Original file line number Diff line number Diff line change
Expand Up @@ -883,11 +883,6 @@ func (b Builder) Do(da DoAction, fn Expr, args ...Expr) (ret Expr) {
// Go spec (excluding "make" and "new").
func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
switch fn {
case "String": // unsafe.String
return b.unsafeString(args[0].impl, args[1].impl)
case "Slice": // unsafe.Slice
size := args[1].impl
return b.unsafeSlice(args[0], size, size)
case "len":
if len(args) == 1 {
arg := args[0]
Expand Down Expand Up @@ -946,6 +941,13 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
return b.Recover()
case "print", "println":
return b.PrintEx(fn == "println", args...)
case "String": // unsafe.String
return b.unsafeString(args[0].impl, args[1].impl)
case "Slice": // unsafe.Slice
size := args[1].impl
return b.unsafeSlice(args[0], size, size)
case "SliceData":
return b.SliceData(args[0]) // TODO(xsw): check return type
}
panic("todo: " + fn)
}
Expand Down

0 comments on commit 2e6312e

Please sign in to comment.