c-common.c (handle_section_attribute): Refactor to reduce nesting and distinguish...
authorJosh Triplett <josh@joshtriplett.org>
Wed, 29 Apr 2015 20:32:41 +0000 (20:32 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 29 Apr 2015 20:32:41 +0000 (14:32 -0600)
        * c-common.c (handle_section_attribute): Refactor to reduce
        nesting and distinguish between error cases.

From-SVN: r222590

gcc/c-family/ChangeLog
gcc/c-family/c-common.c

index 44e21f3dde61b7a7938ee84322fb94d064bc52a5..c17ea5f6138f814ceeaf95975ce76809efd3961c 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-29  Josh Triplett  <josh@joshtriplett.org>
+
+        * c-common.c (handle_section_attribute): Refactor to reduce
+        nesting and distinguish between error cases.
+
 2015-04-29  Marek Polacek  <polacek@redhat.com>
 
        PR c/64610
index eecbe41d4f6fbb2b34db527c4b4610f5c7b833c3..7d314f854fe231784c3d0070a0fc73e611af3a2c 100644 (file)
@@ -7602,58 +7602,59 @@ handle_section_attribute (tree *node, tree ARG_UNUSED (name), tree args,
 {
   tree decl = *node;
 
-  if (targetm_common.have_named_sections)
+  if (!targetm_common.have_named_sections)
     {
-      user_defined_section_attribute = true;
+      error_at (DECL_SOURCE_LOCATION (*node),
+               "section attributes are not supported for this target");
+      goto fail;
+    }
 
-      if ((TREE_CODE (decl) == FUNCTION_DECL
-          || TREE_CODE (decl) == VAR_DECL)
-         && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
-       {
-         if (TREE_CODE (decl) == VAR_DECL
-             && current_function_decl != NULL_TREE
-             && !TREE_STATIC (decl))
-           {
-             error_at (DECL_SOURCE_LOCATION (decl),
-                       "section attribute cannot be specified for "
-                       "local variables");
-             *no_add_attrs = true;
-           }
+  user_defined_section_attribute = true;
 
-         /* The decl may have already been given a section attribute
-            from a previous declaration.  Ensure they match.  */
-         else if (DECL_SECTION_NAME (decl) != NULL
-                  && strcmp (DECL_SECTION_NAME (decl),
-                             TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
-           {
-             error ("section of %q+D conflicts with previous declaration",
-                    *node);
-             *no_add_attrs = true;
-           }
-         else if (TREE_CODE (decl) == VAR_DECL
-                  && !targetm.have_tls && targetm.emutls.tmpl_section
-                  && DECL_THREAD_LOCAL_P (decl))
-           {
-             error ("section of %q+D cannot be overridden", *node);
-             *no_add_attrs = true;
-           }
-         else
-           set_decl_section_name (decl,
-                                  TREE_STRING_POINTER (TREE_VALUE (args)));
-       }
-      else
-       {
-         error ("section attribute not allowed for %q+D", *node);
-         *no_add_attrs = true;
-       }
+  if (TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL)
+    {
+      error ("section attribute not allowed for %q+D", *node);
+      goto fail;
     }
-  else
+
+  if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
     {
-      error_at (DECL_SOURCE_LOCATION (*node),
-               "section attributes are not supported for this target");
-      *no_add_attrs = true;
+      error ("section attribute argument not a string constant");
+      goto fail;
+    }
+
+  if (TREE_CODE (decl) == VAR_DECL
+      && current_function_decl != NULL_TREE
+      && !TREE_STATIC (decl))
+    {
+      error_at (DECL_SOURCE_LOCATION (decl),
+                "section attribute cannot be specified for local variables");
+      goto fail;
     }
 
+  /* The decl may have already been given a section attribute
+     from a previous declaration.  Ensure they match.  */
+  if (DECL_SECTION_NAME (decl) != NULL
+      && strcmp (DECL_SECTION_NAME (decl),
+                 TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
+    {
+      error ("section of %q+D conflicts with previous declaration", *node);
+      goto fail;
+    }
+
+  if (TREE_CODE (decl) == VAR_DECL
+      && !targetm.have_tls && targetm.emutls.tmpl_section
+      && DECL_THREAD_LOCAL_P (decl))
+    {
+      error ("section of %q+D cannot be overridden", *node);
+      goto fail;
+    }
+
+  set_decl_section_name (decl, TREE_STRING_POINTER (TREE_VALUE (args)));
+  return NULL_TREE;
+
+fail:
+  *no_add_attrs = true;
   return NULL_TREE;
 }