OSDN Git Service

2004-12-16 Andrew Pinski <pinskia@physics.uc.edu>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Dec 2004 00:25:16 +0000 (00:25 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Dec 2004 00:25:16 +0000 (00:25 +0000)
        PR target/19041
        * config/darwin.c (machopic_symbol_defined_p): Return false
        if the binds local and is a common symbol.

2004-12-16  Andrew Pinski  <pinskia@physics.uc.edu>

        PR target/19041
        * gcc.dg/visibility-c.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92292 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/darwin.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/visibility-c.c [new file with mode: 0644]

index b288e70..c323cbf 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-16  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR target/19041
+       * config/darwin.c (machopic_symbol_defined_p): Return false
+       if the binds local and is a common symbol.
+
 2004-12-16  Richard Henderson  <rth@redhat.com>
 
        * config/i386/i386.md (extv, extzv, insv): Revalidate the
index e4a3997..7b4943b 100644 (file)
@@ -90,16 +90,30 @@ name_needs_quotes (const char *name)
   return 0;
 }
 
-/*
- * flag_pic = 1 ... generate only indirections
- * flag_pic = 2 ... generate indirections and pure code
- */
-
+/* Return true if SYM_REF can be used without an indirection.  */
 static int
 machopic_symbol_defined_p (rtx sym_ref)
 {
-  return (SYMBOL_REF_FLAGS (sym_ref) & MACHO_SYMBOL_FLAG_DEFINED)
-    || (SYMBOL_REF_LOCAL_P (sym_ref) && ! SYMBOL_REF_EXTERNAL_P (sym_ref));
+  if (SYMBOL_REF_FLAGS (sym_ref) & MACHO_SYMBOL_FLAG_DEFINED)
+    return true;
+
+  /* If a symbol references local and is not an extern to this
+     file, then the symbol might be able to declared as defined.  */
+  if (SYMBOL_REF_LOCAL_P (sym_ref) && ! SYMBOL_REF_EXTERNAL_P (sym_ref))
+    {
+      /* If the symbol references a variable and the variable is a
+        common symbol, then this symbol is not defined.  */
+      if (SYMBOL_REF_FLAGS (sym_ref) & MACHO_SYMBOL_FLAG_VARIABLE)
+       {
+         tree decl = SYMBOL_REF_DECL (sym_ref);
+         if (!decl)
+           return true;
+         if (DECL_COMMON (decl))
+           return false;
+       }
+      return true;
+    }
+  return false;
 }
 
 /* This module assumes that (const (symbol_ref "foo")) is a legal pic
index a92fedc..c5530fa 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-16  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR target/19041
+       * gcc.dg/visibility-c.c: New test.
+
 2004-12-16  Roger Sayle  <roger@eyesopen.com>
 
        PR middle-end/18493
diff --git a/gcc/testsuite/gcc.dg/visibility-c.c b/gcc/testsuite/gcc.dg/visibility-c.c
new file mode 100644 (file)
index 0000000..66b4d25
--- /dev/null
@@ -0,0 +1,11 @@
+/* Test that visibility works on common symbols also. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "options" } } */
+
+int options  __attribute__((__visibility__("hidden")));
+
+void f(void)
+{
+  options = 0;
+}