This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[AArch64] Speed up linking speed by skipping unncessary TLS reloc type check
- From: Jiong Wang <jiong dot wang at arm dot com>
- To: "binutils\ at sourceware dot org" <binutils at sourceware dot org>
- Date: Fri, 17 Jul 2015 13:04:24 +0100
- Subject: [AArch64] Speed up linking speed by skipping unncessary TLS reloc type check
- Authentication-results: sourceware.org; auth=none
When linking one application, perf shows "aarch64_can_relax_tls" consume
about 5% CPU time, after a check, I found this function can be improved.
It's invoked only in "aarch64_tls_transition", for normal applications
which don't contain TLS relocations, the linker always need to go
through the whole "or" check list.
While at least, we can short the list by removing those TLS relocation
types which don't need relaxation. For example all TLS local executable
relocation types shouldn't need any TLS relaxation in current
implementation.
For that application, This patch reduce the cpu consumed by
aarch64_can_relax_tls from 5% to about 2.5%, and reduce the overall
linking time of that application from 4.88s to 4.55s, linking is about
7% faster.
OK for trunk?
2015-07-17 Jiong Wang <jiong.wang@arm.com>
bfd/
* elfnn-aarch64.c (IS_AARCH64_TLS_RELAX_RELOC): New.
(aarch64_can_relax_tls): Use the new IS_AARCH64_TLS_RELAX_RELOC.
--
Regards,
Jiong
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 3471d7e..a60138c 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -188,6 +188,24 @@
|| (R_TYPE) == BFD_RELOC_AARCH64_TLS_TPREL \
|| IS_AARCH64_TLSDESC_RELOC ((R_TYPE)))
+/* Subset of IS_AARCH64_TLS_RELOC relocations that should be considered for
+ relaxation. */
+#define IS_AARCH64_TLS_RELAX_RELOC(R_TYPE) \
+ ((R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_CALL \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD_PREL19 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADR_PREL21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19)
+
#define IS_AARCH64_TLSDESC_RELOC(R_TYPE) \
((R_TYPE) == BFD_RELOC_AARCH64_TLSDESC \
|| (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD \
@@ -4150,7 +4168,7 @@ aarch64_can_relax_tls (bfd *input_bfd,
unsigned int symbol_got_type;
unsigned int reloc_got_type;
- if (! IS_AARCH64_TLS_RELOC (r_type))
+ if (! IS_AARCH64_TLS_RELAX_RELOC (r_type))
return FALSE;
symbol_got_type = elfNN_aarch64_symbol_got_type (h, input_bfd, r_symndx);