Why are switch statement tables in section .rodata which gets copied to RAM with avr-gcc?

"Peter Sommerlad (C++)" <[email protected]> Tue, 31 Mar 2020 15:50:57 +0200
Newsgroups gmane.comp.hardware.avr.gcc
Message-ID <[email protected]>
Hi,

as a newbie to AVR programming, I am porting Arduino Core code to modern 
C++17. I wanted to get rid of ugly large lookup tables that in PROGMEM 
that require separate assembly macro magic to access by normal C++ code.

My naïve assumption was that the compiler-generated tables for switch 
statement would end up in flash memory, because they are immutable.

It turns out, that avr-gcc or the linker for the Arduino processor that 
I have access to, generate code to copy .rodata to .data in RAM. This is 
bad, and may have been the reason for these PROGMEM tables.

For some of the smaller processors the smaller switch statements would 
not end up using the table lookup, but especially the ATmega2560 has 
dense large number of cases.

Any ideas to circumvent it with standard code?

I am using avr-gcc 9.3.0

Regards
Peter.

-- 
Peter Sommerlad

Better Software: Consulting, Training, Reviews
Modern, Safe & Agile C++

[email protected]
+41 79 432 23 32