[swift-dev] Porting swift to FreeBSD

Dmitri Gribenko gribozavr at gmail.com
Sat Dec 12 23:22:17 CST 2015


On Sat, Dec 12, 2015 at 9:09 PM, Davide Italiano <dccitaliano at gmail.com> wrote:
> 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:

It should be empty in the binary (since this simple program does not
define any new conformances to protocols).  Could you try checking the
standard library, libswiftCore.so:

$ objdump -t lib/swift/linux/libswiftCore.so | grep conformances
0000000000602b10 l    d  .swift2_protocol_conformances
0000000000000000              .swift2_protocol_conformances
0000000000602b18 l     O .swift2_protocol_conformances
0000000000002eb0              l_protocol_conformances
0000000000602b10 g       .swift2_protocol_conformances
0000000000000000              .swift2_protocol_conformances_start

$ objdump -s -j .swift2_protocol_conformances
lib/swift/linux/libswiftCore.so | head

lib/swift/linux/libswiftCore.so:     file format elf64-x86-64

Contents of section .swift2_protocol_conformances:
 602b10 b02e0000 00000000 00000000 00000000  ................
 602b20 00000000 04000000 00000000 00000000  ................
 602b30 00000000 04000000 00000000 00000000  ................
 602b40 00000000 04000000 00000000 00000000  ................
 602b50 00000000 04000000 00000000 00000000  ................
 602b60 00000000 04000000 00000000 00000000  ................

I'd recommend that you add debug output to
_addImageProtocolConformances() to see if the section is being found
and iterated over (or just use a debugger, after building with
--debug-swift-stdlib).

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/


More information about the swift-dev mailing list