mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-11-28 12:00:26 +08:00
i386: Remove workaround for Solaris ld 64-bit TLS IE limitation
As detailed in PR target/43309, the Solaris linker initially took the 64-bit x86 TLS IE code sequence literally, assuming that the spec only allowed %rax as target register. A workaround has been in place for more than a decade, but is no longer necessary. The bug had already been fixed for Solaris 11.1, while trunk requires Solaris 11.4. Uros pointed this out and suggested the attached patch. Bootstrapped without regressions on i386-pc-solaris2.11. 2024-10-15 Uros Bizjak <ubizjak@gmail.com> gcc: * config/i386/i386.cc (legitimize_tls_address) <TLS_MODEL_INITIAL_EXEC>: Remove 64-bit Solaris ld workaround. * config/i386/i386.md (UNSPEC_TLS_IE_SUN): Remove. (tls_initial_exec_64_sun): Remove.
This commit is contained in:
parent
bf57f9b599
commit
086ee8d086
@ -12320,17 +12320,6 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
|
||||
case TLS_MODEL_INITIAL_EXEC:
|
||||
if (TARGET_64BIT)
|
||||
{
|
||||
if (TARGET_SUN_TLS && !TARGET_X32)
|
||||
{
|
||||
/* The Sun linker took the AMD64 TLS spec literally
|
||||
and can only handle %rax as destination of the
|
||||
initial executable code sequence. */
|
||||
|
||||
dest = gen_reg_rtx (DImode);
|
||||
emit_insn (gen_tls_initial_exec_64_sun (dest, x));
|
||||
return dest;
|
||||
}
|
||||
|
||||
/* Generate DImode references to avoid %fs:(%reg32)
|
||||
problems and linker IE->LE relaxation bug. */
|
||||
tp_mode = DImode;
|
||||
|
@ -93,7 +93,6 @@
|
||||
UNSPEC_TLS_GD
|
||||
UNSPEC_TLS_LD_BASE
|
||||
UNSPEC_TLSDESC
|
||||
UNSPEC_TLS_IE_SUN
|
||||
|
||||
;; Other random patterns
|
||||
UNSPEC_SCAS
|
||||
@ -22876,22 +22875,6 @@
|
||||
set_mem_addr_space (operands[2], as);
|
||||
})
|
||||
|
||||
;; The Sun linker took the AMD64 TLS spec literally and can only handle
|
||||
;; %rax as destination of the initial executable code sequence.
|
||||
(define_insn "tls_initial_exec_64_sun"
|
||||
[(set (match_operand:DI 0 "register_operand" "=a")
|
||||
(unspec:DI
|
||||
[(match_operand 1 "tls_symbolic_operand")]
|
||||
UNSPEC_TLS_IE_SUN))
|
||||
(clobber (reg:CC FLAGS_REG))]
|
||||
"TARGET_64BIT && TARGET_SUN_TLS"
|
||||
{
|
||||
output_asm_insn
|
||||
("mov{q}\t{%%fs:0, %0|%0, QWORD PTR fs:0}", operands);
|
||||
return "add{q}\t{%a1@gottpoff(%%rip), %0|%0, %a1@gottpoff[rip]}";
|
||||
}
|
||||
[(set_attr "type" "multi")])
|
||||
|
||||
;; GNU2 TLS patterns can be split.
|
||||
|
||||
(define_expand "tls_dynamic_gnu2_32"
|
||||
|
Loading…
Reference in New Issue
Block a user