[PATCH] Remove fno-unit-at-a-time make variable

Fāng-ruì Sòng maskray@google.com
Thu Apr 7 07:02:53 GMT 2022


On 2022-04-05, Adhemerval Zanella wrote:
>
>
>On 05/04/2022 13:44, Fāng-ruì Sòng wrote:
>> On Tue, Apr 5, 2022 at 10:40 AM Adhemerval Zanella
>> <adhemerval.zanella@linaro.org> wrote:
>>>
>>>
>>>
>>> On 05/04/2022 13:22, Fāng-ruì Sòng wrote:
>>>> On Tue, Apr 5, 2022 at 8:35 AM Adhemerval Zanella
>>>> <adhemerval.zanella@linaro.org> wrote:
>>>>>
>>>>>
>>>>>
>>>>> On 04/04/2022 12:57, Fangrui Song wrote:
>>>>>>
>>>>>> On 2022-03-31, Adhemerval Zanella wrote:
>>>>>>>
>>>>>>>
>>>>>>> On 31/03/2022 00:43, Fangrui Song wrote:
>>>>>>>> On 2022-03-30, Adhemerval Zanella wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 30/03/2022 13:23, Fangrui Song wrote:
>>>>>>>>>> On 2022-03-30, Adhemerval Zanella wrote:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On 30/03/2022 02:07, Fangrui Song wrote:
>>>>>>>>>>>> 795985e4e751 in 2003 added -fno-unit-at-a-time to errlist.c and
>>>>>>>>>>>> siglist.c to "avoid reordering assembler output". -fno-toplevel-reorder
>>>>>>>>>>>> is a rough replacement for this legacy option
>>>>>>>>>>>> (https://sourceware.org/pipermail/gcc-patches/2006-January/186801.html).
>>>>>>>>>>>>
>>>>>>>>>>>> The reordering requirement does not seem to be needed any longer.
>>>>>>>>>>>
>>>>>>>>>>> We still need them for otherwise DEFINE_COMPAT_ERRLIST used on errlist-compat.c
>>>>>>>>>>> does not create _sys_errlist and _sys_siglist with expected sizes defined by
>>>>>>>>>>> glibc ABI.
>>>>>>>>>>>
>>>>>>>>>>> I am trying to fix without resorting to compiler options.
>>>>>>>>>>
>>>>>>>>>> DEFINE_COMPAT_ERRLIST does not expand to code/data, just reordeable directives:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>        .globl  __GLIBC_2_1_sys_errlist
>>>>>>>>>> .set __GLIBC_2_1_sys_errlist, _sys_errlist_internal
>>>>>>>>>>         .type   __GLIBC_2_1_sys_errlist,@object
>>>>>>>>>>         .size   __GLIBC_2_1_sys_errlist, 1000
>>>>>>>>>>         .globl  __GLIBC_2_1__sys_errlist
>>>>>>>>>> .set __GLIBC_2_1__sys_errlist, _sys_errlist_internal
>>>>>>>>>>         .type   __GLIBC_2_1__sys_errlist,@object
>>>>>>>>>>         .size   __GLIBC_2_1__sys_errlist, 1000
>>>>>>>>>> .symver __GLIBC_2_1_sys_nerr, sys_nerr@GLIBC_2.2.5
>>>>>>>>>> .symver __GLIBC_2_1__sys_nerr, _sys_nerr@GLIBC_2.2.5
>>>>>>>>>> .symver __GLIBC_2_1_sys_errlist, sys_errlist@GLIBC_2.2.5
>>>>>>>>>> .symver __GLIBC_2_1__sys_errlist, _sys_errlist@GLIBC_2.2.5
>>>>>>>>>>         .globl  __GLIBC_2_3_sys_errlist
>>>>>>>>>> .set __GLIBC_2_3_sys_errlist, _sys_errlist_internal
>>>>>>>>>>         .type   __GLIBC_2_3_sys_errlist,@object
>>>>>>>>>>         .size   __GLIBC_2_3_sys_errlist, 1008
>>>>>>>>>>         .globl  __GLIBC_2_3__sys_errlist
>>>>>>>>>> .set __GLIBC_2_3__sys_errlist, _sys_errlist_internal
>>>>>>>>>>         .type   __GLIBC_2_3__sys_errlist,@object
>>>>>>>>>>         .size   __GLIBC_2_3__sys_errlist, 1008
>>>>>>>>>> .symver __GLIBC_2_3_sys_nerr, sys_nerr@GLIBC_2.3
>>>>>>>>>> .symver __GLIBC_2_3__sys_nerr, _sys_nerr@GLIBC_2.3
>>>>>>>>>> .symver __GLIBC_2_3_sys_errlist, sys_errlist@GLIBC_2.3
>>>>>>>>>> .symver __GLIBC_2_3__sys_errlist, _sys_errlist@GLIBC_2.3
>>>>>>>>>>         .globl  __GLIBC_2_4_sys_errlist
>>>>>>>>>>
>>>>>>>>>> I do not know whether GCC would reorder these macros. Even yes,
>>>>>>>>>> that'd just change the .symtab entries in the relocatable object file.
>>>>>>>>>> The linker behavior remains the same with reordering.
>>>>>>>>>
>>>>>>>>> It does not seem to, just remove the -fno-unit-at-a-time and issue make
>>>>>>>>> check-abi and you will see that object size for the compat symbols
>>>>>>>>> reference to _sys_err_internal instead of the define compat ones.
>>>>>>>>
>>>>>>>> I see. I think this is a brittle behavior in GNU assembler. Filed
>>>>>>>> https://sourceware.org/bugzilla/show_bug.cgi?id=29012 with detailed
>>>>>>>> information. I have created a patch but I know that will not solve
>>>>>>>> glibc's problem :(
>>>>>>>
>>>>>>> It would be good to have this fixes, but unfortunately we need a way
>>>>>>> to handle this on older binutils.  I am kind worried that the only
>>>>>>> possible way to actually fix this without resorting to any compiler
>>>>>>> flags is coding the array definitions in assembly direct...
>>>>>>
>>>>>> The GNU assembler issue has been fixed https://sourceware.org/bugzilla/show_bug.cgi?id=29012
>>>>>> (milestone 2.39, way larger than the current required version: 2.25)
>>>>>>
>>>>>> Switching to assembly output doesn't seem bad :-)
>>>>>>
>>>>>> If you keep the compiler driver option but need to refactor the nearby
>>>>>> code, you may drop -fno-unit-at-a-time. It was added in 2006 (somewhere
>>>>>> between GCC 4.1 and 4.4), while glibc requires GCC>=6.2.
>>>>>
>>>>> Good to know we won't need to rely on compiler flags to get the expected
>>>>> correct asm directives. I am still struggling to get a fix without resorting
>>>>> to compiler flags, but without much success.  Trying to move it to assembly
>>>>> might be tricky, I am not sure if the data directives would be architecture
>>>>> agnostic.
>>>>
>>>> Many directives are architecture-independent:
>>>> https://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops
>>>> binutils-gdb/gas/read.c:346 The `portable[]` array.
>>>
>>> I think we can make it work with asciz directive.
>>>
>>>>
>>>> To support Clang, no refactoring is probably needed: just change
>>>> fno_unit_at_a_time to only specify -fno-toplevel-reorder (and rename
>>>> it), not th legacy -fno-unit-at-a-time.
>>>
>>> Afaik llvm does not support -fno-toplevel-reorder
>>
>> It doesn't, but its integrated assembler does not need the option to
>> have the desired semantics. I have a note that the new GNU as behavior
>> is quite similar to LLVM's integrated assembler since 2014-03:
>> https://sourceware.org/bugzilla/show_bug.cgi?id=29012#c1
>
>This is not what I am seeing on my clang branch, where clang with integrated
>moves the global asm directives to the top of the file.  And it makes
>check-abi fail due the _sys_errlist/sys_errlist being with wrong value.

I see. For gas/testsuite/gas/elf/size.s, LLVM integrated assembler's
behavior matches GNU as. The glibc errlist.os example is more complex
due to a symbol assignment implied by .symver .

https://reviews.llvm.org/D123283 should fix it. It isn't a perfect fix but
works with most cases. I can request a backport to LLVM 14.0.1 if it lands.


More information about the Libc-alpha mailing list