[swift-dev] COFF indirect addressing and protocol conformance tables ABI issues
Saleem Abdulrasool
compnerd at compnerd.org
Sat Jul 9 18:07:39 CDT 2016
On Wed, Jul 6, 2016 at 9:43 AM, John McCall <rjmccall at apple.com> wrote:
> On Jul 6, 2016, at 7:33 AM, Saleem Abdulrasool <compnerd at compnerd.org>
> wrote:
> On Tue, Jul 5, 2016 at 6:28 PM, John McCall <rjmccall at apple.com> wrote:
>
>> On Jul 5, 2016, at 5:56 PM, Saleem Abdulrasool <compnerd at compnerd.org>
>> wrote:
>> On Tue, Jul 5, 2016 at 10:30 AM, John McCall <rjmccall at apple.com> wrote:
>>
>>> > On Jul 3, 2016, at 2:40 PM, Saleem Abdulrasool <compnerd at compnerd.org>
>>> wrote:
>>> > Hello again,
>>> >
>>> > I come bearing more problems :-).
>>> >
>>> > I seem to have found another point in the ABI which prevents an easy
>>> port of swift to Windows without an emulation layer underneath. This time
>>> it deals with the protocol conformance table. The table is constructed
>>> with a direct reference to protocol. However, because the protocol lies in
>>> an external module, this ends up being a problem as it must be indirectly
>>> addressed.
>>> >
>>> > There is a workaround in place for generating a GOT equivalent entry,
>>> however, that still doesnt indirect through the pointer, which needs to be
>>> done to address the executable model on Windows.
>>>
>>> Is it not possible to emit the GOT equivalent entry as a reference to
>>> the appropriate entry in the import lookup table?
>>
>>
>> I had tried that, but it would still just be a constant reference to the
>> value rather than the synthetic. Perhaps I am misunderstanding something?
>>
>>
>> I don't know what you mean. I assume this is the reference to the
>> protocol structure from the global protocol-conformances list. This
>> reference is a relative offset, either directly to the protocol structure
>> or indirectly to a global containing a pointer to an external protocol
>> structure. PE's import lookup table is an array of pointers to external
>> objects.
>>
>
> Exactly, in the case that identified the issue, it is _TMps12OutputStream
>
>
>> I could easily believe that COFF doesn't allow us to express a relative
>> offset to an entry in the import lookup table.
>>
>
> I don't think that there is any way to represent that in IR, and I don't
> know if COFF allows us to encode such a thing. I will see if I can
> construct an object file/library and see if we can get away with that.
>
>
> The way to represent it in IR is using the same private unnamed_addr
> representation that we special-case for ELF/Mach-O. I guess it would be a
> mandatory transformation for COFF.
>
> But if it's not representable in COFF, that's pretty conclusive.
>
I did look into this. It is, as I suspected, not possible to represent an
offset to the value in the ILT or IAT.
> John.
>
>
>
>> However, it sounds like you think this needs to be *doubly* indirected,
>> i.e. the conformance list needs to be a relative offset to a variable
>> containing a pointer to a variable containing a pointer to the import
>> lookup table. I'm not sure why that would be.
>>
> John.
>>
>
>
>
> --
> Saleem Abdulrasool
> compnerd (at) compnerd (dot) org
>
>
>
--
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160709/0f08479a/attachment.html>
More information about the swift-dev
mailing list