From f86cd74a98c9c0b4a11ca195e411094b57354369 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Fri, 26 Apr 2024 13:09:24 +0800 Subject: [PATCH] cl: go:linkname specifies call convention by C.xxx --- cl/_testcgo/strlen/in.go | 4 ++-- cl/_testdata/method/in.go | 2 +- cl/_testdata/printf/in.go | 2 +- cl/_testdata/printval/in.go | 2 +- cl/_testdata/ptrmthd/in.go | 2 +- cl/builtin_test.go | 14 ++++++++++++-- cl/import.go | 8 ++++++-- cl/internal/libc/libc.go | 4 ++-- cl/internal/stdio/printf.go | 2 +- 9 files changed, 27 insertions(+), 13 deletions(-) diff --git a/cl/_testcgo/strlen/in.go b/cl/_testcgo/strlen/in.go index edaa5e9d..7a81d54c 100644 --- a/cl/_testcgo/strlen/in.go +++ b/cl/_testcgo/strlen/in.go @@ -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} diff --git a/cl/_testdata/method/in.go b/cl/_testdata/method/in.go index 991b92b0..ab3a8676 100644 --- a/cl/_testdata/method/in.go +++ b/cl/_testdata/method/in.go @@ -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} diff --git a/cl/_testdata/printf/in.go b/cl/_testdata/printf/in.go index 8d7d1264..812130f1 100644 --- a/cl/_testdata/printf/in.go +++ b/cl/_testdata/printf/in.go @@ -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} diff --git a/cl/_testdata/printval/in.go b/cl/_testdata/printval/in.go index 93d49b80..192c66df 100644 --- a/cl/_testdata/printval/in.go +++ b/cl/_testdata/printval/in.go @@ -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} diff --git a/cl/_testdata/ptrmthd/in.go b/cl/_testdata/ptrmthd/in.go index 16ee3b42..5a61f4b0 100644 --- a/cl/_testdata/ptrmthd/in.go +++ b/cl/_testdata/ptrmthd/in.go @@ -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 diff --git a/cl/builtin_test.go b/cl/builtin_test.go index 23738745..1d116134 100644 --- a/cl/builtin_test.go +++ b/cl/builtin_test.go @@ -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?") diff --git a/cl/import.go b/cl/import.go index 9a02ec0b..53b42d21 100644 --- a/cl/import.go +++ b/cl/import.go @@ -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") + } } } } diff --git a/cl/internal/libc/libc.go b/cl/internal/libc/libc.go index ef5d228a..8828a4df 100644 --- a/cl/internal/libc/libc.go +++ b/cl/internal/libc/libc.go @@ -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 diff --git a/cl/internal/stdio/printf.go b/cl/internal/stdio/printf.go index ac080937..7f97aeb0 100644 --- a/cl/internal/stdio/printf.go +++ b/cl/internal/stdio/printf.go @@ -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 {