On Wed, Feb 18, 2015 at 5:18 AM, H.J. Lu <[email protected]> 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 <[email protected]>. 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.