Return false for common symbols in sdata_symbolic_operand
authorH.J. Lu <hongjiu.lu@intel.com>
Wed, 18 Feb 2015 17:24:20 +0000 (17:24 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Wed, 18 Feb 2015 17:24:20 +0000 (09:24 -0800)
Although common symbols are defined in executables, they aren't in small
data section.  But a definition in small data section overrides a common
symbol, which still binds lcoally, and turns a reference to common symbol
to reference to small data section.  Even if ia64_in_small_data_p returns
true on common symbols, sdata_symbolic_operand must return false on common
symbols.  Common symbols are assumed to be placed in small data section,
but are accessed as if they are in normal data section so that they won't
cause any relocation overflow.

PR target/65064
* config/ia64/predicates.md (sdata_symbolic_operand): Return false
for common symbols.

From-SVN: r220792

gcc/ChangeLog
gcc/config/ia64/predicates.md

index 86831bf7b59d58c00b04319ec0f1430bc1c9d3cd..35bcf40f566c02f7f2748001b19d8cb00be0f578 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-18  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/65064
+       * config/ia64/predicates.md (sdata_symbolic_operand): Return false
+       for common symbols.
+
 2015-02-18  Jakub Jelinek  <jakub@redhat.com>
 
        * config/i386/t-intelmic (mkoffload.o): Remove dependency on
index cba0efe7a6edb358d48791b054d5e217fd3ee618..2aa7a780e02734ebced0d5a1b15b63002b96d1e0 100644 (file)
             of constants here.  */
          t = SYMBOL_REF_DECL (op);
          if (DECL_P (t))
-           t = DECL_SIZE_UNIT (t);
+           {
+             /* Common symbol isn't placed in small data section.  */
+             if (DECL_COMMON (t))
+               return false;
+             t = DECL_SIZE_UNIT (t);
+           }
          else
            t = TYPE_SIZE_UNIT (TREE_TYPE (t));
          if (t && tree_fits_shwi_p (t))