Merge remote-tracking branch 'gop/main' into q
This commit is contained in:
9
c/c.go
9
c/c.go
@@ -97,15 +97,6 @@ func Qsort(base Pointer, count, elem uintptr, compar func(a, b Pointer) Int)
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
//go:linkname Stdin stdin
|
|
||||||
var Stdin FilePtr
|
|
||||||
|
|
||||||
//go:linkname Stdout stdout
|
|
||||||
var Stdout FilePtr
|
|
||||||
|
|
||||||
//go:linkname Stderr stderr
|
|
||||||
var Stderr FilePtr
|
|
||||||
|
|
||||||
//go:linkname Printf C.printf
|
//go:linkname Printf C.printf
|
||||||
func Printf(format *Char, __llgo_va_list ...any) Int
|
func Printf(format *Char, __llgo_va_list ...any) Int
|
||||||
|
|
||||||
|
|||||||
15
c/c_default.go
Normal file
15
c/c_default.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//go:build !linux
|
||||||
|
// +build !linux
|
||||||
|
|
||||||
|
package c
|
||||||
|
|
||||||
|
import _ "unsafe"
|
||||||
|
|
||||||
|
//go:linkname Stdin __stdinp
|
||||||
|
var Stdin FilePtr
|
||||||
|
|
||||||
|
//go:linkname Stdout __stdoutp
|
||||||
|
var Stdout FilePtr
|
||||||
|
|
||||||
|
//go:linkname Stderr __stderrp
|
||||||
|
var Stderr FilePtr
|
||||||
15
c/c_linux.go
Normal file
15
c/c_linux.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//go:build linux
|
||||||
|
// +build linux
|
||||||
|
|
||||||
|
package c
|
||||||
|
|
||||||
|
import _ "unsafe"
|
||||||
|
|
||||||
|
//go:linkname Stdin stdin
|
||||||
|
var Stdin FilePtr
|
||||||
|
|
||||||
|
//go:linkname Stdout stdout
|
||||||
|
var Stdout FilePtr
|
||||||
|
|
||||||
|
//go:linkname Stderr stderr
|
||||||
|
var Stderr FilePtr
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/goplus/llgo/internal/runtime/c"
|
|
||||||
)
|
|
||||||
|
|
||||||
func concat(args ...string) (ret string) {
|
func concat(args ...string) (ret string) {
|
||||||
for _, v := range args {
|
for _, v := range args {
|
||||||
ret += v
|
ret += v
|
||||||
@@ -17,5 +13,5 @@ func info(s string) string {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
result := concat("Hello", " ", "World")
|
result := concat("Hello", " ", "World")
|
||||||
c.Fprintf(c.Stderr, c.Str("Hi, %s\n"), c.AllocaCStr(result))
|
println(result)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ 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
|
||||||
@stderr = external global ptr
|
|
||||||
@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) {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
@@ -119,12 +117,8 @@ _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 @stderr, align 8
|
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %23)
|
||||||
%25 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %23, 1
|
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||||
%26 = add i64 %25, 1
|
|
||||||
%27 = alloca i8, i64 %26, align 1
|
|
||||||
%28 = call ptr @"github.com/goplus/llgo/internal/runtime.CStrCopy"(ptr %27, %"github.com/goplus/llgo/internal/runtime.String" %23)
|
|
||||||
%29 = call i32 (ptr, ptr, ...) @fprintf(ptr %24, ptr @6, ptr %28)
|
|
||||||
ret i32 0
|
ret i32 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,6 +130,6 @@ declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
|||||||
|
|
||||||
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
|
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
|
||||||
|
|
||||||
declare ptr @"github.com/goplus/llgo/internal/runtime.CStrCopy"(ptr, %"github.com/goplus/llgo/internal/runtime.String")
|
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
|
||||||
|
|
||||||
declare i32 @fprintf(ptr, ptr, ...)
|
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
|
||||||
|
|||||||
@@ -60,10 +60,6 @@ func TestPython(t *testing.T) {
|
|||||||
cltest.Pkg(t, ssa.PkgPython, "../py/llgo_autogen.ll")
|
cltest.Pkg(t, ssa.PkgPython, "../py/llgo_autogen.ll")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRuntime(t *testing.T) {
|
|
||||||
cltest.Pkg(t, ssa.PkgRuntime, "../internal/runtime/llgo_autogen.ll")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestVar(t *testing.T) {
|
func TestVar(t *testing.T) {
|
||||||
testCompile(t, `package foo
|
testCompile(t, `package foo
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -145,11 +145,21 @@ func Do(args []string, conf *Config) {
|
|||||||
return rt[1].Types
|
return rt[1].Types
|
||||||
})
|
})
|
||||||
|
|
||||||
pkgs := buildAllPkgs(prog, initial, mode, verbose)
|
pkgs := buildAllPkgs(prog, initial, nil, mode, verbose)
|
||||||
|
|
||||||
var runtimeFiles []string
|
var runtimeFiles []string
|
||||||
if needRt {
|
if needRt {
|
||||||
runtimeFiles = allLinkFiles(rt)
|
skip := make(map[string]bool)
|
||||||
|
for _, v := range pkgs {
|
||||||
|
skip[v.PkgPath] = true
|
||||||
|
}
|
||||||
|
dpkg := buildAllPkgs(prog, rt[:1], skip, mode, verbose)
|
||||||
|
for _, pkg := range dpkg {
|
||||||
|
if !strings.HasSuffix(pkg.ExportFile, ".ll") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
runtimeFiles = append(runtimeFiles, pkg.ExportFile)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if mode != ModeBuild {
|
if mode != ModeBuild {
|
||||||
nErr := 0
|
nErr := 0
|
||||||
@@ -182,7 +192,7 @@ func isNeedRuntimeOrPyInit(pkg *packages.Package) (needRuntime, needPyInit bool)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, verbose bool) (pkgs []*aPackage) {
|
func buildAllPkgs(prog llssa.Program, initial []*packages.Package, skip map[string]bool, mode Mode, verbose bool) (pkgs []*aPackage) {
|
||||||
// Create SSA-form program representation.
|
// Create SSA-form program representation.
|
||||||
ssaProg, pkgs, errPkgs := allPkgs(initial, ssa.SanityCheckFunctions)
|
ssaProg, pkgs, errPkgs := allPkgs(initial, ssa.SanityCheckFunctions)
|
||||||
ssaProg.Build()
|
ssaProg.Build()
|
||||||
@@ -194,6 +204,10 @@ func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, ve
|
|||||||
}
|
}
|
||||||
for _, aPkg := range pkgs {
|
for _, aPkg := range pkgs {
|
||||||
pkg := aPkg.Package
|
pkg := aPkg.Package
|
||||||
|
if skip[pkg.PkgPath] {
|
||||||
|
pkg.ExportFile = ""
|
||||||
|
continue
|
||||||
|
}
|
||||||
switch kind, param := cl.PkgKindOf(pkg.Types); kind {
|
switch kind, param := cl.PkgKindOf(pkg.Types); kind {
|
||||||
case cl.PkgDeclOnly:
|
case cl.PkgDeclOnly:
|
||||||
// skip packages that only contain declarations
|
// skip packages that only contain declarations
|
||||||
@@ -266,7 +280,7 @@ func linkMainPkg(pkg *packages.Package, pkgs []*aPackage, runtimeFiles []string,
|
|||||||
needRuntime := false
|
needRuntime := false
|
||||||
needPyInit := false
|
needPyInit := false
|
||||||
packages.Visit([]*packages.Package{pkg}, nil, func(p *packages.Package) {
|
packages.Visit([]*packages.Package{pkg}, nil, func(p *packages.Package) {
|
||||||
if p.ExportFile != "" && !isRuntimePkg(p.PkgPath) { // skip packages that only contain declarations
|
if p.ExportFile != "" { // skip packages that only contain declarations
|
||||||
args = appendLinkFiles(args, p.ExportFile)
|
args = appendLinkFiles(args, p.ExportFile)
|
||||||
need1, need2 := isNeedRuntimeOrPyInit(p)
|
need1, need2 := isNeedRuntimeOrPyInit(p)
|
||||||
if !needRuntime {
|
if !needRuntime {
|
||||||
@@ -288,7 +302,9 @@ func linkMainPkg(pkg *packages.Package, pkgs []*aPackage, runtimeFiles []string,
|
|||||||
|
|
||||||
dirty := false
|
dirty := false
|
||||||
if needRuntime && runtimeFiles != nil {
|
if needRuntime && runtimeFiles != nil {
|
||||||
args = append(args, runtimeFiles...)
|
for _, file := range runtimeFiles {
|
||||||
|
args = appendLinkFiles(args, file)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
dirty = true
|
dirty = true
|
||||||
fn := aPkg.LPkg.FuncOf(cl.RuntimeInit)
|
fn := aPkg.LPkg.FuncOf(cl.RuntimeInit)
|
||||||
@@ -445,38 +461,6 @@ func checkFlag(arg string, i *int, verbose *bool, swflags map[string]bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func allLinkFiles(rt []*packages.Package) (outFiles []string) {
|
|
||||||
outFiles = make([]string, 0, len(rt))
|
|
||||||
packages.Visit(rt, nil, func(p *packages.Package) {
|
|
||||||
pkgPath := p.PkgPath
|
|
||||||
kind, param := cl.PkgKindOf(p.Types)
|
|
||||||
if isRuntimePkg(pkgPath) {
|
|
||||||
exptFile := ""
|
|
||||||
if kind == cl.PkgLinkIR || kind == cl.PkgDeclOnly {
|
|
||||||
exptFile = strings.TrimSpace(param)
|
|
||||||
}
|
|
||||||
llgoPkgLinkFiles(pkgPath, exptFile, func(linkFile string) {
|
|
||||||
outFiles = append(outFiles, linkFile)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
pkgAbi = llgoModPath + "/internal/abi"
|
|
||||||
pkgRuntime = llgoModPath + "/internal/runtime"
|
|
||||||
pkgRuntimeC = llgoModPath + "/internal/runtime/c"
|
|
||||||
)
|
|
||||||
|
|
||||||
func isRuntimePkg(pkgPath string) bool {
|
|
||||||
switch pkgPath {
|
|
||||||
case pkgRuntime, pkgAbi, pkgRuntimeC:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
rootDir string
|
rootDir string
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ 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
|
||||||
@@ -26,15 +30,6 @@ type (
|
|||||||
FilePtr = unsafe.Pointer
|
FilePtr = unsafe.Pointer
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:linkname Stdin stdin
|
|
||||||
var Stdin FilePtr
|
|
||||||
|
|
||||||
//go:linkname Stdout stdout
|
|
||||||
var Stdout FilePtr
|
|
||||||
|
|
||||||
//go:linkname Stderr stderr
|
|
||||||
var Stderr FilePtr
|
|
||||||
|
|
||||||
//go:linkname Str llgo.cstr
|
//go:linkname Str llgo.cstr
|
||||||
func Str(string) *Char
|
func Str(string) *Char
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,13 @@
|
|||||||
|
|
||||||
package c
|
package c
|
||||||
|
|
||||||
const (
|
import _ "unsafe"
|
||||||
LLGoPackage = "decl: c_default.ll"
|
|
||||||
)
|
//go:linkname Stdin __stdinp
|
||||||
|
var Stdin FilePtr
|
||||||
|
|
||||||
|
//go:linkname Stdout __stdoutp
|
||||||
|
var Stdout FilePtr
|
||||||
|
|
||||||
|
//go:linkname Stderr __stderrp
|
||||||
|
var Stderr FilePtr
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
; 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
|
|
||||||
@stdin = alias i8*, i8** @__stdinp
|
|
||||||
@stdout = alias i8*, i8** @__stdoutp
|
|
||||||
@stderr = alias i8*, i8** @__stderrp
|
|
||||||
@@ -3,6 +3,13 @@
|
|||||||
|
|
||||||
package c
|
package c
|
||||||
|
|
||||||
const (
|
import _ "unsafe"
|
||||||
LLGoPackage = "decl: c_linux.ll"
|
|
||||||
)
|
//go:linkname Stdin stdin
|
||||||
|
var Stdin FilePtr
|
||||||
|
|
||||||
|
//go:linkname Stdout stdout
|
||||||
|
var Stdout FilePtr
|
||||||
|
|
||||||
|
//go:linkname Stderr stderr
|
||||||
|
var Stderr FilePtr
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
; ModuleID = 'github.com/goplus/llgo/internal/runtime/c'
|
|
||||||
source_filename = "github.com/goplus/llgo/internal/runtime/c"
|
|
||||||
Binary file not shown.
@@ -41,14 +41,6 @@ func TestFromTestdata(t *testing.T) {
|
|||||||
cltest.FromDir(t, "", "../cl/_testdata", false)
|
cltest.FromDir(t, "", "../cl/_testdata", false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRuntime(t *testing.T) {
|
|
||||||
cltest.Pkg(t, "github.com/goplus/llgo/internal/runtime", "../internal/runtime/llgo_autogen.ll")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAbi(t *testing.T) {
|
|
||||||
cltest.Pkg(t, "github.com/goplus/llgo/internal/abi", "../internal/abi/llgo_autogen.ll")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMakeInterface(t *testing.T) {
|
func TestMakeInterface(t *testing.T) {
|
||||||
prog := ssatest.NewProgram(t, &ssa.Target{GOARCH: "x86"})
|
prog := ssatest.NewProgram(t, &ssa.Target{GOARCH: "x86"})
|
||||||
pkg := prog.NewPackage("foo", "foo")
|
pkg := prog.NewPackage("foo", "foo")
|
||||||
|
|||||||
Reference in New Issue
Block a user