Misc about gold for aarch64 backend.
The patch does the following things: -- Add support for ifunc. -- Enable safe icf -- Add support for TLSLD relocations R_AARCH64_TLSLD_ADR_PAGE21, R_AARCH64_TLSLD_ADD_LO12_NC, R_AARCH64_TLSLD_MOVW_DTPREL_G1, R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC. (R_AARCH64_TLSLD_MOVW_* are used by LLVM.) -- Add support for TLSLD->TLSLE relaxation. -- Add support for R_AARCH64_LD_PREL_LO19, R_AARCH64_ADR_PREL_LO21. -- Fix 2 encoding bugs in AArch64_relocate_functions::update_movnz. -- Correct TLS relocation properties in gold/aarch64-reloc.def. -- Update testsuite/icf_safe_so_test.cc, testsuite/icf_safe_test.sh. gold/ 2014-10-29 Han Shen <shenhan@google.com> Jing Yu <jingyu@google.com> * aarch64-reloc.def: Add LD_PREL_LO12, ADR_PREL_LO21, TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC. Change property of TLS relocations to Symbol::TLS_REF. * aarch64.cc (Target_aarch64::do_can_check_for_function_pointers): New method. (Target_aarch64::reloc_needs_plt_for_ifunc): New method. (Target_aarch64::tls_ld_to_le): New method. (Target_aarch64::aarch64_info): Enable can_icf_inline_merge_sections for 64bit targets. (Output_data_plt_aarch64::irelative_rel_): New data member. (Output_data_plt_aarch64::add_entry): Add irelative entries to plt. (Output_data_plt_aarch64::add_local_ifunc_entry): New method. (Output_data_plt_aarch64::add_relocation): New method. (Output_data_plt_aarch64::do_write): Add gold_assert on got_irelative offset. Add got_irelative size to got size. (AArch64_relocate_functions): Typedef AArch64_valtype. Replace long type string with the new typename. (AArch64_relocate_functions::update_adr): Replace parameter x with immed. (AArch64_relocate_functions::update_movnz): Correct wrong val mask. (AArch64_relocate_functions::reloc_common): New method. (AArch64_relocate_funcsions::rela_general): Extract common part out into reloc_common method. (AArch64_relocate_functions::rela_general): Likewise. (AArch64_relocate_functions::pcrela_general): Likewise. (AArch64_relocate_functions::adr): New method. (AArch64_relocate_functions::adrp): Calculate immed before calling update_adr. (AArch64_relocate_functions::adrp): Likewise. (AArch64_relocate_functions::movnz): Cast x to SignedW type when comparing x to 0. Calculate immed from ~x when x < 0. (Target_aarch64::optimize_tls_reloc): Add new cases for TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC. (Target_aarch64::possible_function_pointer_reloc): Implement this method. (Target_aarch64::Scan::local_reloc_may_be_function_pointer): Update comment. (Target_aarch64::Scan::local): Add codes to handle STT_GNU_IFUNC symbol. Add cases for TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC. (Target_aarch64::Scan::global): Add codes to handle STT_GNU_IFUNC symbol. Add cases for TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC. (Target_aarch64::make_plt_entry): Call add_entry with two more parameters. (Target_aarch64::make_local_ifunc_plt_entry): New method. (Target_aarch64::Relocate::relocate): Add cases for LD_PREL_LO19, ADR_PREL_LO21, TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC. (Target_aarch64::Relocate::relocate_tls): Add cases for TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC. * testsuite/icf_safe_so_test.cc: Correct test comment. * testsuite/icf_safe_test.sh: Add AArch64 arch.
This commit is contained in:
parent
ab917dfb5a
commit
9726c3c179
5 changed files with 660 additions and 142 deletions
|
@ -1,3 +1,63 @@
|
|||
2014-10-29 Han Shen <shenhan@google.com>
|
||||
Jing Yu <jingyu@google.com>
|
||||
|
||||
* aarch64-reloc.def: Add LD_PREL_LO12, ADR_PREL_LO21,
|
||||
TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1,
|
||||
TLSLD_MOVW_DTPREL_G0_NC. Change property of TLS relocations to
|
||||
Symbol::TLS_REF.
|
||||
* aarch64.cc (Target_aarch64::do_can_check_for_function_pointers): New
|
||||
method.
|
||||
(Target_aarch64::reloc_needs_plt_for_ifunc): New method.
|
||||
(Target_aarch64::tls_ld_to_le): New method.
|
||||
(Target_aarch64::aarch64_info): Enable can_icf_inline_merge_sections
|
||||
for 64bit targets.
|
||||
(Output_data_plt_aarch64::irelative_rel_): New data member.
|
||||
(Output_data_plt_aarch64::add_entry): Add irelative entries to plt.
|
||||
(Output_data_plt_aarch64::add_local_ifunc_entry): New method.
|
||||
(Output_data_plt_aarch64::add_relocation): New method.
|
||||
(Output_data_plt_aarch64::do_write): Add gold_assert on got_irelative
|
||||
offset. Add got_irelative size to got size.
|
||||
(AArch64_relocate_functions): Typedef AArch64_valtype. Replace long
|
||||
type string with the new typename.
|
||||
(AArch64_relocate_functions::update_adr): Replace parameter x with
|
||||
immed.
|
||||
(AArch64_relocate_functions::update_movnz): Correct wrong val mask.
|
||||
(AArch64_relocate_functions::reloc_common): New method.
|
||||
(AArch64_relocate_funcsions::rela_general): Extract common part out
|
||||
into reloc_common method.
|
||||
(AArch64_relocate_functions::rela_general): Likewise.
|
||||
(AArch64_relocate_functions::pcrela_general): Likewise.
|
||||
(AArch64_relocate_functions::adr): New method.
|
||||
(AArch64_relocate_functions::adrp): Calculate immed before calling
|
||||
update_adr.
|
||||
(AArch64_relocate_functions::adrp): Likewise.
|
||||
(AArch64_relocate_functions::movnz): Cast x to SignedW type when
|
||||
comparing x to 0. Calculate immed from ~x when x < 0.
|
||||
(Target_aarch64::optimize_tls_reloc): Add new cases for
|
||||
TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1,
|
||||
TLSLD_MOVW_DTPREL_G0_NC.
|
||||
(Target_aarch64::possible_function_pointer_reloc): Implement this
|
||||
method.
|
||||
(Target_aarch64::Scan::local_reloc_may_be_function_pointer): Update
|
||||
comment.
|
||||
(Target_aarch64::Scan::local): Add codes to handle STT_GNU_IFUNC
|
||||
symbol. Add cases for TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC,
|
||||
TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC.
|
||||
(Target_aarch64::Scan::global): Add codes to handle STT_GNU_IFUNC
|
||||
symbol. Add cases for TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC,
|
||||
TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC.
|
||||
(Target_aarch64::make_plt_entry): Call add_entry with two more
|
||||
parameters.
|
||||
(Target_aarch64::make_local_ifunc_plt_entry): New method.
|
||||
(Target_aarch64::Relocate::relocate): Add cases for LD_PREL_LO19,
|
||||
ADR_PREL_LO21, TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC,
|
||||
TLSLD_MOVW_DTPREL_G1, TLSLD_MOVW_DTPREL_G0_NC.
|
||||
(Target_aarch64::Relocate::relocate_tls): Add cases for
|
||||
TLSLD_ADR_PAGE21, TLSLD_ADD_LO12_NC, TLSLD_MOVW_DTPREL_G1,
|
||||
TLSLD_MOVW_DTPREL_G0_NC.
|
||||
* testsuite/icf_safe_so_test.cc: Correct test comment.
|
||||
* testsuite/icf_safe_test.sh: Add AArch64 arch.
|
||||
|
||||
2014-10-22 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* powerpc.cc (do_relax): Add gcc-4.9 libgomp functions to
|
||||
|
|
|
@ -40,16 +40,22 @@ ARD(PREL32 , STATIC , DATA , Y, -1, 31,32
|
|||
ARD(PREL16 , STATIC , DATA , Y, -1, 15,16 , 0,0 , Symbol::RELATIVE_REF , DATA )
|
||||
// Above is from Table 4-6, Data relocations, 257-262.
|
||||
|
||||
ARD(LD_PREL_LO19 , STATIC , AARCH64 , Y, -1, 20,20 , 2,20 , Symbol::RELATIVE_REF , LDST )
|
||||
ARD(ADR_PREL_LO21 , STATIC , AARCH64 , Y, -1, 20,20 , 0,20 , Symbol::RELATIVE_REF , ADR )
|
||||
ARD(ADR_PREL_PG_HI21 , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::RELATIVE_REF , ADRP )
|
||||
ARD(ADR_PREL_PG_HI21_NC , STATIC , AARCH64 , Y, -1, 0,0 , 12,32 , Symbol::RELATIVE_REF , ADRP )
|
||||
ARD(ADD_ABS_LO12_NC , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::ABSOLUTE_REF , ADD )
|
||||
ARD(LDST8_ABS_LO12_NC , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::ABSOLUTE_REF , LDST )
|
||||
ARD(LDST16_ABS_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN2 , 1,11 , Symbol::ABSOLUTE_REF , LDST )
|
||||
ARD(LDST32_ABS_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN4 , 2,11 , Symbol::ABSOLUTE_REF , LDST )
|
||||
ARD(LDST64_ABS_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN8 , 3,11 , Symbol::ABSOLUTE_REF , LDST )
|
||||
ARD(LDST128_ABS_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN16 , 4,11 , Symbol::ABSOLUTE_REF , LDST )
|
||||
ARD(ADD_ABS_LO12_NC , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::ABSOLUTE_REF , ADD )
|
||||
// Above 10 relocs are from Table 4-9, Relocations to generate 19, 21 and 33 bit PC-relative addresses.
|
||||
|
||||
ARD(ADR_GOT_PAGE , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::RELATIVE_REF , ADRP )
|
||||
ARD(LD64_GOT_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN8 , 3,11 , Symbol::ABSOLUTE_REF , LDST )
|
||||
// Above 2 relocs are from Table 4-14, GOT-relative instruction relocations. (Some relocs in the table are not implemented yet.)
|
||||
|
||||
ARD(TSTBR14 , STATIC , CFLOW , N, -1, 15,15 , 2,15 , (Symbol::FUNCTION_CALL|Symbol::ABSOLUTE_REF) , TBZNZ )
|
||||
ARD(CONDBR19 , STATIC , CFLOW , N, -1, 20,20 , 2,20 , (Symbol::FUNCTION_CALL|Symbol::ABSOLUTE_REF) , CONDB )
|
||||
ARD(CALL26 , STATIC , CFLOW , Y, -1, 27,27 , 2,27 , (Symbol::FUNCTION_CALL|Symbol::RELATIVE_REF) , CALL )
|
||||
|
@ -57,24 +63,32 @@ ARD(JUMP26 , STATIC , CFLOW , Y, -1, 27,27
|
|||
// Above is from Table 4-10, Relocations for control-flow instructions,
|
||||
// 279-283.
|
||||
|
||||
ARD(TLSGD_ADR_PAGE21 , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::ABSOLUTE_REF , ADRP )
|
||||
ARD(TLSGD_ADD_LO12_NC , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::ABSOLUTE_REF , ADD )
|
||||
ARD(TLSIE_MOVW_GOTTPREL_G1 , STATIC , AARCH64 , N, -1, 0,0 , 16,31 , Symbol::ABSOLUTE_REF , MOVW )
|
||||
ARD(TLSIE_MOVW_GOTTPREL_G0_NC , STATIC , AARCH64 , N, -1, 0,0 , 0,15 , Symbol::ABSOLUTE_REF , MOVW )
|
||||
ARD(TLSIE_ADR_GOTTPREL_PAGE21 , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::ABSOLUTE_REF , ADRP )
|
||||
ARD(TLSIE_LD64_GOTTPREL_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN8 , 3,11 , Symbol::ABSOLUTE_REF , LDST )
|
||||
ARD(TLSIE_LD_GOTTPREL_PREL19 , STATIC , AARCH64 , N, -1, 20,20 , 2,20 , Symbol::ABSOLUTE_REF , LD )
|
||||
ARD(TLSGD_ADR_PAGE21 , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::TLS_REF , ADRP )
|
||||
ARD(TLSGD_ADD_LO12_NC , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::TLS_REF , ADD )
|
||||
// Above is from Table 4-15, General Dynamic TLS relocations, 512-516.
|
||||
|
||||
ARD(TLSLD_ADR_PAGE21 , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::TLS_REF , ADRP )
|
||||
ARD(TLSLD_ADD_LO12_NC , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::TLS_REF , ADD )
|
||||
ARD(TLSLD_MOVW_DTPREL_G1 , STATIC , AARCH64 , Y, 1, 32,32 , 16,31 , Symbol::TLS_REF , ADRP )
|
||||
ARD(TLSLD_MOVW_DTPREL_G0_NC , STATIC , AARCH64 , Y, 0, 0,0 , 0,15 , Symbol::TLS_REF , MOVW )
|
||||
// Above is from Table 4-16, Local Dynamic TLS relocations, 517-573.
|
||||
|
||||
ARD(TLSIE_MOVW_GOTTPREL_G1 , STATIC , AARCH64 , N, -1, 32,32 , 16,31 , Symbol::TLS_REF , MOVW )
|
||||
ARD(TLSIE_MOVW_GOTTPREL_G0_NC , STATIC , AARCH64 , N, -1, 0,0 , 0,15 , Symbol::TLS_REF , MOVW )
|
||||
ARD(TLSIE_ADR_GOTTPREL_PAGE21 , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::TLS_REF , ADRP )
|
||||
ARD(TLSIE_LD64_GOTTPREL_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN8 , 3,11 , Symbol::TLS_REF , LDST )
|
||||
ARD(TLSIE_LD_GOTTPREL_PREL19 , STATIC , AARCH64 , N, -1, 20,20 , 2,20 , Symbol::TLS_REF , LD )
|
||||
// Above is from Table 4-17, Initial Exec TLS relocations, 539-543.
|
||||
|
||||
ARD(TLSLE_ADD_TPREL_HI12 , STATIC , AARCH64 , Y, -1, 0,24 , 12,23 , Symbol::ABSOLUTE_REF , ADD )
|
||||
ARD(TLSLE_ADD_TPREL_LO12 , STATIC , AARCH64 , Y, -1, 0,12 , 0,11 , Symbol::ABSOLUTE_REF , ADD )
|
||||
ARD(TLSLE_ADD_TPREL_LO12_NC , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::ABSOLUTE_REF , ADD )
|
||||
ARD(TLSLE_ADD_TPREL_HI12 , STATIC , AARCH64 , Y, -1, 0,24 , 12,23 , Symbol::TLS_REF , ADD )
|
||||
ARD(TLSLE_ADD_TPREL_LO12 , STATIC , AARCH64 , Y, -1, 0,12 , 0,11 , Symbol::TLS_REF , ADD )
|
||||
ARD(TLSLE_ADD_TPREL_LO12_NC , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::TLS_REF , ADD )
|
||||
// Above is from Table 4-18, Local Exec TLS relocations, 544-571.
|
||||
|
||||
ARD(TLSDESC_ADR_PAGE21 , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::RELATIVE_REF , ADRP )
|
||||
ARD(TLSDESC_LD64_LO12 , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN8 , 3,11 , Symbol::ABSOLUTE_REF , LDST )
|
||||
ARD(TLSDESC_ADD_LO12 , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::ABSOLUTE_REF , ADD )
|
||||
ARD(TLSDESC_CALL , STATIC , CFLOW , Y, -1, 0,0 , 0,0 , (Symbol::FUNCTION_CALL|Symbol::ABSOLUTE_REF) , CALL )
|
||||
ARD(TLSDESC_ADR_PAGE21 , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::TLS_REF , ADRP )
|
||||
ARD(TLSDESC_LD64_LO12 , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN8 , 3,11 , Symbol::TLS_REF , LDST )
|
||||
ARD(TLSDESC_ADD_LO12 , STATIC , AARCH64 , Y, -1, 0,0 , 0,11 , Symbol::TLS_REF , ADD )
|
||||
ARD(TLSDESC_CALL , STATIC , CFLOW , Y, -1, 0,0 , 0,0 , Symbol::TLS_REF , CALL )
|
||||
// Above is from Table 4-19, TLS descriptor relocations, 560-569.
|
||||
|
||||
// Note -
|
||||
|
|
688
gold/aarch64.cc
688
gold/aarch64.cc
File diff suppressed because it is too large
Load diff
|
@ -22,10 +22,10 @@
|
|||
|
||||
// The goal of this program is to verify if identical code folding
|
||||
// in safe mode correctly folds functions in a shared object. The
|
||||
// foo_* functions below should not be folded. For x86-64,
|
||||
// foo_glob and bar_glob should be folded as their function pointers
|
||||
// are addresses of PLT entries in shared objects. For 32-bit X86,
|
||||
// the hidden protected and internal symbols can be folded.
|
||||
// foo_* functions below should not be folded on X86_64.
|
||||
// For 32-bit X86, the hidden protected and internal symbols can be folded.
|
||||
// foo_glob and bar_glob should not be folded, because function pointer
|
||||
// of foo_glob is taken.
|
||||
|
||||
int __attribute__ ((visibility ("protected")))
|
||||
foo_prot()
|
||||
|
|
|
@ -57,7 +57,7 @@ END {
|
|||
|
||||
arch_specific_safe_fold()
|
||||
{
|
||||
grep_x86=`grep -q -e "Advanced Micro Devices X86-64" -e "Intel 80386" -e "ARM" -e "TILE" -e "PowerPC" $2`
|
||||
grep_x86=`grep -q -e "Advanced Micro Devices X86-64" -e "Intel 80386" -e "ARM" -e "TILE" -e "PowerPC" -e "AArch64" $2`
|
||||
if [ $? -eq 0 ];
|
||||
then
|
||||
check_fold $3 $4 $5
|
||||
|
|
Loading…
Reference in a new issue