May want to check out this setting on your issue:
 "cmd/internal/obj: reject splittable ABIInternal functions without 
morestack spill info (e.g., asm functions) because we can't generate a 
correct morestack path "
Unless of course you don't want to use asm functions
On Thursday, March 25, 2021 at 8:03:42 PM UTC-7 Marco Ronchese wrote:

> Thanks for the explanation.
>
> I did some reading and I see there is some work going to switch to 
> register-based calling convention (
> https://github.com/golang/go/issues/40724).
> This could be a good occasion to try to fix this. In that issue is 
> discussed which kind of SysCallbacks are needed, I will drop a comment and 
> see what happens from there.
>
>
> On Thursday, 25 March 2021 at 20:46:06 UTC+1 Ian Lance Taylor wrote:
>
>> On Thu, Mar 25, 2021 at 11:38 AM Marco Ronchese <marcor...@gmail.com> 
>> wrote:
>> >
>> > I am calling certain Windows API from Go code (without CGO), everything 
>> works flawlessly, but now I bumped into this issue.
>> >
>> > I want to register a callback that accepts (also) a float as argument (
>> https://docs.microsoft.com/en-us/windows/win32/api/audiopolicy/nf-audiopolicy-iaudiosessionevents-onsimplevolumechanged)
>>  
>> and I get a runtime error:
>> >
>> > panic: compileCallback: float arguments not supported
>> >
>> > This panic is thrown at 
>> https://golang.org/src/runtime/syscall_windows.go#L125
>> >
>> > I tried to receive an uint32 and convert it with math.Float64frombits 
>> (well, basically just with some pointer arithmetic) but no luck.
>> >
>> > This issue on Github (https://github.com/golang/go/issues/6510), which 
>> got fixed, is related, but there the syscall itself was returning floats, 
>> here is a callback to register with a syscall.
>> >
>> > The questions are:
>> > 1) Can I work around this with some clever pointer conversion? From 
>> what I understand this is not the case since basically Go runtime is 
>> ignoring some CPU registers where that value is stored, am I right?
>> > 2) What is the philosophy behind the choice of not supporting this kind 
>> of stuff? Is something like: "Go runtime needs to support the basic syscall 
>> the language, its standard library and most users need, and for the rest C 
>> is the way"
>> >
>> > A while back I though using CGO for these kind of stuff was the only 
>> way, few weeks ago I discover that this was not necessarily the case. I was 
>> thrilled I could write everything in Go, but maybe this is not true after 
>> all. Well, quite a journey. Of course I hope I am wrong
>>
>> The problem is the calling convention. syscall.NewCallback has to
>> take the C values, which arrive using the C calling convention, and
>> pass them to Go using the Go calling convention. On amd64 the main
>> step here is callbackasm1 in runtime/sys_windows_amd64.s That
>> function takes the C argument registers and stores them in the right
>> place for the Go code. Unfortunately, on x86 floats are passed in
>> floating point registers, not the ordinary argument registers. So to
>> handle floating point arguments the code would need to get them from
>> the right register.
>>
>> Not supporting this case is not a philosophical issue. It's that
>> nobody really knows how to implement it.
>>
>> Ian
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/6f52c808-81e4-495b-bfcd-2fb582244933n%40googlegroups.com.

Reply via email to