On 2023-07-31 19:02:26+0800, Zhangjin Wu wrote:
Hi, Willy
Thomas here :-)
Why not a simple 'static __attribute__((unused))' line, then, no need to add them again next time.
-static int expect_zr(int expr, int llen) +static __attribute__((unused)) +int expect_zr(int expr, int llen) {
Personally I don't like having dead code lying around that needs to be maintained and skipped over while reading. It's not a given that we will need those helpers in the future at all.
It is reasonable in some degree from current status, especially for these ones are newly added, but let us think about these scenes: when we would drop or change some test cases in the future and the helpers may would be not referenced by any test cases in a short time, and warnings there, but some other cases may be added later to use them again ...
That doesn't seem very likely. Did it happen recently?
Yeah, it did happen, but I can not remember which one, a simple statistic does show it may be likely:
I can't find it.
$ grep EXPECT_ -ur tools/testing/selftests/nolibc/nolibc-test.c | grep -v define | sed -e 's/.*\(EXPECT_[A-Z0-9]*\).*/\1/g' | sort | uniq -c | sort -k 1 -g -r 55 EXPECT_EQ 37 EXPECT_SYSER 21 EXPECT_SYSZR 11 EXPECT_SYSNE 9 EXPECT_VFPRINTF 4 EXPECT_PTRGT 4 EXPECT_GE 3 EXPECT_STRZR 3 EXPECT_NE 3 EXPECT_LT 3 EXPECT_GT 2 EXPECT_STRNZ 2 EXPECT_STREQ 2 EXPECT_PTRLT 1 EXPECT_SYSER2 1 EXPECT_SYSEQ 1 EXPECT_PTRNZ 1 EXPECT_PTRNE 1 EXPECT_PTRER2 1 EXPECT_PTRER 1 EXPECT_PTREQ
7 helpers are only used by once, another 3 helpers are used twice, and another 4 are only used by three times.
Why can't we just drop them when they are not used anymore?
I'm ok to drop these ones, but another patch may be required to add 'static __attribute__((unused))' for all of the currently used ones, otherwise, there will be warnings randomly by a test case change or drop.
Then we just drop the helper when we don't need it anymore.
I also dislike the __attribute__ spam to be honest.
Me too, but it does help sometimes ;-)
Or even further, is it possible to merge some of them to some more generic helpers like the ones used from the selftest.h in your last RFC patchset?
Something like this will indeed be part of the KTAP rework. But it's a change for another time.
Yes, this may be a better solution to such warnings.
Btw, just thought about gc-section, do we need to further remove dead code/data in the binary? I don't think it is necessary for nolibc-test itself, but with '-Wl,--gc-sections -Wl,--print-gc-sections' may be a good helper to show us which ones should be dropped or which ones are wrongly declared as public?
Just found '-O3 + -Wl,--gc-section + -Wl,--print-gc-sections' did tell us something as below:
removing unused section '.text.nolibc_raise' removing unused section '.text.nolibc_memmove' removing unused section '.text.nolibc_abort' removing unused section '.text.nolibc_memcpy' removing unused section '.text.__stack_chk_init' removing unused section '.text.is_setting_valid'
These info may help us further add missing 'static' keyword or find another method to to drop the wrongly used status of some functions from the code side.
It is very easy to add the missing 'static' keyword for is_setting_valid(), but for __stack_chk_init(), is it ok for us to convert it to 'static' and remove the 'weak' attrbute and even the 'section' attribute? seems it is only used by our _start_c() currently.
Making is_setting_valid(), __stack_chk_init() seems indeed useful. Also all the run_foo() test functions.
For the left ones, some are related to libgcc for divide by zero or the other divide functions, which may be not possible to drop in code side, but for memmove/memset, it is able to add -ffreestanding in our nolibc-test like -Wall and only wrap the 'weak' attribute with '#if __STDC_HOSTED__ == 1', for the ARM specific one, '#ifdef __ARM_EABI__'.
That seems very excessive.
And even further, the '_start_c()' should be 'static' too, perhaps the above issues are worth a new patchset, If you agree, will send a new patchset to fix up them.
_start_c(), too.