From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-il1-x142.google.com (mail-il1-x142.google.com [IPv6:2607:f8b0:4864:20::142]) by sourceware.org (Postfix) with ESMTPS id C0CA2386F82D for ; Fri, 1 May 2020 15:57:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C0CA2386F82D Received: by mail-il1-x142.google.com with SMTP id t12so4819168ile.9 for ; Fri, 01 May 2020 08:57:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=8EFhUmfm33ATHNnhp0NK5qcE+NwiJjrAHBhNjjb445w=; b=NHjiIF89C8v4ntqzUaDB/mb1uG+BHs4A65Qv5qwvGX1WglLrtd7Bvt9JbbUtVBfO6w zIezLc52LDYT+jT3eesW9QbcnmAK1wYzbVvf//HbApSbrNPJrvEbc1DKxQ2tfpNOhR1L Gp2GmsgpNWm+YzSOsu/kYCsjFtmEcfn4gJaJ04ovXPx5UB1dCXlcFbaETH48xMjBeh4z 7hfDTqAF8Ww/VHhTQO9n7oJem4lKaHiRMH3ix2rbIr3mt0BFRAgscGxxqQckOuYh/x7j Ejp5Lg4R3f4bwP0tcIYLF3GyY1i6RSEzYW+VQC5aEYB5luvO5OIP/cuDSPjHOLJTX+7B zWhw== X-Gm-Message-State: AGi0PubSnSRWkg3mOtKLgSfAFKdF34g9omrNdM0nBz1ZZggkNLkDRUcj 0YuAraoOC60Y1TSKEmDUhw9bouobLDSBu1VC934GLw== X-Google-Smtp-Source: APiQypLiSB+nNtrA40ZogNXkwtLfIHM8xXp+F5V30Rejc2rSkC99U9hGrVRnSfTgY0tF7JiJthnXzRMZ9ZKnhiv0z6U= X-Received: by 2002:a92:8dd5:: with SMTP id w82mr4221823ill.151.1588348651978; Fri, 01 May 2020 08:57:31 -0700 (PDT) MIME-Version: 1.0 References: <20200201011027.478698-1-hjl.tools@gmail.com> In-Reply-To: <20200201011027.478698-1-hjl.tools@gmail.com> From: "H.J. Lu" Date: Fri, 1 May 2020 08:56:56 -0700 Message-ID: Subject: Re: [PATCH] gold: x86-64: Fix TLSDESC -> LE relaxation To: Binutils , Cary Coutant Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-20.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 May 2020 15:57:34 -0000 On Fri, Jan 31, 2020 at 5:10 PM H.J. Lu wrote: > > X86-64 TLSDESC sequences can be: > > 4c 8d 0d 00 00 00 00 leaq foo@TLSDESC(%rip), %r9 > 4c 89 c8 movq %r9, %rax > ff 10 call *foo@TLSCALL(%rax) > > TLSDESC -> LE relaxation can turn them into: > > 49 c7 c1 fc ff ff ff mov $0xfffffffffffffffc,%r9 > 4c 89 c8 mov %r9,%rax > 66 90 xchg %ax,%ax > > We need to check and update the REX byte in this case. > > PR gold/25473 > * x86_64.cc (Target_x86_64::Relocate::tls_desc_gd_to_ie): > Properly check r8 - r15 in "lea foo@TLSDESC(%rip), %reg". > (Target_x86_64::Relocate::tls_desc_gd_to_le): Properly > relax r8 - r15 in "lea foo@TLSDESC(%rip), %reg". > * testsuite/Makefile.am (check_SCRIPTS): Add x86_64_gd_to_le.sh. > (check_DATA): Add x86_64_gd_to_le.stdout. > (MOSTLYCLEANFILES): Add x86_64_gd_to_le. > (x86_64_gd_to_le.o): New target. > (x86_64_gd_to_le): Likewise. > (x86_64_gd_to_le.stdout): Likewise. > * testsuite/Makefile.in: Regenerated. > * testsuite/x86_64_gd_to_le.s: New file. > * testsuite/x86_64_gd_to_le.sh: Likewise. > --- > gold/testsuite/Makefile.am | 11 +++++++++++ > gold/testsuite/Makefile.in | 17 +++++++++++++++++ > gold/testsuite/x86_64_gd_to_le.s | 24 ++++++++++++++++++++++++ > gold/testsuite/x86_64_gd_to_le.sh | 26 ++++++++++++++++++++++++++ > gold/x86_64.cc | 11 ++++++++--- > 5 files changed, 86 insertions(+), 3 deletions(-) > create mode 100644 gold/testsuite/x86_64_gd_to_le.s > create mode 100755 gold/testsuite/x86_64_gd_to_le.sh > > diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am > index ed1ea1755ac..3d8c42cadfc 100644 > --- a/gold/testsuite/Makefile.am > +++ b/gold/testsuite/Makefile.am > @@ -1202,6 +1202,17 @@ x86_64_indirect_jump_to_direct1: x86_64_indirect_jump_to_direct1.o gcctestdir/ld > x86_64_indirect_jump_to_direct1.stdout: x86_64_indirect_jump_to_direct1 > $(TEST_OBJDUMP) -dw $< > $@ > > +check_SCRIPTS += x86_64_gd_to_le.sh > +check_DATA += x86_64_gd_to_le.stdout > +MOSTLYCLEANFILES += x86_64_gd_to_le > + > +x86_64_gd_to_le.o: x86_64_gd_to_le.s > + $(TEST_AS) --64 -o $@ $< > +x86_64_gd_to_le: x86_64_gd_to_le.o gcctestdir/ld > + gcctestdir/ld -o $@ $< > +x86_64_gd_to_le.stdout: x86_64_gd_to_le > + $(TEST_OBJDUMP) -dw $< > $@ > + > check_SCRIPTS += x86_64_overflow_pc32.sh > check_DATA += x86_64_overflow_pc32.err > MOSTLYCLEANFILES += x86_64_overflow_pc32.err > diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in > index 9533b0e20b2..9409e1ad3d2 100644 > --- a/gold/testsuite/Makefile.in > +++ b/gold/testsuite/Makefile.in > @@ -291,6 +291,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ > @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@am__append_28 = tls_shared_nonpic_test > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_29 = x86_64_mov_to_lea.sh \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_indirect_call_to_direct.sh \ > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_gd_to_le.sh \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_overflow_pc32.sh \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x32_overflow_pc32.sh \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ pr23016_1.sh \ > @@ -311,6 +312,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_mov_to_lea14.stdout \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_indirect_call_to_direct1.stdout \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_indirect_jump_to_direct1.stdout \ > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_gd_to_le.stdout \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_overflow_pc32.err \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x32_overflow_pc32.err \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ pr23016_1.stdout \ > @@ -332,6 +334,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_mov_to_lea14 \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_indirect_call_to_direct1 \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_indirect_jump_to_direct1 \ > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_gd_to_le \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x86_64_overflow_pc32.err \ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ x32_overflow_pc32.err > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_32 = pr17704a_test > @@ -5629,6 +5632,13 @@ x86_64_indirect_call_to_direct.sh.log: x86_64_indirect_call_to_direct.sh > --log-file $$b.log --trs-file $$b.trs \ > $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ > "$$tst" $(AM_TESTS_FD_REDIRECT) > +x86_64_gd_to_le.sh.log: x86_64_gd_to_le.sh > + @p='x86_64_gd_to_le.sh'; \ > + b='x86_64_gd_to_le.sh'; \ > + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ > + --log-file $$b.log --trs-file $$b.trs \ > + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ > + "$$tst" $(AM_TESTS_FD_REDIRECT) > x86_64_overflow_pc32.sh.log: x86_64_overflow_pc32.sh > @p='x86_64_overflow_pc32.sh'; \ > b='x86_64_overflow_pc32.sh'; \ > @@ -8312,6 +8322,13 @@ uninstall-am: > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ gcctestdir/ld -o $@ $< > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@x86_64_indirect_jump_to_direct1.stdout: x86_64_indirect_jump_to_direct1 > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_OBJDUMP) -dw $< > $@ > + > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@x86_64_gd_to_le.o: x86_64_gd_to_le.s > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AS) --64 -o $@ $< > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@x86_64_gd_to_le: x86_64_gd_to_le.o gcctestdir/ld > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ gcctestdir/ld -o $@ $< > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@x86_64_gd_to_le.stdout: x86_64_gd_to_le > +@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_OBJDUMP) -dw $< > $@ > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@x86_64_overflow_pc32.o: x86_64_overflow_pc32.s > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AS) -o $@ $< > @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@x86_64_overflow_pc32.err: x86_64_overflow_pc32.o gcctestdir/ld > diff --git a/gold/testsuite/x86_64_gd_to_le.s b/gold/testsuite/x86_64_gd_to_le.s > new file mode 100644 > index 00000000000..dcdd303184d > --- /dev/null > +++ b/gold/testsuite/x86_64_gd_to_le.s > @@ -0,0 +1,24 @@ > + .text > + .p2align 4 > + .globl _start > + .type _start, @function > +_start: > + .cfi_startproc > + subq $8, %rsp > + .cfi_def_cfa_offset 16 > + leaq foo@TLSDESC(%rip), %r9 > + movq %r9, %rax > + call *foo@TLSCALL(%rax) > + addq %fs:0, %rax > + addq $8, %rsp > + .cfi_def_cfa_offset 8 > + ret > + .cfi_endproc > + .size _start, .-_start > + .section .tdata,"awT",@progbits > + .align 4 > + .type foo, @object > + .size foo, 4 > +foo: > + .long 30 > + .section .note.GNU-stack,"",@progbits > diff --git a/gold/testsuite/x86_64_gd_to_le.sh b/gold/testsuite/x86_64_gd_to_le.sh > new file mode 100755 > index 00000000000..7ecc6ea5a23 > --- /dev/null > +++ b/gold/testsuite/x86_64_gd_to_le.sh > @@ -0,0 +1,26 @@ > +#!/bin/sh > + > +# x86_64_gd_to_ie.sh -- a test for GDesc -> IE conversion. > + > +# Copyright (C) 2020 Free Software Foundation, Inc. > + > +# This file is part of gold. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > + > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > + > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, > +# MA 02110-1301, USA. > + > +set -e > + > +grep -q "mov[ \t]\+\$0x[a-f0-9]\+,%r9" x86_64_gd_to_le.stdout > diff --git a/gold/x86_64.cc b/gold/x86_64.cc > index a65e2c55e9e..622e9431021 100644 > --- a/gold/x86_64.cc > +++ b/gold/x86_64.cc > @@ -5479,7 +5479,9 @@ Target_x86_64::Relocate::tls_desc_gd_to_ie( > tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3); > tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4); > tls::check_tls(relinfo, relnum, rela.get_r_offset(), > - view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x05); > + ((view[-3] & 0xfb) == 0x48 > + && view[-2] == 0x8d > + && (view[-1] & 0xc7) == 0x05)); > view[-2] = 0x8b; > const elfcpp::Elf_Xword addend = rela.get_r_addend(); > Relocate_functions::pcrela32(view, value, addend, address); > @@ -5518,9 +5520,12 @@ Target_x86_64::Relocate::tls_desc_gd_to_le( > tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3); > tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4); > tls::check_tls(relinfo, relnum, rela.get_r_offset(), > - view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x05); > + ((view[-3] & 0xfb) == 0x48 > + && view[-2] == 0x8d > + && (view[-1] & 0xc7) == 0x05)); > + view[-3] = 0x48 | ((view[-3] >> 2) & 1); > view[-2] = 0xc7; > - view[-1] = 0xc0; > + view[-1] = 0xc0 | ((view[-1] >> 3) & 7); > value -= tls_segment->memsz(); > Relocate_functions::rela32(view, value, 0); > } > -- > 2.24.1 > I am checking in this patch. -- H.J.