> On Oct 13, 2016, at 9:30 AM, Michael Gottesman <mgottes...@apple.com> wrote:
>> On Oct 12, 2016, at 4:36 PM, John McCall via swift-dev <swift-dev@swift.org 
>> <mailto:swift-dev@swift.org>> wrote:
>> 
>>> On Oct 12, 2016, at 3:46 PM, Greg Parker <gpar...@apple.com 
>>> <mailto:gpar...@apple.com>> wrote:
>>>> On Oct 12, 2016, at 11:11 AM, John McCall via swift-dev 
>>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>>> 
>>>>> On Oct 11, 2016, at 8:10 PM, Joe Groff via swift-dev <swift-dev@swift.org 
>>>>> <mailto:swift-dev@swift.org>> wrote:
>>>>> I just tracked down a bug due to C++ code in the Swift runtime code 
>>>>> trying to interface with standard library code written in Swift, but 
>>>>> getting the ABI slightly wrong and leading to some nasty 
>>>>> hard-to-reproduce heisenbugs. While I've narrowed down the bug in this 
>>>>> specific case, it seems like this is a potentially continuing source of 
>>>>> maintenance bugs, especially as we try to bring up the Swift calling 
>>>>> convention in the coming year. I'm wondering if there's anything we could 
>>>>> do to help validate that C++ and Swift code in the runtime is correctly 
>>>>> interfacing. We could at least check that we're passing the right number 
>>>>> of arguments by comparing the LLVM IR of the runtime and stdlib, perhaps, 
>>>>> though this would have to be a fuzzy type-level match since Clang and 
>>>>> Swift aren't normally going to agree on the exact pointer types of 
>>>>> arguments.
>>>> 
>>>> One potential approach:  make a def file with the names and (somehow 
>>>> abstracted) expected prototypes of Swift functions defined by the standard 
>>>> library but used by the runtime.  In the runtime, use that to autogenerate 
>>>> a header.  In IRGen, add a +Asserts check before finalizing the module 
>>>> that, if there are any functions with those names, they do match the 
>>>> abstract prototypes.  Hope that all such interactions use only portable 
>>>> IRGen call-lowering patterns.
>>> 
>>> Or perhaps have a swiftc mode that generates a C prototype for every 
>>> function marked with @_silgen_name, and use that to build an autogenerated 
>>> C header. (I.e., skip the def file and use the swift file as the canonical 
>>> description.)
>> 
>> That's nice in theory, but it creates a build dependency between the C++ and 
>> Swift sources wherever we want to do this.
> 
> I have not thought about the build dependency issue, but just off the top of 
> my head, using it for building seems unnecessary. That is we could instead of 
> using the autogenerated C header file for compilation, just generate those 
> files for testing purposes. Then we could still use the .def file normally, 
> but could at least have a bot that checks that things are correct.
> 
> I am not sure if there is a clang mode for diffing/comparing declarations 
> like these though.

If we have to have a .def file, just consuming it for assertions in IRGen seems 
like the way to go.

John.

> 
> Michael
> 
>> 
>> John.
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev@swift.org <mailto:swift-dev@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-dev
> 

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to