]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/6569 (sparc-sun-solaris2.7 C testsuite regression in compile/20011119...
authorMark Mitchell <mark@codesourcery.com>
Wed, 8 May 2002 14:36:35 +0000 (14:36 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 8 May 2002 14:36:35 +0000 (14:36 +0000)
PR c/6569.
* varasm.c (mark_weak): New function.
(merge_weak): Use it.  Do not call declare_weak.
(declare_weak): Use merge_weak.

PR c/6569
* gcc.dg/weak-3.c: Update location of warning messages.
* gcc.dg/weak-5.c: Likewise.

From-SVN: r53292

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/weak-3.c
gcc/testsuite/gcc.dg/weak-5.c
gcc/varasm.c

index 7196ce4871ba424691ca3830c5c950e8caa2786d..17ffeab8b3ad1b8c409c74480ed5d16eda468670 100644 (file)
@@ -1,3 +1,10 @@
+2002-05-08  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c/6569.
+       * varasm.c (mark_weak): New function.
+       (merge_weak): Use it.  Do not call declare_weak.
+       (declare_weak): Use merge_weak.
+
 2002-05-07  Geoffrey Keating  <geoffk@redhat.com>
 
        * configure.in: Don't pass -Wno-long-long to a ADA compiler
index 0ab468915b65b54eb056f71c45305508f8a881d1..57828875fe1986890ea0984f809da63267b0767a 100644 (file)
@@ -1,3 +1,9 @@
+2002-05-08  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c/6569
+       * gcc.dg/weak-3.c: Update location of warning messages.
+       * gcc.dg/weak-5.c: Likewise.
+
 2002-05-03  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.dg/20020503-1.c: New test.
index bd7d827ee971c5bc49993aefe442b67f914eff7c..1675ab10f3bd5fe40812a4812c9cfacb522f267c 100644 (file)
@@ -34,12 +34,12 @@ void * foo1b (void)
 }
 
 
-extern void * ffoo1c (void);  /* { dg-warning "weak declaration" "weak declaration" } */
+extern void * ffoo1c (void);  
 void * foo1c (void)
 {
   return (void *)ffoo1c;
 }
-extern void * ffoo1c (void) __attribute__((weak));
+extern void * ffoo1c (void) __attribute__((weak)); /* { dg-warning "weak declaration" "weak declaration" } */
 
 
 int ffoo1d (void);
@@ -56,7 +56,7 @@ void * foo1e (void)
 }
 
 
-extern void * ffoo1f (void);    /* { dg-warning "weak declaration" "weak declaration" } */
+extern void * ffoo1f (void);    
 extern void * ffoox1f (void);
 void * foo1f (void)
 {
@@ -64,7 +64,7 @@ void * foo1f (void)
     ffoo1f ();
   return 0;
 }
-extern void * ffoo1f (void)  __attribute__((weak, alias ("ffoox1f")));
+extern void * ffoo1f (void)  __attribute__((weak, alias ("ffoox1f"))); /* { dg-warning "weak declaration" "weak declaration" } */
 
 
 extern void * ffoo1g (void);
index 694eb61ac1cb18db7b5ffc97f908ba1759c54470..eec210992f455201c65cde1892563379a763e97b 100644 (file)
@@ -39,12 +39,12 @@ void * foo1b (void)
 }
 
 
-extern int vfoo1c;  /* { dg-warning "weak declaration" "weak declaration" } */
+extern int vfoo1c;  
 void * foo1c (void)
 {
   return (void *)&vfoo1c;
 }
-extern int vfoo1c __attribute__((weak));
+extern int vfoo1c __attribute__((weak)); /* { dg-warning "weak declaration" "weak declaration" } */
 
 
 extern int vfoo1d __attribute__((weak));
