On 14 November 2014 08:19, Andrew Pinski <pins...@gmail.com> wrote:
> On Fri, Nov 14, 2014 at 12:12 AM, Tejas Belagod <tejas.bela...@arm.com> wrote:
>>
>> Hi,
>>
>> Following the discussion here
>> https://gcc.gnu.org/ml/gcc-patches/2014-09/msg02237.html, this has been
>> tracked down to a range-checking bug with symbol + offset style addressing
>> with adrp where we allowed any arbitrary offset and this would cause
>> truncation of final addresses when relocations were being resolved by ld.
>> When we retreive symbol + offset address, we have to make sure 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 alternate mechanism.
>> Similarly for the SMALL code model the offset has been capped at 4G.
>>
>> The cap value for the offset in each code model is open to debate.
>>
>> All testing done with Alan's workaround
>> patch(https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01509.html) reversed.
>>
>> bootstrapped aarch64-linux.
>>
>> OK for trunk?
>
> This looks like a better fix than I would have came up with.
> Since you are touching this area you might want to look into this issue:
> I notice SYMBOL_REF_WEAK (x) is true for references(decls) which are
> comdat's which are declared in the translation unit.  So force them to
> memory when really we know they are declared and don't have a value of
> zero so they will fit in the medium code model.  This happens with
> vtables and we lose some performance because of this.

Andrew, do you mind if we take that as a separate patch, I'd like to
take Tejas' patch sooner rather than later since it gates building a
variety of stuff some folks care about.
Cheers
/Marcus

Reply via email to