[swift-dev] Porting swift to FreeBSD

Davide Italiano dccitaliano at gmail.com
Sat Dec 12 23:09:49 CST 2015


On Sat, Dec 12, 2015 at 11:45 PM, Dmitri Gribenko <gribozavr at gmail.com> wrote:
> On Sat, Dec 12, 2015 at 8:29 PM, Davide Italiano via swift-dev
> <swift-dev at swift.org> wrote:
>> Hi,
>> I'm a FreeBSD developer who has been working on porting swift to FreeBSD.
>> I'm at a point where with a local patch (
>> https://people.freebsd.org/~davide/swift/build_freebsd.diff ) to fix
>> build errors I'm able to build the compiler itself on FreeBSD 11
>> (-CURRENT).
>
> +Doug for this patch.
>
>> The compiler itself seems to work fine (at least semantic analysis is
>> able to produce the correct result for toy examples).
>> Example:
>>
>> % cat hello.swift
>> let number = 4
>> println(number)
>>
>> % ./swiftc hello.swift -o hello
>> hello.swift:2:1: error: 'println' has been renamed to 'print'
>> println(number)
>> ^~~~~~~
>> [...]
>>
>> The executables generated seem to have some problems, though.
>> This is what I see:
>>
>> % cat hello2.swift
>> let number = 4
>> print(number)
>> % ./swiftc hello2.swift -o hello2
>>  % ./hello2
>> Int(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(String(Stri
>
> The reason is that the program can't find the protocol conformance
> tables.  On Linux, we are using a linker script to collect all
> conformances into one section, and insert symbols at the beginning and
> at the end, see stdlib/public/runtime/swift.ld.  The code that reads
> these sections is in stdlib/public/runtime/Casting.cpp.
>

Thanks Dmitri.
The linker script is actually executed on FreeBSD as well (with a
recent version of GNU ld, with the old ld shipped with FreeBSD or gold
the parsing of the linker script fails)

and the section is created (as objdump -h witnesses):

 20 .dtors        00000010  0000000000603218  0000000000603218  00003218  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 21 .swift2_protocol_conformances 00000008  0000000000603228
0000000000603228  00003228  2**0
                  CONTENTS, ALLOC, LOAD, DATA
 22 .jcr          00000008  0000000000603230  0000000000603230  00003230  2**3
                  CONTENTS, ALLOC, LOAD, DATA

% objdump -t ./hello | grep conformances
0000000000603228 l    d  .swift2_protocol_conformances
0000000000000000              .swift2_protocol_conformances
0000000000603228 g       .swift2_protocol_conformances
0000000000000000              .swift2_protocol_conformances_start

Although the section seems to be empty/corrupted:

Disassembly of section .dtors:

0000000000603218 <__DTOR_LIST__>:
  603218:       ff                      (bad)
  603219:       ff                      (bad)
  60321a:       ff                      (bad)
  60321b:       ff                      (bad)
  60321c:       ff                      (bad)
  60321d:       ff                      (bad)
  60321e:       ff                      (bad)
  60321f:       ff 00                   incl   (%rax)

0000000000603220 <__DTOR_END__>:
        ...
Disassembly of section .swift2_protocol_conformances:

0000000000603228 <.swift2_protocol_conformances_start>:
        ...
Disassembly of section .jcr:

0000000000603230 <__JCR_END__>:

Do you have an example on how that should look like (on Linux) so I
can investigate and try to adapt that to work on FreeBSD?

Thanks,

--
Davide


More information about the swift-dev mailing list