]> git.ipfire.org Git - thirdparty/gcc.git/commit
x86: Add -m[no-]direct-extern-access
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 19 Jun 2021 12:12:48 +0000 (05:12 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 9 Feb 2022 12:38:54 +0000 (04:38 -0800)
commitab0b5fbfe90168d2e470aefb19e0cf31526290bc
tree736de4846f3c063c6373bae97e8603ef8bd2d011
parent5390a2f191682dae3c6d1e1deac20e05be413514
x86: Add -m[no-]direct-extern-access

Add -m[no-]direct-extern-access and nodirect_extern_access attribute.
-mdirect-extern-access is the default.  With nodirect_extern_access
attribute, GOT is always used to access undefined data and function
symbols with nodirect_extern_access attribute, including in PIE and
non-PIE.  With -mno-direct-extern-access:

1. Always use GOT to access undefined data and function symbols,
   including in PIE and non-PIE.  These will avoid copy relocations
   in executables.  This is compatible with existing executables and
   shared libraries.
2. In executable and shared library, bind symbols with the STV_PROTECTED
   visibility locally:
   a. The address of data symbol is the address of data body.
   b. For systems without function descriptor, the function pointer is
      the address of function body.
   c. The resulting shared libraries may not be incompatible with
      executables which have copy relocations on protected symbols or
      use executable PLT entries as function addresses for protected
      functions in shared libraries.
3. Update asm_preferred_eh_data_format to select PC relative EH encoding
format with -mno-direct-extern-access to avoid copy relocation.
4. Add ix86_reloc_rw_mask for TARGET_ASM_RELOC_RW_MASK to avoid copy
relocation with -mno-direct-extern-access.

gcc/

PR target/35513
PR target/100593
* config/i386/gnu-property.cc: Include "i386-protos.h".
(file_end_indicate_exec_stack_and_gnu_property): Generate
a GNU_PROPERTY_1_NEEDED note for -mno-direct-extern-access or
nodirect_extern_access attribute.
* config/i386/i386-options.cc
(handle_nodirect_extern_access_attribute): New function.
(ix86_attribute_table): Add nodirect_extern_access attribute.
* config/i386/i386-protos.h (ix86_force_load_from_GOT_p): Add a
bool argument.
(ix86_has_no_direct_extern_access): New.
* config/i386/i386.cc (ix86_has_no_direct_extern_access): New.
(ix86_force_load_from_GOT_p): Add a bool argument to indicate
call operand.  Force non-call load from GOT for
-mno-direct-extern-access or nodirect_extern_access attribute.
(legitimate_pic_address_disp_p): Avoid copy relocation in PIE
for -mno-direct-extern-access or nodirect_extern_access attribute.
(ix86_print_operand): Pass true to ix86_force_load_from_GOT_p
for call operand.
(asm_preferred_eh_data_format): Use PC-relative format for
-mno-direct-extern-access to avoid copy relocation.  Check
ptr_mode instead of TARGET_64BIT when selecting DW_EH_PE_sdata4.
(ix86_binds_local_p): Set ix86_has_no_direct_extern_access to
true for -mno-direct-extern-access or nodirect_extern_access
attribute.  Don't treat protected data as extern and avoid copy
relocation on common symbol with -mno-direct-extern-access or
nodirect_extern_access attribute.
(ix86_reloc_rw_mask): New to avoid copy relocation for
-mno-direct-extern-access.
(TARGET_ASM_RELOC_RW_MASK): New.
* config/i386/i386.opt: Add -mdirect-extern-access.
* doc/extend.texi: Document nodirect_extern_access attribute.
* doc/invoke.texi: Document -m[no-]direct-extern-access.

gcc/testsuite/

PR target/35513
PR target/100593
* g++.target/i386/pr35513-1.C: New file.
* g++.target/i386/pr35513-2.C: Likewise.
* gcc.target/i386/pr35513-1a.c: Likewise.
* gcc.target/i386/pr35513-1b.c: Likewise.
* gcc.target/i386/pr35513-2a.c: Likewise.
* gcc.target/i386/pr35513-2b.c: Likewise.
* gcc.target/i386/pr35513-3a.c: Likewise.
* gcc.target/i386/pr35513-3b.c: Likewise.
* gcc.target/i386/pr35513-4a.c: Likewise.
* gcc.target/i386/pr35513-4b.c: Likewise.
* gcc.target/i386/pr35513-5a.c: Likewise.
* gcc.target/i386/pr35513-5b.c: Likewise.
* gcc.target/i386/pr35513-6a.c: Likewise.
* gcc.target/i386/pr35513-6b.c: Likewise.
* gcc.target/i386/pr35513-7a.c: Likewise.
* gcc.target/i386/pr35513-7b.c: Likewise.
* gcc.target/i386/pr35513-8.c: Likewise.
* gcc.target/i386/pr35513-9a.c: Likewise.
* gcc.target/i386/pr35513-9b.c: Likewise.
* gcc.target/i386/pr35513-10a.c: Likewise.
* gcc.target/i386/pr35513-10b.c: Likewise.
* gcc.target/i386/pr35513-11a.c: Likewise.
* gcc.target/i386/pr35513-11b.c: Likewise.
* gcc.target/i386/pr35513-12a.c: Likewise.
* gcc.target/i386/pr35513-12b.c: Likewise.
32 files changed:
gcc/config/i386/gnu-property.cc
gcc/config/i386/i386-options.cc
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.cc
gcc/config/i386/i386.opt
gcc/doc/extend.texi
gcc/doc/invoke.texi
gcc/testsuite/g++.target/i386/pr35513-1.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/pr35513-2.C [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-10a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-10b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-11a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-11b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-12a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-12b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-1a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-1b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-2a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-2b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-3a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-3b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-4a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-4b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-5a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-5b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-6a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-6b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-7a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-7b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-9a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr35513-9b.c [new file with mode: 0644]