On Wed, Feb 18, 2015 at 5:18 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Sun, Feb 15, 2015 at 06:19:21AM -0800, H.J. Lu wrote:
>> Hi,
>>
>> r220674 exposed a bug in ia64_in_small_data_p.  After r220674, COMMON
>> symbols binds locally for executables.  But ia64_in_small_data_p returns
>> true for COMMON symbols which are never in small data section.  This patch
>> fixes it.  OK for trunk?
>>
>> H.J.
>> ----
>> Since COMMON symbols are never in small data section, ia64_in_small_data_p
>> should return false for COMMON symbols.
>>
>>       PR target/65064
>>       * config/ia64/ia64.c (ia64_in_small_data_p): Return false for
>>       COMMON symbols.
>
>
> 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

                         ^^^^^^ It should be true.
> 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.
>
> Tested by Andreas Schwab  <sch...@linux-m68k.org>. OK for trunk?
>
> Thanks.
>
>
> H.J.
> ---
>         PR target/65064
>         * config/ia64/predicates.md (sdata_symbolic_operand): Return false
>         for common symbols.
>
> diff --git a/gcc/config/ia64/predicates.md b/gcc/config/ia64/predicates.md
> index cba0efe..b550882 100644
> --- a/gcc/config/ia64/predicates.md
> +++ b/gcc/config/ia64/predicates.md
> @@ -69,7 +69,12 @@
>              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))



-- 
H.J.

Reply via email to