https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95238

--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to H.J. Lu from comment #3)
> (In reply to Uroš Bizjak from comment #2)
> > (In reply to H.J. Lu from comment #1)
> > > The "i" constraint shouldn't be used for flag_pic since symbolic constant
> > > leads to writable text in 32-bit mode and invalid in 64-bit mode.
> > 
> > Just a typo. "i" should be changed back to "e".
> 
> There are other "ri" in push patterns.  The 32 bit linker won't complain
> but will add DT_TEXTREL for "push $symbol" when generating shared object.

(define_insn "*push<mode>2"
  [(set (match_operand:DWI 0 "push_operand" "=<,<")
        (match_operand:DWI 1 "general_no_elim_operand" "riF*o,*v"))]

This will never match symbol, so "i" can be "n" as well.

;; For TARGET_64BIT we always round up to 8 bytes.
(define_insn "*pushsi2_rex64"
  [(set (match_operand:SI 0 "push_operand" "=X,X")
        (match_operand:SI 1 "nonmemory_no_elim_operand" "re,*v"))]

This is changed to "e", as was before.

(define_insn "*pushsi2"
  [(set (match_operand:SI 0 "push_operand" "=<,<")
        (match_operand:SI 1 "general_no_elim_operand" "ri*m,*v"))]

This was "i" before my patch.

(define_insn "*push<mode>2_prologue"
  [(set (match_operand:W 0 "push_operand" "=<")
        (match_operand:W 1 "general_no_elim_operand" "r<i>*m"))

This one is in effect "e".

Reply via email to