Re: [PATCH v2] vsprintf: introduce %dE for error constants

From: Juergen Gross
Date: Thu Aug 29 2019 - 04:27:09 EST


On 29.08.19 10:12, Petr Mladek wrote:
On Wed 2019-08-28 21:18:37, Uwe Kleine-KÃnig wrote:
Hello Petr,

On 8/28/19 1:32 PM, Petr Mladek wrote:
On Tue 2019-08-27 23:12:44, Uwe Kleine-KÃnig wrote:
Petr Mladek had some concerns:
There are ideas to make the code even more tricky to reduce
the size, keep it fast.

I think Enrico Weigelt's suggestion to use a case is the best
performance-wise so that's what I picked up. Also I hope that
performance isn't that important because the need to print an error
should not be so common that it really hurts in production.

This is contadicting. The "best" performance-wise solution was
choosen in favor of space. The next sentence says that performance
is not important.

I personally do not like switch/case. It is a lot of code.
I wonder if it even saved some space.

I guess we have to die either way. Either it is quick or it is space
efficient.

I am more concerned about the size. Well, array of strings will
be both fast and size efficient.

With the big case I trust the compiler to pick something
sensible expecting that it adapts for example to -Osize.

I am not sure what are the expectations here. I can't imagine
another translation than:

if (val == 1)
str = "EPERM";
else if (val == 2)
str = "ENOENT"
else if (val == 3)
str = "ESRCH"
...

It means that all constans will be hardcoded in the code instead
of in data section. Plus there will be instructions for each
if/else part.

If you want to safe space, I would use u16 to store the numbers.
Or I would use array of strings. There will be only few holes.

You might also consider handling only the most commonly
used codes from errno.h and errno-base.h (1..133). There will
be no holes and the codes are stable.

I'd like to postpone the discussion about "how" until we agreed about
the "if at all".

It seems that all people like this feature.

Hmm, what about already existing format strings conatining "%dE"?

Yes, I could find only one (drivers/staging/speakup/speakup_bns.c), but
nevertheless...


BTW: I though more about generating or cut&pasting the arrary.
I can't find any reasonable way how to generate it.

Generate the array and errno.h/errno-base.h from the same source?


Juergen