rx.c (struct decl_chain): New local structure.
authorNick Clifton <nickc@redhat.com>
Wed, 3 Oct 2012 16:12:22 +0000 (16:12 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Wed, 3 Oct 2012 16:12:22 +0000 (16:12 +0000)
* config/rx/rx.c (struct decl_chain): New local structure.
(warned_decls): New local variable.  Contains a stack of decls for
which warnings have been issued.
(add_warned_decl): Adds a decl to the stack.
(already_warned): Returns true if a given decl is on the stack.
(rx_set_current_function): Issue a warning if multiple fast
interrupt handlers are defined.
* config/rx/rx.opt (mwarn-multiple-fast-interrupts): New option.
* doc/invoke.texi: Document the option.

From-SVN: r192041

gcc/ChangeLog
gcc/config/rx/rx.c
gcc/config/rx/rx.opt
gcc/doc/invoke.texi

index 5d9f51955d878ee11408e447be0207be71cc7e83..23515ec1a65596ecc64deb26c0c988eff7bb3437 100644 (file)
@@ -1,8 +1,20 @@
+2012-10-03  Nick Clifton  <nickc@redhat.com>
+
+       * config/rx/rx.c (struct decl_chain): New local structure.
+       (warned_decls): New local variable.  Contains a stack of decls for
+       which warnings have been issued.
+       (add_warned_decl): Adds a decl to the stack.
+       (already_warned): Returns true if a given decl is on the stack.
+       (rx_set_current_function): Issue a warning if multiple fast
+       interrupt handlers are defined.
+       * config/rx/rx.opt (mwarn-multiple-fast-interrupts): New option.
+       * doc/invoke.texi: Document the option.
+
 2012-09-03  Mark Kettenis  <kettenis@openbsd.org>
 
        * config.gcc (*-*-openbsd4.[3-9]|*-*-openbsd[5-9]*): Set
        default_use_cxa_atexit to yes.
-               
+
 2012-10-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/54792
index 43676d1251cd1d2175586dfc57c98262a22752e5..5d31eac973848a9f1bec0f2bcc5ce3dbecd11026 100644 (file)
@@ -1256,6 +1256,41 @@ rx_conditional_register_usage (void)
     }
 }
 
+struct decl_chain
+{
+  tree fndecl;
+  struct decl_chain * next;
+};
+
+/* Stack of decls for which we have issued warnings.  */
+static struct decl_chain * warned_decls = NULL;
+
+static void
+add_warned_decl (tree fndecl)
+{
+  struct decl_chain * warned = (struct decl_chain *) xmalloc (sizeof * warned);
+
+  warned->fndecl = fndecl;
+  warned->next = warned_decls;
+  warned_decls = warned;
+}
+
+/* Returns TRUE if FNDECL is on our list of warned about decls.  */
+
+static bool
+already_warned (tree fndecl)
+{
+  struct decl_chain * warned;
+
+  for (warned = warned_decls;
+       warned != NULL;
+       warned = warned->next)
+    if (warned->fndecl == fndecl)
+      return true;
+
+  return false;
+}
+
 /* Perform any actions necessary before starting to compile FNDECL.
    For the RX we use this to make sure that we have the correct
    set of register masks selected.  If FNDECL is NULL then we are
@@ -1288,6 +1323,24 @@ rx_set_current_function (tree fndecl)
       target_reinit ();
     }
 
+  if (current_is_fast_interrupt && rx_warn_multiple_fast_interrupts)
+    {
+      /* We do not warn about the first fast interrupt routine that
+        we see.  Instead we just push it onto the stack.  */
+      if (warned_decls == NULL)
+       add_warned_decl (fndecl);
+
+      /* Otherwise if this fast interrupt is one for which we have
+        not already issued a warning, generate one and then push
+        it onto the stack as well.  */
+      else if (! already_warned (fndecl))
+       {
+         warning (0, "multiple fast interrupt routines seen: %qE and %qE",
+                  fndecl, warned_decls->fndecl);
+         add_warned_decl (fndecl);
+       }
+    }
+
   rx_previous_fndecl = fndecl;
 }
 \f
index 76c2f61c79bcffe2320cec82c6e8b042fe9df877..f0a57b1fae11c7ca672b60b9aa5b66e116536459 100644 (file)
@@ -118,3 +118,9 @@ Specifies whether interrupt functions should save and restore the accumulator re
 mpid
 Target Mask(PID)
 Enables Position-Independent-Data (PID) mode.
+
+;---------------------------------------------------
+
+mwarn-multiple-fast-interrupts
+Target Report Var(rx_warn_multiple_fast_interrupts) Init(1) Warning
+Warn when multiple, different, fast interrupt handlers are in the compilation unit.
index 0e7e441b8d03a81f989bb501396809e8da101bec..297b651adfed23ef40753aea4dab626568791180 100644 (file)
@@ -859,6 +859,7 @@ See RS/6000 and PowerPC Options.
 -mmax-constant-size=@gol
 -mint-register=@gol
 -mpid@gol
+-mno-warn-multiple-fast-interrupts@gol
 -msave-acc-in-interrupts}
 
 @emph{S/390 and zSeries Options}
@@ -17875,6 +17876,15 @@ command line.
 By default this feature is not enabled.  The default can be restored
 via the @option{-mno-pid} command-line option.
 
+@item -mno-warn-multiple-fast-interrupts
+@itemx -mwarn-multiple-fast-interrupts
+@opindex mno-warn-multiple-fast-interrupts
+@opindex mwarn-multiple-fast-interrupts
+Prevents GCC from issuing a warning message if it finds more than one
+fast interrupt handler when it is compiling a file.  The default is to
+issue a warning for each extra fast interrupt handler found, as the RX
+only supports one such interrupt.
+
 @end table
 
 @emph{Note:} The generic GCC command-line option @option{-ffixed-@var{reg}}