• Matt Turner's avatar
    util/ralloc: Make sizeof(linear_header) a multiple of 8 · efb1ccad
    Matt Turner authored
    Prior to this patch sizeof(linear_header) was 20 bytes in a
    non-debug build on 32-bit platforms. We do some pointer arithmetic to
    calculate the next available location with
    
       ptr = (linear_size_chunk *)((char *)&latest[1] + latest->offset);
    
    in linear_alloc_child(). The &latest[1] adds 20 bytes, so an allocation
    would only be 4-byte aligned.
    
    On 32-bit SPARC a 'sttw' instruction (which stores a consecutive pair of
    4-byte registers to memory) requires an 8-byte aligned address. Such an
    instruction is used to store to an 8-byte integer type, like intmax_t
    which is used in glcpp's expression_value_t struct.
    
    As a result of the 4-byte alignment returned by linear_alloc_child() we
    would generate a SIGBUS (unaligned exception) on SPARC.
    
    According to the GNU libc manual malloc() always returns memory that has
    at least an alignment of 8-bytes [1]. I think our allocator should do
    the same.
    
    So, simple fix with two parts:
    
       (1) Increase SUBALLOC_ALIGNMENT to 8 unconditionally.
       (2) Mark linear_header with an aligned attribute, which will cause
           its sizeof to be rounded up to that alignment. (We already do
           this for ralloc_header)
    
    With this done, all Mesa's unit tests now pass on SPARC.
    
    [1] https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html
    
    Fixes: 47e17586 ("glcpp: use the linear allocator for most objects")
    Bug: https://bugs.gentoo.org/636326Reviewed-by: Eric Anholt's avatarEric Anholt <eric@anholt.net>
    efb1ccad
ralloc.c 20.1 KB