2
.gitignore
vendored
2
.gitignore
vendored
@@ -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
6
c/c.go
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, ""
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
8
internal/runtime/c/c_default.go
Normal file
8
internal/runtime/c/c_default.go
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
//go:build !linux
|
||||||
|
// +build !linux
|
||||||
|
|
||||||
|
package c
|
||||||
|
|
||||||
|
const (
|
||||||
|
LLGoPackage = "decl: stdio_default.ll"
|
||||||
|
)
|
||||||
9
internal/runtime/c/c_default.ll
Normal file
9
internal/runtime/c/c_default.ll
Normal 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
|
||||||
8
internal/runtime/c/c_linux.go
Normal file
8
internal/runtime/c/c_linux.go
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
//go:build linux
|
||||||
|
// +build linux
|
||||||
|
|
||||||
|
package c
|
||||||
|
|
||||||
|
const (
|
||||||
|
LLGoPackage = "decl: stdio_linux.ll"
|
||||||
|
)
|
||||||
9
internal/runtime/c/c_linux.ll
Normal file
9
internal/runtime/c/c_linux.ll
Normal 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.
Reference in New Issue
Block a user