Merge pull request #275 from cpunion/libc

runtime: libc compatible
This commit is contained in:
xushiwei
2024-06-06 17:24:06 +08:00
committed by GitHub
12 changed files with 67 additions and 25 deletions

2
.gitignore vendored
View File

@@ -9,7 +9,7 @@
*.dylib *.dylib
test.db test.db
llgo_autogen.ll llgo_autogen*.ll
stories*.bin stories*.bin
.DS_Store .DS_Store
err.log err.log

6
c/c.go
View File

@@ -97,13 +97,13 @@ func Qsort(base Pointer, count, elem uintptr, compar func(a, b Pointer) Int)
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
//go:linkname Stdin __stdinp //go:linkname Stdin llgo_stdin
var Stdin FilePtr var Stdin FilePtr
//go:linkname Stdout __stdoutp //go:linkname Stdout llgo_stdout
var Stdout FilePtr var Stdout FilePtr
//go:linkname Stderr __stderrp //go:linkname Stderr llgo_stderr
var Stderr FilePtr var Stderr FilePtr
//go:linkname Printf C.printf //go:linkname Printf C.printf

View File

@@ -13,7 +13,7 @@ source_filename = "main"
@3 = private unnamed_addr constant [6 x i8] c"Hello\00", align 1 @3 = private unnamed_addr constant [6 x i8] c"Hello\00", align 1
@4 = private unnamed_addr constant [2 x i8] c" \00", align 1 @4 = private unnamed_addr constant [2 x i8] c" \00", align 1
@5 = private unnamed_addr constant [6 x i8] c"World\00", align 1 @5 = private unnamed_addr constant [6 x i8] c"World\00", align 1
@__stderrp = external global ptr @llgo_stderr = external global ptr
@6 = private unnamed_addr constant [8 x i8] c"Hi, %s\0A\00", align 1 @6 = private unnamed_addr constant [8 x i8] c"Hi, %s\0A\00", align 1
define %"github.com/goplus/llgo/internal/runtime.String" @main.concat(%"github.com/goplus/llgo/internal/runtime.Slice" %0) { define %"github.com/goplus/llgo/internal/runtime.String" @main.concat(%"github.com/goplus/llgo/internal/runtime.Slice" %0) {
@@ -119,7 +119,7 @@ _llgo_0:
store i64 3, ptr %21, align 4 store i64 3, ptr %21, align 4
%22 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %18, align 8 %22 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %18, align 8
%23 = call %"github.com/goplus/llgo/internal/runtime.String" @main.concat(%"github.com/goplus/llgo/internal/runtime.Slice" %22) %23 = call %"github.com/goplus/llgo/internal/runtime.String" @main.concat(%"github.com/goplus/llgo/internal/runtime.Slice" %22)
%24 = load ptr, ptr @__stderrp, align 8 %24 = load ptr, ptr @llgo_stderr, align 8
%25 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %23, 1 %25 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %23, 1
%26 = add i64 %25, 1 %26 = add i64 %25, 1
%27 = alloca i8, i64 %26, align 1 %27 = alloca i8, i64 %26, align 1

View File

@@ -26,6 +26,7 @@ import (
"log" "log"
"os" "os"
"path" "path"
"path/filepath"
"strings" "strings"
"testing" "testing"
@@ -74,7 +75,7 @@ func decodeLinkFile(llFile string) (data []byte, err error) {
return return
} }
defer zipf.Close() defer zipf.Close()
f, err := zipf.Open("llgo_autogen.ll") f, err := zipf.Open(filepath.Base(llFile))
if err != nil { if err != nil {
return return
} }

View File

@@ -105,6 +105,8 @@ func pkgKind(v string) (int, string) {
return PkgLinkExtern, v[5:] return PkgLinkExtern, v[5:]
} else if strings.HasPrefix(v, "py.") { // "py.<module>" } else if strings.HasPrefix(v, "py.") { // "py.<module>"
return PkgPyModule, v[3:] return PkgPyModule, v[3:]
} else if strings.HasPrefix(v, "decl:") { // "decl: <param>"
return PkgDeclOnly, v[5:]
} }
} }
return PkgLLGo, "" return PkgLLGo, ""

View File

