• Julien BLACHE's avatar
    Endianness, alignment and type-punning fixes for binary plist support · 33b8a128
    Julien BLACHE authored
     - endianness issues: on big endian machines, writing out only part
       of an integer was broken (get_needed_bytes(x) < sizeof(x))
        -> shift integer before memcpy() on big endian machines
    
     - alignment issues: unaligned reads when loading binary plist. Leads
       to slow runtime performance (kernel trapping and fixing things up),
       SIGBUS (kernel not helping us out)
        -> introduce get_unaligned() and have the compiler generate the code
           needed for the unaligned access
       (note that there remains unaligned accesses that I haven't been able
        to track down - I've seen 2 of them with test #2)
    
     - type-punning issues: breaking strict aliasing rules can lead to
       unexpected results as the compiler takes full advantage of the aliasing
       while optimizing
        -> introduce the plist_uint_ptr union instead of casting pointers
    
    Tested on amd64, alpha and hppa.
    33b8a128
bplist.c 28.2 KB