[PATCH] D57240: [RISCV] Don't incorrectly force relocation for %pcrel_lo

James Clarke via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 5 10:19:44 PST 2019


jrtc27 added a comment.

In D57240#1385323 <https://reviews.llvm.org/D57240#1385323>, @lewis-revill wrote:

> In D57240#1385261 <https://reviews.llvm.org/D57240#1385261>, @jrtc27 wrote:
>
> > Could we not have a situation where the pcrel_hi20 is seen *after* the lo12, in which case the lo12 would be forced but the hi20 could still be evaluated? E.g. I think the following would be problematic:
> >
> >   foo:
> >       j 1f
> >   0:  addi a0, a0, %pcrel_lo(1f)
> >       ret
> >   1: auipc a0, %pcrel_hi(bar)
> >       j 0b
> >  
> >   .align 2
> >   bar:
> >       # ...
> >
> >
> > Obviously extremely pathological code, but nonetheless valid.
>
>
> Good call. It's a pathological case but maybe there are other cases as well. It's not a nice situation. Somehow we have to ensure there can never be a pcrel_lo12 relocation without a corresponding pcrel_hi20 relocation. It might help to know whether the pcrel_hi20 has been seen at all, regardless of whether it was resolved.
>
> So I guess the intended behaviour might be:
>
> pcrel_hi20 seen and not resolved (IE relocation emitted) -> force relocation
>  pcrel_hi20 seen and resolved -> don't force relocation
>  pcrel_hi20 not seen -> don't force relocation? If evaluatePcRelLo thinks it can be evaluated does it matter if the pcrel_hi20 can or not?
>
> I'll have another think and take a look at your testcase.


My suspicion is that it would be easier to teach `MCAssembler::evaluateFixup` how to deal with an extra level of indirection, since the problem stems from it believing the relocation can be evaluated and not knowing about the *real* symbol/relocation we care about.


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57240/new/

https://reviews.llvm.org/D57240





More information about the llvm-commits mailing list