This patch changes gcc to emit DW_OP_form_tls_address rather than DW_OP_GNU_push_tls_address. This is PR debug/77315.
DW_OP_form_tls_address was added in DWARF 3, and this patch uses the DWARF version to decide which opcode to emit. Note that gdb did not implement the DWARF 3 opcode until recently -- in fact it isn't even in 7.12 (I thought I had put it in there but it seems not). I'm not sure if that means that this should wait a cycle. Built and regtested on x86-64 Fedora 24. 2016-10-21 Tom Tromey <t...@tromey.com> PR debug/77315: * dwarf2out.c (mem_loc_descriptor): Use DW_OP_form_tls_address. (resolve_args_picking_1): Move DW_OP_form_tls_address case next to DW_OP_GNU_push_tls_address case. (loc_list_from_tree_1): Use DW_OP_form_tls_address. --- gcc/ChangeLog | 8 ++++++++ gcc/dwarf2out.c | 12 ++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6102719..481a2a9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-10-21 Tom Tromey <t...@tromey.com> + + PR debug/77315: + * dwarf2out.c (mem_loc_descriptor): Use DW_OP_form_tls_address. + (resolve_args_picking_1): Move DW_OP_form_tls_address case next to + DW_OP_GNU_push_tls_address case. + (loc_list_from_tree_1): Use DW_OP_form_tls_address. + 2016-10-21 Jakub Jelinek <ja...@redhat.com> * config/i386/adxintrin.h (_subborrow_u32, _addcarry_u32, diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 4683e1c..6ab6ff8 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -13619,7 +13619,10 @@ mem_loc_descriptor (rtx rtl, machine_mode mode, temp = new_addr_loc_descr (rtl, dtprel_true); - mem_loc_result = new_loc_descr (DW_OP_GNU_push_tls_address, 0, 0); + mem_loc_result = new_loc_descr ((dwarf_version > 2 + ? DW_OP_form_tls_address + : DW_OP_GNU_push_tls_address), + 0, 0); add_loc_descr (&mem_loc_result, temp); break; @@ -15467,7 +15470,6 @@ resolve_args_picking_1 (dw_loc_descr_ref loc, unsigned initial_frame_offset, case DW_OP_piece: case DW_OP_deref_size: case DW_OP_nop: - case DW_OP_form_tls_address: case DW_OP_bit_piece: case DW_OP_implicit_value: case DW_OP_stack_value: @@ -15595,6 +15597,7 @@ resolve_args_picking_1 (dw_loc_descr_ref loc, unsigned initial_frame_offset, break; } + case DW_OP_form_tls_address: case DW_OP_GNU_push_tls_address: case DW_OP_GNU_uninit: case DW_OP_GNU_encoded_addr: @@ -15924,8 +15927,9 @@ loc_list_from_tree_1 (tree loc, int want_address, operand shouldn't be. */ if (DECL_EXTERNAL (loc) && !targetm.binds_local_p (loc)) return 0; - dtprel = dtprel_true; - tls_op = DW_OP_GNU_push_tls_address; + dtprel = dtprel_true; + tls_op = (dwarf_version > 2 ? DW_OP_form_tls_address + : DW_OP_GNU_push_tls_address); } else { -- 2.7.4