From patchwork Sun Feb 19 21:28:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kratochvil X-Patchwork-Id: 19304 Received: (qmail 117571 invoked by alias); 19 Feb 2017 21:28:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 117498 invoked by uid 89); 19 Feb 2017 21:28:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, KAM_STOCKGEN, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=baton X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 19 Feb 2017 21:28:36 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 14728C057FA7; Sun, 19 Feb 2017 21:28:36 +0000 (UTC) Received: from host1.jankratochvil.net (ovpn-116-221.ams2.redhat.com [10.36.116.221]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1JLSYrR020804; Sun, 19 Feb 2017 16:28:34 -0500 Subject: [PATCH v2 5/8] DWARF-5: call sites From: Jan Kratochvil To: gdb-patches@sourceware.org Cc: Victor Leschuk Date: Sun, 19 Feb 2017 22:28:32 +0100 Message-ID: <148753971276.4016.12278439867773595722.stgit@host1.jankratochvil.net> In-Reply-To: <148753968011.4016.6818202131640662529.stgit@host1.jankratochvil.net> References: <148753968011.4016.6818202131640662529.stgit@host1.jankratochvil.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-IsSubscribed: yes Hi, this patch updates all call sites related DWARF-5 renames. Jan gdb/ChangeLog 2017-02-11 Jan Kratochvil * block.c (call_site_for_pc): Rename DW_OP_GNU_*, DW_TAG_GNU_* and DW_AT_GNU_*. * common/common-exceptions.h (enum errors): Likewise. * dwarf2-frame.c (class dwarf_expr_executor): Likewise. * dwarf2expr.c (dwarf_block_to_dwarf_reg) (dwarf_expr_context::execute_stack_op): Likewise. * dwarf2expr.h (struct dwarf_expr_context, struct dwarf_expr_piece): Likewise. * dwarf2loc.c (dwarf_evaluate_loc_desc::get_base_type) (dwarf_evaluate_loc_desc::push_dwarf_reg_entry_value) (show_entry_values_debug, call_site_to_target_addr) (func_addr_to_tail_call_list, func_verify_no_selftailcall) (dwarf_expr_reg_to_entry_parameter, dwarf_entry_parameter_to_value) (entry_data_value_free_closure, value_of_dwarf_reg_entry) (value_of_dwarf_block_entry, indirect_pieced_value) (symbol_needs_eval_context::push_dwarf_reg_entry_value): (disassemble_dwarf_expression): Likewise. * dwarf2read.c (process_die, inherit_abstract_dies) (read_call_site_scope): Likewise. * gdbtypes.h (struct func_type, struct call_site_parameter) (struct call_site): Likewise. * stack.c (read_frame_arg): Likewise. * std-operator.def (OP_VAR_ENTRY_VALUE): Likewise. gdb/doc/ChangeLog 2017-02-11 Jan Kratochvil * gdb.texinfo (Print Settings, Tail Call Frames): Rename DW_OP_GNU_*, DW_TAG_GNU_* and DW_AT_GNU_*. gdb/testsuite/ChangeLog 2017-02-11 Jan Kratochvil * gdb.arch/amd64-entry-value-param-dwarf5.S: New file. * gdb.arch/amd64-entry-value-param-dwarf5.c: New file. * gdb.arch/amd64-entry-value-param-dwarf5.exp: New file. * gdb.arch/amd64-entry-value.exp: Rename DW_OP_GNU_*, DW_TAG_GNU_* and DW_AT_GNU_*. --- gdb/block.c | 4 gdb/common/common-exceptions.h | 2 gdb/doc/gdb.texinfo | 10 gdb/dwarf2-frame.c | 2 gdb/dwarf2expr.c | 23 - gdb/dwarf2expr.h | 10 gdb/dwarf2loc.c | 59 +- gdb/dwarf2read.c | 93 ++- gdb/gdbtypes.h | 22 - gdb/stack.c | 5 gdb/std-operator.def | 2 .../gdb.arch/amd64-entry-value-param-dwarf5.S | 699 ++++++++++++++++++++ .../gdb.arch/amd64-entry-value-param-dwarf5.c | 40 + .../gdb.arch/amd64-entry-value-param-dwarf5.exp | 49 + gdb/testsuite/gdb.arch/amd64-entry-value.exp | 6 15 files changed, 926 insertions(+), 100 deletions(-) create mode 100644 gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.S create mode 100644 gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.c create mode 100644 gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.exp diff --git a/gdb/block.c b/gdb/block.c index 670a49d..2f44460 100644 --- a/gdb/block.c +++ b/gdb/block.c @@ -239,8 +239,8 @@ call_site_for_pc (struct gdbarch *gdbarch, CORE_ADDR pc) /* DW_TAG_gnu_call_site will be missing just if GCC could not determine the call target. */ throw_error (NO_ENTRY_VALUE_ERROR, - _("DW_OP_GNU_entry_value resolving cannot find " - "DW_TAG_GNU_call_site %s in %s"), + _("DW_OP_entry_value resolving cannot find " + "DW_TAG_call_site %s in %s"), paddress (gdbarch, pc), (msym.minsym == NULL ? "???" : MSYMBOL_PRINT_NAME (msym.minsym))); diff --git a/gdb/common/common-exceptions.h b/gdb/common/common-exceptions.h index c4a2f59..49f309f 100644 --- a/gdb/common/common-exceptions.h +++ b/gdb/common/common-exceptions.h @@ -87,7 +87,7 @@ enum errors { means the register was not saved in the frame. */ OPTIMIZED_OUT_ERROR, - /* DW_OP_GNU_entry_value resolving failed. */ + /* DW_OP_entry_value resolving failed. */ NO_ENTRY_VALUE_ERROR, /* Target throwing an error has been closed. Current command should be diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index c465dc2..962325b 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -9857,7 +9857,7 @@ this feature will behave in the @code{default} setting the same way as with the @code{no} setting. This functionality is currently supported only by DWARF 2 debugging format and -the compiler has to produce @samp{DW_TAG_GNU_call_site} tags. With +the compiler has to produce @samp{DW_TAG_call_site} tags. With @value{NGCC}, you need to specify @option{-O -g} during compilation, to get this information. @@ -12025,7 +12025,7 @@ some cases @value{GDBN} can determine that @code{C} was tail-called from return address set up as if @code{B} called @code{C} normally. This functionality is currently supported only by DWARF 2 debugging format and -the compiler has to produce @samp{DW_TAG_GNU_call_site} tags. With +the compiler has to produce @samp{DW_TAG_call_site} tags. With @value{NGCC}, you need to specify @option{-O -g} during compilation, to get this information. @@ -12078,8 +12078,8 @@ static void __attribute__((noinline, noclone)) a (void) @{ x++; @} static void __attribute__((noinline, noclone)) c (void) @{ a (); @} int main (void) @{ x (); return 0; @} -Breakpoint 1, DW_OP_GNU_entry_value resolving cannot find -DW_TAG_GNU_call_site 0x40039a in main +Breakpoint 1, DW_OP_entry_value resolving cannot find +DW_TAG_call_site 0x40039a in main a () at t.c:3 3 static void __attribute__((noinline, noclone)) a (void) @{ x++; @} (gdb) bt @@ -12155,7 +12155,7 @@ int main (void) @{ a (5); return 0; @} (gdb) bt #0 c (i=i@@entry=0) at t.c:2 -#1 0x0000000000400428 in a (DW_OP_GNU_entry_value resolving has found +#1 0x0000000000400428 in a (DW_OP_entry_value resolving has found function "a" at 0x400420 can call itself via tail calls i=) at t.c:6 #2 0x000000000040036e in main () at t.c:7 diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index c5ad0dd..f8dd1df 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -361,7 +361,7 @@ class dwarf_expr_executor : public dwarf_expr_context union call_site_parameter_u kind_u, int deref_size) OVERRIDE { - invalid ("DW_OP_GNU_entry_value"); + invalid ("DW_OP_entry_value"); } CORE_ADDR get_object_address () OVERRIDE diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c index 6ba4831..fbbb6c4 100644 --- a/gdb/dwarf2expr.c +++ b/gdb/dwarf2expr.c @@ -423,7 +423,7 @@ dwarf_block_to_dwarf_reg (const gdb_byte *buf, const gdb_byte *buf_end) return *buf - DW_OP_reg0; } - if (*buf == DW_OP_GNU_regval_type) + if (*buf == DW_OP_regval_type || *buf == DW_OP_GNU_regval_type) { buf++; buf = gdb_read_uleb128 (buf, buf_end, &dwarf_reg); @@ -805,12 +805,13 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_stack_value"); goto no_push; + case DW_OP_implicit_pointer: case DW_OP_GNU_implicit_pointer: { int64_t len; if (this->ref_addr_size == -1) - error (_("DWARF-2 expression error: DW_OP_GNU_implicit_pointer " + error (_("DWARF-2 expression error: DW_OP_implicit_pointer " "is not allowed in frame context")); /* The referred-to DIE of sect_offset kind. */ @@ -825,7 +826,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, this->location = DWARF_VALUE_IMPLICIT_POINTER; dwarf_expr_require_composition (op_ptr, op_end, - "DW_OP_GNU_implicit_pointer"); + "DW_OP_implicit_pointer"); } break; @@ -963,6 +964,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, case DW_OP_deref: case DW_OP_deref_size: + case DW_OP_deref_type: case DW_OP_GNU_deref_type: { int addr_size = (op == DW_OP_deref ? this->addr_size : *op_ptr++); @@ -972,7 +974,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, pop (); - if (op == DW_OP_GNU_deref_type) + if (op == DW_OP_deref_type || op == DW_OP_GNU_deref_type) { cu_offset type_die; @@ -1299,6 +1301,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, } goto no_push; + case DW_OP_entry_value: case DW_OP_GNU_entry_value: { uint64_t len; @@ -1307,7 +1310,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, op_ptr = safe_read_uleb128 (op_ptr, op_end, &len); if (op_ptr + len > op_end) - error (_("DW_OP_GNU_entry_value: too few bytes available.")); + error (_("DW_OP_entry_value: too few bytes available.")); kind_u.dwarf_reg = dwarf_block_to_dwarf_reg (op_ptr, op_ptr + len); if (kind_u.dwarf_reg != -1) @@ -1332,7 +1335,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, goto no_push; } - error (_("DWARF-2 expression error: DW_OP_GNU_entry_value is " + error (_("DWARF-2 expression error: DW_OP_entry_value is " "supported only for single DW_OP_reg* " "or for DW_OP_breg*(0)+DW_OP_deref*")); } @@ -1350,6 +1353,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, } goto no_push; + case DW_OP_const_type: case DW_OP_GNU_const_type: { cu_offset type_die; @@ -1368,6 +1372,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, } break; + case DW_OP_regval_type: case DW_OP_GNU_regval_type: { cu_offset type_die; @@ -1382,7 +1387,9 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, } break; + case DW_OP_convert: case DW_OP_GNU_convert: + case DW_OP_reinterpret: case DW_OP_GNU_reinterpret: { cu_offset type_die; @@ -1399,7 +1406,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, result_val = fetch (0); pop (); - if (op == DW_OP_GNU_convert) + if (op == DW_OP_convert || op == DW_OP_GNU_convert) result_val = value_cast (type, result_val); else if (type == value_type (result_val)) { @@ -1407,7 +1414,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, } else if (TYPE_LENGTH (type) != TYPE_LENGTH (value_type (result_val))) - error (_("DW_OP_GNU_reinterpret has wrong size")); + error (_("DW_OP_reinterpret has wrong size")); else result_val = value_from_contents (type, diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h index 017488c..2df310f 100644 --- a/gdb/dwarf2expr.h +++ b/gdb/dwarf2expr.h @@ -164,7 +164,7 @@ struct dwarf_expr_context /* Return the PC for the frame. */ virtual CORE_ADDR get_frame_pc () { - error (_("%s is invalid in this context"), "DW_OP_GNU_implicit_pointer"); + error (_("%s is invalid in this context"), "DW_OP_implicit_pointer"); } /* Return the thread-local storage address for @@ -187,10 +187,10 @@ struct dwarf_expr_context return builtin_type (this->gdbarch)->builtin_int; } - /* Push on DWARF stack an entry evaluated for DW_TAG_GNU_call_site's + /* Push on DWARF stack an entry evaluated for DW_TAG_call_site's parameter matching KIND and KIND_U at the caller of specified BATON. - If DEREF_SIZE is not -1 then use DW_AT_GNU_call_site_data_value instead of - DW_AT_GNU_call_site_value. */ + If DEREF_SIZE is not -1 then use DW_AT_call_data_value instead of + DW_AT_call_value. */ virtual void push_dwarf_reg_entry_value (enum call_site_parameter_kind kind, union call_site_parameter_u kind_u, int deref_size) = 0; @@ -248,7 +248,7 @@ struct dwarf_expr_piece /* Used for DWARF_VALUE_IMPLICIT_POINTER. */ struct { - /* The referent DIE from DW_OP_GNU_implicit_pointer. */ + /* The referent DIE from DW_OP_implicit_pointer. */ sect_offset die; /* The byte offset into the resulting data. */ LONGEST offset; diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 8774af4..4393c1f 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -588,9 +588,9 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context { struct type *result = dwarf2_get_die_type (die_offset, per_cu); if (result == NULL) - error (_("Could not find type for DW_OP_GNU_const_type")); + error (_("Could not find type for DW_OP_const_type")); if (size != 0 && TYPE_LENGTH (result) != size) - error (_("DW_OP_GNU_const_type has different sizes for type and data")); + error (_("DW_OP_const_type has different sizes for type and data")); return result; } @@ -640,7 +640,7 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context /* DEREF_SIZE size is not verified here. */ if (data_src == NULL) throw_error (NO_ENTRY_VALUE_ERROR, - _("Cannot resolve DW_AT_GNU_call_site_data_value")); + _("Cannot resolve DW_AT_call_data_value")); scoped_restore save_frame = make_scoped_restore (&this->frame, caller_frame); @@ -732,7 +732,7 @@ show_entry_values_debug (struct ui_file *file, int from_tty, value); } -/* Find DW_TAG_GNU_call_site's DW_AT_GNU_call_site_target address. +/* Find DW_TAG_call_site's DW_AT_call_target address. CALLER_FRAME (for registers) can be NULL if it is not known. This function always returns valid address or it throws NO_ENTRY_VALUE_ERROR. */ @@ -757,8 +757,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch, msym = lookup_minimal_symbol_by_pc (call_site->pc - 1); throw_error (NO_ENTRY_VALUE_ERROR, - _("DW_AT_GNU_call_site_target is not specified " - "at %s in %s"), + _("DW_AT_call_target is not specified at %s in %s"), paddress (call_site_gdbarch, call_site->pc), (msym.minsym == NULL ? "???" : MSYMBOL_PRINT_NAME (msym.minsym))); @@ -770,7 +769,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch, msym = lookup_minimal_symbol_by_pc (call_site->pc - 1); throw_error (NO_ENTRY_VALUE_ERROR, - _("DW_AT_GNU_call_site_target DWARF block resolving " + _("DW_AT_call_target DWARF block resolving " "requires known frame which is currently not " "available at %s in %s"), paddress (call_site_gdbarch, call_site->pc), @@ -783,8 +782,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch, val = dwarf2_evaluate_loc_desc (caller_core_addr_type, caller_frame, dwarf_block->data, dwarf_block->size, dwarf_block->per_cu); - /* DW_AT_GNU_call_site_target is a DWARF expression, not a DWARF - location. */ + /* DW_AT_call_target is a DWARF expression, not a DWARF location. */ if (VALUE_LVAL (val) == lval_memory) return value_address (val); else @@ -834,7 +832,7 @@ func_addr_to_tail_call_list (struct gdbarch *gdbarch, CORE_ADDR addr) if (sym == NULL || BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) != addr) throw_error (NO_ENTRY_VALUE_ERROR, - _("DW_TAG_GNU_call_site resolving failed to find function " + _("DW_TAG_call_site resolving failed to find function " "name for address %s"), paddress (gdbarch, addr)); @@ -892,7 +890,7 @@ func_verify_no_selftailcall (struct gdbarch *gdbarch, CORE_ADDR verify_addr) msym = lookup_minimal_symbol_by_pc (verify_addr); throw_error (NO_ENTRY_VALUE_ERROR, - _("DW_OP_GNU_entry_value resolving has found " + _("DW_OP_entry_value resolving has found " "function \"%s\" at %s can call itself via tail " "calls"), (msym.minsym == NULL ? "???" @@ -1234,7 +1232,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, struct gdbarch *caller_gdbarch = frame_unwind_arch (frame); throw_error (NO_ENTRY_VALUE_ERROR, - _("DW_OP_GNU_entry_value resolving callee gdbarch %s " + _("DW_OP_entry_value resolving callee gdbarch %s " "(of %s (%s)) does not match caller gdbarch %s"), gdbarch_bfd_arch_info (gdbarch)->printable_name, paddress (gdbarch, func_addr), @@ -1248,7 +1246,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, struct bound_minimal_symbol msym = lookup_minimal_symbol_by_pc (func_addr); - throw_error (NO_ENTRY_VALUE_ERROR, _("DW_OP_GNU_entry_value resolving " + throw_error (NO_ENTRY_VALUE_ERROR, _("DW_OP_entry_value resolving " "requires caller of %s (%s)"), paddress (gdbarch, func_addr), (msym.minsym == NULL ? "???" @@ -1265,7 +1263,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, target_msym = lookup_minimal_symbol_by_pc (target_addr).minsym; func_msym = lookup_minimal_symbol_by_pc (func_addr).minsym; throw_error (NO_ENTRY_VALUE_ERROR, - _("DW_OP_GNU_entry_value resolving expects callee %s at %s " + _("DW_OP_entry_value resolving expects callee %s at %s " "but the called frame is for %s at %s"), (target_msym == NULL ? "???" : MSYMBOL_PRINT_NAME (target_msym)), @@ -1289,10 +1287,10 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, struct minimal_symbol *msym = lookup_minimal_symbol_by_pc (caller_pc).minsym; - /* DW_TAG_GNU_call_site_parameter will be missing just if GCC could not + /* DW_TAG_call_site_parameter will be missing just if GCC could not determine its value. */ throw_error (NO_ENTRY_VALUE_ERROR, _("Cannot find matching parameter " - "at DW_TAG_GNU_call_site %s at %s"), + "at DW_TAG_call_site %s at %s"), paddress (gdbarch, caller_pc), msym == NULL ? "???" : MSYMBOL_PRINT_NAME (msym)); } @@ -1302,8 +1300,8 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, } /* Return value for PARAMETER matching DEREF_SIZE. If DEREF_SIZE is -1, return - the normal DW_AT_GNU_call_site_value block. Otherwise return the - DW_AT_GNU_call_site_data_value (dereferenced) block. + the normal DW_AT_call_value block. Otherwise return the + DW_AT_call_data_value (dereferenced) block. TYPE and CALLER_FRAME specify how to evaluate the DWARF block into returned struct value. @@ -1327,9 +1325,9 @@ dwarf_entry_parameter_to_value (struct call_site_parameter *parameter, /* DEREF_SIZE size is not verified here. */ if (data_src == NULL) throw_error (NO_ENTRY_VALUE_ERROR, - _("Cannot resolve DW_AT_GNU_call_site_data_value")); + _("Cannot resolve DW_AT_call_data_value")); - /* DW_AT_GNU_call_site_value is a DWARF expression, not a DWARF + /* DW_AT_call_value is a DWARF expression, not a DWARF location. Postprocessing of DWARF_VALUE_MEMORY would lose the type from DWARF block. */ data = (gdb_byte *) alloca (size + 1); @@ -1380,7 +1378,7 @@ entry_data_value_free_closure (struct value *v) /* Vector for methods for an entry value reference where the referenced value is stored in the caller. On the first dereference use - DW_AT_GNU_call_site_data_value in the caller. */ + DW_AT_call_data_value in the caller. */ static const struct lval_funcs entry_data_value_funcs = { @@ -1395,7 +1393,7 @@ static const struct lval_funcs entry_data_value_funcs = /* Read parameter of TYPE at (callee) FRAME's function entry. KIND and KIND_U are used to match DW_AT_location at the caller's - DW_TAG_GNU_call_site_parameter. + DW_TAG_call_site_parameter. Function always returns non-NULL value. It throws NO_ENTRY_VALUE_ERROR if it cannot resolve the parameter for any reason. */ @@ -1419,7 +1417,7 @@ value_of_dwarf_reg_entry (struct type *type, struct frame_info *frame, type, caller_frame, caller_per_cu); - /* Check if DW_AT_GNU_call_site_data_value cannot be used. If it should be + /* Check if DW_AT_call_data_value cannot be used. If it should be used and it is not available do not fall back to OUTER_VAL - dereferencing TYPE_CODE_REF with non-entry data value would give current value - not the entry value. */ @@ -1447,7 +1445,7 @@ value_of_dwarf_reg_entry (struct type *type, struct frame_info *frame, /* Read parameter of TYPE at (callee) FRAME's function entry. DATA and SIZE are DWARF block used to match DW_AT_location at the caller's - DW_TAG_GNU_call_site_parameter. + DW_TAG_call_site_parameter. Function always returns non-NULL value. It throws NO_ENTRY_VALUE_ERROR if it cannot resolve the parameter for any reason. */ @@ -1471,7 +1469,7 @@ value_of_dwarf_block_entry (struct type *type, struct frame_info *frame, suppressed during normal operation. The expression can be arbitrary if there is no caller-callee entry value binding expected. */ throw_error (NO_ENTRY_VALUE_ERROR, - _("DWARF-2 expression error: DW_OP_GNU_entry_value is supported " + _("DWARF-2 expression error: DW_OP_entry_value is supported " "only for single DW_OP_reg* or for DW_OP_fbreg(*)")); } @@ -2226,7 +2224,7 @@ indirect_pieced_value (struct value *value) return NULL; if (bit_length != 0) - error (_("Invalid use of DW_OP_GNU_implicit_pointer")); + error (_("Invalid use of DW_OP_implicit_pointer")); piece = p; break; @@ -2805,7 +2803,7 @@ class symbol_needs_eval_context : public dwarf_expr_context per_cu_dwarf_call (this, die_offset, per_cu); } - /* DW_OP_GNU_entry_value accesses require a caller, therefore a + /* DW_OP_entry_value accesses require a caller, therefore a frame. */ void push_dwarf_reg_entry_value (enum call_site_parameter_kind kind, @@ -4162,6 +4160,7 @@ disassemble_dwarf_expression (struct ui_file *stream, } break; + case DW_OP_implicit_pointer: case DW_OP_GNU_implicit_pointer: { ul = extract_unsigned_integer (data, offset_size, @@ -4176,6 +4175,7 @@ disassemble_dwarf_expression (struct ui_file *stream, } break; + case DW_OP_deref_type: case DW_OP_GNU_deref_type: { int addr_size = *data++; @@ -4192,6 +4192,7 @@ disassemble_dwarf_expression (struct ui_file *stream, } break; + case DW_OP_const_type: case DW_OP_GNU_const_type: { cu_offset type_die; @@ -4206,6 +4207,7 @@ disassemble_dwarf_expression (struct ui_file *stream, } break; + case DW_OP_regval_type: case DW_OP_GNU_regval_type: { uint64_t reg; @@ -4225,7 +4227,9 @@ disassemble_dwarf_expression (struct ui_file *stream, } break; + case DW_OP_convert: case DW_OP_GNU_convert: + case DW_OP_reinterpret: case DW_OP_GNU_reinterpret: { cu_offset type_die; @@ -4247,6 +4251,7 @@ disassemble_dwarf_expression (struct ui_file *stream, } break; + case DW_OP_entry_value: case DW_OP_GNU_entry_value: data = safe_read_uleb128 (data, end, &ul); fputc_filtered ('\n', stream); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 063f463..403d1e3 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -8361,6 +8361,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) case DW_TAG_catch_block: read_lexical_block_scope (die, cu); break; + case DW_TAG_call_site: case DW_TAG_GNU_call_site: read_call_site_scope (die, cu); break; @@ -11314,11 +11315,12 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) struct dwarf2_cu *child_origin_cu; /* We are trying to process concrete instance entries: - DW_TAG_GNU_call_site DIEs indeed have a DW_AT_abstract_origin tag, but + DW_TAG_call_site DIEs indeed have a DW_AT_abstract_origin tag, but it's not relevant to our analysis here. i.e. detecting DIEs that are present in the abstract instance but not referenced in the concrete one. */ - if (child_die->tag == DW_TAG_GNU_call_site) + if (child_die->tag == DW_TAG_call_site + || child_die->tag == DW_TAG_GNU_call_site) continue; /* For each CHILD_DIE, find the corresponding child of @@ -11653,7 +11655,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) local_using_directives = newobj->local_using_directives; } -/* Read in DW_TAG_GNU_call_site and insert it to CU->call_site_htab. */ +/* Read in DW_TAG_call_site and insert it to CU->call_site_htab. */ static void read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) @@ -11669,11 +11671,17 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - attr = dwarf2_attr (die, DW_AT_low_pc, cu); + attr = dwarf2_attr (die, DW_AT_call_return_pc, cu); + if (attr == NULL) + { + /* This was a pre-DWARF-5 GNU extension alias + for DW_AT_call_return_pc. */ + attr = dwarf2_attr (die, DW_AT_low_pc, cu); + } if (!attr) { complaint (&symfile_complaints, - _("missing DW_AT_low_pc for DW_TAG_GNU_call_site " + _("missing DW_AT_call_return_pc for DW_TAG_call_site " "DIE 0x%x [in module %s]"), die->offset.sect_off, objfile_name (objfile)); return; @@ -11690,7 +11698,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) if (*slot != NULL) { complaint (&symfile_complaints, - _("Duplicate PC %s for DW_TAG_GNU_call_site " + _("Duplicate PC %s for DW_TAG_call_site " "DIE 0x%x [in module %s]"), paddress (gdbarch, pc), die->offset.sect_off, objfile_name (objfile)); @@ -11703,11 +11711,12 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) for (child_die = die->child; child_die && child_die->tag; child_die = sibling_die (child_die)) { - if (child_die->tag != DW_TAG_GNU_call_site_parameter) + if (child_die->tag != DW_TAG_call_site_parameter + && child_die->tag != DW_TAG_GNU_call_site_parameter) { complaint (&symfile_complaints, - _("Tag %d is not DW_TAG_GNU_call_site_parameter in " - "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"), + _("Tag %d is not DW_TAG_call_site_parameter in " + "DW_TAG_call_site child DIE 0x%x [in module %s]"), child_die->tag, child_die->offset.sect_off, objfile_name (objfile)); continue; @@ -11725,7 +11734,8 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) memset (call_site, 0, sizeof (*call_site) - sizeof (*call_site->parameter)); call_site->pc = pc; - if (dwarf2_flag_true_p (die, DW_AT_GNU_tail_call, cu)) + if (dwarf2_flag_true_p (die, DW_AT_call_tail_call, cu) + || dwarf2_flag_true_p (die, DW_AT_GNU_tail_call, cu)) { struct die_info *func_die; @@ -11735,10 +11745,12 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) && func_die->tag != DW_TAG_subroutine_type; func_die = func_die->parent); - /* DW_AT_GNU_all_call_sites is a superset - of DW_AT_GNU_all_tail_call_sites. */ + /* DW_AT_call_all_calls is a superset + of DW_AT_call_all_tail_calls. */ if (func_die + && !dwarf2_flag_true_p (func_die, DW_AT_call_all_calls, cu) && !dwarf2_flag_true_p (func_die, DW_AT_GNU_all_call_sites, cu) + && !dwarf2_flag_true_p (func_die, DW_AT_call_all_tail_calls, cu) && !dwarf2_flag_true_p (func_die, DW_AT_GNU_all_tail_call_sites, cu)) { /* TYPE_TAIL_CALL_LIST is not interesting in functions where it is @@ -11766,15 +11778,22 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) } else complaint (&symfile_complaints, - _("Cannot find function owning DW_TAG_GNU_call_site " + _("Cannot find function owning DW_TAG_call_site " "DIE 0x%x [in module %s]"), die->offset.sect_off, objfile_name (objfile)); } } - attr = dwarf2_attr (die, DW_AT_GNU_call_site_target, cu); + attr = dwarf2_attr (die, DW_AT_call_target, cu); if (attr == NULL) - attr = dwarf2_attr (die, DW_AT_abstract_origin, cu); + attr = dwarf2_attr (die, DW_AT_GNU_call_site_target, cu); + if (attr == NULL) + attr = dwarf2_attr (die, DW_AT_call_origin, cu); + if (attr == NULL) + { + /* This was a pre-DWARF-5 GNU extension alias for DW_AT_call_origin. */ + attr = dwarf2_attr (die, DW_AT_abstract_origin, cu); + } SET_FIELD_DWARF_BLOCK (call_site->target, NULL); if (!attr || (attr_form_is_block (attr) && DW_BLOCK (attr)->size == 0)) /* Keep NULL DWARF_BLOCK. */; @@ -11812,7 +11831,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) target_physname = dwarf2_physname (NULL, target_die, target_cu); if (target_physname == NULL) complaint (&symfile_complaints, - _("DW_AT_GNU_call_site_target target DIE has invalid " + _("DW_AT_call_target target DIE has invalid " "physname, for referencing DIE 0x%x [in module %s]"), die->offset.sect_off, objfile_name (objfile)); else @@ -11826,7 +11845,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) if (dwarf2_get_pc_bounds (target_die, &lowpc, NULL, target_cu, NULL) <= PC_BOUNDS_INVALID) complaint (&symfile_complaints, - _("DW_AT_GNU_call_site_target target DIE has invalid " + _("DW_AT_call_target target DIE has invalid " "low pc, for referencing DIE 0x%x [in module %s]"), die->offset.sect_off, objfile_name (objfile)); else @@ -11838,7 +11857,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) } else complaint (&symfile_complaints, - _("DW_TAG_GNU_call_site DW_AT_GNU_call_site_target is neither " + _("DW_TAG_call_site DW_AT_call_target is neither " "block nor reference, for DIE 0x%x [in module %s]"), die->offset.sect_off, objfile_name (objfile)); @@ -11851,7 +11870,8 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) struct call_site_parameter *parameter; struct attribute *loc, *origin; - if (child_die->tag != DW_TAG_GNU_call_site_parameter) + if (child_die->tag != DW_TAG_call_site_parameter + && child_die->tag != DW_TAG_GNU_call_site_parameter) { /* Already printed the complaint above. */ continue; @@ -11862,10 +11882,16 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) /* DW_AT_location specifies the register number or DW_AT_abstract_origin specifies DW_TAG_formal_parameter. Value of the data assumed for the - register is contained in DW_AT_GNU_call_site_value. */ + register is contained in DW_AT_call_value. */ loc = dwarf2_attr (child_die, DW_AT_location, cu); - origin = dwarf2_attr (child_die, DW_AT_abstract_origin, cu); + origin = dwarf2_attr (child_die, DW_AT_call_parameter, cu); + if (origin == NULL) + { + /* This was a pre-DWARF-5 GNU extension alias + for DW_AT_call_parameter. */ + origin = dwarf2_attr (child_die, DW_AT_abstract_origin, cu); + } if (loc == NULL && origin != NULL && attr_form_is_ref (origin)) { sect_offset offset; @@ -11878,9 +11904,8 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) binding can be done only inside one CU. Such referenced DIE therefore cannot be even moved to DW_TAG_partial_unit. */ complaint (&symfile_complaints, - _("DW_AT_abstract_origin offset is not in CU for " - "DW_TAG_GNU_call_site child DIE 0x%x " - "[in module %s]"), + _("DW_AT_call_parameter offset is not in CU for " + "DW_TAG_call_site child DIE 0x%x [in module %s]"), child_die->offset.sect_off, objfile_name (objfile)); continue; } @@ -11891,7 +11916,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) { complaint (&symfile_complaints, _("No DW_FORM_block* DW_AT_location for " - "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"), + "DW_TAG_call_site child DIE 0x%x [in module %s]"), child_die->offset.sect_off, objfile_name (objfile)); continue; } @@ -11910,19 +11935,21 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("Only single DW_OP_reg or DW_OP_fbreg is supported " "for DW_FORM_block* DW_AT_location is supported for " - "DW_TAG_GNU_call_site child DIE 0x%x " + "DW_TAG_call_site child DIE 0x%x " "[in module %s]"), child_die->offset.sect_off, objfile_name (objfile)); continue; } } - attr = dwarf2_attr (child_die, DW_AT_GNU_call_site_value, cu); + attr = dwarf2_attr (child_die, DW_AT_call_value, cu); + if (attr == NULL) + attr = dwarf2_attr (child_die, DW_AT_GNU_call_site_value, cu); if (!attr_form_is_block (attr)) { complaint (&symfile_complaints, - _("No DW_FORM_block* DW_AT_GNU_call_site_value for " - "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"), + _("No DW_FORM_block* DW_AT_call_value for " + "DW_TAG_call_site child DIE 0x%x [in module %s]"), child_die->offset.sect_off, objfile_name (objfile)); continue; } @@ -11934,13 +11961,15 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) parameter->data_value_size = 0; call_site->parameter_count++; - attr = dwarf2_attr (child_die, DW_AT_GNU_call_site_data_value, cu); + attr = dwarf2_attr (child_die, DW_AT_call_data_value, cu); + if (attr == NULL) + attr = dwarf2_attr (child_die, DW_AT_GNU_call_site_data_value, cu); if (attr) { if (!attr_form_is_block (attr)) complaint (&symfile_complaints, - _("No DW_FORM_block* DW_AT_GNU_call_site_data_value for " - "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"), + _("No DW_FORM_block* DW_AT_call_data_value for " + "DW_TAG_call_site child DIE 0x%x [in module %s]"), child_die->offset.sect_off, objfile_name (objfile)); else { diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 5852160..e094ece 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1041,12 +1041,12 @@ struct func_type unsigned int is_noreturn : 1; - /* * Only those DW_TAG_GNU_call_site's in this function that have - DW_AT_GNU_tail_call set are linked in this list. Function + /* * Only those DW_TAG_call_site's in this function that have + DW_AT_call_tail_call set are linked in this list. Function without its tail call list complete - (DW_AT_GNU_all_tail_call_sites or its superset - DW_AT_GNU_all_call_sites) has TAIL_CALL_LIST NULL, even if some - DW_TAG_GNU_call_site's exist in such function. */ + (DW_AT_call_all_tail_calls or its superset + DW_AT_call_all_calls) has TAIL_CALL_LIST NULL, even if some + DW_TAG_call_site's exist in such function. */ struct call_site *tail_call_list; @@ -1106,13 +1106,12 @@ struct call_site_parameter union call_site_parameter_u u; - /* * DW_TAG_formal_parameter's DW_AT_GNU_call_site_value. It - is never NULL. */ + /* * DW_TAG_formal_parameter's DW_AT_call_value. It is never NULL. */ const gdb_byte *value; size_t value_size; - /* * DW_TAG_formal_parameter's DW_AT_GNU_call_site_data_value. + /* * DW_TAG_formal_parameter's DW_AT_call_data_value. It may be NULL if not provided by DWARF. */ const gdb_byte *data_value; @@ -1120,8 +1119,7 @@ struct call_site_parameter }; /* * A place where a function gets called from, represented by - DW_TAG_GNU_call_site. It can be looked up from - symtab->call_site_htab. */ + DW_TAG_call_site. It can be looked up from symtab->call_site_htab. */ struct call_site { @@ -1135,7 +1133,7 @@ struct call_site struct call_site *tail_call_next; - /* * Describe DW_AT_GNU_call_site_target. Missing attribute uses + /* * Describe DW_AT_call_target. Missing attribute uses FIELD_LOC_KIND_DWARF_BLOCK with FIELD_DWARF_BLOCK == NULL. */ struct call_site_target target; @@ -1149,7 +1147,7 @@ struct call_site struct dwarf2_per_cu_data *per_cu; - /* * Describe DW_TAG_GNU_call_site's DW_TAG_formal_parameter. */ + /* * Describe DW_TAG_call_site's DW_TAG_formal_parameter. */ struct call_site_parameter parameter[1]; }; diff --git a/gdb/stack.c b/gdb/stack.c index 6cd4110..aa3a80e 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -407,10 +407,9 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame, /* Initialize it just to avoid a GCC false warning. */ struct value *val_deref = NULL, *entryval_deref; - /* DW_AT_GNU_call_site_value does match with the current + /* DW_AT_call_value does match with the current value. If it is a reference still try to verify if - dereferenced DW_AT_GNU_call_site_data_value does not - differ. */ + dereferenced DW_AT_call_data_value does not differ. */ TRY { diff --git a/gdb/std-operator.def b/gdb/std-operator.def index 5ce39c2..4650726 100644 --- a/gdb/std-operator.def +++ b/gdb/std-operator.def @@ -129,7 +129,7 @@ OP (OP_VAR_VALUE) /* OP_VAR_ENTRY_VALUE takes one struct symbol * in the following element, followed by another OP_VAR_ENTRY_VALUE, making three exp_elements. somename@entry may mean parameter value as present at the entry of the - current function. Implemented via DW_OP_GNU_entry_value. */ + current function. Implemented via DW_OP_entry_value. */ OP (OP_VAR_ENTRY_VALUE) /* OP_LAST is followed by an integer in the next exp_element. diff --git a/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.S b/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.S new file mode 100644 index 0000000..8b8ee94 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.S @@ -0,0 +1,699 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2012-2017 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* This file is compiled from gdb.arch/amd64-entry-value-param-dwarf5.c + using -g -dA -S -O2. */ + + .file "amd64-entry-value-param-dwarf5.c" + .text +.Ltext0: + .p2align 4,,15 + .type foo.isra.0.constprop.2, @function +foo.isra.0.constprop.2: +.LFB4: + /* gdb.arch/amd64-entry-value-param-dwarf5.c:21 */ +.LM1: + .cfi_startproc +.LVL0: +/* BLOCK 2 freq:10000 seq:0 */ +/* PRED: ENTRY [100.0%] (FALLTHRU) */ + /* gdb.arch/amd64-entry-value-param-dwarf5.c:26 */ +.LM2: + movl vv(%rip), %eax + addl $1, %eax + movl %eax, vv(%rip) + /* gdb.arch/amd64-entry-value-param-dwarf5.c:27 */ +.LM3: + leal 3(%rdi), %eax +/* SUCC: EXIT [100.0%] */ + /* gdb.arch/amd64-entry-value-param-dwarf5.c:28 */ +.LM4: + ret + .cfi_endproc +.LFE4: + .size foo.isra.0.constprop.2, .-foo.isra.0.constprop.2 + .p2align 4,,15 + .type bar.constprop.1, @function +bar.constprop.1: +.LFB5: + /* gdb.arch/amd64-entry-value-param-dwarf5.c:31 */ +.LM5: + .cfi_startproc +/* BLOCK 2 freq:10000 seq:0 */ +/* PRED: ENTRY [100.0%] (FALLTHRU) */ +.LVL1: + /* gdb.arch/amd64-entry-value-param-dwarf5.c:33 */ +.LM6: + movl $10, %edi + call foo.isra.0.constprop.2 +.LVL2: + movl $10, %edi + movl %eax, %edx + call foo.isra.0.constprop.2 +.LVL3: + movl $16, %edi + addl %eax, %edx + call foo.isra.0.constprop.2 +.LVL4: + leal 10(%rdx,%rax), %eax +/* SUCC: EXIT [100.0%] */ + /* gdb.arch/amd64-entry-value-param-dwarf5.c:34 */ +.LM7: + ret + .cfi_endproc +.LFE5: + .size bar.constprop.1, .-bar.constprop.1 + .section .text.startup,"ax",@progbits + .p2align 4,,15 + .globl main + .type main, @function +main: +.LFB2: + /* gdb.arch/amd64-entry-value-param-dwarf5.c:38 */ +.LM8: + .cfi_startproc +/* BLOCK 2 freq:10000 seq:0 */ +/* PRED: ENTRY [100.0%] (FALLTHRU) */ +/* SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) */ + /* gdb.arch/amd64-entry-value-param-dwarf5.c:39 */ +.LM9: + jmp bar.constprop.1 +.LVL5: + .cfi_endproc +.LFE2: + .size main, .-main + .comm vv,4,4 + .text +.Letext0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .long 0x199 /* Length of Compilation Unit Info */ + .value 0x5 /* DWARF version number */ + .byte 0x1 /* DW_UT_compile */ + .byte 0x8 /* Pointer Size (in bytes) */ + .long .Ldebug_abbrev0 /* Offset Into Abbrev. Section */ + .uleb128 0xa /* (DIE (0xc) DW_TAG_compile_unit) */ + .long .LASF2 /* DW_AT_producer: "GNU C11 7.0.1 20170218 (experimental) -mtune=generic -march=x86-64 -gdwarf-5 -O2" */ + .byte 0x1d /* DW_AT_language */ + .long .LASF0 /* DW_AT_name: "gdb.arch/amd64-entry-value-param-dwarf5.c" */ + .long .LASF1 /* DW_AT_comp_dir: "" */ + .long .LLRL0 /* DW_AT_ranges */ + .quad 0 /* DW_AT_low_pc */ + .long .Ldebug_line0 /* DW_AT_stmt_list */ + .uleb128 0xb /* (DIE (0x2a) DW_TAG_variable) */ + .ascii "vv\0" /* DW_AT_name */ + .byte 0x1 /* DW_AT_decl_file (gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x12 /* DW_AT_decl_line */ + .long 0x45 /* DW_AT_type */ + /* DW_AT_external */ + .uleb128 0x9 /* DW_AT_location */ + .byte 0x3 /* DW_OP_addr */ + .quad vv + .uleb128 0xc /* (DIE (0x3e) DW_TAG_base_type) */ + .byte 0x4 /* DW_AT_byte_size */ + .byte 0x5 /* DW_AT_encoding */ + .ascii "int\0" /* DW_AT_name */ + .uleb128 0xd /* (DIE (0x45) DW_TAG_volatile_type) */ + .long 0x3e /* DW_AT_type */ + .uleb128 0xe /* (DIE (0x4a) DW_TAG_subprogram) */ + /* DW_AT_external */ + .long .LASF3 /* DW_AT_name: "main" */ + .byte 0x1 /* DW_AT_decl_file (gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x25 /* DW_AT_decl_line */ + /* DW_AT_prototyped */ + .long 0x3e /* DW_AT_type */ + .quad .LFB2 /* DW_AT_low_pc */ + .quad .LFE2-.LFB2 /* DW_AT_high_pc */ + .uleb128 0x1 /* DW_AT_frame_base */ + .byte 0x9c /* DW_OP_call_frame_cfa */ + /* DW_AT_call_all_calls */ + .long 0x79 /* DW_AT_sibling */ + .uleb128 0xf /* (DIE (0x6b) DW_TAG_call_site) */ + .quad .LVL5 /* DW_AT_call_return_pc */ + /* DW_AT_call_tail_call */ + .long 0x125 /* DW_AT_call_origin */ + .byte 0 /* end of children of DIE 0x4a */ + .uleb128 0x5 /* (DIE (0x79) DW_TAG_subprogram) */ + .ascii "bar\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x1f /* DW_AT_decl_line */ + /* DW_AT_prototyped */ + .long 0x3e /* DW_AT_type */ + .byte 0x1 /* DW_AT_inline */ + .long 0x91 /* DW_AT_sibling */ + .uleb128 0x1 /* (DIE (0x88) DW_TAG_formal_parameter) */ + .ascii "x\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x1f /* DW_AT_decl_line */ + .long 0x3e /* DW_AT_type */ + .byte 0 /* end of children of DIE 0x79 */ + .uleb128 0x5 /* (DIE (0x91) DW_TAG_subprogram) */ + .ascii "foo\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x15 /* DW_AT_decl_line */ + /* DW_AT_prototyped */ + .long 0x3e /* DW_AT_type */ + .byte 0 /* DW_AT_inline */ + .long 0xd1 /* DW_AT_sibling */ + .uleb128 0x1 /* (DIE (0xa0) DW_TAG_formal_parameter) */ + .ascii "x\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x15 /* DW_AT_decl_line */ + .long 0x3e /* DW_AT_type */ + .uleb128 0x1 /* (DIE (0xa8) DW_TAG_formal_parameter) */ + .ascii "y\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x15 /* DW_AT_decl_line */ + .long 0x3e /* DW_AT_type */ + .uleb128 0x1 /* (DIE (0xb0) DW_TAG_formal_parameter) */ + .ascii "z\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x15 /* DW_AT_decl_line */ + .long 0x3e /* DW_AT_type */ + .uleb128 0x2 /* (DIE (0xb8) DW_TAG_variable) */ + .ascii "a\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x17 /* DW_AT_decl_line */ + .long 0x3e /* DW_AT_type */ + .uleb128 0x2 /* (DIE (0xc0) DW_TAG_variable) */ + .ascii "b\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x18 /* DW_AT_decl_line */ + .long 0x3e /* DW_AT_type */ + .uleb128 0x2 /* (DIE (0xc8) DW_TAG_variable) */ + .ascii "c\0" /* DW_AT_name */ + /* DW_AT_decl_file (1, gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .byte 0x19 /* DW_AT_decl_line */ + .long 0x3e /* DW_AT_type */ + .byte 0 /* end of children of DIE 0x91 */ + .uleb128 0x10 /* (DIE (0xd1) DW_TAG_subprogram) */ + .long 0x91 /* DW_AT_abstract_origin */ + .quad .LFB4 /* DW_AT_low_pc */ + .quad .LFE4-.LFB4 /* DW_AT_high_pc */ + .uleb128 0x1 /* DW_AT_frame_base */ + .byte 0x9c /* DW_OP_call_frame_cfa */ + /* DW_AT_call_all_calls */ + .long 0x125 /* DW_AT_sibling */ + .uleb128 0x6 /* (DIE (0xec) DW_TAG_formal_parameter) */ + .long 0xa0 /* DW_AT_abstract_origin */ + .uleb128 0x1 /* DW_AT_location */ + .byte 0x55 /* DW_OP_reg5 */ + .uleb128 0x6 /* (DIE (0xf3) DW_TAG_formal_parameter) */ + .long 0xa8 /* DW_AT_abstract_origin */ + .uleb128 0x6 /* DW_AT_location */ + .byte 0xfa /* DW_OP_GNU_parameter_ref */ + .long 0xa8 + .byte 0x9f /* DW_OP_stack_value */ + .uleb128 0x7 /* (DIE (0xff) DW_TAG_variable) */ + .long 0xb8 /* DW_AT_abstract_origin */ + .uleb128 0x5 /* DW_AT_location */ + .byte 0x75 /* DW_OP_breg5 */ + .sleb128 0 + .byte 0x31 /* DW_OP_lit1 */ + .byte 0x24 /* DW_OP_shl */ + .byte 0x9f /* DW_OP_stack_value */ + .uleb128 0x7 /* (DIE (0x10a) DW_TAG_variable) */ + .long 0xc0 /* DW_AT_abstract_origin */ + .uleb128 0x8 /* DW_AT_location */ + .byte 0xfa /* DW_OP_GNU_parameter_ref */ + .long 0xa8 + .byte 0x31 /* DW_OP_lit1 */ + .byte 0x24 /* DW_OP_shl */ + .byte 0x9f /* DW_OP_stack_value */ + .uleb128 0x11 /* (DIE (0x118) DW_TAG_variable) */ + .long 0xc8 /* DW_AT_abstract_origin */ + .byte 0x6 /* DW_AT_const_value */ + .uleb128 0x8 /* (DIE (0x11e) DW_TAG_formal_parameter) */ + .long 0xb0 /* DW_AT_abstract_origin */ + .byte 0x3 /* DW_AT_const_value */ + .byte 0 /* end of children of DIE 0xd1 */ + .uleb128 0x12 /* (DIE (0x125) DW_TAG_subprogram) */ + .long 0x79 /* DW_AT_abstract_origin */ + .quad .LFB5 /* DW_AT_low_pc */ + .quad .LFE5-.LFB5 /* DW_AT_high_pc */ + .uleb128 0x1 /* DW_AT_frame_base */ + .byte 0x9c /* DW_OP_call_frame_cfa */ + /* DW_AT_call_all_calls */ + .uleb128 0x8 /* (DIE (0x13c) DW_TAG_formal_parameter) */ + .long 0x88 /* DW_AT_abstract_origin */ + .byte 0xa /* DW_AT_const_value */ + .uleb128 0x9 /* (DIE (0x142) DW_TAG_call_site) */ + .quad .LVL2 /* DW_AT_call_return_pc */ + .long 0xd1 /* DW_AT_call_origin */ + .long 0x161 /* DW_AT_sibling */ + .uleb128 0x3 /* (DIE (0x153) DW_TAG_call_site_parameter) */ + .uleb128 0x1 /* DW_AT_location */ + .byte 0x55 /* DW_OP_reg5 */ + .uleb128 0x2 /* DW_AT_call_value */ + .byte 0x75 /* DW_OP_breg5 */ + .sleb128 0 + .uleb128 0x4 /* (DIE (0x159) DW_TAG_call_site_parameter) */ + .long 0xa8 /* DW_AT_call_parameter */ + .uleb128 0x1 /* DW_AT_call_value */ + .byte 0x32 /* DW_OP_lit2 */ + .byte 0 /* end of children of DIE 0x142 */ + .uleb128 0x9 /* (DIE (0x161) DW_TAG_call_site) */ + .quad .LVL3 /* DW_AT_call_return_pc */ + .long 0xd1 /* DW_AT_call_origin */ + .long 0x180 /* DW_AT_sibling */ + .uleb128 0x3 /* (DIE (0x172) DW_TAG_call_site_parameter) */ + .uleb128 0x1 /* DW_AT_location */ + .byte 0x55 /* DW_OP_reg5 */ + .uleb128 0x2 /* DW_AT_call_value */ + .byte 0x75 /* DW_OP_breg5 */ + .sleb128 0 + .uleb128 0x4 /* (DIE (0x178) DW_TAG_call_site_parameter) */ + .long 0xa8 /* DW_AT_call_parameter */ + .uleb128 0x1 /* DW_AT_call_value */ + .byte 0x34 /* DW_OP_lit4 */ + .byte 0 /* end of children of DIE 0x161 */ + .uleb128 0x13 /* (DIE (0x180) DW_TAG_call_site) */ + .quad .LVL4 /* DW_AT_call_return_pc */ + .long 0xd1 /* DW_AT_call_origin */ + .uleb128 0x3 /* (DIE (0x18d) DW_TAG_call_site_parameter) */ + .uleb128 0x1 /* DW_AT_location */ + .byte 0x55 /* DW_OP_reg5 */ + .uleb128 0x2 /* DW_AT_call_value */ + .byte 0x75 /* DW_OP_breg5 */ + .sleb128 0 + .uleb128 0x4 /* (DIE (0x193) DW_TAG_call_site_parameter) */ + .long 0xa8 /* DW_AT_call_parameter */ + .uleb128 0x1 /* DW_AT_call_value */ + .byte 0x3a /* DW_OP_lit10 */ + .byte 0 /* end of children of DIE 0x180 */ + .byte 0 /* end of children of DIE 0x125 */ + .byte 0 /* end of children of DIE 0xc */ + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 /* (abbrev code) */ + .uleb128 0x5 /* (TAG: DW_TAG_formal_parameter) */ + .byte 0 /* DW_children_no */ + .uleb128 0x3 /* (DW_AT_name) */ + .uleb128 0x8 /* (DW_FORM_string) */ + .uleb128 0x3a /* (DW_AT_decl_file) */ + .uleb128 0x21 /* (DW_FORM_implicit_const) */ + .sleb128 1 /* (gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .uleb128 0x3b /* (DW_AT_decl_line) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x49 /* (DW_AT_type) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .uleb128 0x2 /* (abbrev code) */ + .uleb128 0x34 /* (TAG: DW_TAG_variable) */ + .byte 0 /* DW_children_no */ + .uleb128 0x3 /* (DW_AT_name) */ + .uleb128 0x8 /* (DW_FORM_string) */ + .uleb128 0x3a /* (DW_AT_decl_file) */ + .uleb128 0x21 /* (DW_FORM_implicit_const) */ + .sleb128 1 /* (gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .uleb128 0x3b /* (DW_AT_decl_line) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x49 /* (DW_AT_type) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .uleb128 0x3 /* (abbrev code) */ + .uleb128 0x49 /* (TAG: DW_TAG_call_site_parameter) */ + .byte 0 /* DW_children_no */ + .uleb128 0x2 /* (DW_AT_location) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .uleb128 0x7e /* (DW_AT_call_value) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .byte 0 + .byte 0 + .uleb128 0x4 /* (abbrev code) */ + .uleb128 0x49 /* (TAG: DW_TAG_call_site_parameter) */ + .byte 0 /* DW_children_no */ + .uleb128 0x80 /* (DW_AT_call_parameter) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x7e /* (DW_AT_call_value) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .byte 0 + .byte 0 + .uleb128 0x5 /* (abbrev code) */ + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x3 /* (DW_AT_name) */ + .uleb128 0x8 /* (DW_FORM_string) */ + .uleb128 0x3a /* (DW_AT_decl_file) */ + .uleb128 0x21 /* (DW_FORM_implicit_const) */ + .sleb128 1 /* (gdb.arch/amd64-entry-value-param-dwarf5.c) */ + .uleb128 0x3b /* (DW_AT_decl_line) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x27 /* (DW_AT_prototyped) */ + .uleb128 0x19 /* (DW_FORM_flag_present) */ + .uleb128 0x49 /* (DW_AT_type) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x20 /* (DW_AT_inline) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x1 /* (DW_AT_sibling) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .uleb128 0x6 /* (abbrev code) */ + .uleb128 0x5 /* (TAG: DW_TAG_formal_parameter) */ + .byte 0 /* DW_children_no */ + .uleb128 0x31 /* (DW_AT_abstract_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x2 /* (DW_AT_location) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .byte 0 + .byte 0 + .uleb128 0x7 /* (abbrev code) */ + .uleb128 0x34 /* (TAG: DW_TAG_variable) */ + .byte 0 /* DW_children_no */ + .uleb128 0x31 /* (DW_AT_abstract_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x2 /* (DW_AT_location) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .byte 0 + .byte 0 + .uleb128 0x8 /* (abbrev code) */ + .uleb128 0x5 /* (TAG: DW_TAG_formal_parameter) */ + .byte 0 /* DW_children_no */ + .uleb128 0x31 /* (DW_AT_abstract_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x1c /* (DW_AT_const_value) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .byte 0 + .byte 0 + .uleb128 0x9 /* (abbrev code) */ + .uleb128 0x48 /* (TAG: DW_TAG_call_site) */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x7d /* (DW_AT_call_return_pc) */ + .uleb128 0x1 /* (DW_FORM_addr) */ + .uleb128 0x7f /* (DW_AT_call_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x1 /* (DW_AT_sibling) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .uleb128 0xa /* (abbrev code) */ + .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x25 /* (DW_AT_producer) */ + .uleb128 0xe /* (DW_FORM_strp) */ + .uleb128 0x13 /* (DW_AT_language) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x3 /* (DW_AT_name) */ + .uleb128 0x1f /* (DW_FORM_line_strp) */ + .uleb128 0x1b /* (DW_AT_comp_dir) */ + .uleb128 0x1f /* (DW_FORM_line_strp) */ + .uleb128 0x55 /* (DW_AT_ranges) */ + .uleb128 0x17 /* (DW_FORM_sec_offset) */ + .uleb128 0x11 /* (DW_AT_low_pc) */ + .uleb128 0x1 /* (DW_FORM_addr) */ + .uleb128 0x10 /* (DW_AT_stmt_list) */ + .uleb128 0x17 /* (DW_FORM_sec_offset) */ + .byte 0 + .byte 0 + .uleb128 0xb /* (abbrev code) */ + .uleb128 0x34 /* (TAG: DW_TAG_variable) */ + .byte 0 /* DW_children_no */ + .uleb128 0x3 /* (DW_AT_name) */ + .uleb128 0x8 /* (DW_FORM_string) */ + .uleb128 0x3a /* (DW_AT_decl_file) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x3b /* (DW_AT_decl_line) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x49 /* (DW_AT_type) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x3f /* (DW_AT_external) */ + .uleb128 0x19 /* (DW_FORM_flag_present) */ + .uleb128 0x2 /* (DW_AT_location) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .byte 0 + .byte 0 + .uleb128 0xc /* (abbrev code) */ + .uleb128 0x24 /* (TAG: DW_TAG_base_type) */ + .byte 0 /* DW_children_no */ + .uleb128 0xb /* (DW_AT_byte_size) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x3e /* (DW_AT_encoding) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x3 /* (DW_AT_name) */ + .uleb128 0x8 /* (DW_FORM_string) */ + .byte 0 + .byte 0 + .uleb128 0xd /* (abbrev code) */ + .uleb128 0x35 /* (TAG: DW_TAG_volatile_type) */ + .byte 0 /* DW_children_no */ + .uleb128 0x49 /* (DW_AT_type) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .uleb128 0xe /* (abbrev code) */ + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x3f /* (DW_AT_external) */ + .uleb128 0x19 /* (DW_FORM_flag_present) */ + .uleb128 0x3 /* (DW_AT_name) */ + .uleb128 0xe /* (DW_FORM_strp) */ + .uleb128 0x3a /* (DW_AT_decl_file) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x3b /* (DW_AT_decl_line) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x27 /* (DW_AT_prototyped) */ + .uleb128 0x19 /* (DW_FORM_flag_present) */ + .uleb128 0x49 /* (DW_AT_type) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x11 /* (DW_AT_low_pc) */ + .uleb128 0x1 /* (DW_FORM_addr) */ + .uleb128 0x12 /* (DW_AT_high_pc) */ + .uleb128 0x7 /* (DW_FORM_data8) */ + .uleb128 0x40 /* (DW_AT_frame_base) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .uleb128 0x7a /* (DW_AT_call_all_calls) */ + .uleb128 0x19 /* (DW_FORM_flag_present) */ + .uleb128 0x1 /* (DW_AT_sibling) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .uleb128 0xf /* (abbrev code) */ + .uleb128 0x48 /* (TAG: DW_TAG_call_site) */ + .byte 0 /* DW_children_no */ + .uleb128 0x7d /* (DW_AT_call_return_pc) */ + .uleb128 0x1 /* (DW_FORM_addr) */ + .uleb128 0x82 /* (DW_AT_call_tail_call) */ + .uleb128 0x19 /* (DW_FORM_flag_present) */ + .uleb128 0x7f /* (DW_AT_call_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .uleb128 0x10 /* (abbrev code) */ + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x31 /* (DW_AT_abstract_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x11 /* (DW_AT_low_pc) */ + .uleb128 0x1 /* (DW_FORM_addr) */ + .uleb128 0x12 /* (DW_AT_high_pc) */ + .uleb128 0x7 /* (DW_FORM_data8) */ + .uleb128 0x40 /* (DW_AT_frame_base) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .uleb128 0x7a /* (DW_AT_call_all_calls) */ + .uleb128 0x19 /* (DW_FORM_flag_present) */ + .uleb128 0x1 /* (DW_AT_sibling) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .uleb128 0x11 /* (abbrev code) */ + .uleb128 0x34 /* (TAG: DW_TAG_variable) */ + .byte 0 /* DW_children_no */ + .uleb128 0x31 /* (DW_AT_abstract_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x1c /* (DW_AT_const_value) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .byte 0 + .byte 0 + .uleb128 0x12 /* (abbrev code) */ + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x31 /* (DW_AT_abstract_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x11 /* (DW_AT_low_pc) */ + .uleb128 0x1 /* (DW_FORM_addr) */ + .uleb128 0x12 /* (DW_AT_high_pc) */ + .uleb128 0x7 /* (DW_FORM_data8) */ + .uleb128 0x40 /* (DW_AT_frame_base) */ + .uleb128 0x18 /* (DW_FORM_exprloc) */ + .uleb128 0x7a /* (DW_AT_call_all_calls) */ + .uleb128 0x19 /* (DW_FORM_flag_present) */ + .byte 0 + .byte 0 + .uleb128 0x13 /* (abbrev code) */ + .uleb128 0x48 /* (TAG: DW_TAG_call_site) */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x7d /* (DW_AT_call_return_pc) */ + .uleb128 0x1 /* (DW_FORM_addr) */ + .uleb128 0x7f /* (DW_AT_call_origin) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .byte 0 + .byte 0 + .byte 0 + .section .debug_aranges,"",@progbits + .long 0x3c /* Length of Address Ranges Info */ + .value 0x2 /* DWARF Version */ + .long .Ldebug_info0 /* Offset of Compilation Unit Info */ + .byte 0x8 /* Size of Address */ + .byte 0 /* Size of Segment Descriptor */ + .value 0 /* Pad to 16 byte boundary */ + .value 0 + .quad .Ltext0 /* Address */ + .quad .Letext0-.Ltext0 /* Length */ + .quad .LFB2 /* Address */ + .quad .LFE2-.LFB2 /* Length */ + .quad 0 + .quad 0 + .section .debug_rnglists,"",@progbits +.Ldebug_ranges0: + .long .Ldebug_ranges3-.Ldebug_ranges2 /* Length of Range Lists */ +.Ldebug_ranges2: + .value 0x5 /* DWARF Version */ + .byte 0x8 /* Address Size */ + .byte 0 /* Segment Size */ + .long 0 /* Offset Entry Count */ +.LLRL0: + .byte 0x7 /* DW_RLE_start_length (*.LLRL0) */ + .quad .Ltext0 /* Range begin address (*.LLRL0) */ + .uleb128 .Letext0-.Ltext0 /* Range length (*.LLRL0) */ + .byte 0x7 /* DW_RLE_start_length (*.LLRL0) */ + .quad .LFB2 /* Range begin address (*.LLRL0) */ + .uleb128 .LFE2-.LFB2 /* Range length (*.LLRL0) */ + .byte 0 /* DW_RLE_end_of_list (*.LLRL0) */ +.Ldebug_ranges3: + .section .debug_line,"",@progbits +.Ldebug_line0: + .long .LELT0-.LSLT0 /* Length of Source Line Info */ +.LSLT0: + .value 0x5 /* DWARF Version */ + .byte 0x8 /* Address Size */ + .byte 0 /* Segment Size */ + .long .LELTP0-.LASLTP0 /* Prolog Length */ +.LASLTP0: + .byte 0x1 /* Minimum Instruction Length */ + .byte 0x1 /* Maximum Operations Per Instruction */ + .byte 0x1 /* Default is_stmt_start flag */ + .byte 0xf6 /* Line Base Value (Special Opcodes) */ + .byte 0xf2 /* Line Range Value (Special Opcodes) */ + .byte 0xd /* Special Opcode Base */ + .byte 0 /* opcode: 0x1 has 0 args */ + .byte 0x1 /* opcode: 0x2 has 1 args */ + .byte 0x1 /* opcode: 0x3 has 1 args */ + .byte 0x1 /* opcode: 0x4 has 1 args */ + .byte 0x1 /* opcode: 0x5 has 1 args */ + .byte 0 /* opcode: 0x6 has 0 args */ + .byte 0 /* opcode: 0x7 has 0 args */ + .byte 0 /* opcode: 0x8 has 0 args */ + .byte 0x1 /* opcode: 0x9 has 1 args */ + .byte 0 /* opcode: 0xa has 0 args */ + .byte 0 /* opcode: 0xb has 0 args */ + .byte 0x1 /* opcode: 0xc has 1 args */ + .byte 0x1 /* Directory entry format count */ + .uleb128 0x1 /* DW_LNCT_path */ + .uleb128 0x1f /* DW_FORM_line_strp */ + .uleb128 0x2 /* Directories count */ + .long .LASF1 /* Directory Entry: 0: "" */ + .long .LASF4 /* Directory Entry: 0: "gdb.arch" */ + .byte 0x2 /* File name entry format count */ + .uleb128 0x1 /* DW_LNCT_path */ + .uleb128 0x1f /* DW_FORM_line_strp */ + .uleb128 0x2 /* DW_LNCT_directory_index */ + .uleb128 0xb /* DW_FORM_data1 */ + .uleb128 0x2 /* File names count */ + .long .LASF0 /* File Entry: 0: "gdb.arch/amd64-entry-value-param-dwarf5.c" */ + .byte 0 + .long .LASF5 /* File Entry: 0: "amd64-entry-value-param-dwarf5.c" */ + .byte 0x1 +.LELTP0: + .byte 0 /* set address *.LM8 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM8 + .byte 0x3c /* line 38 */ + .byte 0 /* set address *.LM9 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM9 + .byte 0x18 /* line 39 */ + .byte 0 /* set address *.LFE2 */ + .uleb128 0x9 + .byte 0x2 + .quad .LFE2 + .byte 0 /* end sequence */ + .uleb128 0x1 + .byte 0x1 + .byte 0 /* set address *.LM1 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM1 + .byte 0x2b /* line 21 */ + .byte 0 /* set address *.LM2 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM2 + .byte 0x1c /* line 26 */ + .byte 0 /* set address *.LM3 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM3 + .byte 0x18 /* line 27 */ + .byte 0 /* set address *.LM4 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM4 + .byte 0x18 /* line 28 */ + .byte 0 /* set address *.LM5 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM5 + .byte 0x1a /* line 31 */ + .byte 0 /* set address *.LM6 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM6 + .byte 0x19 /* line 33 */ + .byte 0 /* set address *.LM7 */ + .uleb128 0x9 + .byte 0x2 + .quad .LM7 + .byte 0x18 /* line 34 */ + .byte 0 /* set address *.Letext0 */ + .uleb128 0x9 + .byte 0x2 + .quad .Letext0 + .byte 0 /* end sequence */ + .uleb128 0x1 + .byte 0x1 +.LELT0: + .section .debug_str,"MS",@progbits,1 +.LASF2: + .string "GNU C11 7.0.1 20170218 (experimental) -mtune=generic -march=x86-64 -gdwarf-5 -O2" +.LASF3: + .string "main" + .section .debug_line_str,"MS",@progbits,1 +.LASF5: + .string "amd64-entry-value-param-dwarf5.c" +.LASF0: + .string "gdb.arch/amd64-entry-value-param-dwarf5.c" +.LASF1: + .string "" +.LASF4: + .string "gdb.arch" + .ident "GCC: (GNU) 7.0.1 20170218 (experimental)" + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.c b/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.c new file mode 100644 index 0000000..d677516 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.c @@ -0,0 +1,40 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2012-2017 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +volatile int vv; + +static __attribute__((noinline)) int +foo (int x, int y, int z) +{ + int a = x * 2; + int b = y * 2; + int c = z * 2; + vv++; /* break-here */ + return x + z; +} + +static __attribute__((noinline)) int +bar (int x) +{ + return foo (x, 2, 3) + foo (x, 4, 3) + foo (x + 6, x, 3) + x; +} + +int +main (void) +{ + return bar (10); +} diff --git a/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.exp b/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.exp new file mode 100644 index 0000000..0357ff4 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-entry-value-param-dwarf5.exp @@ -0,0 +1,49 @@ +# Copyright (C) 2012-2017 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +standard_testfile .S .c +set opts {} + +if [info exists COMPILE] { + # make check RUNTESTFLAGS="gdb.arch/amd64-entry-value-param-dwarf5.exp COMPILE=1" + set srcfile ${srcfile2} + lappend opts optimize=-O2 additional_flags=-gdwarf-5 +} elseif { ![istarget x86_64-*-* ] || ![is_lp64_target] } { + verbose "Skipping amd64-entry-value-param-dwarf5." + return +} + +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} $opts] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +set srcfile $srcfile2 +gdb_breakpoint [gdb_get_line_number "break-here"] + +gdb_continue_to_breakpoint "break-here" ".* break-here .*" +gdb_test "p y" " = 2" +gdb_test "p b" " = 4" + +gdb_continue_to_breakpoint "break-here" ".* break-here .*" +gdb_test "p y" " = 4" +gdb_test "p b" " = 8" + +gdb_continue_to_breakpoint "break-here" ".* break-here .*" +gdb_test "p y" " = 10" +gdb_test "p b" " = 20" diff --git a/gdb/testsuite/gdb.arch/amd64-entry-value.exp b/gdb/testsuite/gdb.arch/amd64-entry-value.exp index ee6bff5..d041b37 100644 --- a/gdb/testsuite/gdb.arch/amd64-entry-value.exp +++ b/gdb/testsuite/gdb.arch/amd64-entry-value.exp @@ -159,7 +159,7 @@ gdb_test_no_output "set print entry-values default" "entry_invalid: set print en gdb_test "frame" {\(inv=\).*} "entry_invalid: frame: default" -# Test @entry values for DW_AT_GNU_call_site_data_value parameters. +# Test @entry values for DW_AT_call_data_value parameters. gdb_continue_to_breakpoint "entry_reference: reference" @@ -188,7 +188,7 @@ gdb_test "p regparam@entry" " = \\(int &\\) @$addr: 1" "entry_reference: p regpa gdb_test "p ®param@entry" " = \\(int \\*\\) $addr" "entry_reference: p ®param@entry" gdb_test "p regcopy" " = 1" "entry_reference: p regcopy" gdb_test "p nodataparam" " = \\(int &\\) @0x\[0-9a-f\]+: 22" "entry_reference: p nodataparam" -gdb_test "p nodataparam@entry" "Cannot resolve DW_AT_GNU_call_site_data_value" "entry_reference: p nodataparam@entry" +gdb_test "p nodataparam@entry" "Cannot resolve DW_AT_call_data_value" "entry_reference: p nodataparam@entry" # Test virtual tail call frames. @@ -249,5 +249,5 @@ gdb_test "bt" "^bt\r\n#0 +d \\(i=, j=\\)\[^\r\n\]* "self: bt" gdb_test_no_output "set debug entry-values 1" -gdb_test "bt" "DW_OP_GNU_entry_value resolving has found function \"self\\(int\\)\" at 0x\[0-9a-f\]+ can call itself via tail calls\r\n.*" \ +gdb_test "bt" "DW_OP_entry_value resolving has found function \"self\\(int\\)\" at 0x\[0-9a-f\]+ can call itself via tail calls\r\n.*" \ "self: bt debug entry-values"