cl: go:linkname specifies call convention by C.xxx
This commit is contained in:
@@ -3,10 +3,10 @@ package main
|
|||||||
import "C"
|
import "C"
|
||||||
import _ "unsafe"
|
import _ "unsafe"
|
||||||
|
|
||||||
//go:linkname printf printf
|
//go:linkname printf C.printf
|
||||||
func printf(format *int8, __llgo_va_list ...any)
|
func printf(format *int8, __llgo_va_list ...any)
|
||||||
|
|
||||||
//go:linkname strlen strlen
|
//go:linkname strlen C.strlen
|
||||||
func strlen(str *int8) C.int
|
func strlen(str *int8) C.int
|
||||||
|
|
||||||
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ func (a T) Add(b T) T {
|
|||||||
return a + b
|
return a + b
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:linkname printf printf
|
//go:linkname printf C.printf
|
||||||
func printf(format *int8, __llgo_va_list ...any)
|
func printf(format *int8, __llgo_va_list ...any)
|
||||||
|
|
||||||
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package main
|
|||||||
|
|
||||||
import _ "unsafe"
|
import _ "unsafe"
|
||||||
|
|
||||||
//go:linkname printf printf
|
//go:linkname printf C.printf
|
||||||
func printf(format *int8, __llgo_va_list ...any)
|
func printf(format *int8, __llgo_va_list ...any)
|
||||||
|
|
||||||
var hello = [...]int8{'H', 'e', 'l', 'l', 'o', '\n', 0}
|
var hello = [...]int8{'H', 'e', 'l', 'l', 'o', '\n', 0}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package main
|
|||||||
|
|
||||||
import _ "unsafe"
|
import _ "unsafe"
|
||||||
|
|
||||||
//go:linkname printf printf
|
//go:linkname printf C.printf
|
||||||
func printf(format *int8, __llgo_va_list ...any)
|
func printf(format *int8, __llgo_va_list ...any)
|
||||||
|
|
||||||
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package main
|
|||||||
|
|
||||||
import _ "unsafe"
|
import _ "unsafe"
|
||||||
|
|
||||||
//go:linkname printf printf
|
//go:linkname printf C.printf
|
||||||
func printf(format *int8, __llgo_va_list ...any)
|
func printf(format *int8, __llgo_va_list ...any)
|
||||||
|
|
||||||
type T int8
|
type T int8
|
||||||
|
|||||||
@@ -30,13 +30,23 @@ func TestIgnoreName(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestImport(t *testing.T) {
|
func TestErrImport(t *testing.T) {
|
||||||
var ctx context
|
var ctx context
|
||||||
pkg := types.NewPackage("foo", "foo")
|
pkg := types.NewPackage("foo", "foo")
|
||||||
ctx.importPkg(pkg)
|
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() {
|
defer func() {
|
||||||
if r := recover(); r == nil {
|
if r := recover(); r == nil {
|
||||||
t.Fatal("varOf: no error?")
|
t.Fatal("varOf: no error?")
|
||||||
|
|||||||
@@ -98,9 +98,13 @@ func (p *context) initLinkname(pkgPath, line string) {
|
|||||||
if strings.HasPrefix(line, linkname) {
|
if strings.HasPrefix(line, linkname) {
|
||||||
text := strings.TrimSpace(line[len(linkname):])
|
text := strings.TrimSpace(line[len(linkname):])
|
||||||
if idx := strings.IndexByte(text, ' '); idx > 0 {
|
if idx := strings.IndexByte(text, ' '); idx > 0 {
|
||||||
name := pkgPath + "." + text[:idx]
|
|
||||||
link := strings.TrimLeft(text[idx+1:], " ")
|
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")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ const (
|
|||||||
LLGoPackage = true
|
LLGoPackage = true
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:linkname Printf printf
|
//go:linkname Printf C.printf
|
||||||
func Printf(format *int8, __llgo_va_list ...any)
|
func Printf(format *int8, __llgo_va_list ...any)
|
||||||
|
|
||||||
//go:linkname Strlen strlen
|
//go:linkname Strlen C.strlen
|
||||||
func Strlen(str *int8) C.int
|
func Strlen(str *int8) C.int
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ const (
|
|||||||
LLGoPackage = true
|
LLGoPackage = true
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:linkname Printf printf
|
//go:linkname Printf C.printf
|
||||||
func Printf(format *int8, __llgo_va_list ...any)
|
func Printf(format *int8, __llgo_va_list ...any)
|
||||||
|
|
||||||
func Max(a, b int) int {
|
func Max(a, b int) int {
|
||||||
|
|||||||
Reference in New Issue
Block a user