@@ -449,8 +449,13 @@ func allLinkFiles(rt []*packages.Package) (outFiles []string) {
outFiles = make([]string, 0, len(rt)) outFiles = make([]string, 0, len(rt))
packages.Visit(rt, nil, func(p *packages.Package) { packages.Visit(rt, nil, func(p *packages.Package) {
pkgPath := p.PkgPath pkgPath := p.PkgPath
kind, param := cl.PkgKindOf(p.Types)
if isRuntimePkg(pkgPath) { if isRuntimePkg(pkgPath) {
llgoPkgLinkFiles(pkgPath, func(linkFile string) { exptFile := ""
if kind == cl.PkgLinkIR || kind == cl.PkgDeclOnly {
exptFile = strings.TrimSpace(param)
}
llgoPkgLinkFiles(pkgPath, exptFile, func(linkFile string) {
outFiles = append(outFiles, linkFile) outFiles = append(outFiles, linkFile)
}) })
} }
@@ -459,13 +464,14 @@ func allLinkFiles(rt []*packages.Package) (outFiles []string) {
} }
const ( const (
pkgAbi = llgoModPath + "/internal/abi" pkgAbi = llgoModPath + "/internal/abi"
pkgRuntime = llgoModPath + "/internal/runtime" pkgRuntime = llgoModPath + "/internal/runtime"
pkgRuntimeC = llgoModPath + "/internal/runtime/c"
) )
func isRuntimePkg(pkgPath string) bool { func isRuntimePkg(pkgPath string) bool {
switch pkgPath { switch pkgPath {
case pkgRuntime, pkgAbi: case pkgRuntime, pkgAbi, pkgRuntimeC:
return true return true
} }
return false return false
@@ -501,7 +507,7 @@ func concatPkgLinkFiles(pkgPath string) string {
var b strings.Builder var b strings.Builder
var ret string var ret string
var n int var n int
llgoPkgLinkFiles(pkgPath, func(linkFile string) { llgoPkgLinkFiles(pkgPath, "", func(linkFile string) {
if n == 0 { if n == 0 {
ret = linkFile ret = linkFile
} else { } else {
@@ -518,13 +524,16 @@ func concatPkgLinkFiles(pkgPath string) string {
return ret return ret
} }
func llgoPkgLinkFiles(pkgPath string, procFile func(linkFile string)) { func llgoPkgLinkFiles(pkgPath string, llFile string, procFile func(linkFile string)) {
dir := llgoRoot() + pkgPath[len(llgoModPath):] + "/" dir := llgoRoot() + pkgPath[len(llgoModPath):] + "/"
llFile := dir + "llgo_autogen.ll" if llFile == "" {
llaFile := llFile + "a" llFile = "llgo_autogen.ll"
zipf, err := zip.OpenReader(llaFile) }
llPath := dir + llFile
llaPath := llPath + "a"
zipf, err := zip.OpenReader(llaPath)
if err != nil { if err != nil {
procFile(llFile) procFile(llPath)
return return
} }
defer zipf.Close() defer zipf.Close()
@@ -532,7 +541,7 @@ func llgoPkgLinkFiles(pkgPath string, procFile func(linkFile string)) {
for _, f := range zipf.File { for _, f := range zipf.File {
procFile(dir + f.Name) procFile(dir + f.Name)
} }
if _, err := os.Stat(llFile); os.IsNotExist(err) { if _, err := os.Stat(llPath); os.IsNotExist(err) {
for _, f := range zipf.File { for _, f := range zipf.File {
decodeFile(dir+f.Name, f) decodeFile(dir+f.Name, f)
} }

View File

@@ -19,10 +19,6 @@ package c
import "C" import "C"
import "unsafe" import "unsafe"
const (
LLGoPackage = "decl"
)
type ( type (
Char = int8 Char = int8
Int = C.int Int = C.int
@@ -30,13 +26,13 @@ type (
FilePtr = unsafe.Pointer FilePtr = unsafe.Pointer
) )
//go:linkname Stdin __stdinp //go:linkname Stdin llgo_stdin
var Stdin FilePtr var Stdin FilePtr
//go:linkname Stdout __stdoutp //go:linkname Stdout llgo_stdout
var Stdout FilePtr var Stdout FilePtr
//go:linkname Stderr __stderrp //go:linkname Stderr llgo_stderr
var Stderr FilePtr var Stderr FilePtr
//go:linkname Str llgo.cstr //go:linkname Str llgo.cstr

View File

@@ -0,0 +1,8 @@
//go:build !linux
// +build !linux
package c
const (
LLGoPackage = "decl: stdio_default.ll"
)

View File

@@ -0,0 +1,9 @@
; ModuleID = 'github.com/goplus/llgo/internal/runtime/c'
source_filename = "github.com/goplus/llgo/internal/runtime/c"
@__stderrp = external global ptr
@__stdinp = external global ptr
@__stdoutp = external global ptr
@llgo_stdin = alias i8*, i8** @__stdinp
@llgo_stdout = alias i8*, i8** @__stdoutp
@llgo_stderr = alias i8*, i8** @__stderrp

View File

@@ -0,0 +1,8 @@
//go:build linux
// +build linux
package c
const (
LLGoPackage = "decl: stdio_linux.ll"
)

View File

@@ -0,0 +1,9 @@
; ModuleID = 'github.com/goplus/llgo/internal/runtime/c'
source_filename = "github.com/goplus/llgo/internal/runtime/c"
@stderr = external global ptr
@stdin = external global ptr
@stdout = external global ptr
@llgo_stdin = alias i8*, i8** @stdin
@llgo_stdout = alias i8*, i8** @stdout
@llgo_stderr = alias i8*, i8** @stderr

Binary file not shown.