https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92606
Bug ID: 92606 Summary: [avr] invalid merge of symbols in progmem and data sections Product: gcc Version: 9.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: lists.oss at hamme dot info Target Milestone: --- Target: avr AVR GCC 9.2.0 has a critical bug with merging identical constant progmem and data section symbols to a single progmem symbol (.text). I discovered it while debugging my 3d printer firmware (print head kept crashing inexplicably). Due to this invalid optimization, if data is read from the symbol originally defined in data space, only arbitrary data is read (from data space at the address of the symbol in program space). Below is a short example for Arduino. The example was compiled with GCC options `-Os -g -ffunction-sections -fdata-sections -flto -Wl,--gc-section`. I'm not entirely sure, but the bug appears to be triggered by link time optimization (-flto) in combination with optimization levels -Os or higher. ------------------- #include "Arduino.h" static const PROGMEM float xyz_prog[] = { 123, 123, 123 }; float xyz[] = { 123, 123, 123 }; volatile int x = 0; void setup() { Serial.begin(57600); Serial.print("X_prog: "); Serial.println(pgm_read_float_near(&xyz_prog[0])); } void loop() { Serial.print("X: "); Serial.println(xyz[x]); } ------------------- Expected output: X_prog: 123 X: 123 X: 123 X: 123 ... Actual output (example): X_prog: 123 X: -0.00 X: 0.00 X: 553676288.00 ... I've uploaded the example to https://github.com/xblax/avr_gcc_bug together with the Arduino core library and a cmake project for easy compilation.