<html><body><p><tt>jgroff@apple.com wrote on 2016-03-22 12:05:06 PM:<br><br></tt><tt>&gt;</tt><tt>&nbsp;On Mar 22, 2016, at 5:57 AM, Bryan Chan via swift-dev &lt;swift-dev@swift.org</tt><br><tt>&gt;</tt><tt>&nbsp;wrote:</tt><br><tt>&gt;</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; I tried to google for an answer but couldn't find anything. What is</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; the correct way to do the following on Linux?</tt><br><tt>&gt;</tt><tt>&nbsp;&gt;</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; @_silgen_name(&quot;foo&quot;)</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; func foo(theInt: UInt)</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; -&gt; (a: UInt, b: UInt, c: UInt)</tt><br><tt>&gt;</tt><tt>&nbsp;&gt;</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; var (d, e, f) = foo(aNum)</tt><br><tt>&gt;</tt><tt>&nbsp;&gt;</tt><br><tt>[snip]</tt><br><tt>&gt;</tt><tt>&nbsp;&gt;</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; Currently, the call to foo crashes because foo wants to return the</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; tuple indirectly, but the Swift call expects the three scalar return</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; values in registers. This example is a generalization of runtime</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; functions such as swift_class_getInstanceExtents, which happens to</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; work because it only returns two scalars in RAX and RDX, which is</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; supported by Clang. But my tests show that three-scalar tuples/</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; structs will cause problems. On architectures where Clang only</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; supports one scalar return value, the problem is worse.</tt><br><tt>&gt;</tt><tt>&nbsp;&gt;</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; Am I doing something wrong or is there already a way to deal with</tt><br><tt>&gt;</tt><tt>&nbsp;&gt; this (e.g. annotation in Swift code to make it obey C ABI, or vice versa)?</tt><br><tt>&gt;</tt><br><tt>&gt;</tt><tt>&nbsp;Don't use @_silgen_name. If you want to use a C API from Swift,</tt><br><tt>&gt;</tt><tt>&nbsp;define a Clang module for its headers, and import the module. See</tt><br><tt>&gt;</tt><tt>&nbsp;</tt><a href="http://clang.llvm.org/docs/Modules.html"><tt>http://clang.llvm.org/docs/Modules.html</tt></a><tt>&nbsp;for documentation on Clang</tt><br><tt>&gt;</tt><tt>&nbsp;module maps.</tt><br><br><tt>Is this the solution for runtime functions like</tt><br><tt>swift_class_getInstanceExtents as well?</tt><BR>
</body></html>