On Fri, Mar 1, 2013 at 3:43 PM, Ian Lance Taylor <i...@google.com> wrote: > On Fri, Mar 1, 2013 at 4:57 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >> >> Due to the fact that libFFI does not handle C99 _Complex arguments >> correctly [1], libgo passes Complex64 and Complex128 arguments via a >> temporary structure. However, passing parts of complex number in a >> structure is not the same as passing true C99 _Complex value, so this >> workaround introduces ABI mismatch between caller and callee. This >> mismatch results in wrong passed values of complex types. >> >> Fortunately all x86 ABIs tolerate this mismatch, but other targets >> (i.e. alpha) don't have this privilege. > > Is there a PR open against libffi? > > Do we have any idea which targets pass complex in a manner different > than a struct of two float/doubles? Your patch assumes that only x86 > targets work, but I would expect that many targets work that way.
$ grep -R "define TARGET_SPLIT_COMPLEX_ARG" config config/rs6000/rs6000.c:#define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true config/xtensa/xtensa.c:#define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true config/alpha/alpha.c:#define TARGET_SPLIT_COMPLEX_ARG alpha_split_complex_arg We can probably define Complex64 type as "struct { float re, im; }" and Complex128 as "struct { double re, im; }" for these targets. What do you think about this approach? Uros.