Tuesday, October 29, 2024
Richard Sandiford <richard.sandif...@arm.com> wrote:

> Hmm, I see.  I think this is surprising enough that it would be worth
> a comment.  How about:
>
>  /* Since the assembly directive only specifies a size, and not an
>     alignment, we need to follow the default ASM_OUTPUT_LOCAL behavior
>     and round the size up to at least a multiple of BIGGEST_ALIGNMENT bits,
>     so that each uninitialized object starts on such a boundary.
>     However, we also want to allow the alignment (and thus minimum size)
>     to exceed BIGGEST_ALIGNMENT.  */

Thanks for the suggestion. It will be included in the next version of the patch.

> But how does using a larger size force the linker to assign a larger
> alignment than BIGGEST_ALIGNMENT?  Is there a second limit in play?
> 
> Or does this patch not guarantee that the ffmpeg variable gets the
> alignment it wants?  Is it just about suppresing the error?
> 
> If it's just about suppressing the error without guaranteeing the
> requested alignment, then, yeah, I think patching ffmpeg would
> be better.  If the patch does guarantee the alignment, then the
> patch seems ok, but I think the comment should explain how, and
> explain why BIGGEST_ALIGNMENT isn't larger.

It looks like it generates the expected assembly code for the alignments
and the correct object file, and it should be the expected code for FFmpeg.

The alignment cannot be larger than 8192, otherwise, it will generate an error.

error: requested alignment ‘16384’ exceeds object file maximum 8192
   16 | float __attribute__((aligned (1 << 14))) large_aligned_array10[3];

Regards,
Evgeny


Here an example:

float large_aligned_array[3];
float __attribute__((aligned (8))) large_aligned_array2[3];
float __attribute__((aligned (16))) large_aligned_array3[3];
float __attribute__((aligned (32))) large_aligned_array4[3];
float __attribute__((aligned (64))) large_aligned_array5[3];
float __attribute__((aligned (128))) large_aligned_array6[3];
float __attribute__((aligned (256))) large_aligned_array7[3];
float __attribute__((aligned (512))) large_aligned_array8[3];
float __attribute__((aligned (1024))) large_aligned_array9[3];


        .align  3
        .def    large_aligned_array;    .scl    3;      .type   0;      .endef
large_aligned_array:
        .space  12  // skip

        .global large_aligned_array2
        .align  3
        .def    large_aligned_array2;   .scl    3;      .type   0;      .endef
large_aligned_array2:
        .space  12  // skip

        .global large_aligned_array3
        .align  4
        .def    large_aligned_array3;   .scl    3;      .type   0;      .endef
large_aligned_array3:
        .space  12  // skip

        .global large_aligned_array4
        .align  5
        .def    large_aligned_array4;   .scl    3;      .type   0;      .endef
large_aligned_array4:
        .space  12  // skip

        .global large_aligned_array5
        .align  6
        .def    large_aligned_array5;   .scl    3;      .type   0;      .endef
large_aligned_array5:
        .space  12  // skip

        .global large_aligned_array6
        .align  7
        .def    large_aligned_array6;   .scl    3;      .type   0;      .endef
large_aligned_array6:
        .space  12  // skip

        .global large_aligned_array7
        .align  8
        .def    large_aligned_array7;   .scl    3;      .type   0;      .endef
large_aligned_array7:
        .space  12  // skip

        .global large_aligned_array8
        .align  9
        .def    large_aligned_array8;   .scl    3;      .type   0;      .endef
large_aligned_array8:
        .space  12  // skip

        .global large_aligned_array9
        .align  10
    .def        large_aligned_array9;   .scl    3;      .type   0;      .endef
large_aligned_array9:
        .space  12  // skip


Symbols in the object file also look good.

015 00000000 SECT2  notype       External     | large_aligned_array
016 00000010 SECT2  notype       External     | large_aligned_array2
017 00000020 SECT2  notype       External     | large_aligned_array3
018 00000040 SECT2  notype       External     | large_aligned_array4
019 00000080 SECT2  notype       External     | large_aligned_array5
01A 00000100 SECT2  notype       External     | large_aligned_array6
01B 00000200 SECT2  notype       External     | large_aligned_array7
01C 00000400 SECT2  notype       External     | large_aligned_array8
01D 00000800 SECT2  notype       External     | large_aligned_array9

Reply via email to