[all-commits] [llvm/llvm-project] e2e82c: [CodeGenModule] Drop dso_local on function declara...
Fangrui Song via All-commits
all-commits at lists.llvm.org
Sat Jan 9 16:32:11 PST 2021
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: e2e82c9983f0dff671dd47d3e256d80faa40e892
https://github.com/llvm/llvm-project/commit/e2e82c9983f0dff671dd47d3e256d80faa40e892
Author: Fangrui Song <i at maskray.me>
Date: 2021-01-09 (Sat, 09 Jan 2021)
Changed paths:
M clang/lib/CodeGen/CodeGenModule.cpp
M clang/test/CodeGen/dso-local-executable.c
Log Message:
-----------
[CodeGenModule] Drop dso_local on function declarations for ELF -fno-pic -fno-direct-access-external-data
ELF -fno-pic sets dso_local on a function declaration to allow direct accesses
when taking its address (similar to a data symbol). The emitted code follows the
traditional GCC/Clang -fno-pic behavior: an absolute relocation is produced.
If the function is not defined in the executable, a canonical PLT entry will be
needed at link time. This is similar to a copy relocation and is incompatible
with (-Bsymbolic or --dynamic-list linked shared objects / protected symbols in
a shared object).
This patch gives -fno-pic code a way to avoid such a canonical PLT entry.
The FIXME was about a generalization for -fpie -mpie-copy-relocations (now -fpie
-fdirect-access-external-data). While we could set dso_local to avoid GOT when
taking the address of a function declaration (there is an ignorable difference
about R_386_PC32 vs R_386_PLT32 on i386), it likely does not provide any benefit
and can just cause trouble, so we don't make the generalization.
More information about the All-commits
mailing list