mirror of
https://sourceware.org/git/glibc.git
synced 2025-10-28 23:34:53 +03:00
misc: Optimize internal usage of __libc_single_threaded
By adding an internal alias to avoid the GOT indirection.
On some architecture, __libc_single_thread may be accessed through
copy relocations and thus it requires to update also the copies
default copy.
This is done by adding a new internal macro,
libc_hidden_data_{proto,def}, which has an addition argument that
specifies the alias name (instead of default __GI_ one).
Checked on x86_64-linux-gnu and i686-linux-gnu.
Reviewed-by: Fangrui Song <maskray@google.com>
This commit is contained in:
@@ -534,11 +534,15 @@ for linking")
|
||||
__attribute__ ((visibility ("hidden"), ##attrs))
|
||||
# define hidden_proto(name, attrs...) \
|
||||
__hidden_proto (name, , __GI_##name, ##attrs)
|
||||
# define hidden_proto_alias(name, alias, attrs...) \
|
||||
__hidden_proto_alias (name, , alias, ##attrs)
|
||||
# define hidden_tls_proto(name, attrs...) \
|
||||
__hidden_proto (name, __thread, __GI_##name, ##attrs)
|
||||
# define __hidden_proto(name, thread, internal, attrs...) \
|
||||
extern thread __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
|
||||
__hidden_proto_hiddenattr (attrs);
|
||||
# define __hidden_proto_alias(name, thread, internal, attrs...) \
|
||||
extern thread __typeof (name) internal __hidden_proto_hiddenattr (attrs);
|
||||
# define __hidden_asmname(name) \
|
||||
__hidden_asmname1 (__USER_LABEL_PREFIX__, name)
|
||||
# define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
|
||||
@@ -554,7 +558,10 @@ for linking")
|
||||
# define hidden_ver(local, name) __hidden_ver1(local, __GI_##name, name);
|
||||
# define hidden_data_ver(local, name) hidden_ver(local, name)
|
||||
# define hidden_def(name) __hidden_ver1(__GI_##name, name, name);
|
||||
# define hidden_def_alias(name, internal) \
|
||||
strong_alias (name, internal)
|
||||
# define hidden_data_def(name) hidden_def(name)
|
||||
# define hidden_data_def_alias(name, alias) hidden_def_alias(name, alias)
|
||||
# define hidden_tls_def(name) \
|
||||
__hidden_ver2 (__thread, __GI_##name, name, name);
|
||||
# define hidden_weak(name) \
|
||||
@@ -581,9 +588,11 @@ for linking")
|
||||
hidden_proto doesn't make sense for assembly but the equivalent
|
||||
is to call via the HIDDEN_JUMPTARGET macro instead of JUMPTARGET. */
|
||||
# define hidden_def(name) strong_alias (name, __GI_##name)
|
||||
# define hidden_def_alias(name, alias) strong_alias (name, alias)
|
||||
# define hidden_weak(name) hidden_def (name)
|
||||
# define hidden_ver(local, name) strong_alias (local, __GI_##name)
|
||||
# define hidden_data_def(name) strong_data_alias (name, __GI_##name)
|
||||
# define hidden_data_def_alias(name, alias) strong_data_alias (name, alias)
|
||||
# define hidden_tls_def(name) hidden_data_def (name)
|
||||
# define hidden_data_weak(name) hidden_data_def (name)
|
||||
# define hidden_data_ver(local, name) strong_data_alias (local, __GI_##name)
|
||||
@@ -598,12 +607,17 @@ for linking")
|
||||
__attribute__ ((visibility ("hidden"), ##attrs))
|
||||
# define hidden_proto(name, attrs...) \
|
||||
__hidden_proto (name, , name, ##attrs)
|
||||
# define hidden_proto_alias(name, alias, attrs...) \
|
||||
__hidden_proto_alias (name, , alias, ##attrs)
|
||||
# define hidden_tls_proto(name, attrs...) \
|
||||
__hidden_proto (name, __thread, name, ##attrs)
|
||||
# define __hidden_proto(name, thread, internal, attrs...) \
|
||||
extern thread __typeof (name) name __hidden_proto_hiddenattr (attrs);
|
||||
# define __hidden_proto_alias(name, thread, internal, attrs...) \
|
||||
extern thread __typeof (name) internal __hidden_proto_hiddenattr (attrs);
|
||||
# else
|
||||
# define hidden_proto(name, attrs...)
|
||||
# define hidden_proto_alias(name, alias, attrs...)
|
||||
# define hidden_tls_proto(name, attrs...)
|
||||
# endif
|
||||
# else
|
||||
@@ -611,9 +625,11 @@ for linking")
|
||||
# endif /* Not __ASSEMBLER__ */
|
||||
# define hidden_weak(name)
|
||||
# define hidden_def(name)
|
||||
# define hidden_def_alias(name, alias)
|
||||
# define hidden_ver(local, name)
|
||||
# define hidden_data_weak(name)
|
||||
# define hidden_data_def(name)
|
||||
# define hidden_data_def_alias(name, alias)
|
||||
# define hidden_tls_def(name)
|
||||
# define hidden_data_ver(local, name)
|
||||
# define hidden_nolink(name, lib, version)
|
||||
@@ -621,22 +637,28 @@ for linking")
|
||||
|
||||
#if IS_IN (libc)
|
||||
# define libc_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
||||
# define libc_hidden_proto_alias(name, alias, attrs...) \
|
||||
hidden_proto_alias (name, alias, ##attrs)
|
||||
# define libc_hidden_tls_proto(name, attrs...) hidden_tls_proto (name, ##attrs)
|
||||
# define libc_hidden_def(name) hidden_def (name)
|
||||
# define libc_hidden_def_alias(name, alias) hidden_def_alias (name, alias)
|
||||
# define libc_hidden_weak(name) hidden_weak (name)
|
||||
# define libc_hidden_nolink_sunrpc(name, version) hidden_nolink (name, libc, version)
|
||||
# define libc_hidden_ver(local, name) hidden_ver (local, name)
|
||||
# define libc_hidden_data_def(name) hidden_data_def (name)
|
||||
# define libc_hidden_data_def_alias(name, alias) hidden_data_def_alias (name, alias)
|
||||
# define libc_hidden_tls_def(name) hidden_tls_def (name)
|
||||
# define libc_hidden_data_weak(name) hidden_data_weak (name)
|
||||
# define libc_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
||||
#else
|
||||
# define libc_hidden_proto(name, attrs...)
|
||||
# define libc_hidden_proto_alias(name, alias, attrs...)
|
||||
# define libc_hidden_tls_proto(name, attrs...)
|
||||
# define libc_hidden_def(name)
|
||||
# define libc_hidden_weak(name)
|
||||
# define libc_hidden_ver(local, name)
|
||||
# define libc_hidden_data_def(name)
|
||||
# define libc_hidden_data_def_alias(name, alias)
|
||||
# define libc_hidden_tls_def(name)
|
||||
# define libc_hidden_data_weak(name)
|
||||
# define libc_hidden_data_ver(local, name)
|
||||
|
||||
Reference in New Issue
Block a user