• Linus Torvalds's avatar
    lib/test_scanf: split up number parsing test routines · ba7b1f86
    Linus Torvalds authored
    It turns out that gcc has real trouble merging all the temporary
    on-stack buffer allocation.  So despite the fact that their lifetimes do
    not overlap, gcc will allocate stack for all of them when they have
    different types.  Which they do in the number scanning test routines.
    
    This is unfortunate in general, but with lots of test-cases in one
    function, it becomes a real problem.  gcc will allocate a huge stack
    frame for no actual good reason.
    
    We have tried to counteract this tendency of gcc not merging stack slots
    (see "-fconserve-stack"), but that has limited effect (and should be on
    by default these days, iirc).
    
    So with all the debug options enabled on an i386 allmodconfig build, we
    end up with overly big stack frames, and the resulting stack frame size
    warnings (now errors):
    
       lib/test_scanf.c: In function ‘numbers_list_field_width_val_width’:
       lib/test_scanf.c:530:1: error: the frame size of 2088 bytes is larger than 2048 bytes [-Werror=frame-larger-than=]
         530 | }
             | ^
       lib/test_scanf.c: In function ‘numbers_list_field_width_typemax’:
       lib/test_scanf.c:488:1: error: the frame size of 2568 bytes is larger than 2048 bytes [-Werror=frame-larger-than=]
         488 | }
             | ^
       lib/test_scanf.c: In function ‘numbers_list’:
       lib/test_scanf.c:437:1: error: the frame size of 2088 bytes is larger than 2048 bytes [-Werror=frame-larger-than=]
         437 | }
             | ^
    
    In this particular case, the reasonably straightforward solution is to
    just split out the test routines into multiple more targeted versions.
    That way we don't have one huge stack, but several smaller ones, and
    they aren't active all at the same time.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ba7b1f86
test_scanf.c 28.9 KB