OSDN Git Service

ChangeLog:
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Jan 2005 01:49:01 +0000 (01:49 +0000)
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Jan 2005 01:49:01 +0000 (01:49 +0000)
* dbxout.c (dbxout_symbol_location): Resolve constant pool references
even for variables with NULL DECL_INITIAL.

testsuite/ChangeLog:
* gcc.dg/20041216-1.c: New test.

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

gcc/ChangeLog
gcc/dbxout.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20041216-1.c [new file with mode: 0644]

index f21d9d2..ca995cc 100644 (file)
@@ -1,3 +1,8 @@
+2005-01-26  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * dbxout.c (dbxout_symbol_location): Resolve constant pool references
+       even for variables with NULL DECL_INITIAL.
+
 2005-01-26  Stuart Hastings  <stuart@apple.com>
 
        * gcc/gimplify.c (shortcut_cond_expr): Re-compute side-effects.
index 8c2d6ea..d4c78e9 100644 (file)
@@ -2733,6 +2733,37 @@ dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
 
          letter = decl_function_context (decl) ? 'V' : 'S';
 
+         /* Some ports can transform a symbol ref into a label ref,
+            because the symbol ref is too far away and has to be
+            dumped into a constant pool.  Alternatively, the symbol
+            in the constant pool might be referenced by a different
+            symbol.  */
+         if (GET_CODE (addr) == SYMBOL_REF
+             && CONSTANT_POOL_ADDRESS_P (addr))
+           {
+             bool marked;
+             rtx tmp = get_pool_constant_mark (addr, &marked);
+
+             if (GET_CODE (tmp) == SYMBOL_REF)
+               {
+                 addr = tmp;
+                 if (CONSTANT_POOL_ADDRESS_P (addr))
+                   get_pool_constant_mark (addr, &marked);
+                 else
+                   marked = true;
+               }
+             else if (GET_CODE (tmp) == LABEL_REF)
+               {
+                 addr = tmp;
+                 marked = true;
+               }
+
+             /* If all references to the constant pool were optimized
+                out, we just ignore the symbol.  */
+             if (!marked)
+               return 0;
+           }
+
          /* This should be the same condition as in assemble_variable, but
             we don't have access to dont_output_data here.  So, instead,
             we rely on the fact that error_mark_node initializers always
@@ -2747,37 +2778,6 @@ dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
            code = DBX_STATIC_CONST_VAR_CODE;
          else
            {
-             /* Some ports can transform a symbol ref into a label ref,
-                because the symbol ref is too far away and has to be
-                dumped into a constant pool.  Alternatively, the symbol
-                in the constant pool might be referenced by a different
-                symbol.  */
-             if (GET_CODE (addr) == SYMBOL_REF
-                 && CONSTANT_POOL_ADDRESS_P (addr))
-               {
-                 bool marked;
-                 rtx tmp = get_pool_constant_mark (addr, &marked);
-
-                 if (GET_CODE (tmp) == SYMBOL_REF)
-                   {
-                     addr = tmp;
-                     if (CONSTANT_POOL_ADDRESS_P (addr))
-                       get_pool_constant_mark (addr, &marked);
-                     else
-                       marked = true;
-                   }
-                 else if (GET_CODE (tmp) == LABEL_REF)
-                   {
-                     addr = tmp;
-                     marked = true;
-                   }
-
-                  /* If all references to the constant pool were optimized
-                     out, we just ignore the symbol.  */
-                 if (!marked)
-                   return 0;
-               }
-
              /* Ultrix `as' seems to need this.  */
 #ifdef DBX_STATIC_STAB_DATA_SECTION
              data_section ();
index 7cdaf99..0140e9a 100644 (file)
@@ -1,3 +1,7 @@
+2005-01-26  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * gcc.dg/20041216-1.c: New test.
+
 2005-01-26  Alexander Malmberg  <alexander@malmberg.org>
 
        PR objc/18862
diff --git a/gcc/testsuite/gcc.dg/20041216-1.c b/gcc/testsuite/gcc.dg/20041216-1.c
new file mode 100644 (file)
index 0000000..3f892a2
--- /dev/null
@@ -0,0 +1,23 @@
+/* This test case would get an unresolved symbol during link
+   because stabs referred to an optimized-away literal pool
+   entry.  */
+
+/* { dg-do run { target s390*-*-* } } */
+/* { dg-options "-O2 -fno-omit-frame-pointer -gstabs" } */
+
+int main (void)
+{
+  static char buf[4096];
+  char *p;
+
+  do
+    {
+      p = buf;
+      asm volatile ("" : : : "memory", "0", "1", "2", "3", "4", "5", "6",
+                                      "7", "8", "9", "10", "12");
+    }
+  while (*p);
+
+  return 0;
+}
+