<div dir="ltr">Hello,<div><br></div><div>The current layout for the swift metadata for structure types, as emitted, seems to be unrepresentable in PE/COFF (at least for x86_64).  There is a partial listing of the generated code following the message for reference.</div><div><br></div><div>When building the standard library, LLVM encounters a relocation which cannot be represented.  Tracking down the relocation led to the type metadata for SwiftNSOperatingSystemVersion.  The metadata here is <span style="font-family:monospace,monospace">_T0SC30_SwiftNSOperatingSystemVersionVN</span><font face="arial, helvetica, sans-serif">.  At +32-bytes we find the Kind (1).  So, this is a struct metadata type.  Thus at Offset 1 (+40 bytes) we have the nominal type descriptor reference.  This is the relocation which we fail to represent correctly.  If I&#39;m not mistaken, it seems that the field is supposed to be a relative offset to the nominal type descriptor.  However, currently, the nominal type descriptor is emitted in a different section (.rodata) as opposed to the type descriptor (.data).  This cross-section relocation cannot be represented in the file format.</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">My understanding is that the type metadata will be adjusted during the load for the field offsets.  Furthermore, my guess is that the relative offset is used to encode the location to avoid a relocation for the load address base.  In the case of windows, the based relocations are a given, and I&#39;m not sure if there is a better approach to be taken.  There are a couple of solutions which immediately spring to mind: moving the nominal type descriptor into the (RW) data segment and the other is to adjust the ABI to use an absolute relocation which would be rebased.  Given that the type metadata may be adjusted means that we cannot emit it into the RO data segment.  Is there another solution that I am overlooking which may be simpler or better?</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Thanks!</font></div><div><br></div><div><br></div><div>```</div><div><font face="monospace, monospace">        .section        .rdata,&quot;dr&quot;</font><br></div><div><font face="monospace, monospace">...</font></div><div><div><font face="monospace, monospace">        .globl  _T0SC30_SwiftNSOperatingSystemVersionVMn # @_T0SC30_SwiftNSOperatingSystemVersionVMn</font></div><div><font face="monospace, monospace">        .p2align        3</font></div><div><font face="monospace, monospace">_T0SC30_SwiftNSOperatingSystemVersionVMn:</font></div><div><font face="monospace, monospace">        .long   .L__unnamed_1056-_T0SC30_SwiftNSOperatingSystemVersionVMn</font></div><div><font face="monospace, monospace">        .long   3                       # 0x3</font></div><div><font face="monospace, monospace">        .long   3                       # 0x3</font></div><div><font face="monospace, monospace">        .long   (.L__unnamed_1057-_T0SC30_SwiftNSOperatingSystemVersionVMn)-12</font></div><div><font face="monospace, monospace">        .long   (.Lget_field_types__SwiftNSOperatingSystemVersion-_T0SC30_SwiftNSOperatingSystemVersionVMn)-16</font></div><div><font face="monospace, monospace">        .long   1                       # 0x1</font></div><div><font face="monospace, monospace">        .long   0                       # 0x0</font></div><div><font face="monospace, monospace">        .long   6                       # 0x6</font></div><div><font face="monospace, monospace">        .long   0                       # 0x0</font></div><div><font face="monospace, monospace">        .long   0                       # 0x0</font></div><div><font face="monospace, monospace">        .long   0                       # 0x0</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        .data</font></div><div><font face="monospace, monospace">        .globl  _T0SC30_SwiftNSOperatingSystemVersionVN # @_T0SC30_SwiftNSOperatingSystemVersionVN</font></div><div><font face="monospace, monospace">        .p2align        3</font></div><div><font face="monospace, monospace">_T0SC30_SwiftNSOperatingSystemVersionVN:</font></div><div><font face="monospace, monospace">        .quad   .L__unnamed_1056</font></div><div><font face="monospace, monospace">        .quad   0</font></div><div><font face="monospace, monospace">        .quad   0                       # 0x0</font></div><div><font face="monospace, monospace">        .quad   _T0SC30_SwiftNSOperatingSystemVersionVWV</font></div><div><font face="monospace, monospace">        .quad   1                       # 0x1</font></div><div><font face="monospace, monospace">        .quad   (_T0SC30_SwiftNSOperatingSystemVersionVMn-_T0SC30_SwiftNSOperatingSystemVersionVN)-40</font></div><div><font face="monospace, monospace">        .quad   0</font></div><div><font face="monospace, monospace">        .quad   0                       # 0x0</font></div><div><font face="monospace, monospace">        .quad   8                       # 0x8</font></div><div><font face="monospace, monospace">        .quad   16                      # 0x10</font></div></div><div>```</div><div><br></div><div><div>-- <br><div class="gmail_signature">Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org</div>
</div></div></div>