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".