Messages in this thread | | | Subject | Re: linux-kernel janitorial RFP: Mark static arrays as const | From | Rasmus Villemoes <> | Date | Wed, 3 Mar 2021 10:41:58 +0100 |
| |
On 02/03/2021 18.42, Joe Perches wrote: > Here is a possible opportunity to reduce data usage in the kernel. > > $ git grep -P -n '^static\s+(?!const|struct)(?:\w+\s+){1,3}\w+\s*\[\s*\]' drivers/ | \ > grep -v __initdata | \ > wc -l > 3250 > > Meaning there are ~3000 declarations of arrays with what appears to be > file static const content that are not marked const. > > So there are many static arrays that could be marked const to move the > compiled object code from data to text minimizing the total amount of > exposed r/w data.
You can add const if you like, but it will rarely change the generated code. gcc is already smart enough to take a static array whose contents are provably never modified within the TU and put it in .rodata:
static int x = 7; static int y[2] = {13, 19};
static int p(int a, const int *foo) { return a + *foo; } int q(int a) { int b = p(a, &x); return p(b, &y[b & 1]); } $ nm c.o 0000000000000000 T q 0000000000000000 r y $ size c.o text data bss dec hex filename 111 0 0 111 6f c.o
So x gets optimized away completely, but y isn't so easy to get rid of - nevertheless, it's never modified and the address doesn't escape the TU, so gcc treats is as if it was declared const.
I think you'll see the same if you try adding the const on a few of your real-life examples. (Of course, the control flow may be so convoluted that gcc isn't able to infer the constness, so I'm not saying it will never make a difference - only that you shouldn't expect too much.)
Rasmus
| |