clang -fpic -fno-semantic-interposition may set dso_local on variables for -fpic.
GCC folks consider there are 'address interposition' and 'semantic interposition',
and 'disabling semantic interposition' can optimize function calls but
cannot change variable references to use local aliases
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100483).
This patch removes dso_local for variables in
clang -fpic -fno-semantic-interposition mode so that the built shared objects can
work with copy relocations.
Example:
// a.c int var; int *addr() { return var; } // old: cannot be interposed movslq .Lvar$local(%rip), %rax // new: can be interposed movq var@GOTPCREL(%rip), %rax movslq (%rax), %rax
The local alias lowering for GlobalVariables is kept in case there is a
future option allowing local aliases.