Merge pull request #58 from xushiwei/q

cl: go:linkname specifies call convention by C.xxx
This commit is contained in:
xushiwei
2024-04-26 13:27:55 +08:00
committed by GitHub
9 changed files with 27 additions and 13 deletions

View File

@@ -3,10 +3,10 @@ package main
import "C"
import _ "unsafe"
//go:linkname printf printf
//go:linkname printf C.printf
func printf(format *int8, __llgo_va_list ...any)
//go:linkname strlen strlen
//go:linkname strlen C.strlen
func strlen(str *int8) C.int
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}

View File

@@ -8,7 +8,7 @@ func (a T) Add(b T) T {
return a + b
}
//go:linkname printf printf
//go:linkname printf C.printf
func printf(format *int8, __llgo_va_list ...any)
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}

View File

@@ -2,7 +2,7 @@ package main
import _ "unsafe"
//go:linkname printf printf
//go:linkname printf C.printf
func printf(format *int8, __llgo_va_list ...any)
var hello = [...]int8{'H', 'e', 'l', 'l', 'o', '\n', 0}

View File

@@ -2,7 +2,7 @@ package main
import _ "unsafe"
//go:linkname printf printf
//go:linkname printf C.printf
func printf(format *int8, __llgo_va_list ...any)
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}

View File

@@ -2,7 +2,7 @@ package main
import _ "unsafe"
//go:linkname printf printf
//go:linkname printf C.printf
func printf(format *int8, __llgo_va_list ...any)
type T int8

View File

@@ -30,13 +30,23 @@ func TestIgnoreName(t *testing.T) {
}
}
func TestImport(t *testing.T) {
func TestErrImport(t *testing.T) {
var ctx context
pkg := types.NewPackage("foo", "foo")
ctx.importPkg(pkg)
}
func TestVarOf(t *testing.T) {
func TestErrInitLinkname(t *testing.T) {
defer func() {
if r := recover(); r == nil {
t.Fatal("initLinkname: no error?")
}
}()
var ctx context
ctx.initLinkname("foo", "//go:linkname Printf printf")
}
func TestErrVarOf(t *testing.T) {
defer func() {
if r := recover(); r == nil {
t.Fatal("varOf: no error?")

View File

@@ -98,9 +98,13 @@ func (p *context) initLinkname(pkgPath, line string) {
if strings.HasPrefix(line, linkname) {
text := strings.TrimSpace(line[len(linkname):])
if idx := strings.IndexByte(text, ' '); idx > 0 {
name := pkgPath + "." + text[:idx]
link := strings.TrimLeft(text[idx+1:], " ")
p.link[name] = link
if strings.Contains(link, ".") { // eg. C.printf, C.strlen
name := pkgPath + "." + text[:idx]
p.link[name] = link[2:]
} else {
panic(line + ": no specified call convention. eg. //go:linkname Printf C.printf")
}
}
}
}

View File

@@ -7,8 +7,8 @@ const (
LLGoPackage = true
)
//go:linkname Printf printf
//go:linkname Printf C.printf
func Printf(format *int8, __llgo_va_list ...any)
//go:linkname Strlen strlen
//go:linkname Strlen C.strlen
func Strlen(str *int8) C.int

View File

@@ -6,7 +6,7 @@ const (
LLGoPackage = true
)
//go:linkname Printf printf
//go:linkname Printf C.printf
func Printf(format *int8, __llgo_va_list ...any)
func Max(a, b int) int {