Richard Guenther schrieb:
> On Wed, Jun 15, 2011 at 3:54 PM, Georg-Johann Lay <avr@...> wrote:
Is it possible not to quote my email address? Thanks.
>> Weddington, Eric schrieb:
>>> Hi Johann,
>>>
>>> I understand your reasoning, but I'm not particularly fond of this hack.
>> Yes, ACK. It's a hack to get rid of the PR.
>>
>>> Surely there's a way to fix this correctly without relying on this hack...
>
> Well, doing this error handling at attribute parsing time is going to
> be fragile.
> I suggest to move it to code emission time instead (there currently isn't a
> target hook for when the frontend finished a variable declaration).
>
> Richard.
Thanks, appears I was a bit lazy in the original patch...
So here it is, no more a hack :-)
PR target/34734
* config/avr/avr.c (avr_handle_progmem_attribute): Move warning
about uninitialized data attributed 'progmem' from here...
(avr_asm_named_section): ...to here.
I changed the warning message because we now actually have different
behavior: data will be put in progmem no matter if an initializer is
present or not, just a warning will pop up an case of missing
initializer and if Wuninitialized is on.
Johann
>>
>>> Eric Weddington
>>>
>>>> -----Original Message-----
>>>> From: Georg-Johann Lay [mailto:avr@...]
Ditto, quoting ones name here will suffice.
>>>> Sent: Wednesday, June 15, 2011 3:26 PM
>>>> To: [email protected]
>>>> Cc: Weddington, Eric; Anatoly Sokolov; Denis Chertykov
>>>> Subject: [Patch, AVR]: Hack around PR34734
>>>>
>>>> PR34734 is an annoying, false C++ warning for code like
>>>>
>>>> const int x __attribute__((progmem)) = 1;
>>>>
>>>> progmem.c:1:30: warning: only initialized variables can be placed into
>>>> program memory area [enabled by default]
>>>>
>>>> The problem is that DECL_INITIAL is NULL at the specific point in
>>>> space and time (avr_handle_progmem_attribute) even though tree.def
>>>> promises otherwise.
>>>>
>>>> The patch hacks around by explicitly querying for C++ front end.
>>>>
>>>> Johann
>>>>
>>>> PR target/34734
>>>> * config/avr/avr.c (avr_handle_progmem_attribute): Hack around
>>>> non-present DECL_INITIAL if front end is C++.
Index: config/avr/avr.c
===================================================================
--- config/avr/avr.c (Revision 175036)
+++ config/avr/avr.c (Arbeitskopie)
@@ -5099,12 +5099,7 @@ avr_handle_progmem_attribute (tree *node
}
else if (TREE_STATIC (*node) || DECL_EXTERNAL (*node))
{
- if (DECL_INITIAL (*node) == NULL_TREE && !DECL_EXTERNAL (*node))
- {
- warning (0, "only initialized variables can be placed into "
- "program memory area");
- *no_add_attrs = true;
- }
+ *no_add_attrs = false;
}
else
{
@@ -5293,6 +5288,15 @@ avr_asm_init_sections (void)
void
avr_asm_named_section (const char *name, unsigned int flags, tree decl)
{
+ if (decl && DECL_P (decl)
+ && NULL_TREE == DECL_INITIAL (decl)
+ && avr_progmem_p (decl, DECL_ATTRIBUTES (decl)))
+ {
+ warning (OPT_Wuninitialized,
+ "uninitialized variable %q+D put into "
+ "program memory area", decl);
+ }
+
if (!avr_need_copy_data_p)
avr_need_copy_data_p = (0 == strncmp (name, ".data", 5)
|| 0 == strncmp (name, ".rodata", 7)