* [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
@ 2012-03-14 13:38 Gary Benson
2012-03-14 17:51 ` Doug Evans
0 siblings, 1 reply; 19+ messages in thread
From: Gary Benson @ 2012-03-14 13:38 UTC (permalink / raw)
To: gdb-patches, Eli Zaretskii, Mark Wielaard, Jan Kratochvil, Doug Evans
[-- Attachment #1: Type: text/plain, Size: 677 bytes --]
Hi all,
This patch makes GDB able to set breakpoints on inlined functions.
This version of the patch has been updated to address Eli, Jan
and Doug's comments on my previous version. I have renamed the
compatibility option from --allow-incomplete-gdb-indexes to
--use-old-index-sections and documented the option in NEWS. I
also added a warning which will be printed the first time GDB
finds an old .gdb_index section if --use-old-index-sections is
not being used. Note that I had to modify some tests to ignore
these messages. The documentation is essentially unchanged bar
some specific changes Eli requested.
How does this look?
Thanks,
Gary
--
http://gbenson.net/
[-- Attachment #2: break-on-inline-20120314-1.patch --]
[-- Type: text/plain, Size: 80054 bytes --]
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 42fb1a5..bd1e5d9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,27 @@
+2012-03-14 Gary Benson <gbenson@redhat.com>
+
+ PR breakpoints/10738
+ * dwarf2read.c (allow_incomplete_gdb_indexes): New global.
+ (struct partial_die_info): New member may_be_inlined.
+ (read_partial_die): Set may_be_inlined where appropriate.
+ (add_partial_subprogram): Add partial symbols for partial
+ DIEs that may be inlined.
+ (new_symbol_full): Add inlined subroutines to the current
+ scope.
+ (write_psymtabs_to_index): Bump version number.
+ (dwarf2_read_index): Read only version 6 indices unless
+ allow_incomplete_gdb_indexes is set.
+ * linespec.c (symbol_and_data_callback): New structure.
+ (iterate_inline_only): New function.
+ (iterate_over_all_matching_symtabs): New argument
+ "include_inline". If nonzero, also call the callback for
+ symbols representing inlined subroutines.
+ (lookup_prefix_sym): Pass extra argument to the above.
+ (find_function_symbols): Likewise.
+ (add_matching_symbols_to_info): Likewise.
+ * NEWS: Mention that GDB can now set breakpoints on inlined
+ functions.
+
2012-03-13 Yao Qi <yao@codesourcery.com>
* inferior.h (struct inferior): Remove fields any_syscall_count,
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 20f2816..f78dec0 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,11 @@
+2012-03-14 Gary Benson <gbenson@redhat.com>
+
+ PR breakpoints/10738
+ * gdb.texinfo (Inline Functions): Remove the now-unnecessary @item
+ stating that GDB cannot set breakpoints on inlined functions.
+ (Mode Options): Document --allow-incomplete-gdb-indexes.
+ (Index Section Format): Document new index section version format.
+
2012-03-07 Pedro Alves <palves@redhat.com>
* gdb.texinfo (General Query Packets): Document new
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 16a32e4..d6fd998 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,14 @@
+2012-03-14 Gary Benson <gbenson@redhat.com>
+
+ PR breakpoints/10738
+ * gdb.opt/inline-break.exp: New file.
+ * gdb.opt/inline-break.c: Likewise.
+ * gdb.dwarf2/inline-break.exp: Likewise.
+ * gdb.dwarf2/inline-break.S: Likewise.
+ * gdb.base/annota1.exp: Cope with old .gdb_index warnings.
+ * gdb.base/async-shell.exp: Likewise.
+ * lib/mi-support.exp (library_loaded_re): Likewise.
+
2012-03-08 Keith Seitz <keiths@redhat.com>
* lib/gdb.exp (gdb_get_line_number): Throw an
diff --git a/gdb/NEWS b/gdb/NEWS
index 9c89346..33ed8d4 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -60,6 +60,17 @@
* The "info static-tracepoint-marker" command will now also work on
native Linux targets with in-process agent.
+* GDB can now set breakpoints on inlined functions.
+
+* The .gdb_index section has been updated to include symbols for
+ inlined functions. GDB will ignore older .gdb_index sections by
+ default, which could cause symbol files to be loaded more slowly
+ until their .gdb_index sections can be recreated. The new option
+ --use-old-index-sections will cause GDB to use any older .gdb_index
+ sections it finds. This will restore performance, but the ability
+ to set breakpoints on inlined functions will be lost in symbol files
+ with older .gdb_index sections.
+
* New commands
** "catch load" and "catch unload" can be used to stop when a shared
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index e8bbded..9ec58c4 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -1221,6 +1221,13 @@ memory usage after it completes each command and returns to the prompt.
This option causes @value{GDBN} to print its version number and
no-warranty blurb, and exit.
+@item -use-old-index-sections
+@cindex @code{--use-old-index-sections}
+This option causes @value{GDBN} to read and use old and possibly
+incomplete @samp{.gdb_index} sections from symbol files. This can
+speed up startup, but may result in some functionality being lost.
+@xref{Index Section Format}.
+
@end table
@node Startup
@@ -9889,14 +9896,6 @@ function calls are the same as normal calls:
@itemize @bullet
@item
-You cannot set breakpoints on inlined functions. @value{GDBN}
-either reports that there is no symbol with that name, or else sets the
-breakpoint only on non-inlined copies of the function. This limitation
-will be removed in a future version of @value{GDBN}; until then,
-set a breakpoint by line number on the first line of the inlined
-function instead.
-
-@item
Setting breakpoints at the call site of an inlined function may not
work, because the call site does not contain any code. @value{GDBN}
may incorrectly move the breakpoint to the next line of the enclosing
@@ -38976,8 +38975,11 @@ unless otherwise noted:
@enumerate
@item
-The version number, currently 5. Versions 1, 2 and 3 are obsolete.
-Version 4 differs by its hashing function.
+The version number, currently 6. Versions 1, 2 and 3 are obsolete.
+Version 4 uses a different hashing function from versions 5 and 6.
+Version 6 includes symbols for inlined functions, whereas versions
+4 and 5 do not. @value{GDBN} will only read version 4 and 5 indices
+if the @code{--use-old-index-sections} option is used.
@item
The offset, from the start of the file, of the CU list.
@@ -39052,7 +39054,7 @@ index version:
@item Version 4
The formula is @code{r = r * 67 + c - 113}.
-@item Version 5
+@item Versions 5 and 6
The formula is @code{r = r * 67 + tolower (c) - 113}.
@end table
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index ebe855b..a5ea4c3 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -85,6 +85,9 @@ static int dwarf2_die_debug = 0;
/* When non-zero, cross-check physname against demangler. */
static int check_physname = 0;
+/* When non-zero, do not reject incomplete .gdb_index sections. */
+int use_old_index_sections = 0;
+
static int pagesize;
/* When set, the file that we're processing is known to have debugging
@@ -539,6 +542,7 @@ struct partial_die_info
unsigned int has_type : 1;
unsigned int has_specification : 1;
unsigned int has_pc_info : 1;
+ unsigned int may_be_inlined : 1;
/* Flag set if the SCOPE field of this structure has been
computed. */
@@ -2118,13 +2122,38 @@ dwarf2_read_index (struct objfile *objfile)
/* Versions earlier than 3 emitted every copy of a psymbol. This
causes the index to behave very poorly for certain requests. Version 3
contained incomplete addrmap. So, it seems better to just ignore such
- indices. Index version 4 uses a different hash function than index
- version 5 and later. */
- if (version < 4)
- return 0;
- /* Indices with higher version than the one supported by GDB may be no
+ indices.
+
+ Index version 4 uses a different hash function than index version
+ 5 and later.
+
+ Versions earlier than 6 did not emit psymbols for inlined
+ functions. Using these files will cause GDB not to be able to
+ set breakpoints on inlined functions by name, so we ignore these
+ indices unless the --use-old-index-sections command line option
+ was supplied. */
+ if (use_old_index_sections)
+ {
+ if (version < 4)
+ return 0;
+ }
+ else
+ {
+ if (version < 6)
+ {
+ static int warning_printed = 0;
+ if (!warning_printed)
+ {
+ warning (_("Skipping old .gdb_index section in %s."),
+ objfile->name);
+ warning_printed = 1;
+ }
+ return 0;
+ }
+ }
+ /* Indexes with higher version than the one supported by GDB may be no
longer backward compatible. */
- if (version > 5)
+ if (version > 6)
return 0;
map = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct mapped_index);
@@ -4244,6 +4273,10 @@ add_partial_subprogram (struct partial_die_info *pdi,
pdi->highpc - 1 + baseaddr,
cu->per_cu->v.psymtab);
}
+ }
+
+ if (pdi->has_pc_info || (!pdi->is_external && pdi->may_be_inlined))
+ {
if (!pdi->is_declaration)
/* Ignore subprogram DIEs that do not have a name, they are
illegal. Do not emit a complaint at this point, we will
@@ -9874,6 +9907,11 @@ read_partial_die (struct partial_die_info *part_die,
language_of_main = language_fortran;
}
break;
+ case DW_AT_inline:
+ if (DW_UNSND (&attr) == DW_INL_inlined
+ || DW_UNSND (&attr) == DW_INL_declared_inlined)
+ part_die->may_be_inlined = 1;
+ break;
default:
break;
}
@@ -11718,8 +11756,7 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
finish_block. */
SYMBOL_CLASS (sym) = LOC_BLOCK;
SYMBOL_INLINED (sym) = 1;
- /* Do not add the symbol to any lists. It will be found via
- BLOCK_FUNCTION from the blockvector. */
+ list_to_add = cu->list_in_scope;
break;
case DW_TAG_template_value_param:
suppress_add = 1;
@@ -17022,7 +17059,7 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
total_len = size_of_contents;
/* The version number. */
- val = MAYBE_SWAP (5);
+ val = MAYBE_SWAP (6);
obstack_grow (&contents, &val, sizeof (val));
/* The offset of the CU list from the start of the file. */
diff --git a/gdb/linespec.c b/gdb/linespec.c
index c2057cf..1e9770e 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -321,6 +321,33 @@ cplusplus_error (const char *name, const char *fmt, ...)
throw_error (NOT_FOUND_ERROR, "%s", message);
}
+/* A callback function and the additional data to call it with. */
+
+struct symbol_and_data_callback
+{
+ /* The callback to use. */
+ symbol_found_callback_ftype *callback;
+
+ /* Data to be passed to the callback. */
+ void *data;
+};
+
+/* A helper for iterate_over_all_matching_symtabs that is used to
+ restrict calls to another callback to symbols representing inline
+ symbols only. */
+
+static int
+iterate_inline_only (struct symbol *sym, void *d)
+{
+ if (SYMBOL_INLINED (sym))
+ {
+ struct symbol_and_data_callback *cad = d;
+
+ return cad->callback (sym, cad->data);
+ }
+ return 1; /* Continue iterating. */
+}
+
/* Some data for the expand_symtabs_matching callback. */
struct symbol_matcher_data
@@ -348,14 +375,16 @@ iterate_name_matcher (const char *name, void *d)
/* A helper that walks over all matching symtabs in all objfiles and
calls CALLBACK for each symbol matching NAME. If SEARCH_PSPACE is
not NULL, then the search is restricted to just that program
- space. */
+ space. If INCLUDE_INLINE is nonzero then symbols representing
+ inlined instances of functions will be included in the result. */
static void
iterate_over_all_matching_symtabs (const char *name,
const domain_enum domain,
symbol_found_callback_ftype *callback,
void *data,
- struct program_space *search_pspace)
+ struct program_space *search_pspace,
+ int include_inline)
{
struct objfile *objfile;
struct program_space *pspace;
@@ -394,6 +423,20 @@ iterate_over_all_matching_symtabs (const char *name,
block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK);
LA_ITERATE_OVER_SYMBOLS (block, name, domain, callback, data);
+
+ if (include_inline)
+ {
+ struct symbol_and_data_callback cad = { callback, data };
+ int i;
+
+ for (i = FIRST_LOCAL_BLOCK;
+ i < BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (symtab)); i++)
+ {
+ block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), i);
+ LA_ITERATE_OVER_SYMBOLS (block, name, domain,
+ iterate_inline_only, &cad);
+ }
+ }
}
}
}
@@ -1885,10 +1928,10 @@ lookup_prefix_sym (char **argptr, char *p, VEC (symtab_p) *file_symtabs,
{
iterate_over_all_matching_symtabs (copy, STRUCT_DOMAIN,
collect_one_symbol, &collector,
- NULL);
+ NULL, 0);
iterate_over_all_matching_symtabs (copy, VAR_DOMAIN,
collect_one_symbol, &collector,
- NULL);
+ NULL, 0);
}
else
{
@@ -2251,7 +2294,8 @@ find_function_symbols (char **argptr, char *p, int is_quote_enclosed,
copy[p - *argptr] = 0;
iterate_over_all_matching_symtabs (copy, VAR_DOMAIN,
- collect_function_symbols, &result, NULL);
+ collect_function_symbols, &result, NULL,
+ 0);
if (VEC_empty (symbolp, result))
VEC_free (symbolp, result);
@@ -2952,7 +2996,7 @@ add_matching_symbols_to_info (const char *name,
{
iterate_over_all_matching_symtabs (name, VAR_DOMAIN,
collect_symbols, info,
- pspace);
+ pspace, 1);
search_minsyms_for_name (info, name, pspace);
}
else if (pspace == NULL || pspace == SYMTAB_PSPACE (elt))
diff --git a/gdb/main.c b/gdb/main.c
index e46f823..dd1955d 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -450,6 +450,7 @@ captured_main (void *data)
{"args", no_argument, &set_args, 1},
{"l", required_argument, 0, 'l'},
{"return-child-result", no_argument, &return_child_result, 1},
+ {"use-old-index-sections", no_argument, &use_old_index_sections, 1},
{0, no_argument, 0, 0}
};
@@ -1021,6 +1022,10 @@ Options:\n\n\
"), stream);
#endif
fputs_unfiltered (_("\
+ --use-old-index-sections\n\
+ Do not reject old (broken) .gdb_index sections.\n\
+"), stream);
+ fputs_unfiltered (_("\
--version Print version information and then exit.\n\
-w Use a window interface.\n\
--write Set writing into executable and core files.\n\
diff --git a/gdb/symfile.h b/gdb/symfile.h
index d4f3fd9..1958c3c 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -617,6 +617,9 @@ extern void dwarf2_build_frame_info (struct objfile *);
void dwarf2_free_objfile (struct objfile *);
+/* Whether to use old and possibly incomplete .gdb_index sections. */
+extern int use_old_index_sections;
+
/* From mdebugread.c */
/* Hack to force structures to exist before use in parameter list. */
diff --git a/gdb/testsuite/gdb.base/annota1.exp b/gdb/testsuite/gdb.base/annota1.exp
index ae16667..fe91d1c 100644
--- a/gdb/testsuite/gdb.base/annota1.exp
+++ b/gdb/testsuite/gdb.base/annota1.exp
@@ -133,7 +133,7 @@ gdb_test_multiple "info break" "breakpoint info" {
#exp_internal 1
set binexp [string_to_regexp $binfile]
gdb_test_multiple "run" "run until main breakpoint" {
- -re "\r\n\032\032post-prompt\r\nStarting program: $binexp \(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)+\r\n\r\n\032\032starting\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)*\r\n\r\n\032\032breakpoint 1\r\n\r\nBreakpoint 1, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*annota1.c\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n$main_line\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*$srcfile:$main_line:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped.*$gdb_prompt$" {
+ -re "\r\n\032\032post-prompt\r\nStarting program: $binexp \(\r\nwarning: Skipping old .gdb_index section in \[^\r\n\]+\)?\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)+\r\n\r\n\032\032starting\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)*\r\n\r\n\032\032breakpoint 1\r\n\r\nBreakpoint 1, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*annota1.c\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n$main_line\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*$srcfile:$main_line:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped.*$gdb_prompt$" {
pass "run until main breakpoint"
}
}
diff --git a/gdb/testsuite/gdb.base/async-shell.exp b/gdb/testsuite/gdb.base/async-shell.exp
index 4949cf9..e894674 100644
--- a/gdb/testsuite/gdb.base/async-shell.exp
+++ b/gdb/testsuite/gdb.base/async-shell.exp
@@ -29,9 +29,11 @@ if { [prepare_for_testing ${testfile}.exp ${testfile}] } {
return -1
}
+set gdbindex_warning_re "warning: Skipping old \\.gdb_index section \[^\r\n\]*"
+
gdb_test_no_output "set target-async on "
gdb_test_no_output "set non-stop on"
-gdb_test "run &" "Starting program: \[^\r\n\]*"
+gdb_test "run &" "Starting program: \[^\r\n\]*(\r\n$gdbindex_warning_re)?"
# `sleep 5' here would workaround the bug, do not sleep here.
# "shell" could eat waitpid event from the asynchronous inferior process.
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-break.S b/gdb/testsuite/gdb.dwarf2/dw2-inline-break.S
new file mode 100644
index 0000000..92da965
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-break.S
@@ -0,0 +1,1663 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2012 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 <http://www.gnu.org/licenses/>. */
+
+/* This source file was generated using the following command line:
+
+ gcc -S -dA -g -O2 ../gdb.opt/inline-break.c -o inline-break.S
+
+*/
+ .file "inline-break.c"
+ .section .debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+ .section .debug_info,"",@progbits
+.Ldebug_info0:
+ .section .debug_line,"",@progbits
+.Ldebug_line0:
+ .text
+.Ltext0:
+ .p2align 4,,15
+.globl func2
+ .type func2, @function
+func2:
+.LFB1:
+ .file 1 "../gdb.opt/inline-break.c"
+ # ../gdb.opt/inline-break.c:39
+ .loc 1 39 0
+ .cfi_startproc
+.LVL0:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:40
+ .loc 1 40 0
+ movl %edi, %eax
+ sall $4, %eax
+ addl %edi, %eax
+ # ../gdb.opt/inline-break.c:41
+ .loc 1 41 0
+ ret
+ .cfi_endproc
+.LFE1:
+ .size func2, .-func2
+ .p2align 4,,15
+.globl func4a
+ .type func4a, @function
+func4a:
+.LFB5:
+ # ../gdb.opt/inline-break.c:69
+ .loc 1 69 0
+ .cfi_startproc
+.LVL1:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:70
+ .loc 1 70 0
+ movl %edi, %eax
+ sall $4, %eax
+ leal (%rax,%rdi), %edi
+.LVL2:
+.LBB46:
+.LBB47:
+ # ../gdb.opt/inline-break.c:64
+ .loc 1 64 0
+ xorl %eax, %eax
+ cmpl $12, %edi
+ setg %al
+ addl $1, %eax
+.LBE47:
+.LBE46:
+ # ../gdb.opt/inline-break.c:71
+ .loc 1 71 0
+ ret
+ .cfi_endproc
+.LFE5:
+ .size func4a, .-func4a
+ .p2align 4,,15
+.globl func5b
+ .type func5b, @function
+func5b:
+.LFB6:
+ # ../gdb.opt/inline-break.c:78
+ .loc 1 78 0
+ .cfi_startproc
+.LVL3:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:79
+ .loc 1 79 0
+ xorl %eax, %eax
+ cmpl $11, %edi
+ setg %al
+ addl $1, %eax
+ # ../gdb.opt/inline-break.c:80
+ .loc 1 80 0
+ ret
+ .cfi_endproc
+.LFE6:
+ .size func5b, .-func5b
+ .p2align 4,,15
+.globl func6b
+ .type func6b, @function
+func6b:
+.LFB8:
+ # ../gdb.opt/inline-break.c:93
+ .loc 1 93 0
+ .cfi_startproc
+.LVL4:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:94
+ .loc 1 94 0
+ xorl %eax, %eax
+ cmpl $13, %edi
+ setle %al
+ addl $2, %eax
+ # ../gdb.opt/inline-break.c:95
+ .loc 1 95 0
+ ret
+ .cfi_endproc
+.LFE8:
+ .size func6b, .-func6b
+ .p2align 4,,15
+.globl func6a
+ .type func6a, @function
+func6a:
+.LFB9:
+ # ../gdb.opt/inline-break.c:99
+ .loc 1 99 0
+ .cfi_startproc
+.LVL5:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:100
+ .loc 1 100 0
+ movl %edi, %eax
+ sall $4, %eax
+ leal (%rax,%rdi), %edi
+.LVL6:
+.LBB48:
+.LBB49:
+ # ../gdb.opt/inline-break.c:94
+ .loc 1 94 0
+ xorl %eax, %eax
+ cmpl $13, %edi
+ setle %al
+ addl $2, %eax
+.LBE49:
+.LBE48:
+ # ../gdb.opt/inline-break.c:101
+ .loc 1 101 0
+ ret
+ .cfi_endproc
+.LFE9:
+ .size func6a, .-func6a
+ .p2align 4,,15
+.globl func8b
+ .type func8b, @function
+func8b:
+.LFB12:
+ # ../gdb.opt/inline-break.c:121
+ .loc 1 121 0
+ .cfi_startproc
+.LVL7:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:122
+ .loc 1 122 0
+ xorl %eax, %eax
+ cmpl $6, %edi
+ setle %al
+ leal 9(%rax,%rax), %eax
+ # ../gdb.opt/inline-break.c:123
+ .loc 1 123 0
+ ret
+ .cfi_endproc
+.LFE12:
+ .size func8b, .-func8b
+ .p2align 4,,15
+.globl main
+ .type main, @function
+main:
+.LFB14:
+ # ../gdb.opt/inline-break.c:135
+ .loc 1 135 0
+ .cfi_startproc
+.LVL8:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:140
+ .loc 1 140 0
+ movl %edi, -4(%rsp)
+.LVL9:
+ # ../gdb.opt/inline-break.c:142
+ .loc 1 142 0
+ movl -4(%rsp), %eax
+.LVL10:
+.LBB50:
+.LBB51:
+ # ../gdb.opt/inline-break.c:32
+ .loc 1 32 0
+ movl $23, %edi
+.LVL11:
+.LBE51:
+.LBE50:
+.LBB53:
+.LBB54:
+ # ../gdb.opt/inline-break.c:55
+ .loc 1 55 0
+ movl $23, %esi
+.LVL12:
+.LBE54:
+.LBE53:
+.LBB58:
+.LBB59:
+ # ../gdb.opt/inline-break.c:85
+ .loc 1 85 0
+ movl $23, %ecx
+.LBE59:
+.LBE58:
+.LBB63:
+.LBB52:
+ # ../gdb.opt/inline-break.c:32
+ .loc 1 32 0
+ imull %edi, %eax
+.LVL13:
+.LBE52:
+.LBE63:
+ # ../gdb.opt/inline-break.c:142
+ .loc 1 142 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:144
+ .loc 1 144 0
+ movl -4(%rsp), %eax
+.LVL14:
+.LBB64:
+.LBB65:
+ # ../gdb.opt/inline-break.c:40
+ .loc 1 40 0
+ movl %eax, %edx
+ sall $4, %edx
+ leal (%rdx,%rax), %eax
+.LVL15:
+.LBE65:
+.LBE64:
+ # ../gdb.opt/inline-break.c:144
+ .loc 1 144 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:146
+ .loc 1 146 0
+ movl -4(%rsp), %eax
+.LVL16:
+.LBB66:
+.LBB57:
+ # ../gdb.opt/inline-break.c:55
+ .loc 1 55 0
+ imull %esi, %eax
+.LVL17:
+.LBB55:
+.LBB56:
+ # ../gdb.opt/inline-break.c:49
+ .loc 1 49 0
+ cmpl $13, %eax
+ setg %al
+.LVL18:
+ movzbl %al, %eax
+ addl $1, %eax
+.LBE56:
+.LBE55:
+.LBE57:
+.LBE66:
+ # ../gdb.opt/inline-break.c:146
+ .loc 1 146 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:148
+ .loc 1 148 0
+ movl -4(%rsp), %eax
+.LVL19:
+.LBB67:
+.LBB68:
+ # ../gdb.opt/inline-break.c:70
+ .loc 1 70 0
+ movl %eax, %edx
+ sall $4, %edx
+ leal (%rdx,%rax), %eax
+.LVL20:
+.LBB69:
+.LBB70:
+ # ../gdb.opt/inline-break.c:64
+ .loc 1 64 0
+ cmpl $12, %eax
+ setg %al
+ movzbl %al, %eax
+ addl $1, %eax
+.LBE70:
+.LBE69:
+.LBE68:
+.LBE67:
+ # ../gdb.opt/inline-break.c:148
+ .loc 1 148 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:150
+ .loc 1 150 0
+ movl -4(%rsp), %eax
+.LVL21:
+.LBB71:
+.LBB62:
+ # ../gdb.opt/inline-break.c:85
+ .loc 1 85 0
+ imull %ecx, %eax
+.LVL22:
+.LBB60:
+.LBB61:
+ # ../gdb.opt/inline-break.c:79
+ .loc 1 79 0
+ cmpl $11, %eax
+ setg %al
+.LVL23:
+ movzbl %al, %eax
+ addl $1, %eax
+.LBE61:
+.LBE60:
+.LBE62:
+.LBE71:
+ # ../gdb.opt/inline-break.c:150
+ .loc 1 150 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:152
+ .loc 1 152 0
+ movl -4(%rsp), %eax
+.LVL24:
+.LBB72:
+.LBB73:
+ # ../gdb.opt/inline-break.c:100
+ .loc 1 100 0
+ movl %eax, %edx
+ sall $4, %edx
+ leal (%rdx,%rax), %eax
+.LVL25:
+.LBE73:
+.LBE72:
+.LBB77:
+.LBB80:
+ # ../gdb.opt/inline-break.c:114
+ .loc 1 114 0
+ movl $29, %edx
+.LBE80:
+.LBE77:
+.LBB89:
+.LBB76:
+.LBB74:
+.LBB75:
+ # ../gdb.opt/inline-break.c:94
+ .loc 1 94 0
+ cmpl $13, %eax
+ setle %al
+ movzbl %al, %eax
+ addl $2, %eax
+.LBE75:
+.LBE74:
+.LBE76:
+.LBE89:
+ # ../gdb.opt/inline-break.c:152
+ .loc 1 152 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:154
+ .loc 1 154 0
+ movl -4(%rsp), %eax
+.LVL26:
+.LBB90:
+.LBB79:
+ # ../gdb.opt/inline-break.c:114
+ .loc 1 114 0
+ imull %edx, %eax
+.LVL27:
+.LBE79:
+.LBE90:
+ # ../gdb.opt/inline-break.c:154
+ .loc 1 154 0
+ movl -4(%rsp), %edx
+.LVL28:
+.LBB91:
+.LBB87:
+.LBB82:
+.LBB84:
+ # ../gdb.opt/inline-break.c:108
+ .loc 1 108 0
+ cmpl $22, %eax
+ setg %al
+.LVL29:
+.LBE84:
+.LBE82:
+.LBE87:
+.LBE91:
+.LBB92:
+.LBB94:
+ cmpl $22, %edx
+ setg %dl
+.LVL30:
+.LBE94:
+.LBE92:
+.LBB96:
+.LBB78:
+.LBB81:
+.LBB83:
+ movzbl %al, %eax
+.LBE83:
+.LBE81:
+.LBE78:
+.LBE96:
+.LBB97:
+.LBB93:
+ movzbl %dl, %edx
+.LBE93:
+.LBE97:
+.LBB98:
+.LBB88:
+.LBB86:
+.LBB85:
+ leal 1(%rax,%rax,2), %eax
+.LBE85:
+.LBE86:
+.LBE88:
+.LBE98:
+.LBB99:
+.LBB95:
+ leal 1(%rdx,%rdx,2), %edx
+.LBE95:
+.LBE99:
+ # ../gdb.opt/inline-break.c:154
+ .loc 1 154 0
+ leal (%rdx,%rax), %eax
+.LVL31:
+ movl %eax, -4(%rsp)
+.LVL32:
+ # ../gdb.opt/inline-break.c:156
+ .loc 1 156 0
+ movl -4(%rsp), %edx
+.LVL33:
+.LBB100:
+.LBB101:
+ # ../gdb.opt/inline-break.c:128
+ .loc 1 128 0
+ movl %edx, %eax
+.LVL34:
+ sall $5, %eax
+ subl %edx, %eax
+.LBB102:
+.LBB103:
+ # ../gdb.opt/inline-break.c:122
+ .loc 1 122 0
+ xorl %edx, %edx
+.LVL35:
+ cmpl $6, %eax
+.LBE103:
+.LBE102:
+.LBE101:
+.LBE100:
+ # ../gdb.opt/inline-break.c:156
+ .loc 1 156 0
+ movl -4(%rsp), %eax
+.LVL36:
+.LBB107:
+.LBB106:
+.LBB105:
+.LBB104:
+ # ../gdb.opt/inline-break.c:122
+ .loc 1 122 0
+ setle %dl
+.LBE104:
+.LBE105:
+.LBE106:
+.LBE107:
+.LBB108:
+.LBB109:
+ cmpl $6, %eax
+ setle %al
+.LVL37:
+ movzbl %al, %eax
+ leal 9(%rax,%rax), %eax
+.LBE109:
+.LBE108:
+ # ../gdb.opt/inline-break.c:156
+ .loc 1 156 0
+ leal 9(%rax,%rdx,2), %eax
+.LVL38:
+ movl %eax, -4(%rsp)
+.LVL39:
+ # ../gdb.opt/inline-break.c:158
+ .loc 1 158 0
+ movl -4(%rsp), %eax
+.LVL40:
+ # ../gdb.opt/inline-break.c:159
+ .loc 1 159 0
+ ret
+ .cfi_endproc
+.LFE14:
+ .size main, .-main
+.Letext0:
+ .section .debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST0:
+ .quad .LVL1-.Ltext0 # Location list begin address (*.LLST0)
+ .quad .LVL2-.Ltext0 # Location list end address (*.LLST0)
+ .value 0x1 # Location expression size
+ .byte 0x55 # DW_OP_reg5
+ .quad 0x0 # Location list terminator begin (*.LLST0)
+ .quad 0x0 # Location list terminator end (*.LLST0)
+.LLST1:
+ .quad .LVL1-.Ltext0 # Location list begin address (*.LLST1)
+ .quad .LVL2-.Ltext0 # Location list end address (*.LLST1)
+ .value 0x5 # Location expression size
+ .byte 0x75 # DW_OP_breg5
+ .sleb128 0
+ .byte 0x41 # DW_OP_lit17
+ .byte 0x1e # DW_OP_mul
+ .byte 0x9f # DW_OP_stack_value
+ .quad 0x0 # Location list terminator begin (*.LLST1)
+ .quad 0x0 # Location list terminator end (*.LLST1)
+.LLST2:
+ .quad .LVL5-.Ltext0 # Location list begin address (*.LLST2)
+ .quad .LVL6-.Ltext0 # Location list end address (*.LLST2)
+ .value 0x1 # Location expression size
+ .byte 0x55 # DW_OP_reg5
+ .quad 0x0 # Location list terminator begin (*.LLST2)
+ .quad 0x0 # Location list terminator end (*.LLST2)
+.LLST3:
+ .quad .LVL5-.Ltext0 # Location list begin address (*.LLST3)
+ .quad .LVL6-.Ltext0 # Location list end address (*.LLST3)
+ .value 0x5 # Location expression size
+ .byte 0x75 # DW_OP_breg5
+ .sleb128 0
+ .byte 0x41 # DW_OP_lit17
+ .byte 0x1e # DW_OP_mul
+ .byte 0x9f # DW_OP_stack_value
+ .quad 0x0 # Location list terminator begin (*.LLST3)
+ .quad 0x0 # Location list terminator end (*.LLST3)
+.LLST4:
+ .quad .LVL8-.Ltext0 # Location list begin address (*.LLST4)
+ .quad .LVL11-.Ltext0 # Location list end address (*.LLST4)
+ .value 0x1 # Location expression size
+ .byte 0x55 # DW_OP_reg5
+ .quad .LVL11-.Ltext0 # Location list begin address (*.LLST4)
+ .quad .LFE14-.Ltext0 # Location list end address (*.LLST4)
+ .value 0x2 # Location expression size
+ .byte 0x91 # DW_OP_fbreg
+ .sleb128 -12
+ .quad 0x0 # Location list terminator begin (*.LLST4)
+ .quad 0x0 # Location list terminator end (*.LLST4)
+.LLST5:
+ .quad .LVL8-.Ltext0 # Location list begin address (*.LLST5)
+ .quad .LVL12-.Ltext0 # Location list end address (*.LLST5)
+ .value 0x1 # Location expression size
+ .byte 0x54 # DW_OP_reg4
+ .quad 0x0 # Location list terminator begin (*.LLST5)
+ .quad 0x0 # Location list terminator end (*.LLST5)
+.LLST6:
+ .quad .LVL9-.Ltext0 # Location list begin address (*.LLST6)
+ .quad .LVL31-.Ltext0 # Location list end address (*.LLST6)
+ .value 0x2 # Location expression size
+ .byte 0x91 # DW_OP_fbreg
+ .sleb128 -12
+ .quad .LVL32-.Ltext0 # Location list begin address (*.LLST6)
+ .quad .LVL34-.Ltext0 # Location list end address (*.LLST6)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad .LVL34-.Ltext0 # Location list begin address (*.LLST6)
+ .quad .LVL38-.Ltext0 # Location list end address (*.LLST6)
+ .value 0x2 # Location expression size
+ .byte 0x91 # DW_OP_fbreg
+ .sleb128 -12
+ .quad .LVL39-.Ltext0 # Location list begin address (*.LLST6)
+ .quad .LVL40-.Ltext0 # Location list end address (*.LLST6)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad .LVL40-.Ltext0 # Location list begin address (*.LLST6)
+ .quad .LFE14-.Ltext0 # Location list end address (*.LLST6)
+ .value 0x2 # Location expression size
+ .byte 0x91 # DW_OP_fbreg
+ .sleb128 -12
+ .quad 0x0 # Location list terminator begin (*.LLST6)
+ .quad 0x0 # Location list terminator end (*.LLST6)
+.LLST7:
+ .quad .LVL10-.Ltext0 # Location list begin address (*.LLST7)
+ .quad .LVL13-.Ltext0 # Location list end address (*.LLST7)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST7)
+ .quad 0x0 # Location list terminator end (*.LLST7)
+.LLST8:
+ .quad .LVL16-.Ltext0 # Location list begin address (*.LLST8)
+ .quad .LVL17-.Ltext0 # Location list end address (*.LLST8)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST8)
+ .quad 0x0 # Location list terminator end (*.LLST8)
+.LLST9:
+ .quad .LVL16-.Ltext0 # Location list begin address (*.LLST9)
+ .quad .LVL17-.Ltext0 # Location list end address (*.LLST9)
+ .value 0x5 # Location expression size
+ .byte 0x70 # DW_OP_breg0
+ .sleb128 0
+ .byte 0x47 # DW_OP_lit23
+ .byte 0x1e # DW_OP_mul
+ .byte 0x9f # DW_OP_stack_value
+ .quad .LVL17-.Ltext0 # Location list begin address (*.LLST9)
+ .quad .LVL18-.Ltext0 # Location list end address (*.LLST9)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST9)
+ .quad 0x0 # Location list terminator end (*.LLST9)
+.LLST10:
+ .quad .LVL21-.Ltext0 # Location list begin address (*.LLST10)
+ .quad .LVL22-.Ltext0 # Location list end address (*.LLST10)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST10)
+ .quad 0x0 # Location list terminator end (*.LLST10)
+.LLST11:
+ .quad .LVL21-.Ltext0 # Location list begin address (*.LLST11)
+ .quad .LVL22-.Ltext0 # Location list end address (*.LLST11)
+ .value 0x5 # Location expression size
+ .byte 0x70 # DW_OP_breg0
+ .sleb128 0
+ .byte 0x47 # DW_OP_lit23
+ .byte 0x1e # DW_OP_mul
+ .byte 0x9f # DW_OP_stack_value
+ .quad .LVL22-.Ltext0 # Location list begin address (*.LLST11)
+ .quad .LVL23-.Ltext0 # Location list end address (*.LLST11)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST11)
+ .quad 0x0 # Location list terminator end (*.LLST11)
+.LLST12:
+ .quad .LVL14-.Ltext0 # Location list begin address (*.LLST12)
+ .quad .LVL15-.Ltext0 # Location list end address (*.LLST12)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST12)
+ .quad 0x0 # Location list terminator end (*.LLST12)
+.LLST13:
+ .quad .LVL19-.Ltext0 # Location list begin address (*.LLST13)
+ .quad .LVL20-.Ltext0 # Location list end address (*.LLST13)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST13)
+ .quad 0x0 # Location list terminator end (*.LLST13)
+.LLST14:
+ .quad .LVL19-.Ltext0 # Location list begin address (*.LLST14)
+ .quad .LVL20-.Ltext0 # Location list end address (*.LLST14)
+ .value 0x5 # Location expression size
+ .byte 0x70 # DW_OP_breg0
+ .sleb128 0
+ .byte 0x41 # DW_OP_lit17
+ .byte 0x1e # DW_OP_mul
+ .byte 0x9f # DW_OP_stack_value
+ .quad 0x0 # Location list terminator begin (*.LLST14)
+ .quad 0x0 # Location list terminator end (*.LLST14)
+.LLST15:
+ .quad .LVL24-.Ltext0 # Location list begin address (*.LLST15)
+ .quad .LVL25-.Ltext0 # Location list end address (*.LLST15)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST15)
+ .quad 0x0 # Location list terminator end (*.LLST15)
+.LLST16:
+ .quad .LVL24-.Ltext0 # Location list begin address (*.LLST16)
+ .quad .LVL25-.Ltext0 # Location list end address (*.LLST16)
+ .value 0x5 # Location expression size
+ .byte 0x70 # DW_OP_breg0
+ .sleb128 0
+ .byte 0x41 # DW_OP_lit17
+ .byte 0x1e # DW_OP_mul
+ .byte 0x9f # DW_OP_stack_value
+ .quad 0x0 # Location list terminator begin (*.LLST16)
+ .quad 0x0 # Location list terminator end (*.LLST16)
+.LLST17:
+ .quad .LVL26-.Ltext0 # Location list begin address (*.LLST17)
+ .quad .LVL27-.Ltext0 # Location list end address (*.LLST17)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST17)
+ .quad 0x0 # Location list terminator end (*.LLST17)
+.LLST18:
+ .quad .LVL26-.Ltext0 # Location list begin address (*.LLST18)
+ .quad .LVL27-.Ltext0 # Location list end address (*.LLST18)
+ .value 0x5 # Location expression size
+ .byte 0x70 # DW_OP_breg0
+ .sleb128 0
+ .byte 0x4d # DW_OP_lit29
+ .byte 0x1e # DW_OP_mul
+ .byte 0x9f # DW_OP_stack_value
+ .quad .LVL27-.Ltext0 # Location list begin address (*.LLST18)
+ .quad .LVL29-.Ltext0 # Location list end address (*.LLST18)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST18)
+ .quad 0x0 # Location list terminator end (*.LLST18)
+.LLST19:
+ .quad .LVL28-.Ltext0 # Location list begin address (*.LLST19)
+ .quad .LVL30-.Ltext0 # Location list end address (*.LLST19)
+ .value 0x1 # Location expression size
+ .byte 0x51 # DW_OP_reg1
+ .quad 0x0 # Location list terminator begin (*.LLST19)
+ .quad 0x0 # Location list terminator end (*.LLST19)
+.LLST20:
+ .quad .LVL33-.Ltext0 # Location list begin address (*.LLST20)
+ .quad .LVL35-.Ltext0 # Location list end address (*.LLST20)
+ .value 0x1 # Location expression size
+ .byte 0x51 # DW_OP_reg1
+ .quad 0x0 # Location list terminator begin (*.LLST20)
+ .quad 0x0 # Location list terminator end (*.LLST20)
+.LLST21:
+ .quad .LVL33-.Ltext0 # Location list begin address (*.LLST21)
+ .quad .LVL35-.Ltext0 # Location list end address (*.LLST21)
+ .value 0x5 # Location expression size
+ .byte 0x71 # DW_OP_breg1
+ .sleb128 0
+ .byte 0x4f # DW_OP_lit31
+ .byte 0x1e # DW_OP_mul
+ .byte 0x9f # DW_OP_stack_value
+ .quad 0x0 # Location list terminator begin (*.LLST21)
+ .quad 0x0 # Location list terminator end (*.LLST21)
+.LLST22:
+ .quad .LVL36-.Ltext0 # Location list begin address (*.LLST22)
+ .quad .LVL37-.Ltext0 # Location list end address (*.LLST22)
+ .value 0x1 # Location expression size
+ .byte 0x50 # DW_OP_reg0
+ .quad 0x0 # Location list terminator begin (*.LLST22)
+ .quad 0x0 # Location list terminator end (*.LLST22)
+ .section .debug_info
+ .long 0x540 # Length of Compilation Unit Info
+ .value 0x3 # DWARF version number
+ .long .Ldebug_abbrev0 # Offset Into Abbrev. Section
+ .byte 0x8 # Pointer Size (in bytes)
+ .uleb128 0x1 # (DIE (0xb) DW_TAG_compile_unit)
+ .long .LASF17 # DW_AT_producer: "GNU C 4.5.1 20100924 (Red Hat 4.5.1-4)"
+ .byte 0x1 # DW_AT_language
+ .long .LASF18 # DW_AT_name: "../gdb.opt/inline-break.c"
+ .long .LASF19 # DW_AT_comp_dir: "/home/gary/work/archer/src/gdb/testsuite/gdb.dwarf2"
+ .quad .Ltext0 # DW_AT_low_pc
+ .quad .Letext0 # DW_AT_high_pc
+ .long .Ldebug_line0 # DW_AT_stmt_list
+ .uleb128 0x2 # (DIE (0x2d) DW_TAG_subprogram)
+ .long .LASF0 # DW_AT_name: "func3b"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x2f # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x48 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x3e) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x2f # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x2d
+ .uleb128 0x4 # (DIE (0x48) DW_TAG_base_type)
+ .byte 0x4 # DW_AT_byte_size
+ .byte 0x5 # DW_AT_encoding
+ .ascii "int\0" # DW_AT_name
+ .uleb128 0x2 # (DIE (0x4f) DW_TAG_subprogram)
+ .long .LASF1 # DW_AT_name: "func7b"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x6a # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x6a # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x60) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x6a # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x4f
+ .uleb128 0x2 # (DIE (0x6a) DW_TAG_subprogram)
+ .long .LASF2 # DW_AT_name: "func4b"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x3e # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x85 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x7b) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x3e # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x6a
+ .uleb128 0x5 # (DIE (0x85) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF3 # DW_AT_name: "func5b"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x4d # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0xa1 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x97) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x4d # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x85
+ .uleb128 0x5 # (DIE (0xa1) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF4 # DW_AT_name: "func6b"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x5c # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0xbd # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0xb3) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x5c # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0xa1
+ .uleb128 0x5 # (DIE (0xbd) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF5 # DW_AT_name: "func8b"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x78 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0xd9 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0xcf) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x78 # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0xbd
+ .uleb128 0x2 # (DIE (0xd9) DW_TAG_subprogram)
+ .long .LASF6 # DW_AT_name: "func1"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x1e # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0xf4 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0xea) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x1e # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0xd9
+ .uleb128 0x5 # (DIE (0xf4) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF7 # DW_AT_name: "func2"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x26 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x110 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x106) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x26 # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0xf4
+ .uleb128 0x2 # (DIE (0x110) DW_TAG_subprogram)
+ .long .LASF8 # DW_AT_name: "func3a"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x35 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x12b # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x121) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x35 # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x110
+ .uleb128 0x5 # (DIE (0x12b) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF9 # DW_AT_name: "func4a"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x44 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x147 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x13d) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x44 # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x12b
+ .uleb128 0x2 # (DIE (0x147) DW_TAG_subprogram)
+ .long .LASF10 # DW_AT_name: "func5a"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x53 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x162 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x158) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x53 # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x147
+ .uleb128 0x5 # (DIE (0x162) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF11 # DW_AT_name: "func6a"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x62 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x17e # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x174) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x62 # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x162
+ .uleb128 0x2 # (DIE (0x17e) DW_TAG_subprogram)
+ .long .LASF12 # DW_AT_name: "func7a"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x70 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x199 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x18f) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x70 # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x17e
+ .uleb128 0x2 # (DIE (0x199) DW_TAG_subprogram)
+ .long .LASF13 # DW_AT_name: "func8a"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x7e # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .byte 0x3 # DW_AT_inline
+ .long 0x1b4 # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0x1aa) DW_TAG_formal_parameter)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x7e # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0x199
+ .uleb128 0x6 # (DIE (0x1b4) DW_TAG_subprogram)
+ .long 0xf4 # DW_AT_abstract_origin
+ .quad .LFB1 # DW_AT_low_pc
+ .quad .LFE1 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_frame_base
+ .byte 0x9c # DW_OP_call_frame_cfa
+ .long 0x1d7 # DW_AT_sibling
+ .uleb128 0x7 # (DIE (0x1cf) DW_TAG_formal_parameter)
+ .long 0x106 # DW_AT_abstract_origin
+ .byte 0x1 # DW_AT_location
+ .byte 0x55 # DW_OP_reg5
+ .byte 0x0 # end of children of DIE 0x1b4
+ .uleb128 0x6 # (DIE (0x1d7) DW_TAG_subprogram)
+ .long 0x12b # DW_AT_abstract_origin
+ .quad .LFB5 # DW_AT_low_pc
+ .quad .LFE5 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_frame_base
+ .byte 0x9c # DW_OP_call_frame_cfa
+ .long 0x21d # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x1f2) DW_TAG_formal_parameter)
+ .long 0x13d # DW_AT_abstract_origin
+ .long .LLST0 # DW_AT_location
+ .uleb128 0x9 # (DIE (0x1fb) DW_TAG_inlined_subroutine)
+ .long 0x6a # DW_AT_abstract_origin
+ .quad .LBB46 # DW_AT_low_pc
+ .quad .LBE46 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x46 # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x212) DW_TAG_formal_parameter)
+ .long 0x7b # DW_AT_abstract_origin
+ .long .LLST1 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x1fb
+ .byte 0x0 # end of children of DIE 0x1d7
+ .uleb128 0x6 # (DIE (0x21d) DW_TAG_subprogram)
+ .long 0x85 # DW_AT_abstract_origin
+ .quad .LFB6 # DW_AT_low_pc
+ .quad .LFE6 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_frame_base
+ .byte 0x9c # DW_OP_call_frame_cfa
+ .long 0x240 # DW_AT_sibling
+ .uleb128 0x7 # (DIE (0x238) DW_TAG_formal_parameter)
+ .long 0x97 # DW_AT_abstract_origin
+ .byte 0x1 # DW_AT_location
+ .byte 0x55 # DW_OP_reg5
+ .byte 0x0 # end of children of DIE 0x21d
+ .uleb128 0x6 # (DIE (0x240) DW_TAG_subprogram)
+ .long 0xa1 # DW_AT_abstract_origin
+ .quad .LFB8 # DW_AT_low_pc
+ .quad .LFE8 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_frame_base
+ .byte 0x9c # DW_OP_call_frame_cfa
+ .long 0x263 # DW_AT_sibling
+ .uleb128 0x7 # (DIE (0x25b) DW_TAG_formal_parameter)
+ .long 0xb3 # DW_AT_abstract_origin
+ .byte 0x1 # DW_AT_location
+ .byte 0x55 # DW_OP_reg5
+ .byte 0x0 # end of children of DIE 0x240
+ .uleb128 0x6 # (DIE (0x263) DW_TAG_subprogram)
+ .long 0x162 # DW_AT_abstract_origin
+ .quad .LFB9 # DW_AT_low_pc
+ .quad .LFE9 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_frame_base
+ .byte 0x9c # DW_OP_call_frame_cfa
+ .long 0x2a9 # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x27e) DW_TAG_formal_parameter)
+ .long 0x174 # DW_AT_abstract_origin
+ .long .LLST2 # DW_AT_location
+ .uleb128 0x9 # (DIE (0x287) DW_TAG_inlined_subroutine)
+ .long 0xa1 # DW_AT_abstract_origin
+ .quad .LBB48 # DW_AT_low_pc
+ .quad .LBE48 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x64 # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x29e) DW_TAG_formal_parameter)
+ .long 0xb3 # DW_AT_abstract_origin
+ .long .LLST3 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x287
+ .byte 0x0 # end of children of DIE 0x263
+ .uleb128 0x6 # (DIE (0x2a9) DW_TAG_subprogram)
+ .long 0xbd # DW_AT_abstract_origin
+ .quad .LFB12 # DW_AT_low_pc
+ .quad .LFE12 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_frame_base
+ .byte 0x9c # DW_OP_call_frame_cfa
+ .long 0x2cc # DW_AT_sibling
+ .uleb128 0x7 # (DIE (0x2c4) DW_TAG_formal_parameter)
+ .long 0xcf # DW_AT_abstract_origin
+ .byte 0x1 # DW_AT_location
+ .byte 0x55 # DW_OP_reg5
+ .byte 0x0 # end of children of DIE 0x2a9
+ .uleb128 0xa # (DIE (0x2cc) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF20 # DW_AT_name: "main"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x86 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0x48 # DW_AT_type
+ .quad .LFB14 # DW_AT_low_pc
+ .quad .LFE14 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_frame_base
+ .byte 0x9c # DW_OP_call_frame_cfa
+ .long 0x52b # DW_AT_sibling
+ .uleb128 0xb # (DIE (0x2ef) DW_TAG_formal_parameter)
+ .long .LASF14 # DW_AT_name: "argc"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x86 # DW_AT_decl_line
+ .long 0x48 # DW_AT_type
+ .long .LLST4 # DW_AT_location
+ .uleb128 0xb # (DIE (0x2fe) DW_TAG_formal_parameter)
+ .long .LASF15 # DW_AT_name: "argv"
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x86 # DW_AT_decl_line
+ .long 0x52b # DW_AT_type
+ .long .LLST5 # DW_AT_location
+ .uleb128 0xc # (DIE (0x30d) DW_TAG_variable)
+ .ascii "x\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../gdb.opt/inline-break.c)
+ .byte 0x8c # DW_AT_decl_line
+ .long 0x53e # DW_AT_type
+ .long .LLST6 # DW_AT_location
+ .uleb128 0xd # (DIE (0x31a) DW_TAG_inlined_subroutine)
+ .long 0xd9 # DW_AT_abstract_origin
+ .quad .LBB50 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0x0 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x8e # DW_AT_call_line
+ .long 0x33b # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x331) DW_TAG_formal_parameter)
+ .long 0xea # DW_AT_abstract_origin
+ .long .LLST7 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x31a
+ .uleb128 0xd # (DIE (0x33b) DW_TAG_inlined_subroutine)
+ .long 0x110 # DW_AT_abstract_origin
+ .quad .LBB53 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0x30 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x92 # DW_AT_call_line
+ .long 0x37d # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x352) DW_TAG_formal_parameter)
+ .long 0x121 # DW_AT_abstract_origin
+ .long .LLST8 # DW_AT_location
+ .uleb128 0x9 # (DIE (0x35b) DW_TAG_inlined_subroutine)
+ .long 0x2d # DW_AT_abstract_origin
+ .quad .LBB55 # DW_AT_low_pc
+ .quad .LBE55 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x37 # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x372) DW_TAG_formal_parameter)
+ .long 0x3e # DW_AT_abstract_origin
+ .long .LLST9 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x35b
+ .byte 0x0 # end of children of DIE 0x33b
+ .uleb128 0xd # (DIE (0x37d) DW_TAG_inlined_subroutine)
+ .long 0x147 # DW_AT_abstract_origin
+ .quad .LBB58 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0x60 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x96 # DW_AT_call_line
+ .long 0x3bf # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x394) DW_TAG_formal_parameter)
+ .long 0x158 # DW_AT_abstract_origin
+ .long .LLST10 # DW_AT_location
+ .uleb128 0x9 # (DIE (0x39d) DW_TAG_inlined_subroutine)
+ .long 0x85 # DW_AT_abstract_origin
+ .quad .LBB60 # DW_AT_low_pc
+ .quad .LBE60 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x55 # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x3b4) DW_TAG_formal_parameter)
+ .long 0x97 # DW_AT_abstract_origin
+ .long .LLST11 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x39d
+ .byte 0x0 # end of children of DIE 0x37d
+ .uleb128 0xe # (DIE (0x3bf) DW_TAG_inlined_subroutine)
+ .long 0xf4 # DW_AT_abstract_origin
+ .quad .LBB64 # DW_AT_low_pc
+ .quad .LBE64 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x90 # DW_AT_call_line
+ .long 0x3e4 # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x3da) DW_TAG_formal_parameter)
+ .long 0x106 # DW_AT_abstract_origin
+ .long .LLST12 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x3bf
+ .uleb128 0xe # (DIE (0x3e4) DW_TAG_inlined_subroutine)
+ .long 0x12b # DW_AT_abstract_origin
+ .quad .LBB67 # DW_AT_low_pc
+ .quad .LBE67 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x94 # DW_AT_call_line
+ .long 0x42a # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x3ff) DW_TAG_formal_parameter)
+ .long 0x13d # DW_AT_abstract_origin
+ .long .LLST13 # DW_AT_location
+ .uleb128 0x9 # (DIE (0x408) DW_TAG_inlined_subroutine)
+ .long 0x6a # DW_AT_abstract_origin
+ .quad .LBB69 # DW_AT_low_pc
+ .quad .LBE69 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x46 # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x41f) DW_TAG_formal_parameter)
+ .long 0x7b # DW_AT_abstract_origin
+ .long .LLST14 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x408
+ .byte 0x0 # end of children of DIE 0x3e4
+ .uleb128 0xd # (DIE (0x42a) DW_TAG_inlined_subroutine)
+ .long 0x162 # DW_AT_abstract_origin
+ .quad .LBB72 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0x90 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x98 # DW_AT_call_line
+ .long 0x46c # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x441) DW_TAG_formal_parameter)
+ .long 0x174 # DW_AT_abstract_origin
+ .long .LLST15 # DW_AT_location
+ .uleb128 0x9 # (DIE (0x44a) DW_TAG_inlined_subroutine)
+ .long 0xa1 # DW_AT_abstract_origin
+ .quad .LBB74 # DW_AT_low_pc
+ .quad .LBE74 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x64 # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x461) DW_TAG_formal_parameter)
+ .long 0xb3 # DW_AT_abstract_origin
+ .long .LLST16 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x44a
+ .byte 0x0 # end of children of DIE 0x42a
+ .uleb128 0xd # (DIE (0x46c) DW_TAG_inlined_subroutine)
+ .long 0x17e # DW_AT_abstract_origin
+ .quad .LBB77 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0xc0 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x9a # DW_AT_call_line
+ .long 0x4aa # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x483) DW_TAG_formal_parameter)
+ .long 0x18f # DW_AT_abstract_origin
+ .long .LLST17 # DW_AT_location
+ .uleb128 0xf # (DIE (0x48c) DW_TAG_inlined_subroutine)
+ .long 0x4f # DW_AT_abstract_origin
+ .quad .LBB82 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0x120 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x72 # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x49f) DW_TAG_formal_parameter)
+ .long 0x60 # DW_AT_abstract_origin
+ .long .LLST18 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x48c
+ .byte 0x0 # end of children of DIE 0x46c
+ .uleb128 0xd # (DIE (0x4aa) DW_TAG_inlined_subroutine)
+ .long 0x4f # DW_AT_abstract_origin
+ .quad .LBB92 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0x160 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x9a # DW_AT_call_line
+ .long 0x4cb # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x4c1) DW_TAG_formal_parameter)
+ .long 0x60 # DW_AT_abstract_origin
+ .long .LLST19 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x4aa
+ .uleb128 0xd # (DIE (0x4cb) DW_TAG_inlined_subroutine)
+ .long 0x199 # DW_AT_abstract_origin
+ .quad .LBB100 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0x1a0 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x9c # DW_AT_call_line
+ .long 0x509 # DW_AT_sibling
+ .uleb128 0x8 # (DIE (0x4e2) DW_TAG_formal_parameter)
+ .long 0x1aa # DW_AT_abstract_origin
+ .long .LLST20 # DW_AT_location
+ .uleb128 0xf # (DIE (0x4eb) DW_TAG_inlined_subroutine)
+ .long 0xbd # DW_AT_abstract_origin
+ .quad .LBB102 # DW_AT_entry_pc
+ .long .Ldebug_ranges0+0x1d0 # DW_AT_ranges
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x80 # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x4fe) DW_TAG_formal_parameter)
+ .long 0xcf # DW_AT_abstract_origin
+ .long .LLST21 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x4eb
+ .byte 0x0 # end of children of DIE 0x4cb
+ .uleb128 0x9 # (DIE (0x509) DW_TAG_inlined_subroutine)
+ .long 0xbd # DW_AT_abstract_origin
+ .quad .LBB108 # DW_AT_low_pc
+ .quad .LBE108 # DW_AT_high_pc
+ .byte 0x1 # DW_AT_call_file (../gdb.opt/inline-break.c)
+ .byte 0x9c # DW_AT_call_line
+ .uleb128 0x8 # (DIE (0x520) DW_TAG_formal_parameter)
+ .long 0xcf # DW_AT_abstract_origin
+ .long .LLST22 # DW_AT_location
+ .byte 0x0 # end of children of DIE 0x509
+ .byte 0x0 # end of children of DIE 0x2cc
+ .uleb128 0x10 # (DIE (0x52b) DW_TAG_pointer_type)
+ .byte 0x8 # DW_AT_byte_size
+ .long 0x531 # DW_AT_type
+ .uleb128 0x10 # (DIE (0x531) DW_TAG_pointer_type)
+ .byte 0x8 # DW_AT_byte_size
+ .long 0x537 # DW_AT_type
+ .uleb128 0x11 # (DIE (0x537) DW_TAG_base_type)
+ .byte 0x1 # DW_AT_byte_size
+ .byte 0x6 # DW_AT_encoding
+ .long .LASF16 # DW_AT_name: "char"
+ .uleb128 0x12 # (DIE (0x53e) DW_TAG_volatile_type)
+ .long 0x48 # DW_AT_type
+ .byte 0x0 # end of children of DIE 0xb
+ .section .debug_abbrev
+ .uleb128 0x1 # (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 0xe # (DW_FORM_strp)
+ .uleb128 0x1b # (DW_AT_comp_dir)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x10 # (DW_AT_stmt_list)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0x2 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0x1 # DW_children_yes
+ .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 0xc # (DW_FORM_flag)
+ .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 0x0
+ .byte 0x0
+ .uleb128 0x3 # (abbrev code)
+ .uleb128 0x5 # (TAG: DW_TAG_formal_parameter)
+ .byte 0x0 # 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)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0x4 # (abbrev code)
+ .uleb128 0x24 # (TAG: DW_TAG_base_type)
+ .byte 0x0 # 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 0x0
+ .byte 0x0
+ .uleb128 0x5 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x3f # (DW_AT_external)
+ .uleb128 0xc # (DW_FORM_flag)
+ .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 0xc # (DW_FORM_flag)
+ .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 0x0
+ .byte 0x0
+ .uleb128 0x6 # (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 0x1 # (DW_FORM_addr)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0xa # (DW_FORM_block1)
+ .uleb128 0x1 # (DW_AT_sibling)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0x7 # (abbrev code)
+ .uleb128 0x5 # (TAG: DW_TAG_formal_parameter)
+ .byte 0x0 # DW_children_no
+ .uleb128 0x31 # (DW_AT_abstract_origin)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x2 # (DW_AT_location)
+ .uleb128 0xa # (DW_FORM_block1)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0x8 # (abbrev code)
+ .uleb128 0x5 # (TAG: DW_TAG_formal_parameter)
+ .byte 0x0 # DW_children_no
+ .uleb128 0x31 # (DW_AT_abstract_origin)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x2 # (DW_AT_location)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0x9 # (abbrev code)
+ .uleb128 0x1d # (TAG: DW_TAG_inlined_subroutine)
+ .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 0x1 # (DW_FORM_addr)
+ .uleb128 0x58 # (DW_AT_call_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x59 # (DW_AT_call_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0xa # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x3f # (DW_AT_external)
+ .uleb128 0xc # (DW_FORM_flag)
+ .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 0xc # (DW_FORM_flag)
+ .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 0x1 # (DW_FORM_addr)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0xa # (DW_FORM_block1)
+ .uleb128 0x1 # (DW_AT_sibling)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0xb # (abbrev code)
+ .uleb128 0x5 # (TAG: DW_TAG_formal_parameter)
+ .byte 0x0 # DW_children_no
+ .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 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x2 # (DW_AT_location)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0xc # (abbrev code)
+ .uleb128 0x34 # (TAG: DW_TAG_variable)
+ .byte 0x0 # 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 0x2 # (DW_AT_location)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0xd # (abbrev code)
+ .uleb128 0x1d # (TAG: DW_TAG_inlined_subroutine)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x31 # (DW_AT_abstract_origin)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x52 # (DW_AT_entry_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x55 # (DW_AT_ranges)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .uleb128 0x58 # (DW_AT_call_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x59 # (DW_AT_call_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x1 # (DW_AT_sibling)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0xe # (abbrev code)
+ .uleb128 0x1d # (TAG: DW_TAG_inlined_subroutine)
+ .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 0x1 # (DW_FORM_addr)
+ .uleb128 0x58 # (DW_AT_call_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x59 # (DW_AT_call_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x1 # (DW_AT_sibling)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0xf # (abbrev code)
+ .uleb128 0x1d # (TAG: DW_TAG_inlined_subroutine)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x31 # (DW_AT_abstract_origin)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x52 # (DW_AT_entry_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x55 # (DW_AT_ranges)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .uleb128 0x58 # (DW_AT_call_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x59 # (DW_AT_call_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0x10 # (abbrev code)
+ .uleb128 0xf # (TAG: DW_TAG_pointer_type)
+ .byte 0x0 # DW_children_no
+ .uleb128 0xb # (DW_AT_byte_size)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0x11 # (abbrev code)
+ .uleb128 0x24 # (TAG: DW_TAG_base_type)
+ .byte 0x0 # 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 0xe # (DW_FORM_strp)
+ .byte 0x0
+ .byte 0x0
+ .uleb128 0x12 # (abbrev code)
+ .uleb128 0x35 # (TAG: DW_TAG_volatile_type)
+ .byte 0x0 # DW_children_no
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0x0
+ .byte 0x0
+ .byte 0x0
+ .section .debug_pubnames,"",@progbits
+ .long 0x58 # Length of Public Names Info
+ .value 0x2 # DWARF Version
+ .long .Ldebug_info0 # Offset of Compilation Unit Info
+ .long 0x544 # Compilation Unit Length
+ .long 0x1b4 # DIE offset
+ .ascii "func2\0" # external name
+ .long 0x1d7 # DIE offset
+ .ascii "func4a\0" # external name
+ .long 0x21d # DIE offset
+ .ascii "func5b\0" # external name
+ .long 0x240 # DIE offset
+ .ascii "func6b\0" # external name
+ .long 0x263 # DIE offset
+ .ascii "func6a\0" # external name
+ .long 0x2a9 # DIE offset
+ .ascii "func8b\0" # external name
+ .long 0x2cc # DIE offset
+ .ascii "main\0" # external name
+ .long 0x0
+ .section .debug_aranges,"",@progbits
+ .long 0x2c # Length of Address Ranges Info
+ .value 0x2 # DWARF Version
+ .long .Ldebug_info0 # Offset of Compilation Unit Info
+ .byte 0x8 # Size of Address
+ .byte 0x0 # Size of Segment Descriptor
+ .value 0x0 # Pad to 16 byte boundary
+ .value 0x0
+ .quad .Ltext0 # Address
+ .quad .Letext0-.Ltext0 # Length
+ .quad 0x0
+ .quad 0x0
+ .section .debug_ranges,"",@progbits
+.Ldebug_ranges0:
+ .quad .LBB50-.Ltext0 # Offset 0x0
+ .quad .LBE50-.Ltext0
+ .quad .LBB63-.Ltext0
+ .quad .LBE63-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .quad .LBB53-.Ltext0 # Offset 0x30
+ .quad .LBE53-.Ltext0
+ .quad .LBB66-.Ltext0
+ .quad .LBE66-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .quad .LBB58-.Ltext0 # Offset 0x60
+ .quad .LBE58-.Ltext0
+ .quad .LBB71-.Ltext0
+ .quad .LBE71-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .quad .LBB72-.Ltext0 # Offset 0x90
+ .quad .LBE72-.Ltext0
+ .quad .LBB89-.Ltext0
+ .quad .LBE89-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .quad .LBB77-.Ltext0 # Offset 0xc0
+ .quad .LBE77-.Ltext0
+ .quad .LBB98-.Ltext0
+ .quad .LBE98-.Ltext0
+ .quad .LBB96-.Ltext0
+ .quad .LBE96-.Ltext0
+ .quad .LBB91-.Ltext0
+ .quad .LBE91-.Ltext0
+ .quad .LBB90-.Ltext0
+ .quad .LBE90-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .quad .LBB82-.Ltext0 # Offset 0x120
+ .quad .LBE82-.Ltext0
+ .quad .LBB86-.Ltext0
+ .quad .LBE86-.Ltext0
+ .quad .LBB81-.Ltext0
+ .quad .LBE81-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .quad .LBB92-.Ltext0 # Offset 0x160
+ .quad .LBE92-.Ltext0
+ .quad .LBB99-.Ltext0
+ .quad .LBE99-.Ltext0
+ .quad .LBB97-.Ltext0
+ .quad .LBE97-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .quad .LBB100-.Ltext0 # Offset 0x1a0
+ .quad .LBE100-.Ltext0
+ .quad .LBB107-.Ltext0
+ .quad .LBE107-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .quad .LBB102-.Ltext0 # Offset 0x1d0
+ .quad .LBE102-.Ltext0
+ .quad .LBB105-.Ltext0
+ .quad .LBE105-.Ltext0
+ .quad 0x0
+ .quad 0x0
+ .section .debug_str,"MS",@progbits,1
+.LASF12:
+ .string "func7a"
+.LASF1:
+ .string "func7b"
+.LASF19:
+ .string "/home/gary/work/archer/src/gdb/testsuite/gdb.dwarf2"
+.LASF20:
+ .string "main"
+.LASF18:
+ .string "../gdb.opt/inline-break.c"
+.LASF6:
+ .string "func1"
+.LASF17:
+ .string "GNU C 4.5.1 20100924 (Red Hat 4.5.1-4)"
+.LASF14:
+ .string "argc"
+.LASF8:
+ .string "func3a"
+.LASF0:
+ .string "func3b"
+.LASF16:
+ .string "char"
+.LASF9:
+ .string "func4a"
+.LASF2:
+ .string "func4b"
+.LASF11:
+ .string "func6a"
+.LASF10:
+ .string "func5a"
+.LASF3:
+ .string "func5b"
+.LASF5:
+ .string "func8b"
+.LASF13:
+ .string "func8a"
+.LASF7:
+ .string "func2"
+.LASF4:
+ .string "func6b"
+.LASF15:
+ .string "argv"
+ .ident "GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)"
+ .section .note.GNU-stack,"",@progbits
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-break.exp b/gdb/testsuite/gdb.dwarf2/dw2-inline-break.exp
new file mode 100644
index 0000000..2ef7145
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-break.exp
@@ -0,0 +1,124 @@
+# Copyright 2012 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 <http://www.gnu.org/licenses/>.
+
+# Note that the testcase gdb.opt/inline-break.exp largely mirrors
+# this testcase, and should be updated if this testcase is changed.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if ![dwarf2_support] {
+ return 0
+}
+
+# This test can only be run on x86_64 targets.
+if {![istarget "x86_64-*-*"] || ![is_lp64_target]} {
+ return 0
+}
+
+set basename "inline-break"
+set testfile "dw2-$basename"
+
+if { [prepare_for_testing $testfile.exp $testfile $testfile.S {nodebug}] } {
+ return -1
+}
+
+#
+# func1 is a static inlined function that is called once.
+# The result should be a single-location breakpoint.
+#
+gdb_test "break func1" \
+ "Breakpoint.*at.* file .*$basename\\.c, line.*"
+
+#
+# func2 is a non-static inlined function that is called once.
+# The result should be a breakpoint with two locations: the
+# out-of-line function and the single inlined instance.
+#
+gdb_test "break func2" \
+ "Breakpoint.*at.*func2.*\\(2 locations\\)"
+
+#
+# func3b is a static inlined function that is called once from
+# within another static inlined function. The result should be
+# a single-location breakpoint.
+#
+gdb_test "break func3b" \
+ "Breakpoint.*at.* file .*$basename\\.c, line.*"
+
+#
+# func4b is a static inlined function that is called once from
+# within a non-static inlined function. The result should be
+# a breakpoint with two locations: the inlined instance within
+# the inlined call to func4a in main, and the inlined instance
+# within the out-of-line func4a.
+#
+gdb_test "break func4b" \
+ "Breakpoint.*at.*func4b.*\\(2 locations\\)"
+
+#
+# func5b is a non-static inlined function that is called once
+# from within a static inlined function. The result should be a
+# breakpoint with two locations: the out-of-line function and the
+# inlined instance within the inlined call to func5a in main.
+#
+gdb_test "break func5b" \
+ "Breakpoint.*at.*func5b.*\\(2 locations\\)"
+#
+# func6b is a non-static inlined function that is called once from
+# within another non-static inlined function. The result should be
+# a breakpoint with three locations: the out-of-line function, the
+# inlined instance within the out-of-line func6a, and the inlined
+# instance within the inlined call to func6a in main,
+#
+gdb_test "break func6b" \
+ "Breakpoint.*at.*func6b.*\\(3 locations\\)"
+
+#
+# func7b is a static inlined function that is called twice: once from
+# func7a, and once from main. The result should be a breakpoint with
+# two locations: the inlined instance within the inlined instance of
+# func7a, and the inlined instance within main.
+#
+gdb_test "break func7b" \
+ "Breakpoint.*at.*func7b.*\\(2 locations\\)"
+
+#
+# func8b is a non-static inlined function that is called twice: once
+# func8a, and once from main. The result should be a breakpoint with
+# three locations: the out-of-line function, the inlined instance
+# within the inlined instance of func7a, and the inlined instance
+# within main.
+#
+gdb_test "break func8b" \
+ "Breakpoint.*at.*func8b.*\\(3 locations\\)"
+
+#
+# func1 is a static inlined function. The result should be that no
+# symbol is found to print.
+#
+gdb_test "print func1" \
+ "No symbol \"func1\" in current context."
+
+#
+# func2 is a non-static inlined function. The result should be that
+# one symbol is found to print, and that the printed symbol is called
+# "func2". Note that this does not cover the failure case that two
+# symbols were found, but that gdb chose the out-of-line copy to
+# print, but if this was failing the "print func1" test would likely
+# fail instead.
+#
+gdb_test "print func2" \
+ "\\\$.* = {int \\(int\\)} .* <func2>"
diff --git a/gdb/testsuite/gdb.opt/inline-break.c b/gdb/testsuite/gdb.opt/inline-break.c
new file mode 100644
index 0000000..edf82d6
--- /dev/null
+++ b/gdb/testsuite/gdb.opt/inline-break.c
@@ -0,0 +1,159 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright (C) 2012 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 <http://www.gnu.org/licenses/>. */
+
+/* The file ../gdb.dwarf2/inline-break.S was generated manually from
+ this file, and should be regenerated if this file is modified. */
+
+#ifdef __GNUC__
+# define ATTR __attribute__((always_inline))
+#else
+# define ATTR
+#endif
+
+/* A static inlined function that is called once. */
+
+static inline ATTR int
+func1 (int x)
+{
+ return x * 23;
+}
+
+/* A non-static inlined function that is called once. */
+
+inline ATTR int
+func2 (int x)
+{
+ return x * 17;
+}
+
+/* A static inlined function that calls another static inlined
+ function. */
+
+static inline ATTR int
+func3b (int x)
+{
+ return x < 14 ? 1 : 2;
+}
+
+static inline ATTR int
+func3a (int x)
+{
+ return func3b (x * 23);
+}
+
+/* A non-static inlined function that calls a static inlined
+ function. */
+
+static inline ATTR int
+func4b (int x)
+{
+ return x < 13 ? 1 : 2;
+}
+
+inline ATTR int
+func4a (int x)
+{
+ return func4b (x * 17);
+}
+
+/* A static inlined function that calls a non-static inlined
+ function. */
+
+inline ATTR int
+func5b (int x)
+{
+ return x < 12 ? 1 : 2;
+}
+
+static inline ATTR int
+func5a (int x)
+{
+ return func5b (x * 23);
+}
+
+/* A non-static inlined function that calls another non-static inlined
+ function. */
+
+inline ATTR int
+func6b (int x)
+{
+ return x < 14 ? 3 : 2;
+}
+
+inline ATTR int
+func6a (int x)
+{
+ return func6b (x * 17);
+}
+
+/* A static inlined function that is called more than once. */
+
+static inline ATTR int
+func7b (int x)
+{
+ return x < 23 ? 1 : 4;
+}
+
+static inline ATTR int
+func7a (int x)
+{
+ return func7b (x * 29);
+}
+
+/* A non-static inlined function that is called more than once. */
+
+inline ATTR int
+func8b (int x)
+{
+ return x < 7 ? 11 : 9;
+}
+
+static inline ATTR int
+func8a (int x)
+{
+ return func8b (x * 31);
+}
+
+/* Entry point. */
+
+int
+main (int argc, char *argv[])
+{
+ /* Declaring x as volatile here prevents GCC from combining calls.
+ If GCC is allowed to combine calls then some of them end up with
+ no instructions at all, so there is no specific address for GDB
+ to set a breakpoint at. */
+ volatile int x = argc;
+
+ x = func1 (x);
+
+ x = func2 (x);
+
+ x = func3a (x);
+
+ x = func4a (x);
+
+ x = func5a (x);
+
+ x = func6a (x);
+
+ x = func7a (x) + func7b (x);
+
+ x = func8a (x) + func8b (x);
+
+ return x;
+}
diff --git a/gdb/testsuite/gdb.opt/inline-break.exp b/gdb/testsuite/gdb.opt/inline-break.exp
new file mode 100644
index 0000000..c357723
--- /dev/null
+++ b/gdb/testsuite/gdb.opt/inline-break.exp
@@ -0,0 +1,114 @@
+# Copyright 2012 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 <http://www.gnu.org/licenses/>.
+
+# Note that the testcase gdb.dwarf2/dw2-inline-break.exp largely
+# mirrors this testcase, and should be updated if this testcase is
+# changed.
+
+set basename "inline-break"
+set testfile $basename
+
+if { [prepare_for_testing $testfile.exp $testfile $testfile.c \
+ {debug optimize=-O2 additional_flags=-Winline}] } {
+ return -1
+}
+
+#
+# func1 is a static inlined function that is called once.
+# The result should be a single-location breakpoint.
+#
+gdb_test "break func1" \
+ "Breakpoint.*at.* file .*$basename\\.c, line.*"
+
+#
+# func2 is a non-static inlined function that is called once.
+# The result should be a breakpoint with two locations: the
+# out-of-line function and the single inlined instance.
+#
+gdb_test "break func2" \
+ "Breakpoint.*at.*func2.*\\(2 locations\\)"
+
+#
+# func3b is a static inlined function that is called once from
+# within another static inlined function. The result should be
+# a single-location breakpoint.
+#
+gdb_test "break func3b" \
+ "Breakpoint.*at.* file .*$basename\\.c, line.*"
+
+#
+# func4b is a static inlined function that is called once from
+# within a non-static inlined function. The result should be
+# a breakpoint with two locations: the inlined instance within
+# the inlined call to func4a in main, and the inlined instance
+# within the out-of-line func4a.
+#
+gdb_test "break func4b" \
+ "Breakpoint.*at.*func4b.*\\(2 locations\\)"
+
+#
+# func5b is a non-static inlined function that is called once
+# from within a static inlined function. The result should be a
+# breakpoint with two locations: the out-of-line function and the
+# inlined instance within the inlined call to func5a in main.
+#
+gdb_test "break func5b" \
+ "Breakpoint.*at.*func5b.*\\(2 locations\\)"
+#
+# func6b is a non-static inlined function that is called once from
+# within another non-static inlined function. The result should be
+# a breakpoint with three locations: the out-of-line function, the
+# inlined instance within the out-of-line func6a, and the inlined
+# instance within the inlined call to func6a in main,
+#
+gdb_test "break func6b" \
+ "Breakpoint.*at.*func6b.*\\(3 locations\\)"
+
+#
+# func7b is a static inlined function that is called twice: once from
+# func7a, and once from main. The result should be a breakpoint with
+# two locations: the inlined instance within the inlined instance of
+# func7a, and the inlined instance within main.
+#
+gdb_test "break func7b" \
+ "Breakpoint.*at.*func7b.*\\(2 locations\\)"
+
+#
+# func8b is a non-static inlined function that is called twice: once
+# func8a, and once from main. The result should be a breakpoint with
+# three locations: the out-of-line function, the inlined instance
+# within the inlined instance of func7a, and the inlined instance
+# within main.
+#
+gdb_test "break func8b" \
+ "Breakpoint.*at.*func8b.*\\(3 locations\\)"
+
+#
+# func1 is a static inlined function. The result should be that no
+# symbol is found to print.
+#
+gdb_test "print func1" \
+ "No symbol \"func1\" in current context."
+
+#
+# func2 is a non-static inlined function. The result should be that
+# one symbol is found to print, and that the printed symbol is called
+# "func2". Note that this does not cover the failure case that two
+# symbols were found, but that gdb chose the out-of-line copy to
+# print, but if this was failing the "print func1" test would likely
+# fail instead.
+#
+gdb_test "print func2" \
+ "\\\$.* = {int \\(int\\)} .* <func2>"
diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp
index 206f7b3..c298a89 100644
--- a/gdb/testsuite/lib/mi-support.exp
+++ b/gdb/testsuite/lib/mi-support.exp
@@ -31,7 +31,8 @@ global mi_inferior_tty_name
set MIFLAGS "-i=mi"
set thread_selected_re "=thread-selected,id=\"\[0-9\]+\"\r\n"
-set library_loaded_re "=library-loaded\[^\n\]+\"\r\n"
+set gdbindex_warning_re "&\"warning: Skipping old \.gdb_index section in \[^\"\]+\"\r\n"
+set library_loaded_re "=library-loaded\[^\n\]+\"\r\n(?:$gdbindex_warning_re)?"
set breakpoint_re "=(?:breakpoint-created|breakpoint-deleted)\[^\n\]+\"\r\n"
#
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-14 13:38 [RFA take 6] Allow setting breakpoints on inline functions (PR 10738) Gary Benson
@ 2012-03-14 17:51 ` Doug Evans
2012-03-14 17:55 ` Jan Kratochvil
0 siblings, 1 reply; 19+ messages in thread
From: Doug Evans @ 2012-03-14 17:51 UTC (permalink / raw)
To: gdb-patches, Eli Zaretskii, Mark Wielaard, Jan Kratochvil, gbenson
On Wed, Mar 14, 2012 at 6:37 AM, Gary Benson <gbenson@redhat.com> wrote:
> Hi all,
>
> This patch makes GDB able to set breakpoints on inlined functions.
>
> This version of the patch has been updated to address Eli, Jan
> and Doug's comments on my previous version. I have renamed the
> compatibility option from --allow-incomplete-gdb-indexes to
> --use-old-index-sections and documented the option in NEWS. I
> also added a warning which will be printed the first time GDB
> finds an old .gdb_index section if --use-old-index-sections is
> not being used. Note that I had to modify some tests to ignore
> these messages. The documentation is essentially unchanged bar
> some specific changes Eli requested.
>
> How does this look?
Cool, thanks.
nit: ChangeLog description needs to be updated to use the renamed option.
+ if (use_old_index_sections)
+ {
+ if (version < 4)
+ return 0;
+ }
+ else
+ {
+ if (version < 6)
+ {
+ static int warning_printed = 0;
+ if (!warning_printed)
+ {
+ warning (_("Skipping old .gdb_index section in %s."),
+ objfile->name);
+ warning_printed = 1;
+ }
+ return 0;
+ }
+ }
If we're going to print warnings (and I think that's a great idea),
then we should do so consistently.
- for the "if (use_old_index_sections)" case, print warning "if (version < 4)"
- I think we should print different warnings for versions < 4, and versions 4,5.
versions < 4: something like "Skipping obsolete .gdb-index section in %s" ?
versions 4,5: something like "Skipping old .gdb_index section in %s,
pass --use-old-index-sections to use them anyway" ?
[suitably formatted and worded]
fputs_unfiltered (_("\
+ --use-old-index-sections\n\
+ Do not reject old (broken) .gdb_index sections.\n\
+"), stream);
s/(broken)/(incomplete)/
Ok with me with those nits fixed.
[I didn't dig into the actual logic of the implementation, I'm
assuming that's already been vetted.]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-14 17:51 ` Doug Evans
@ 2012-03-14 17:55 ` Jan Kratochvil
2012-03-14 17:58 ` Doug Evans
0 siblings, 1 reply; 19+ messages in thread
From: Jan Kratochvil @ 2012-03-14 17:55 UTC (permalink / raw)
To: Doug Evans; +Cc: gdb-patches, Eli Zaretskii, Mark Wielaard, gbenson
On Wed, 14 Mar 2012 18:50:55 +0100, Doug Evans wrote:
> + --use-old-index-sections\n\
> + Do not reject old (broken) .gdb_index sections.\n\
> +"), stream);
>
> s/(broken)/(incomplete)/
FYI I may not have the right interpretation of English words but with
"incomplete" it may suggest to me that only part of the file will use index
and part of the file will be processed by a slower non-indexed method.
It should suggest user the GDB functionality will be affected.
Thanks,
Jan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-14 17:55 ` Jan Kratochvil
@ 2012-03-14 17:58 ` Doug Evans
2012-03-15 10:51 ` Gary Benson
0 siblings, 1 reply; 19+ messages in thread
From: Doug Evans @ 2012-03-14 17:58 UTC (permalink / raw)
To: Jan Kratochvil; +Cc: gdb-patches, Eli Zaretskii, Mark Wielaard, gbenson
On Wed, Mar 14, 2012 at 10:54 AM, Jan Kratochvil
<jan.kratochvil@redhat.com> wrote:
> On Wed, 14 Mar 2012 18:50:55 +0100, Doug Evans wrote:
>> + --use-old-index-sections\n\
>> + Do not reject old (broken) .gdb_index sections.\n\
>> +"), stream);
>>
>> s/(broken)/(incomplete)/
>
> FYI I may not have the right interpretation of English words but with
> "incomplete" it may suggest to me that only part of the file will use index
> and part of the file will be processed by a slower non-indexed method.
>
> It should suggest user the GDB functionality will be affected.
The doc patch uses the word "incomplete", so that's why I suggest using it here.
If one wants to find a better word, great, but I think the same word
should be used in both places.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-14 17:58 ` Doug Evans
@ 2012-03-15 10:51 ` Gary Benson
2012-03-15 10:52 ` Jan Kratochvil
` (2 more replies)
0 siblings, 3 replies; 19+ messages in thread
From: Gary Benson @ 2012-03-15 10:51 UTC (permalink / raw)
To: Doug Evans; +Cc: Jan Kratochvil, gdb-patches, Eli Zaretskii, Mark Wielaard
Doug Evans wrote:
> On Wed, Mar 14, 2012 at 10:54 AM, Jan Kratochvil
> <jan.kratochvil@redhat.com> wrote:
> > On Wed, 14 Mar 2012 18:50:55 +0100, Doug Evans wrote:
> > > + Â --use-old-index-sections\n\
> > > + Â Â Â Â Â Â Â Â Â Â Do not reject old (broken) .gdb_index sections.\n\
> > > +"), stream);
> > >
> > > s/(broken)/(incomplete)/
> >
> > FYI I may not have the right interpretation of English words but
> > with "incomplete" it may suggest to me that only part of the file
> > will use index and part of the file will be processed by a slower
> > non-indexed method.
> >
> > It should suggest user the GDB functionality will be affected.
>
> The doc patch uses the word "incomplete", so that's why I suggest
> using it here. If one wants to find a better word, great, but I
> think the same word should be used in both places.
Jan, Doug, Eli, how do you feel about "possibly inconsistent"?
The option text would become:
"Do not reject possibly inconsistent .gdb_index sections."
and the docs would be s/incomplete/possibly inconsistent/
Warnings would be:
versions < 4: "Skipping obsolete .gdb-index section in %s"
versions 4,5: "Skipping possibly inconsistent .gdb_index section in %s,
pass --use-old-index-sections to use them anyway"
Does that look ok?
Thanks,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 10:51 ` Gary Benson
@ 2012-03-15 10:52 ` Jan Kratochvil
2012-03-15 16:51 ` Doug Evans
2012-03-15 18:04 ` Eli Zaretskii
2 siblings, 0 replies; 19+ messages in thread
From: Jan Kratochvil @ 2012-03-15 10:52 UTC (permalink / raw)
To: Doug Evans, gdb-patches, Eli Zaretskii, Mark Wielaard
On Thu, 15 Mar 2012 11:51:17 +0100, Gary Benson wrote:
> Jan, Doug, Eli, how do you feel about "possibly inconsistent"?
>
> The option text would become:
>
> "Do not reject possibly inconsistent .gdb_index sections."
>
> and the docs would be s/incomplete/possibly inconsistent/
>
> Warnings would be:
> versions < 4: "Skipping obsolete .gdb-index section in %s"
> versions 4,5: "Skipping possibly inconsistent .gdb_index section in %s,
> pass --use-old-index-sections to use them anyway"
>
> Does that look ok?
Fine with me.
Thanks,
Jan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 10:51 ` Gary Benson
2012-03-15 10:52 ` Jan Kratochvil
@ 2012-03-15 16:51 ` Doug Evans
2012-03-15 18:04 ` Eli Zaretskii
2 siblings, 0 replies; 19+ messages in thread
From: Doug Evans @ 2012-03-15 16:51 UTC (permalink / raw)
To: Doug Evans, Jan Kratochvil, gdb-patches, Eli Zaretskii, Mark Wielaard
On Thu, Mar 15, 2012 at 3:51 AM, Gary Benson <gbenson@redhat.com> wrote:
> Jan, Doug, Eli, how do you feel about "possibly inconsistent"?
>
> The option text would become:
>
> "Do not reject possibly inconsistent .gdb_index sections."
>
> and the docs would be s/incomplete/possibly inconsistent/
>
> Warnings would be:
> versions < 4: "Skipping obsolete .gdb-index section in %s"
> versions 4,5: "Skipping possibly inconsistent .gdb_index section in %s,
> pass --use-old-index-sections to use them anyway"
>
> Does that look ok?
ok
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 10:51 ` Gary Benson
2012-03-15 10:52 ` Jan Kratochvil
2012-03-15 16:51 ` Doug Evans
@ 2012-03-15 18:04 ` Eli Zaretskii
2012-03-15 18:10 ` Gary Benson
2 siblings, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2012-03-15 18:04 UTC (permalink / raw)
To: Gary Benson; +Cc: dje, jan.kratochvil, gdb-patches, mark
> Date: Thu, 15 Mar 2012 10:51:17 +0000
> From: Gary Benson <gbenson@redhat.com>
> Cc: Jan Kratochvil <jan.kratochvil@redhat.com>, gdb-patches@sourceware.org,
> Eli Zaretskii <eliz@gnu.org>, Mark Wielaard <mark@klomp.org>
>
> Jan, Doug, Eli, how do you feel about "possibly inconsistent"?
>
> The option text would become:
>
> "Do not reject possibly inconsistent .gdb_index sections."
The meaning of that is that the sections being skipped are
inconsistent within themselves. If that's really what you meant, I'm
fine with the change.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 18:04 ` Eli Zaretskii
@ 2012-03-15 18:10 ` Gary Benson
2012-03-15 18:15 ` Eli Zaretskii
0 siblings, 1 reply; 19+ messages in thread
From: Gary Benson @ 2012-03-15 18:10 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: dje, jan.kratochvil, gdb-patches, mark
Eli Zaretskii wrote:
> > Date: Thu, 15 Mar 2012 10:51:17 +0000
> > From: Gary Benson <gbenson@redhat.com>
> > Cc: Jan Kratochvil <jan.kratochvil@redhat.com>, gdb-patches@sourceware.org,
> > Eli Zaretskii <eliz@gnu.org>, Mark Wielaard <mark@klomp.org>
> >
> > Jan, Doug, Eli, how do you feel about "possibly inconsistent"?
> >
> > The option text would become:
> >
> > "Do not reject possibly inconsistent .gdb_index sections."
>
> The meaning of that is that the sections being skipped are
> inconsistent within themselves. If that's really what you meant,
> I'm fine with the change.
The issue is that with older index section the information in the
.gdb_index sections is not consistent with the information that GDB
would generate from the DWARF. Does that make sense?
Thanks,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 18:10 ` Gary Benson
@ 2012-03-15 18:15 ` Eli Zaretskii
2012-03-15 18:26 ` Gary Benson
2012-03-15 18:31 ` Pedro Alves
0 siblings, 2 replies; 19+ messages in thread
From: Eli Zaretskii @ 2012-03-15 18:15 UTC (permalink / raw)
To: Gary Benson; +Cc: dje, jan.kratochvil, gdb-patches, mark
> Date: Thu, 15 Mar 2012 18:10:02 +0000
> From: Gary Benson <gbenson@redhat.com>
> Cc: dje@google.com, jan.kratochvil@redhat.com, gdb-patches@sourceware.org,
> mark@klomp.org
>
> > > "Do not reject possibly inconsistent .gdb_index sections."
> >
> > The meaning of that is that the sections being skipped are
> > inconsistent within themselves. If that's really what you meant,
> > I'm fine with the change.
>
> The issue is that with older index section the information in the
> .gdb_index sections is not consistent with the information that GDB
> would generate from the DWARF.
Why does this happen? Is the information in those sections
inaccurate?
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 18:15 ` Eli Zaretskii
@ 2012-03-15 18:26 ` Gary Benson
2012-03-15 18:31 ` Pedro Alves
1 sibling, 0 replies; 19+ messages in thread
From: Gary Benson @ 2012-03-15 18:26 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: dje, jan.kratochvil, gdb-patches, mark
Eli Zaretskii wrote:
> > Date: Thu, 15 Mar 2012 18:10:02 +0000
> > From: Gary Benson <gbenson@redhat.com>
> > Cc: dje@google.com, jan.kratochvil@redhat.com, gdb-patches@sourceware.org,
> > mark@klomp.org
> >
> > > > "Do not reject possibly inconsistent .gdb_index sections."
> > >
> > > The meaning of that is that the sections being skipped are
> > > inconsistent within themselves. If that's really what you
> > > meant, I'm fine with the change.
> >
> > The issue is that with older index section the information in the
> > .gdb_index sections is not consistent with the information that
> > GDB would generate from the DWARF.
>
> Why does this happen? Is the information in those sections
> inaccurate?
With the patch GDB now generates psymbols for inlined functions with
no out-of-line version, and these are included in the index. If you
use an old index these symbols will be missing, with the result that
GDB will not have these symbols and therefore will not be able to set
breakpoints on inlined functions by name.
Cheers,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 18:15 ` Eli Zaretskii
2012-03-15 18:26 ` Gary Benson
@ 2012-03-15 18:31 ` Pedro Alves
2012-03-15 18:36 ` Eli Zaretskii
1 sibling, 1 reply; 19+ messages in thread
From: Pedro Alves @ 2012-03-15 18:31 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Gary Benson, dje, jan.kratochvil, gdb-patches, mark
On 03/15/2012 06:14 PM, Eli Zaretskii wrote:
>> Date: Thu, 15 Mar 2012 18:10:02 +0000
>> From: Gary Benson <gbenson@redhat.com>
>> Cc: dje@google.com, jan.kratochvil@redhat.com, gdb-patches@sourceware.org,
>> mark@klomp.org
>>
>>>> "Do not reject possibly inconsistent .gdb_index sections."
>>>
>>> The meaning of that is that the sections being skipped are
>>> inconsistent within themselves. If that's really what you meant,
>>> I'm fine with the change.
>>
>> The issue is that with older index section the information in the
>> .gdb_index sections is not consistent with the information that GDB
>> would generate from the DWARF.
>
> Why does this happen? Is the information in those sections
> inaccurate?
A more high level alternative explanation to Gary's would be
something like:
Older GDB versions didn't use all the info from DWARF that the new
versions do, and so not all the info needed by newer GDBs is in
the older index sections (we only put there what we need). Using the
index is mutually exclusive with fetching the info out of DWARF.
So if GDB loads an older index, there are bits of info that are
missing. And, with those missing, a newer GDB will present a
worse debugging experience in terms of features and correctness
than if it didn't use the index at all, but fetched all it needed
from the DWARF.
Hope I got that right.
--
Pedro Alves
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 18:31 ` Pedro Alves
@ 2012-03-15 18:36 ` Eli Zaretskii
2012-03-15 18:40 ` Jan Kratochvil
0 siblings, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2012-03-15 18:36 UTC (permalink / raw)
To: Pedro Alves; +Cc: gbenson, dje, jan.kratochvil, gdb-patches, mark
> Date: Thu, 15 Mar 2012 18:30:43 +0000
> From: Pedro Alves <palves@redhat.com>
> CC: Gary Benson <gbenson@redhat.com>, dje@google.com,
> jan.kratochvil@redhat.com, gdb-patches@sourceware.org, mark@klomp.org
>
> On 03/15/2012 06:14 PM, Eli Zaretskii wrote:
>
> >> Date: Thu, 15 Mar 2012 18:10:02 +0000
> >> From: Gary Benson <gbenson@redhat.com>
> >> Cc: dje@google.com, jan.kratochvil@redhat.com, gdb-patches@sourceware.org,
> >> mark@klomp.org
> >>
> >>>> "Do not reject possibly inconsistent .gdb_index sections."
> >>>
> >>> The meaning of that is that the sections being skipped are
> >>> inconsistent within themselves. If that's really what you meant,
> >>> I'm fine with the change.
> >>
> >> The issue is that with older index section the information in the
> >> .gdb_index sections is not consistent with the information that GDB
> >> would generate from the DWARF.
> >
> > Why does this happen? Is the information in those sections
> > inaccurate?
>
> A more high level alternative explanation to Gary's would be
> something like:
>
> Older GDB versions didn't use all the info from DWARF that the new
> versions do, and so not all the info needed by newer GDBs is in
> the older index sections (we only put there what we need). Using the
> index is mutually exclusive with fetching the info out of DWARF.
> So if GDB loads an older index, there are bits of info that are
> missing. And, with those missing, a newer GDB will present a
> worse debugging experience in terms of features and correctness
> than if it didn't use the index at all, but fetched all it needed
> from the DWARF.
>
> Hope I got that right.
Thanks. So I think "incomplete" was a better word. But if for some
reason we don't want that, how about "inaccurate"? E.g.
Do not reject obsolete .gdb_index sections with possibly inaccurate info.
However, if everyone else is tired of bikeshedding, go ahead with
whatever you like.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 18:36 ` Eli Zaretskii
@ 2012-03-15 18:40 ` Jan Kratochvil
2012-03-15 19:29 ` Gary Benson
0 siblings, 1 reply; 19+ messages in thread
From: Jan Kratochvil @ 2012-03-15 18:40 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Pedro Alves, gbenson, dje, gdb-patches, mark
On Thu, 15 Mar 2012 19:36:24 +0100, Eli Zaretskii wrote:
> Do not reject obsolete .gdb_index sections with possibly inaccurate info.
>
> However, if everyone else is tired of bikeshedding, go ahead with
> whatever you like.
I would like make clear from the option help that it will have negative effect
on GDB functionality; that it is not just some performance tuning.
So leaving the right wording up to you, just expressing my original goal.
Thanks,
Jan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 18:40 ` Jan Kratochvil
@ 2012-03-15 19:29 ` Gary Benson
2012-03-15 19:34 ` Doug Evans
0 siblings, 1 reply; 19+ messages in thread
From: Gary Benson @ 2012-03-15 19:29 UTC (permalink / raw)
To: Jan Kratochvil; +Cc: Eli Zaretskii, Pedro Alves, dje, gdb-patches, mark
Jan Kratochvil wrote:
> On Thu, 15 Mar 2012 19:36:24 +0100, Eli Zaretskii wrote:
> > Do not reject obsolete .gdb_index sections with possibly
> > inaccurate info.
> >
> > However, if everyone else is tired of bikeshedding, go ahead with
> > whatever you like.
>
> I would like make clear from the option help that it will have
> negative effect on GDB functionality; that it is not just some
> performance tuning. So leaving the right wording up to you, just
> expressing my original goal.
"Innaccurate" is a good word, thanks Eli. I will make the changes
and commit the patch tomorrow if nobody has any further objections.
Thanks,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 19:29 ` Gary Benson
@ 2012-03-15 19:34 ` Doug Evans
2012-03-15 19:52 ` Pedro Alves
0 siblings, 1 reply; 19+ messages in thread
From: Doug Evans @ 2012-03-15 19:34 UTC (permalink / raw)
To: Jan Kratochvil, Eli Zaretskii, Pedro Alves, dje, gdb-patches, mark
On Thu, Mar 15, 2012 at 12:29 PM, Gary Benson <gbenson@redhat.com> wrote:
> Jan Kratochvil wrote:
>> On Thu, 15 Mar 2012 19:36:24 +0100, Eli Zaretskii wrote:
>> > Do not reject obsolete .gdb_index sections with possibly
>> > inaccurate info.
>> >
>> > However, if everyone else is tired of bikeshedding, go ahead with
>> > whatever you like.
>>
>> I would like make clear from the option help that it will have
>> negative effect on GDB functionality; that it is not just some
>> performance tuning. So leaving the right wording up to you, just
>> expressing my original goal.
>
> "Innaccurate" is a good word, thanks Eli. I will make the changes
> and commit the patch tomorrow if nobody has any further objections.
To be honest, I don't like "inaccurate".
But I'm not going to push it.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 19:34 ` Doug Evans
@ 2012-03-15 19:52 ` Pedro Alves
2012-03-15 20:06 ` Pedro Alves
0 siblings, 1 reply; 19+ messages in thread
From: Pedro Alves @ 2012-03-15 19:52 UTC (permalink / raw)
To: Doug Evans; +Cc: Jan Kratochvil, Eli Zaretskii, gdb-patches, mark
On 03/15/2012 07:34 PM, Doug Evans wrote:
> On Thu, Mar 15, 2012 at 12:29 PM, Gary Benson <gbenson@redhat.com> wrote:
>> Jan Kratochvil wrote:
>>> On Thu, 15 Mar 2012 19:36:24 +0100, Eli Zaretskii wrote:
>>>> Do not reject obsolete .gdb_index sections with possibly
>>>> inaccurate info.
>>>>
>>>> However, if everyone else is tired of bikeshedding, go ahead with
>>>> whatever you like.
>>>
>>> I would like make clear from the option help that it will have
>>> negative effect on GDB functionality; that it is not just some
>>> performance tuning. So leaving the right wording up to you, just
>>> expressing my original goal.
>>
>> "Innaccurate" is a good word, thanks Eli. I will make the changes
>> and commit the patch tomorrow if nobody has any further objections.
>
> To be honest, I don't like "inaccurate".
> But I'm not going to push it.
Why don't we just go with "deprecated"? We completely skip the
"obsolete" ones, and skip the "deprecated" ones, unless the user
wants them badly. The explanation why they're deprecated belongs
elsewhere - it doesn't have to be part of the option name...
So picking up one of Gary's previous examples, warnings would
simply be:
versions < 4: "Skipping obsolete .gdb-index section in %s"
versions 4,5: "Skipping deprecated .gdb_index section in %s,
pass --use-deprecated-index-sections to use them anyway"
--
Pedro Alves
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 19:52 ` Pedro Alves
@ 2012-03-15 20:06 ` Pedro Alves
2012-03-16 10:03 ` Gary Benson
0 siblings, 1 reply; 19+ messages in thread
From: Pedro Alves @ 2012-03-15 20:06 UTC (permalink / raw)
Cc: Doug Evans, Jan Kratochvil, Eli Zaretskii, gdb-patches, mark
On 03/15/2012 07:51 PM, Pedro Alves wrote:
> Why don't we just go with "deprecated"? We completely skip the
> "obsolete" ones, and skip the "deprecated" ones, unless the user
> wants them badly. The explanation why they're deprecated belongs
> elsewhere - it doesn't have to be part of the option name...
>
> So picking up one of Gary's previous examples, warnings would
> simply be:
>
> versions < 4: "Skipping obsolete .gdb-index section in %s"
> versions 4,5: "Skipping deprecated .gdb_index section in %s,
> pass --use-deprecated-index-sections to use them anyway"
>
More so (cause I know people aren't yet fed up with the bikeshedding :-) ),
if in the future we ever we want to be selective on _which_ deprecated
versions we want to load, we can extend the option to accept a list of
integers, like:
--use-deprecated-index-sections=7,8
From <https://en.wikipedia.org/wiki/Deprecation>:
"In the process of authoring computer software, its standards or documentation, or other
technical standards, deprecation is a status applied to features, characteristics,
or practices to indicate that they should be avoided, typically because they have
been superseded.
Although deprecated software features remain in the software, their use may raise warning
messages recommending alternative practices, and deprecation may indicate that the feature
will be removed in the future. Features are deprecated - rather than immediately removed - in
order to provide backward compatibility, and give programmers who have used the
feature time to bring their code into compliance with the new standard."
Sounds Just Perfect to me. Can this make everyone happy, please? :-)
--
Pedro Alves
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFA take 6] Allow setting breakpoints on inline functions (PR 10738)
2012-03-15 20:06 ` Pedro Alves
@ 2012-03-16 10:03 ` Gary Benson
0 siblings, 0 replies; 19+ messages in thread
From: Gary Benson @ 2012-03-16 10:03 UTC (permalink / raw)
To: Pedro Alves; +Cc: Doug Evans, Jan Kratochvil, Eli Zaretskii, gdb-patches, mark
Pedro Alves wrote:
> On 03/15/2012 07:51 PM, Pedro Alves wrote:
> > Why don't we just go with "deprecated"? We completely skip the
> > "obsolete" ones, and skip the "deprecated" ones, unless the user
> > wants them badly. The explanation why they're deprecated belongs
> > elsewhere - it doesn't have to be part of the option name...
> >
> > So picking up one of Gary's previous examples, warnings would
> > simply be:
> >
> > versions < 4: "Skipping obsolete .gdb-index section in %s"
> > versions 4,5: "Skipping deprecated .gdb_index section in %s,
> > pass --use-deprecated-index-sections to use them anyway"
>
> More so (cause I know people aren't yet fed up with the bikeshedding
> :-) ), if in the future we ever we want to be selective on _which_
> deprecated versions we want to load, we can extend the option to
> accept a list of integers, like:
>
> --use-deprecated-index-sections=7,8
>
> From <https://en.wikipedia.org/wiki/Deprecation>:
>
> "In the process of authoring computer software, its standards or
> documentation, or other technical standards, deprecation is a status
> applied to features, characteristics, or practices to indicate that
> they should be avoided, typically because they have been superseded.
>
> Although deprecated software features remain in the software, their
> use may raise warning messages recommending alternative practices,
> and deprecation may indicate that the feature will be removed in the
> future. Features are deprecated - rather than immediately removed -
> in order to provide backward compatibility, and give programmers who
> have used the feature time to bring their code into compliance with
> the new standard."
>
> Sounds Just Perfect to me. Can this make everyone happy, please? :-)
I like it.
Cheers,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2012-03-16 10:03 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-14 13:38 [RFA take 6] Allow setting breakpoints on inline functions (PR 10738) Gary Benson
2012-03-14 17:51 ` Doug Evans
2012-03-14 17:55 ` Jan Kratochvil
2012-03-14 17:58 ` Doug Evans
2012-03-15 10:51 ` Gary Benson
2012-03-15 10:52 ` Jan Kratochvil
2012-03-15 16:51 ` Doug Evans
2012-03-15 18:04 ` Eli Zaretskii
2012-03-15 18:10 ` Gary Benson
2012-03-15 18:15 ` Eli Zaretskii
2012-03-15 18:26 ` Gary Benson
2012-03-15 18:31 ` Pedro Alves
2012-03-15 18:36 ` Eli Zaretskii
2012-03-15 18:40 ` Jan Kratochvil
2012-03-15 19:29 ` Gary Benson
2012-03-15 19:34 ` Doug Evans
2012-03-15 19:52 ` Pedro Alves
2012-03-15 20:06 ` Pedro Alves
2012-03-16 10:03 ` Gary Benson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox