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