diff mbox

[AVR] : Hack around PR34734

Message ID 4DF9E91D.7040501@gjlay.de
State New
Headers show

Commit Message

Georg-Johann Lay June 16, 2011, 11:29 a.m. UTC
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: gcc-patches@gcc.gnu.org
>>>> 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++.
diff mbox

Patch

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)