(decl_attributes): Decode section attribute.
authorDoug Evans <dje@gnu.org>
Thu, 17 Feb 1994 22:48:50 +0000 (22:48 +0000)
committerDoug Evans <dje@gnu.org>
Thu, 17 Feb 1994 22:48:50 +0000 (22:48 +0000)
From-SVN: r6582

gcc/c-common.c

index 73ae7ebd686cc561089bc6e0d80a0b8d64f211ec..492ccfc345194ebe924a484553ae07c08bcd9e7e 100644 (file)
@@ -207,6 +207,7 @@ decl_attributes (decl, attributes)
      tree decl, attributes;
 {
   tree a;
+
   for (a = attributes; a; a = TREE_CHAIN (a))
     if (TREE_VALUE (a) == get_identifier ("packed"))
       {
@@ -253,6 +254,32 @@ decl_attributes (decl, attributes)
        if (i == NUM_MACHINE_MODES)
          error ("unknown machine mode `%s'", specified_name);
       }
+    else if (TREE_VALUE (a) != 0
+            && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
+            && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("section"))
+      {
+#ifdef ASM_OUTPUT_SECTION_NAME
+       if (TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
+         {
+           if (TREE_CODE (decl) == VAR_DECL && current_function_decl != NULL_TREE)
+             error ("section attribute cannot be specified for local variables");
+           /* The decl may have already been given a section attribute from
+              a previous declaration.  Ensure they match.  */
+           else if (DECL_SECTION_NAME (decl) != NULL_TREE
+                    && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
+                               TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (a)))) != 0)
+             error_with_decl (decl,
+                              "section of `%s' conflicts with previous declaration");
+           else
+             DECL_SECTION_NAME (decl) = TREE_VALUE (TREE_VALUE (a));
+         }
+       else
+         error_with_decl (decl,
+                          "section attribute not allowed for `%s'");
+#else
+       error_with_decl (decl, "section attributes are not supported for this target");
+#endif
+      }
     else if (TREE_VALUE (a) != 0
             && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
             && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("aligned"))