On 05/11/15 14:57, Jiong Wang wrote:
Marcus Shawcroft writes:
+#ifdef HAVE_AS_TINY_TLSGD_RELOCS
+ return SYMBOL_TINY_TLSGD;
+#else
+ return SYMBOL_SMALL_TLSGD;
+#endif
Rather than introduce blocks of conditional compilation it is better
to gate different behaviours with a test on a constant expression. In
this case add something like this:
#if define(HAVE_AS_TINY_TLSGD_RELOCS)
#define USE_TINY_TLSGD 1
#else
#define USE_TINY_TLSGD 0
#endif
up near the definition of TARGET_HAVE_TLS then write the above
fragment without using the preprocessor:
return USE_TINY_TLSGD ? SYMBOL_TINY_TLSGD : SYMBOL_SMALL_TLSGD;
Done.
- aarch64_emit_call_insn (gen_tlsgd_small (result, imm, resolver));
+ if (type == SYMBOL_SMALL_TLSGD)
+ aarch64_emit_call_insn (gen_tlsgd_small (result, imm, resolver));
+ else
+ aarch64_emit_call_insn (gen_tlsgd_tiny (result, imm, resolver));
insns = get_insns ();
end_sequence ();
Add a separate case statment for SYMBOL_TINY_TLSGD rather than reusing
the case statement for SYMBOL_SMALL_TLSGD and then needing to add
another test against symbol type within the body of the case
statement.
Done.
+(define_insn "tlsgd_tiny"
+ [(set (match_operand 0 "register_operand" "")
+ (call (mem:DI (match_operand:DI 2 "" "")) (const_int 1)))
+ (unspec:DI [(match_operand:DI 1 "aarch64_valid_symref" "S")]
UNSPEC_GOTTINYTLS)
+ (clobber (reg:DI LR_REGNUM))
+ ]
+ ""
+ "adr\tx0, %A1;bl\t%2;nop";
+ [(set_attr "type" "multiple")
+ (set_attr "length" "12")])
I don't think the explicit clobber LR_REGNUM is required since your
change last September:
https://gcc.gnu.org/ml/gcc-patches/2014-09/msg02654.html
We don't need this explict clobber LR_REGNUM only if operand 0 happen
be allocated to LR_REGNUM as after my above patch LR_REGNUM is allocable.
However we still need the explict clobber here. Because for all other
cases LR_REGNUM not allocated, gcc data flow analysis can't deduct
LR_REGNUM
will still be clobbered implicitly by the call instruction.
Without this "clobber" tag, a direct impact is df_regs_ever_live is
calculated
incorrectly for x30, then for the following simple testcase:
__thread int t0 = 0x10;
__thread int t1 = 0x10;
int
main (int argc, char **argv)
{
if (t0 != t1)
return 1;
return 0;
}
if you compile with
"-O2 -ftls-model=global-dynamic -fpic -mtls-dialect=trad t.c
-mcmodel=tiny -fomit-frame-pointer",
wrong code will be generated:
main:
str x19, [sp, -16]! <--- x30 is not saved.
adr x0, :tlsgd:t0
bl __tls_get_addr
nop
Patch updated. tls regression OK
OK for trunk?
2015-11-05 Jiong Wang <jiong.w...@arm.com>
gcc/
* configure.ac: Add check for binutils global dynamic tiny code model
relocation support.
* configure: Regenerate.
* config.in: Regenerate.
* config/aarch64/aarch64.md (tlsgd_tiny): New define_insn.
* config/aarch64/aarch64-protos.h (aarch64_symbol_type): New
enumeration SYMBOL_TINY_TLSGD.
(aarch64_symbol_context): New comment on SYMBOL_TINY_TLSGD.
* config/aarch64/aarch64.c (aarch64_classify_tls_symbol): Support
SYMBOL_TINY_TLSGD.
(aarch64_print_operand): Likewise.
(aarch64_expand_mov_immediate): Likewise.
(aarch64_load_symref_appropriately): Likewise.
gcc/testsuite/
* lib/target-supports.exp (check_effective_target_aarch64_tlsgdtiny):
New effective check.
* gcc.target/aarch64/tlsgd_small_1.c: New testcase.
* gcc.target/aarch64/tlsgd_small_ilp32_1.c: Likewise.
* gcc.target/aarch64/tlsgd_tiny_1.c: Likewise.
* gcc.target/aarch64/tlsgd_tiny_ilp32_1.c: Likewise.
Ping ~