index b50b99f7bbe4052407d652b58a6b92f899548922..6dfc292119337f97d456e0a9cf3bbbefef823a2a 100644 (file)
@@ -187,6 +187,7 @@ static int const_str_htab_eq                PARAMS ((const void *x, const void *y));
 static void const_str_htab_del         PARAMS ((void *));
 static void asm_emit_uninitialised     PARAMS ((tree, const char*, int, int));
 static void resolve_unique_section     PARAMS ((tree, int));
+static void mark_weak                   PARAMS ((tree));
 \f
 static enum in_section { no_section, in_text, in_data, in_named
 #ifdef BSS_SECTION_ASM_OP
@@ -4990,6 +4991,21 @@ output_constructor (exp, size, align)
    to be emitted.  */
 static tree weak_decls;
 
+/* Mark DECL as weak.  */
+
+static void
+mark_weak (decl)
+     tree decl;
+{
+  DECL_WEAK (decl) = 1;
+
+  if (DECL_RTL_SET_P (decl)
+      && GET_CODE (DECL_RTL (decl)) == MEM
+      && XEXP (DECL_RTL (decl), 0)
+      && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
+    SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
+}
 /* Merge weak status between NEWDECL and OLDDECL.  */
 
 void
@@ -4997,22 +5013,54 @@ merge_weak (newdecl, olddecl)
      tree newdecl;
      tree olddecl;
 {
-  tree decl;
-
   if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
     return;
 
-  decl = DECL_WEAK (olddecl) ? newdecl : olddecl;
-
   if (SUPPORTS_WEAK
+      && DECL_WEAK (newdecl) 
       && DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)
-      && (TREE_CODE (decl) != VAR_DECL
-         || ! TREE_STATIC (decl))
-      && TREE_USED (decl)
-      && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
-    warning_with_decl (decl, "weak declaration of `%s' after first use results in unspecified behavior");
+      && (TREE_CODE (olddecl) != VAR_DECL || ! TREE_STATIC (olddecl))
+      && TREE_USED (olddecl)
+      && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
+    warning_with_decl (newdecl, "weak declaration of `%s' after first use results in unspecified behavior");
+
+  if (DECL_WEAK (newdecl))
+    {
+      tree wd;
+      
+      /* NEWDECL is weak, but OLDDECL is not.  */
+
+      /* If we already output the OLDDECL, we're in trouble; we can't
+        go back and make it weak.  This error cannot caught in
+        declare_weak because the NEWDECL and OLDDECL was not yet
+        been merged; therefore, TREE_ASM_WRITTEN was not set.  */
+      if (TREE_CODE (olddecl) == FUNCTION_DECL && TREE_ASM_WRITTEN (olddecl))
+       error_with_decl (newdecl, 
+                        "weak declaration of `%s' must precede definition");
+      
+      if (SUPPORTS_WEAK)
+       {
+         /* We put the NEWDECL on the weak_decls list at some point.
+            Replace it with the OLDDECL.  */
+         for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
+           if (TREE_VALUE (wd) == newdecl)
+             {
+               TREE_VALUE (wd) = olddecl;
+               break;
+             }
+         /* We may not find the entry on the list.  If NEWDECL is a
+            weak alias, then we will have already called
+            globalize_decl to remove the entry; in that case, we do
+            not need to do anything.  */
+       }
 
-  declare_weak (decl);
+      /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping.  */
+      mark_weak (olddecl);
+    }
+  else
+    /* OLDDECL was weak, but NEWDECL was not explicitly marked as
+       weak.  Just update NEWDECL to indicate that it's weak too.  */
+    mark_weak (newdecl);
 }
 
 /* Declare DECL to be a weak symbol.  */
@@ -5033,13 +5081,7 @@ declare_weak (decl)
   else
     warning_with_decl (decl, "weak declaration of `%s' not supported");
 
-  DECL_WEAK (decl) = 1;
-
-  if (DECL_RTL_SET_P (decl)
-      && GET_CODE (DECL_RTL (decl)) == MEM
-      && XEXP (DECL_RTL (decl), 0)
-      && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
-    SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
+  mark_weak (decl);
 }
 
 /* Emit any pending weak declarations.  */