Wilco Dijkstra <wilco.dijks...@arm.com> writes:
> Hi Richard,
>> Sure, the "extern array of unknown size" case isn't about section anchors.
>> But this part of my message (snipped above) was about the other case
>> (objects of known size), and applied to individual objects as well as
>> section anchors.
>>
>> What I was trying to say is: yes, we need better offsets for references
>> to extern objects of unknown size.  But your patch does that by reducing
>> the offset range for all objects, including ones with known sizes in
>> which the documented ranges should be safe.
>>
>> I was trying to explain why I don't think we need to reduce the range
>> in that case too.  If offset_within_block_p then any offset should be
>> OK (the aggressive interpretation) or the original documented ranges
>> should be OK.  I think we only need the smaller range when
>> offset_within_block_p returns false.
>
> Right I see now. Yes given offset_within_block_p is not sufficient, we could 
> test
> both conditions. Here is the updated patch:
>
> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
> index 
> 7ee31a66b12d7354759f06449955e933421f5fe0..31c394a7e8567dd7d4f1698e5ba98aeb8807df38
>  100644
> --- a/gcc/config/aarch64/aarch64.c
> +++ b/gcc/config/aarch64/aarch64.c
> @@ -14079,26 +14079,30 @@ aarch64_classify_symbol (rtx x, HOST_WIDE_INT 
> offset)
>       the offset does not cause overflow of the final address.  But
>       we have no way of knowing the address of symbol at compile time
>       so we can't accurately say if the distance between the PC and
> -     symbol + offset is outside the addressible range of +/-1M in the
> -     TINY code model.  So we rely on images not being greater than
> -     1M and cap the offset at 1M and anything beyond 1M will have to
> -     be loaded using an alternative mechanism.  Furthermore if the
> -     symbol is a weak reference to something that isn't known to
> -     resolve to a symbol in this module, then force to memory.  */
> -  if ((SYMBOL_REF_WEAK (x)
> -       && !aarch64_symbol_binds_local_p (x))
> -      || !IN_RANGE (offset, -1048575, 1048575))
> +     symbol + offset is outside the addressible range of +/-1MB in the
> +     TINY code model.  So we limit the maximum offset to +/-64KB and
> +     assume the offset to the symbol is not larger than +/-(1MB - 64KB).
> +     Furthermore force to memory if the symbol is a weak reference to
> +     something that doesn't resolve to a symbol in this module.  */
> +
> +  if (SYMBOL_REF_WEAK (x) && !aarch64_symbol_binds_local_p (x))
> +    return SYMBOL_FORCE_TO_MEM;
> +  if (!(IN_RANGE (offset, -0x10000, 0x10000)
> +|| offset_within_block_p (x, offset)))
>      return SYMBOL_FORCE_TO_MEM;
> +
>    return SYMBOL_TINY_ABSOLUTE;
>
>  case AARCH64_CMODEL_SMALL:
>    /* Same reasoning as the tiny code model, but the offset cap here is
> -     4G.  */
> -  if ((SYMBOL_REF_WEAK (x)
> -       && !aarch64_symbol_binds_local_p (x))
> -      || !IN_RANGE (offset, HOST_WIDE_INT_C (-4294967263),
> -    HOST_WIDE_INT_C (4294967264)))
> +     1MB, allowing +/-3.9GB for the offset to the symbol.  */
> +
> +  if (SYMBOL_REF_WEAK (x) && !aarch64_symbol_binds_local_p (x))
> +    return SYMBOL_FORCE_TO_MEM;
> +  if (!(IN_RANGE (offset, -0x100000, 0x100000)
> +|| offset_within_block_p (x, offset)))
>      return SYMBOL_FORCE_TO_MEM;

Think this is just the mailer eating tabs, but: || not properly indented.

OK otherwise, thanks.

Richard

Reply via email to