mirror of https://github.com/golang/go.git
An exported Go function like
//export F
func F() {}
gets declared in _cgo_export.h as something like
extern void F(void);
The exact declaration varies by operating system.
In particular, Windows adds __declspec(dllimport).
Clang on Windows/ARM64 rejects code that contains
conflicting declarations for F, like:
extern void F(void);
extern void __declspec(dllimport) F(void);
This means that F must not be declared separately from _cgo_export.h:
any code that wants to refer to F must use #include "_cgo_export.h".
Unfortunately, the cgo prologue itself (the commented code before import "C")
cannot include "_cgo_export.h", because that file is itself produced from the
cgo Go sources and therefore cannot be a dependency of the cgo Go sources.
This CL rewrites misc/cgo/test to avoid redeclaring exported functions.
Most of the time, this is not a significant problem: just move the code
that needs the header into a .c file, perhaps with a wrapper exposed
to the cgo Go sources.
The one case that is potentially problematic is f7665, which is part of
the test for golang.org/issue/7665. That bug report explicitly identified
a bug in referring to the C name for an exported function in the same
Go source file as it was exported function. That is now impossible,
at least on Windows/ARM64, so the test is modified a bit and possibly
does not test what the original bug was. But the original bug should
be long gone: that part of the compiler has been rewritten.
Change-Id: I0d14d9336632f0e5e3db4273d9d32ef2cca0298d
Reviewed-on: https://go-review.googlesource.com/c/go/+/312029
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
|
||
|---|---|---|
| .. | ||
| testdata | ||
| backdoor.go | ||
| buildid_linux.go | ||
| callback.go | ||
| callback_c.c | ||
| callback_c_gc.c | ||
| callback_c_gccgo.c | ||
| cgo_linux_test.go | ||
| cgo_stubs_android_test.go | ||
| cgo_test.go | ||
| cgo_thread_lock.go | ||
| cgo_unix_test.go | ||
| cthread_unix.c | ||
| cthread_windows.c | ||
| issue1435.go | ||
| issue4029.c | ||
| issue4029.go | ||
| issue4029w.go | ||
| issue4273.c | ||
| issue4273b.c | ||
| issue4339.c | ||
| issue4339.h | ||
| issue5548_c.c | ||
| issue5740a.c | ||
| issue5740b.c | ||
| issue6833_c.c | ||
| issue6907export_c.c | ||
| issue6997_linux.c | ||
| issue6997_linux.go | ||
| issue7234_test.go | ||
| issue8148.c | ||
| issue8148.go | ||
| issue8331.h | ||
| issue8517.go | ||
| issue8517_windows.c | ||
| issue8517_windows.go | ||
| issue8694.go | ||
| issue8811.c | ||
| issue18146.go | ||
| issue20910.c | ||
| issue21897.go | ||
| issue21897b.go | ||
| issue31891.c | ||
| issue42495.go | ||
| overlaydir_test.go | ||
| pkg_test.go | ||
| setgid_linux.go | ||
| sigaltstack.go | ||
| sigprocmask.c | ||
| sigprocmask.go | ||
| test.go | ||
| test_unix.go | ||
| test_windows.go | ||
| testx.c | ||
| testx.go | ||