From fdbe66f28c4ec71d2ff03b7662350100481427ac Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 8 Jun 2005 07:05:45 +0200 Subject: [PATCH] re PR debug/21889 (Native Solaris assembler cannot grok DTP-relative debug symbols) PR target/21889 * target.h (gcc_target) : New field output_dwarf_dtprel. * target-def.h (TARGET_ASM_OUTPUT_DWARF_DTPREL): New macro. (TARGET_ASM_OUT): Add it. * doc/tm.texi (Debugging Info): Document it. * dwarf2out.c (output_loc_operands) : Test it instead of ASM_OUTPUT_DWARF_DTPREL. (loc_descriptor_from_tree_1) : Likewise. * system.h: Poison ASM_OUTPUT_DWARF_DTPREL. * config/frv/frv-protos.h (frv_output_dwarf_dtprel): Delete. * config/frv/frv.c (frv_output_dwarf_dtprel): Make static and unused. (gen_inlined_tls_plt): Remove unused variable MEM. (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to frv_output_dwarf_dtprel. * config/frv/frv.h (ASM_OUTPUT_DWARF_DTPREL): Delete. * config/i386/i386-protos.h (i386_output_dwarf_dtprel): Delete. * config/i386/i386.c (i386_output_dwarf_dtprel): Make static and unused. (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to i386_output_dwarf_dtprel. * config/i386/i386.h (ASM_OUTPUT_DWARF_DTPREL): Delete. * config/ia64/ia64-protos.h (ia64_output_dwarf_dtprel): Delete. * config/ia64/ia64.c (ia64_output_dwarf_dtprel): Make static and unused. (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to ia64_output_dwarf_dtprel. * config/ia64/ia64.h (ASM_OUTPUT_DWARF_DTPREL): Delete. * config/rs6000/rs6000-protos.h (rs6000_output_dwarf_dtprel): Delete. * config/rs6000/rs6000.c (rs6000_output_dwarf_dtprel): Make static and unused. (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to rs6000_output_dwarf_dtprel * config/rs6000/rs6000.h (ASM_OUTPUT_DWARF_DTPREL): Delete. * config/s390/s390-protos.h (s390_output_dwarf_dtprel): Delete. * config/s390/s390.c (s390_output_dwarf_dtprel): Make static and unused. (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to s390_output_dwarf_dtprel. * config/s390/s390.h (ASM_OUTPUT_DWARF_DTPREL): Delete. * config/sparc/sol2-gas.h (TARGET_SUN_TLS): Define to 0. (TARGET_GNU_TLS): Define to 1. * config/sparc/sparc-protos.h (sparc_output_dwarf_dtprel): Delete. * config/sparc/sparc.c (sparc_output_dwarf_dtprel): Make static and unused. (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to sparc_output_dwarf_dtprel if TARGET_GNU_TLS only. * config/sparc/sparc.h (ASM_OUTPUT_DWARF_DTPREL): Delete. * config.gcc (sparc64-*-solaris2*): Include tm-dwarf2.h last. (sparc-*-solaris2*): Likewise on Solaris 7 and up. From-SVN: r100742 --- gcc/ChangeLog | 48 +++++++++++++++++++++++++++++++ gcc/config.gcc | 6 ++-- gcc/config/frv/frv-protos.h | 1 - gcc/config/frv/frv.c | 13 +++++++-- gcc/config/frv/frv.h | 7 ----- gcc/config/i386/i386-protos.h | 2 -- gcc/config/i386/i386.c | 11 +++++-- gcc/config/i386/i386.h | 7 ----- gcc/config/ia64/ia64-protos.h | 1 - gcc/config/ia64/ia64.c | 11 +++++-- gcc/config/ia64/ia64.h | 7 ----- gcc/config/rs6000/rs6000-protos.h | 1 - gcc/config/rs6000/rs6000.c | 10 +++++-- gcc/config/rs6000/rs6000.h | 7 ----- gcc/config/s390/s390-protos.h | 1 - gcc/config/s390/s390.c | 11 +++++-- gcc/config/s390/s390.h | 7 ----- gcc/config/sparc/sol2-gas.h | 8 ++++++ gcc/config/sparc/sol2.h | 2 +- gcc/config/sparc/sparc-protos.h | 1 - gcc/config/sparc/sparc.c | 19 ++++++++---- gcc/config/sparc/sparc.h | 10 ++----- gcc/doc/tm.texi | 5 ++++ gcc/dwarf2out.c | 21 +++++++------- gcc/system.h | 2 +- gcc/target-def.h | 7 ++++- gcc/target.h | 3 ++ 27 files changed, 149 insertions(+), 80 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1c446b209b4..246e3daaabe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,51 @@ +2005-06-08 Eric Botcazou + + PR target/21889 + * target.h (gcc_target) : New field output_dwarf_dtprel. + * target-def.h (TARGET_ASM_OUTPUT_DWARF_DTPREL): New macro. + (TARGET_ASM_OUT): Add it. + * doc/tm.texi (Debugging Info): Document it. + * dwarf2out.c (output_loc_operands) : + Test it instead of ASM_OUTPUT_DWARF_DTPREL. + (loc_descriptor_from_tree_1) : Likewise. + * system.h: Poison ASM_OUTPUT_DWARF_DTPREL. + * config/frv/frv-protos.h (frv_output_dwarf_dtprel): Delete. + * config/frv/frv.c (frv_output_dwarf_dtprel): Make static and unused. + (gen_inlined_tls_plt): Remove unused variable MEM. + (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to frv_output_dwarf_dtprel. + * config/frv/frv.h (ASM_OUTPUT_DWARF_DTPREL): Delete. + * config/i386/i386-protos.h (i386_output_dwarf_dtprel): Delete. + * config/i386/i386.c (i386_output_dwarf_dtprel): Make static and + unused. + (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to i386_output_dwarf_dtprel. + * config/i386/i386.h (ASM_OUTPUT_DWARF_DTPREL): Delete. + * config/ia64/ia64-protos.h (ia64_output_dwarf_dtprel): Delete. + * config/ia64/ia64.c (ia64_output_dwarf_dtprel): Make static and + unused. + (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to ia64_output_dwarf_dtprel. + * config/ia64/ia64.h (ASM_OUTPUT_DWARF_DTPREL): Delete. + * config/rs6000/rs6000-protos.h (rs6000_output_dwarf_dtprel): Delete. + * config/rs6000/rs6000.c (rs6000_output_dwarf_dtprel): Make static and + unused. + (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to rs6000_output_dwarf_dtprel + * config/rs6000/rs6000.h (ASM_OUTPUT_DWARF_DTPREL): Delete. + * config/s390/s390-protos.h (s390_output_dwarf_dtprel): Delete. + * config/s390/s390.c (s390_output_dwarf_dtprel): Make static and + unused. + (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to s390_output_dwarf_dtprel. + * config/s390/s390.h (ASM_OUTPUT_DWARF_DTPREL): Delete. + * config/sparc/sol2-gas.h (TARGET_SUN_TLS): Define to 0. + (TARGET_GNU_TLS): Define to 1. + * config/sparc/sparc-protos.h (sparc_output_dwarf_dtprel): Delete. + * config/sparc/sparc.c (sparc_output_dwarf_dtprel): Make static and + unused. + (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to sparc_output_dwarf_dtprel + if TARGET_GNU_TLS only. + * config/sparc/sparc.h (ASM_OUTPUT_DWARF_DTPREL): Delete. + + * config.gcc (sparc64-*-solaris2*): Include tm-dwarf2.h last. + (sparc-*-solaris2*): Likewise on Solaris 7 and up. + 2005-06-07 Dale Johannesen * config/i386/i386.md (movqi_1): Fix case where source diff --git a/gcc/config.gcc b/gcc/config.gcc index 7eab07281fa..6cf2c8cf797 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2021,13 +2021,14 @@ sparc-*-rtems*) extra_parts="crti.o crtn.o crtbegin.o crtend.o" ;; sparc64-*-solaris2* | sparcv9-*-solaris2*) - tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sol2.h sparc/sol2.h sparc/sol2-64.h sparc/sol2-bi.h tm-dwarf2.h" + tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sol2.h sparc/sol2.h sparc/sol2-64.h sparc/sol2-bi.h" if test x$gnu_ld = xyes; then tm_file="${tm_file} sparc/sol2-gld.h sparc/sol2-gld-bi.h" fi if test x$gas = xyes; then tm_file="${tm_file} sparc/sol2-gas.h sparc/sol2-gas-bi.h" fi + tm_file="${tm_file} tm-dwarf2.h" tmake_file="t-sol2 sparc/t-sol2 sparc/t-sol2-64 sparc/t-crtfm" if test x$gnu_ld = xyes; then tmake_file="$tmake_file t-slibgcc-elf-ver" @@ -2071,13 +2072,14 @@ sparc-*-solaris2*) fi ;; *-*-solaris2.[789] | *-*-solaris2.1[0-9]*) - tm_file="sparc/biarch64.h ${tm_file} sparc/sol2-bi.h tm-dwarf2.h" + tm_file="sparc/biarch64.h ${tm_file} sparc/sol2-bi.h" if test x$gnu_ld = xyes; then tm_file="${tm_file} sparc/sol2-gld-bi.h" fi if test x$gas = xyes; then tm_file="${tm_file} sparc/sol2-gas-bi.h" fi + tm_file="${tm_file} tm-dwarf2.h" tmake_file="$tmake_file sparc/t-sol2-64" need_64bit_hwint=yes ;; diff --git a/gcc/config/frv/frv-protos.h b/gcc/config/frv/frv-protos.h index 89107a022ed..a6f6dc480d5 100644 --- a/gcc/config/frv/frv-protos.h +++ b/gcc/config/frv/frv-protos.h @@ -204,7 +204,6 @@ extern int accg_operand (rtx, enum machine_mode); extern rtx frv_matching_accg_for_acc (rtx); extern void frv_expand_fdpic_call (rtx *, bool, bool); extern rtx frv_gen_GPsym2reg (rtx, rtx); -extern void frv_output_dwarf_dtprel (FILE *, int, rtx); extern int frv_legitimate_memory_operand (rtx, enum machine_mode, int); /* Information about a relocation unspec. SYMBOL is the relocation symbol diff --git a/gcc/config/frv/frv.c b/gcc/config/frv/frv.c index cc9270c88bb..b54c085858d 100644 --- a/gcc/config/frv/frv.c +++ b/gcc/config/frv/frv.c @@ -353,6 +353,8 @@ static rtx frv_struct_value_rtx (tree, int); static bool frv_must_pass_in_stack (enum machine_mode mode, tree type); static int frv_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode, tree, bool); +static void frv_output_dwarf_dtprel (FILE *, int, rtx) + ATTRIBUTE_UNUSED; /* Allow us to easily change the default for -malloc-cc. */ #ifndef DEFAULT_NO_ALLOC_CC @@ -426,6 +428,11 @@ static int frv_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode, #undef TARGET_MACHINE_DEPENDENT_REORG #define TARGET_MACHINE_DEPENDENT_REORG frv_reorg +#if HAVE_AS_TLS +#undef TARGET_ASM_OUTPUT_DWARF_DTPREL +#define TARGET_ASM_OUTPUT_DWARF_DTPREL frv_output_dwarf_dtprel +#endif + struct gcc_target targetm = TARGET_INITIALIZER; #define FRV_SYMBOL_REF_TLS_P(RTX) \ @@ -3415,7 +3422,7 @@ frv_legitimate_address_p (enum machine_mode mode, static rtx gen_inlined_tls_plt (rtx addr) { - rtx mem, retval, dest; + rtx retval, dest; rtx picreg = get_hard_reg_initial_val (Pmode, FDPIC_REG); @@ -9098,10 +9105,10 @@ frv_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED, #define TLS_BIAS (2048 - 16) -/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL. +/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL. We need to emit DTP-relative relocations. */ -void +static void frv_output_dwarf_dtprel (FILE *file, int size, rtx x) { gcc_assert (size == 4); diff --git a/gcc/config/frv/frv.h b/gcc/config/frv/frv.h index fa9cca0e9a5..6f2c22d861a 100644 --- a/gcc/config/frv/frv.h +++ b/gcc/config/frv/frv.h @@ -2361,13 +2361,6 @@ do { \ assemble_name (STREAM, LABEL); \ } while (0) -#if HAVE_AS_TLS -/* Emit a dtp-relative reference to a TLS variable. */ - -#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \ - frv_output_dwarf_dtprel ((FILE), (SIZE), (X)) -#endif - /* Whether to emit the gas specific dwarf2 line number support. */ #define DWARF2_ASM_LINE_DEBUG_INFO (TARGET_DEBUG_LOC) diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index df107d36190..142eb5ab1de 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -120,8 +120,6 @@ extern const char *output_387_reg_move (rtx, rtx*); extern const char *output_fix_trunc (rtx, rtx*, int); extern const char *output_fp_compare (rtx, rtx*, int, int); -extern void i386_output_dwarf_dtprel (FILE*, int, rtx); - extern void ix86_expand_clear (rtx); extern void ix86_expand_move (enum machine_mode, rtx[]); extern void ix86_expand_vector_move (enum machine_mode, rtx[]); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index f24a5cc7995..80170f90de8 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -866,6 +866,8 @@ static int ix86_address_cost (rtx); static bool ix86_cannot_force_const_mem (rtx); static rtx ix86_delegitimize_address (rtx); +static void i386_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED; + struct builtin_description; static rtx ix86_expand_sse_comi (const struct builtin_description *, tree, rtx); @@ -1061,6 +1063,11 @@ static void init_ext_80387_constants (void); #undef TARGET_VECTOR_MODE_SUPPORTED_P #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p +#ifdef HAVE_AS_TLS +#undef TARGET_ASM_OUTPUT_DWARF_DTPREL +#define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel +#endif + #ifdef SUBTARGET_INSERT_ATTRIBUTES #undef TARGET_INSERT_ATTRIBUTES #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES @@ -6107,10 +6114,10 @@ output_pic_addr_const (FILE *file, rtx x, int code) } } -/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL. +/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL. We need to emit DTP-relative relocations. */ -void +static void i386_output_dwarf_dtprel (FILE *file, int size, rtx x) { fputs (ASM_LONG, file); diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 73ad1085733..c9c4cfc8426 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2071,13 +2071,6 @@ do { \ #define JUMP_TABLES_IN_TEXT_SECTION \ (!TARGET_64BIT && flag_pic && !HAVE_AS_GOTOFF_IN_DATA) -/* Emit a dtp-relative reference to a TLS variable. */ - -#ifdef HAVE_AS_TLS -#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \ - i386_output_dwarf_dtprel (FILE, SIZE, X) -#endif - /* Switch to init or fini section via SECTION_OP, emit a call to FUNC, and switch back. For x86 we do this only to save a few bytes that would otherwise be unused in the text section. */ diff --git a/gcc/config/ia64/ia64-protos.h b/gcc/config/ia64/ia64-protos.h index 94fa176f7e7..31b854ce475 100644 --- a/gcc/config/ia64/ia64-protos.h +++ b/gcc/config/ia64/ia64-protos.h @@ -68,7 +68,6 @@ extern void ia64_print_operand (FILE *, rtx, int); extern enum reg_class ia64_preferred_reload_class (rtx, enum reg_class); extern enum reg_class ia64_secondary_reload_class (enum reg_class, enum machine_mode, rtx); -extern void ia64_output_dwarf_dtprel (FILE*, int, rtx); extern void process_for_unwind_directive (FILE *, rtx); extern const char *get_bundle_name (int); #endif /* RTX_CODE */ diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index e119ecb2b1a..ca4723e006f 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -232,6 +232,8 @@ static void ia64_file_start (void); static void ia64_select_rtx_section (enum machine_mode, rtx, unsigned HOST_WIDE_INT); +static void ia64_output_dwarf_dtprel (FILE *, int, rtx) + ATTRIBUTE_UNUSED; static void ia64_rwreloc_select_section (tree, int, unsigned HOST_WIDE_INT) ATTRIBUTE_UNUSED; static void ia64_rwreloc_unique_section (tree, int) @@ -369,6 +371,11 @@ static const struct attribute_spec ia64_attribute_table[] = #undef TARGET_SECTION_TYPE_FLAGS #define TARGET_SECTION_TYPE_FLAGS ia64_section_type_flags +#ifdef HAVE_AS_TLS +#undef TARGET_ASM_OUTPUT_DWARF_DTPREL +#define TARGET_ASM_OUTPUT_DWARF_DTPREL ia64_output_dwarf_dtprel +#endif + /* ??? ABI doesn't allow us to define this. */ #if 0 #undef TARGET_PROMOTE_FUNCTION_ARGS @@ -4151,10 +4158,10 @@ ia64_function_value (tree valtype, tree func ATTRIBUTE_UNUSED) } } -/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL. +/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL. We need to emit DTP-relative relocations. */ -void +static void ia64_output_dwarf_dtprel (FILE *file, int size, rtx x) { gcc_assert (size == 8); diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 427c17a61a9..3bef0d3a937 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -1733,13 +1733,6 @@ do { \ { "loc79", LOC_REG (79) }, \ } -/* Emit a dtp-relative reference to a TLS variable. */ - -#ifdef HAVE_AS_TLS -#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \ - ia64_output_dwarf_dtprel (FILE, SIZE, X) -#endif - /* A C compound statement to output to stdio stream STREAM the assembler syntax for an instruction operand X. X is an RTL expression. */ diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h index 041169bde81..c67f559ef72 100644 --- a/gcc/config/rs6000/rs6000-protos.h +++ b/gcc/config/rs6000/rs6000-protos.h @@ -153,7 +153,6 @@ extern int rs6000_register_move_cost (enum machine_mode, enum reg_class, enum reg_class); extern int rs6000_memory_move_cost (enum machine_mode, enum reg_class, int); extern bool rs6000_tls_referenced_p (rtx); -extern void rs6000_output_dwarf_dtprel (FILE*, int, rtx); extern int rs6000_hard_regno_nregs (int, enum machine_mode); extern void rs6000_conditional_register_usage (void); diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 6a55de112db..7bee8c0eb3c 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -683,6 +683,7 @@ int easy_vector_constant (rtx, enum machine_mode); static bool rs6000_is_opaque_type (tree); static rtx rs6000_dwarf_register_span (rtx); static rtx rs6000_legitimize_tls_address (rtx, enum tls_model); +static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED; static rtx rs6000_tls_get_addr (void); static rtx rs6000_got_sym (void); static int rs6000_tls_symbol_ref_1 (rtx *, void *); @@ -982,6 +983,11 @@ static const char alt_reg_names[][8] = #undef TARGET_RELAXED_ORDERING #define TARGET_RELAXED_ORDERING true +#ifdef HAVE_AS_TLS +#undef TARGET_ASM_OUTPUT_DWARF_DTPREL +#define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel +#endif + struct gcc_target targetm = TARGET_INITIALIZER; @@ -2730,10 +2736,10 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, return NULL_RTX; } -/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL. +/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL. We need to emit DTP-relative relocations. */ -void +static void rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x) { switch (size) diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 2710dad4dae..39474ac050e 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -150,13 +150,6 @@ #define TARGET_32BIT (! TARGET_64BIT) -/* Emit a dtp-relative reference to a TLS variable. */ - -#ifdef HAVE_AS_TLS -#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \ - rs6000_output_dwarf_dtprel (FILE, SIZE, X) -#endif - #ifndef HAVE_AS_TLS #define HAVE_AS_TLS 0 #endif diff --git a/gcc/config/s390/s390-protos.h b/gcc/config/s390/s390-protos.h index 3d3ca0cc3e5..1d470a24a39 100644 --- a/gcc/config/s390/s390-protos.h +++ b/gcc/config/s390/s390-protos.h @@ -88,7 +88,6 @@ extern void s390_output_pool_entry (rtx, enum machine_mode, unsigned int); extern void s390_trampoline_template (FILE *); extern void s390_initialize_trampoline (rtx, rtx, rtx); extern rtx s390_gen_rtx_const_DI (int, int); -extern void s390_output_dwarf_dtprel (FILE*, int, rtx); extern int s390_agen_dep_p (rtx, rtx); extern rtx s390_load_got (void); extern void s390_emit_tpf_eh_return (rtx); diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 54661eddbc6..5b82a8e92b3 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -3561,10 +3561,12 @@ s390_expand_addcc (enum rtx_code cmp_code, rtx cmp_op0, rtx cmp_op1, } -/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL. +/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL. We need to emit DTP-relative relocations. */ -void +static void s390_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED; + +static void s390_output_dwarf_dtprel (FILE *file, int size, rtx x) { switch (size) @@ -8285,6 +8287,11 @@ s390_reorg (void) #undef TARGET_INSN_VALID_WITHIN_DOLOOP #define TARGET_INSN_VALID_WITHIN_DOLOOP hook_bool_rtx_true +#ifdef HAVE_AS_TLS +#undef TARGET_ASM_OUTPUT_DWARF_DTPREL +#define TARGET_ASM_OUTPUT_DWARF_DTPREL s390_output_dwarf_dtprel +#endif + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-s390.h" diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h index f04f1387f48..1141d3b2e96 100644 --- a/gcc/config/s390/s390.h +++ b/gcc/config/s390/s390.h @@ -918,13 +918,6 @@ extern int flag_pic; "%ap", "%cc", "%fp", "%rp", "%a0", "%a1" \ } -/* Emit a dtp-relative reference to a TLS variable. */ - -#ifdef HAVE_AS_TLS -#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \ - s390_output_dwarf_dtprel (FILE, SIZE, X) -#endif - /* Print operand X (an rtx) in assembler syntax to file FILE. */ #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE) #define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR) diff --git a/gcc/config/sparc/sol2-gas.h b/gcc/config/sparc/sol2-gas.h index 7e808f7acaf..942e39de8a4 100644 --- a/gcc/config/sparc/sol2-gas.h +++ b/gcc/config/sparc/sol2-gas.h @@ -3,3 +3,11 @@ /* Undefine this so that BNSYM/ENSYM pairs are emitted by STABS+. */ #undef NO_DBX_BNSYM_ENSYM + +/* Use GNU extensions to TLS support. */ +#ifdef HAVE_AS_TLS +#undef TARGET_SUN_TLS +#undef TARGET_GNU_TLS +#define TARGET_SUN_TLS 0 +#define TARGET_GNU_TLS 1 +#endif diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h index 1c68133a8c9..9b548c2d34c 100644 --- a/gcc/config/sparc/sol2.h +++ b/gcc/config/sparc/sol2.h @@ -72,7 +72,7 @@ Boston, MA 02111-1307, USA. */ #undef ASM_GENERATE_INTERNAL_LABEL #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ - sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM)) + sprintf ((LABEL), "*.L%s%lu", (PREFIX), (unsigned long)(NUM)) /* The native TLS-enabled assembler requires the directive #tls_object to be put on objects in TLS sections (as of v7.1). This is not diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h index 9c6e822cc76..c743f55c000 100644 --- a/gcc/config/sparc/sparc-protos.h +++ b/gcc/config/sparc/sparc-protos.h @@ -114,7 +114,6 @@ extern int v9_regcmp_p (enum rtx_code); extern int sparc_check_64 (rtx, rtx); extern rtx gen_df_reg (rtx, int); extern int sparc_extra_constraint_check (rtx, int, int); -extern void sparc_output_dwarf_dtprel (FILE*, int, rtx); #endif /* RTX_CODE */ #endif /* __SPARC_PROTOS_H__ */ diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 9d5edd18391..314895536db 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -363,6 +363,7 @@ static bool sparc_pass_by_reference (CUMULATIVE_ARGS *, static int sparc_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode, tree, bool); static void sparc_dwarf_handle_frame_unspec (const char *, rtx, int); +static void sparc_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED; static void sparc_file_end (void); #ifdef SUBTARGET_ATTRIBUTE_TABLE const struct attribute_spec sparc_attribute_table[]; @@ -437,10 +438,11 @@ static bool fpu_option_set = false; #undef TARGET_EXPAND_BUILTIN #define TARGET_EXPAND_BUILTIN sparc_expand_builtin -#ifdef HAVE_AS_TLS +#if TARGET_TLS #undef TARGET_HAVE_TLS #define TARGET_HAVE_TLS true #endif + #undef TARGET_CANNOT_FORCE_CONST_MEM #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem @@ -512,6 +514,11 @@ static bool fpu_option_set = false; #undef TARGET_HANDLE_OPTION #define TARGET_HANDLE_OPTION sparc_handle_option +#if TARGET_GNU_TLS +#undef TARGET_ASM_OUTPUT_DWARF_DTPREL +#define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel +#endif + #undef TARGET_ASM_FILE_END #define TARGET_ASM_FILE_END sparc_file_end @@ -8451,10 +8458,10 @@ sparc_dwarf_handle_frame_unspec (const char *label, dwarf2out_window_save (label); } -/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL. +/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL. We need to emit DTP-relative relocations. */ -void +static void sparc_output_dwarf_dtprel (FILE *file, int size, rtx x) { switch (size) @@ -8472,8 +8479,10 @@ sparc_output_dwarf_dtprel (FILE *file, int size, rtx x) fputs (")", file); } -static -void sparc_file_end (void) +/* Do whatever processing is required at the end of a file. */ + +static void +sparc_file_end (void) { /* If we haven't emitted the special PIC helper function, do so now. */ if (pic_helper_symbol_name[0] && !pic_helper_emitted_p) diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index aa3752c9d6f..73a64ca9463 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -2349,13 +2349,6 @@ extern int sparc_indent_opcode; } \ } while (0) -/* Emit a dtp-relative reference to a TLS variable. */ - -#ifdef HAVE_AS_TLS -#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \ - sparc_output_dwarf_dtprel (FILE, SIZE, X) -#endif - #define SPARC_SYMBOL_REF_TLS_P(RTX) \ (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0) @@ -2447,11 +2440,14 @@ extern int sparc_indent_opcode; } \ } +/* TLS support defaulting to original Sun flavor. GNU extensions + must be activated in separate configuration files. */ #ifdef HAVE_AS_TLS #define TARGET_TLS 1 #else #define TARGET_TLS 0 #endif + #define TARGET_SUN_TLS TARGET_TLS #define TARGET_GNU_TLS 0 diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index a4adcb9db55..427a23ed580 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -8140,6 +8140,11 @@ A C statement to issue assembly directives that create a self-relative reference to the given label, using an integer of the given size. @end defmac +@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_DWARF_DTPREL (FILE *@var{FILE}, int @var{size}, rtx @var{x}) +If defined, this target hook is a function which outputs a DTP-relative +reference to the given TLS symbol of the specified size. +@end deftypefn + @defmac PUT_SDB_@dots{} Define these macros to override the assembler syntax for the special SDB assembler directives. See @file{sdbout.c} for a list of these diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index e11cd806376..bbd2b32bc5a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -3284,13 +3284,15 @@ output_loc_operands (dw_loc_descr_ref loc) break; case INTERNAL_DW_OP_tls_addr: -#ifdef ASM_OUTPUT_DWARF_DTPREL - ASM_OUTPUT_DWARF_DTPREL (asm_out_file, DWARF2_ADDR_SIZE, - val1->v.val_addr); - fputc ('\n', asm_out_file); -#else - gcc_unreachable (); -#endif + if (targetm.asm_out.output_dwarf_dtprel) + { + targetm.asm_out.output_dwarf_dtprel (asm_out_file, + DWARF2_ADDR_SIZE, + val1->v.val_addr); + fputc ('\n', asm_out_file); + } + else + gcc_unreachable (); break; default: @@ -8954,10 +8956,9 @@ loc_descriptor_from_tree_1 (tree loc, int want_address) { rtx rtl; -#ifndef ASM_OUTPUT_DWARF_DTPREL /* If this is not defined, we have no way to emit the data. */ - return 0; -#endif + if (!targetm.asm_out.output_dwarf_dtprel) + return 0; /* The way DW_OP_GNU_push_tls_address is specified, we can only look up addresses of objects in the current module. */ diff --git a/gcc/system.h b/gcc/system.h index 43455b96edb..9969356b3ad 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -692,7 +692,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; HANDLE_PRAGMA_REDEFINE_EXTNAME HANDLE_PRAGMA_EXTERN_PREFIX \ MUST_PASS_IN_STACK FUNCTION_ARG_PASS_BY_REFERENCE \ VECTOR_MODE_SUPPORTED_P TARGET_SUPPORTS_HIDDEN \ - FUNCTION_ARG_PARTIAL_NREGS + FUNCTION_ARG_PARTIAL_NREGS ASM_OUTPUT_DWARF_DTPREL /* Other obsolete target macros, or macros that used to be in target headers and were not used, and may be obsolete or may never have diff --git a/gcc/target-def.h b/gcc/target-def.h index f5d98f95e09..7d71aeafc4c 100644 --- a/gcc/target-def.h +++ b/gcc/target-def.h @@ -191,6 +191,10 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define TARGET_ASM_MARK_DECL_PRESERVED hook_void_constcharptr #endif +#ifndef TARGET_ASM_OUTPUT_DWARF_DTPREL +#define TARGET_ASM_OUTPUT_DWARF_DTPREL NULL +#endif + #define TARGET_ASM_ALIGNED_INT_OP \ {TARGET_ASM_ALIGNED_HI_OP, \ TARGET_ASM_ALIGNED_SI_OP, \ @@ -232,7 +236,8 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. TARGET_ASM_FILE_START, \ TARGET_ASM_FILE_END, \ TARGET_ASM_EXTERNAL_LIBCALL, \ - TARGET_ASM_MARK_DECL_PRESERVED} + TARGET_ASM_MARK_DECL_PRESERVED, \ + TARGET_ASM_OUTPUT_DWARF_DTPREL} /* Scheduler hooks. All of these default to null pointers, which haifa-sched.c looks for and handles. */ diff --git a/gcc/target.h b/gcc/target.h index 1527819d916..0cdd82d034d 100644 --- a/gcc/target.h +++ b/gcc/target.h @@ -180,6 +180,9 @@ struct gcc_target linker to not dead code strip this symbol. */ void (*mark_decl_preserved) (const char *); + /* Output a DTP-relative reference to a TLS symbol. */ + void (*output_dwarf_dtprel) (FILE *file, int size, rtx x); + } asm_out; /* Functions relating to instruction scheduling. */