Message ID | 4E0C438A.8010604@gjlay.de |
---|---|
State | New |
Headers | show |
Georg-Johann Lay wrote: http://gcc.gnu.org/ml/gcc-patches/2011-06/msg02318.html > avr_insert_attributes uses TREE_READONLY on get readonlyness of node. > > That does not work for C++ arrays: it gives false error > "variable must be const in order to be put into read-only section by > means of '__attribute__((progmem))'". > > This patch peels arrays and uses TYPE_READONLY. > > I did not open separate PR for this, tagged it as addendum to PR44643 > instead. > > Lightly tested on own code. There is no 'progmem' in testsuite, so > from testsuite's perspective that code is dead, anyway... > > Johann > > PR target/44643 > * config/avr/avr.c (avr_insert_attributes): Use TYPE_READONLY > instead of TREE_READONLY. >
2011/7/4 Georg-Johann Lay <avr@gjlay.de>: > Georg-Johann Lay wrote: > > http://gcc.gnu.org/ml/gcc-patches/2011-06/msg02318.html > >> avr_insert_attributes uses TREE_READONLY on get readonlyness of node. >> >> That does not work for C++ arrays: it gives false error >> "variable must be const in order to be put into read-only section by >> means of '__attribute__((progmem))'". >> >> This patch peels arrays and uses TYPE_READONLY. >> >> I did not open separate PR for this, tagged it as addendum to PR44643 >> instead. >> >> Lightly tested on own code. There is no 'progmem' in testsuite, so >> from testsuite's perspective that code is dead, anyway... >> >> Johann >> >> PR target/44643 >> * config/avr/avr.c (avr_insert_attributes): Use TYPE_READONLY >> instead of TREE_READONLY. Approved. Denis.
Index: config/avr/avr.c =================================================================== --- config/avr/avr.c (revision 175629) +++ config/avr/avr.c (working copy) @@ -5030,7 +5030,19 @@ avr_insert_attributes (tree node, tree * && (TREE_STATIC (node) || DECL_EXTERNAL (node)) && avr_progmem_p (node, *attributes)) { - if (TREE_READONLY (node)) + tree node0 = node; + + /* For C++, we have to peel arrays in order to get correct + determination of readonlyness. */ + + do + node0 = TREE_TYPE (node0); + while (TREE_CODE (node0) == ARRAY_TYPE); + + if (error_mark_node == node0) + return; + + if (TYPE_READONLY (node0)) { static const char dsec[] = ".progmem.data";