On nios2-linux-gnu, the testcase gcc.dg/pr65658.c was failing with a link error. The problem was that the nios2 back end was emitting GP-relative addressing for an uninitialized common symbol (C tentative declaration) that had a strong definition in a shared library. That's a dumb thing to do -- it should be treating uninitialized common symbols similarly to weak definitions. I've checked in the attached patch to fix it.

-Sandra
2015-10-06  Sandra Loosemore  <san...@codesourcery.com>

	gcc/
	* config/nios2/nios2.c (nios2_symbol_ref_in_small_data_p):
	For -mgpopt=local, also exclude unintialized common symbols.
	* doc/invoke.texi (Nios II Options): Document the change.
Index: gcc/config/nios2/nios2.c
===================================================================
--- gcc/config/nios2/nios2.c	(revision 228499)
+++ gcc/config/nios2/nios2.c	(working copy)
@@ -2099,13 +2099,17 @@ nios2_symbol_ref_in_small_data_p (rtx sy
 
     case gpopt_local:
       /* Use GP-relative addressing for small data symbols that are
-	 not external or weak, plus any symbols that have explicitly
-	 been placed in a small data section.  */
+	 not external or weak or uninitialized common, plus any symbols
+	 that have explicitly been placed in a small data section.  */
       if (decl && DECL_SECTION_NAME (decl))
 	return nios2_small_section_name_p (DECL_SECTION_NAME (decl));
       return (SYMBOL_REF_SMALL_P (sym)
 	      && !SYMBOL_REF_EXTERNAL_P (sym)
-	      && !(decl && DECL_WEAK (decl)));
+	      && !(decl && DECL_WEAK (decl))
+	      && !(decl && DECL_COMMON (decl)
+		   && (DECL_INITIAL (decl) == NULL
+		       || (!in_lto_p
+			   && DECL_INITIAL (decl) == error_mark_node))));
 
     case gpopt_global:
       /* Use GP-relative addressing for small data symbols, even if
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 228499)
+++ gcc/doc/invoke.texi	(working copy)
@@ -18535,13 +18535,14 @@ Do not generate GP-relative accesses.
 
 @item local
 Generate GP-relative accesses for small data objects that are not 
-external or weak.  Also use GP-relative addressing for objects that
+external, weak, or uninitialized common symbols.  
+Also use GP-relative addressing for objects that
 have been explicitly placed in a small data section via a @code{section}
 attribute.
 
 @item global
 As for @samp{local}, but also generate GP-relative accesses for
-small data objects that are external or weak.  If you use this option,
+small data objects that are external, weak, or common.  If you use this option,
 you must ensure that all parts of your program (including libraries) are
 compiled with the same @option{-G} setting.
 

Reply via email to