Marcus Shawcroft writes: > On 21 May 2015 at 17:49, Jiong Wang wrote: > >> 2015-05-14 Jiong Wang >> gcc/ >> * config/aarch64/aarch64.c (aarch64_print_operand): Support tls_size. >> * config/aarch64/aarch64.md (tlsle): Choose proper instruction >> sequences. >> (tlsle_): New define_insn. >> (tlsle_movsym_): Ditto. >> * config/aarch64/constraints.md (Uta): New constraint. >> (Utb): Ditto. >> (Utc): Ditto. >> (Utd): Ditto. >> >> gcc/testsuite/ >> * gcc.target/aarch64/tlsle.c: New test source. >> * gcc.target/aarch64/tlsle12.c: New testcase. >> * gcc.target/aarch64/tlsle24.c: New testcase. >> * gcc.target/aarch64/tlsle32.c: New testcase. >> > > > case SYMBOL_TLSLE: > - asm_fprintf (asm_out_file, ":tprel_lo12_nc:"); > + if (aarch64_tls_size <= 12) > + /* Make sure TLS offset fit into 12bit. */ > + asm_fprintf (asm_out_file, ":tprel_lo12:"); > + else > + asm_fprintf (asm_out_file, ":tprel_lo12_nc:"); > break; > > Use the existing classify_symbol mechanism we use throughout the > aarch64 backend. Specifically rename SYMBOL_TLSLE as SYMBOL_TLSLE24 > and introduce the 3 missing flavours then use the symbol > classification to control behaviour such as this modifier selection. Done. classified TLS symbol into the following sub-types according to the value of tls size. SYMBOL_TLSLE12 SYMBOL_TLSLE24 SYMBOL_TLSLE32 SYMBOL_TLSLE48 And On AArch64, instruction sequence for TLS LE under -mtls-size=32 will utilize the relocation modifier "tprel_g0_nc" together with MOVK, it's only supported in binutils since 2015-03-04 as PR gas/17843. So I adjusted tlsle32.c to make it robust by detecting whether there is such binutils support. OK for trunk? 2015-08-19 Marcus Shawcroft Jiong Wang gcc/ * config/aarch64/aarch64.c (initialize_aarch64_tls_size): Set default tls size for tiny, small, large memory model. (aarch64_load_symref_appropriately): Support new symbol types. (aarch64_expand_mov_immediate): Likewise. (aarch64_print_operand): Likewise. (aarch64_classify_tls_symbol): Likewise. * config/aarch64/aarch64-protos.h (aarch64_symbol_context): Likewise. (aarch64_symbol_type): Likewise. * config/aarch64/aarch64.md (tlsle): Deleted. (tlsle12_): New define_insn. (tlsle24_): Likewise. (tlsle32_): Likewise. (tlsle48_): Likewise. * doc/sourcebuild.texi (AArch64-specific attributes): Document "aarch64_tlsle32". gcc/testsuite/ * lib/target-supports.exp (check_effective_target_aarch64_tlsle32): New test directive. * gcc.target/aarch64/tlsle_1.x: New test source. * gcc.target/aarch64/tlsle12.c: New testcase. * gcc.target/aarch64/tlsle24.c: New testcase. * gcc.target/aarch64/tlsle32.c: New testcase. -- Regards, Jiong