* [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
@ 2012-02-13 18:47 Gary Benson
2012-02-14 1:39 ` Doug Evans
2012-02-14 9:34 ` Mark Wielaard
0 siblings, 2 replies; 14+ messages in thread
From: Gary Benson @ 2012-02-13 18:47 UTC (permalink / raw)
To: gdb-patches, Jan Kratochvil
[-- Attachment #1: Type: text/plain, Size: 407 bytes --]
Hi all,
This patch makes GDB able to set breakpoints on inlined functions.
This version of the patch has been updated to fix the issues Jan
pointed out with the last version.
This patch bumps the version number of the .gdb-index to 6, but
it does not remove any of the backwards compatibility code which
I would prefer to do as a separate patch.
How does it look?
Thanks,
Gary
--
http://gbenson.net/
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 73603 bytes --]
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 607a570..f3b7041 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,26 @@
+2012-02-13 Gary Benson <gbenson@redhat.com>
+
+ PR breakpoints/10738
+ * dwarf2read.c (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 indexes.
+ * 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-02-12 Jan Kratochvil <jan.kratochvil@redhat.com>
* ppc-linux-nat.c (fetch_register, store_register): Fix GCC aliasing
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index e2488e7..444ea4e 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,10 @@
+2012-02-13 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.
+ (Index Section Format): Document new index section version number.
+
2012-02-09 Yao Qi <yao@codesourcery.com>
* gdb.texinfo (Symbols In Python): Add missing `@end defvar'.
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 4de1457..0e21ceb 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2012-02-13 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.
+
2012-02-12 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.server/server-exec-info.exp: New file.
diff --git a/gdb/NEWS b/gdb/NEWS
index 46ef6d8..0623d17 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -44,6 +44,8 @@
* The command "info catch" has been removed. It has been disabled
since December 2007.
+* GDB can now set breakpoints on inlined functions.
+
* 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 4f863dd..de18d33 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -9812,14 +9812,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
@@ -38717,8 +38709,8 @@ 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, 3, 4 and 5 are
+obsolete.
@item
The offset, from the start of the file, of the CU list.
@@ -38786,18 +38778,9 @@ valid index for both a string and a CU vector.
The hash value for a table entry is computed by applying an
iterative hash function to the symbol's name. Starting with an
initial value of @code{r = 0}, each (unsigned) character @samp{c} in
-the string is incorporated into the hash using the formula depending on the
-index version:
-
-@table @asis
-@item Version 4
-The formula is @code{r = r * 67 + c - 113}.
-
-@item Version 5
-The formula is @code{r = r * 67 + tolower (c) - 113}.
-@end table
-
-The terminating @samp{\0} is not incorporated into the hash.
+the string is incorporated into the hash using the formula
+@code{r = r * 67 + tolower (c) - 113}. The terminating @samp{\0} is
+not incorporated into the hash.
The step size used in the hash table is computed via
@code{((hash * 17) & (size - 1)) | 1}, where @samp{hash} is the hash
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 0576def..f7cbdf4 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -542,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,16 +2119,13 @@ dwarf2_read_index (struct objfile *objfile)
addr = dwarf2_per_objfile->gdb_index.buffer;
/* Version check. */
version = MAYBE_SWAP (*(offset_type *) addr);
- /* 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)
+ /* Versions earlier than 5 did not emit psymbols for inlined
+ functions. */
+ if (version < 6)
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);
@@ -4193,6 +4191,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
@@ -9833,6 +9835,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;
}
@@ -11677,8 +11684,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;
@@ -16980,7 +16986,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 94e8ef6..ae68850 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);
+ }
+ }
}
}
}
@@ -1880,10 +1923,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
{
@@ -2246,7 +2289,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);
@@ -2947,7 +2991,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/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>"
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-13 18:47 [RFA take 4] Allow setting breakpoints on inline functions (PR 10738) Gary Benson
@ 2012-02-14 1:39 ` Doug Evans
2012-02-14 9:02 ` Gary Benson
2012-02-14 9:34 ` Mark Wielaard
1 sibling, 1 reply; 14+ messages in thread
From: Doug Evans @ 2012-02-14 1:39 UTC (permalink / raw)
To: gdb-patches, Jan Kratochvil
On Mon, Feb 13, 2012 at 10:47 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 fix the issues Jan
> pointed out with the last version.
>
> This patch bumps the version number of the .gdb-index to 6, but
> it does not remove any of the backwards compatibility code which
> I would prefer to do as a separate patch.
I agree support for older versions should be a separate patch.
However this patch doesn't do that (it removes current acceptance of
older versions of the index).
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-14 1:39 ` Doug Evans
@ 2012-02-14 9:02 ` Gary Benson
2012-02-15 8:05 ` Doug Evans
0 siblings, 1 reply; 14+ messages in thread
From: Gary Benson @ 2012-02-14 9:02 UTC (permalink / raw)
To: gdb-patches
Hi Doug,
Doug Evans wrote:
> On Mon, Feb 13, 2012 at 10:47 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 fix the issues Jan
> > pointed out with the last version.
> >
> > This patch bumps the version number of the .gdb-index to 6, but
> > it does not remove any of the backwards compatibility code which
> > I would prefer to do as a separate patch.
>
> I agree support for older versions should be a separate patch.
> However this patch doesn't do that (it removes current acceptance
> of older versions of the index).
That's correct. The older versions do not contain partial symbols
for inlined functions. If GDB were to be run on a file with an
older versioned index without rejecting it then the ability to set
breakpoints on inlined functions would silently fail.
The separate patch I was referring to would involve the removal of
some extra code that is present to support version 4 indexes. For
example there is a local copy of the hashing function which could
be removed or could be retained depending on people's wishes. I
thought it would be simpler to discuss that separately from this.
Cheers,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-13 18:47 [RFA take 4] Allow setting breakpoints on inline functions (PR 10738) Gary Benson
2012-02-14 1:39 ` Doug Evans
@ 2012-02-14 9:34 ` Mark Wielaard
2012-02-14 9:38 ` Jan Kratochvil
2012-02-14 18:04 ` Eli Zaretskii
1 sibling, 2 replies; 14+ messages in thread
From: Mark Wielaard @ 2012-02-14 9:34 UTC (permalink / raw)
To: Gary Benson; +Cc: gdb-patches, Jan Kratochvil
On Mon, Feb 13, 2012 at 06:47:00PM +0000, Gary Benson wrote:
> This patch bumps the version number of the .gdb-index to 6, but
> it does not remove any of the backwards compatibility code which
> I would prefer to do as a separate patch.
> [...]
> @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, 3, 4 and 5 are
> +obsolete.
>
> @item
> The offset, from the start of the file, of the CU list.
> @@ -38786,18 +38778,9 @@ valid index for both a string and a CU vector.
> The hash value for a table entry is computed by applying an
> iterative hash function to the symbol's name. Starting with an
> initial value of @code{r = 0}, each (unsigned) character @samp{c} in
> -the string is incorporated into the hash using the formula depending on the
> -index version:
> -
> -@table @asis
> -@item Version 4
> -The formula is @code{r = r * 67 + c - 113}.
> -
> -@item Version 5
> -The formula is @code{r = r * 67 + tolower (c) - 113}.
> -@end table
> -
> -The terminating @samp{\0} is not incorporated into the hash.
> +the string is incorporated into the hash using the formula
> +@code{r = r * 67 + tolower (c) - 113}. The terminating @samp{\0} is
> +not incorporated into the hash.
>
> The step size used in the hash table is computed via
> @code{((hash * 17) & (size - 1)) | 1}, where @samp{hash} is the hash
I think you should keep the historical information about older
versions and add precisely which symbols weren't included with
version 5 that are now included with version 6 in the documentation
of the gdb index format. That will be helpful for other producers
and consumers of the .gdb_index section (elfutils/binutils readelf,
gold --gdb-index option).
Thanks,
Mark
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-14 9:34 ` Mark Wielaard
@ 2012-02-14 9:38 ` Jan Kratochvil
2012-02-14 9:48 ` Mark Wielaard
2012-02-14 18:04 ` Eli Zaretskii
1 sibling, 1 reply; 14+ messages in thread
From: Jan Kratochvil @ 2012-02-14 9:38 UTC (permalink / raw)
To: Mark Wielaard; +Cc: Gary Benson, gdb-patches
On Tue, 14 Feb 2012 10:33:45 +0100, Mark Wielaard wrote:
> I think you should keep the historical information about older
> versions and add precisely which symbols weren't included with
> version 5 that are now included with version 6 in the documentation
> of the gdb index format. That will be helpful for other producers
> and consumers of the .gdb_index section (elfutils/binutils readelf,
> gold --gdb-index option).
So far GDB sources kept only documentation from the recognized formats.
Such change would have to be done retroactively.
I do not think it makes sense to give much energy to deal with older formats,
distros do a mass-rebuild from time to time anyway (some even nightly) and
.gdb_index contains no extra information over the real DWARF.
Sure it is great to have readelf available for the current valid format.
Thanks,
Jan
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-14 9:38 ` Jan Kratochvil
@ 2012-02-14 9:48 ` Mark Wielaard
2012-02-14 10:51 ` Gary Benson
0 siblings, 1 reply; 14+ messages in thread
From: Mark Wielaard @ 2012-02-14 9:48 UTC (permalink / raw)
To: Jan Kratochvil; +Cc: Gary Benson, gdb-patches
On Tue, Feb 14, 2012 at 10:38:31AM +0100, Jan Kratochvil wrote:
> On Tue, 14 Feb 2012 10:33:45 +0100, Mark Wielaard wrote:
> > I think you should keep the historical information about older
> > versions and add precisely which symbols weren't included with
> > version 5 that are now included with version 6 in the documentation
> > of the gdb index format. That will be helpful for other producers
> > and consumers of the .gdb_index section (elfutils/binutils readelf,
> > gold --gdb-index option).
>
> So far GDB sources kept only documentation from the recognized formats.
> Such change would have to be done retroactively.
>
> I do not think it makes sense to give much energy to deal with older formats,
I am not suggesting to retroactive add more info on never documented
versions, just to not remove existing documentation of the old versions.
Version 4, 5 and 6 are all compatible to a consumer, having that documented
is a good thing IMHO. Just having one extra line to document which symbols
have been added in version 6 will also help other producers like gold
--gdb-index.
Thanks,
Mark
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-14 9:48 ` Mark Wielaard
@ 2012-02-14 10:51 ` Gary Benson
0 siblings, 0 replies; 14+ messages in thread
From: Gary Benson @ 2012-02-14 10:51 UTC (permalink / raw)
To: Mark Wielaard; +Cc: Jan Kratochvil, gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1549 bytes --]
Mark Wielaard wrote:
> On Tue, Feb 14, 2012 at 10:38:31AM +0100, Jan Kratochvil wrote:
> > On Tue, 14 Feb 2012 10:33:45 +0100, Mark Wielaard wrote:
> > > I think you should keep the historical information about older
> > > versions and add precisely which symbols weren't included with
> > > version 5 that are now included with version 6 in the
> > > documentation of the gdb index format. That will be helpful for
> > > other producers and consumers of the .gdb_index section
> > > (elfutils/binutils readelf, gold --gdb-index option).
> >
> > So far GDB sources kept only documentation from the recognized
> > formats. Such change would have to be done retroactively.
> >
> > I do not think it makes sense to give much energy to deal with
> > older formats,
>
> I am not suggesting to retroactive add more info on never documented
> versions, just to not remove existing documentation of the old
> versions. Version 4, 5 and 6 are all compatible to a consumer,
> having that documented is a good thing IMHO. Just having one extra
> line to document which symbols have been added in version 6 will
> also help other producers like gold --gdb-index.
I can see the value in not removing existing documentation, but every
way I arranged it seemed more confusing than simply stating that the
previous formats were obsolete.
I've attached an alternate version of the doc part of the patch with
the information retained. I don't really like it, but if other people
think it valuable I won't make a fuss.
Cheers,
Gary
--
http://gbenson.net/
[-- Attachment #2: different-doc-patch --]
[-- Type: text/plain, Size: 1704 bytes --]
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 4f863dd..ee06d0c 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -9812,14 +9812,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
@@ -38717,8 +38709,14 @@ 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, 3, 4 and 5 are
+obsolete. Version 6 differs from version 5 in that version 6 includes
+symbols representing both inlined and out-of-line functions whereas
+version 5 included symbols representing out-of-line functions only.
+Version 5 differed from version 4 in that version 5 used a
+case-insensitive hashing function whereas version 4's hashing function
+was case-sensitive.
@item
The offset, from the start of the file, of the CU list.
@@ -38793,7 +38791,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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-14 9:34 ` Mark Wielaard
2012-02-14 9:38 ` Jan Kratochvil
@ 2012-02-14 18:04 ` Eli Zaretskii
1 sibling, 0 replies; 14+ messages in thread
From: Eli Zaretskii @ 2012-02-14 18:04 UTC (permalink / raw)
To: Mark Wielaard; +Cc: gbenson, gdb-patches, jan.kratochvil
> Date: Tue, 14 Feb 2012 10:33:45 +0100
> From: Mark Wielaard <mark@klomp.org>
> Cc: gdb-patches@sourceware.org, Jan Kratochvil <jan.kratochvil@redhat.com>
>
> I think you should keep the historical information about older
> versions and add precisely which symbols weren't included with
> version 5 that are now included with version 6 in the documentation
> of the gdb index format. That will be helpful for other producers
> and consumers of the .gdb_index section (elfutils/binutils readelf,
> gold --gdb-index option).
I agree.
Otherwise, the patch for the manual is approved.
Thanks.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-14 9:02 ` Gary Benson
@ 2012-02-15 8:05 ` Doug Evans
2012-02-15 12:17 ` Gary Benson
0 siblings, 1 reply; 14+ messages in thread
From: Doug Evans @ 2012-02-15 8:05 UTC (permalink / raw)
To: gdb-patches, gbenson
On Tue, Feb 14, 2012 at 1:02 AM, Gary Benson <gbenson@redhat.com> wrote:
> Hi Doug,
>
> Doug Evans wrote:
>> On Mon, Feb 13, 2012 at 10:47 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 fix the issues Jan
>> > pointed out with the last version.
>> >
>> > This patch bumps the version number of the .gdb-index to 6, but
>> > it does not remove any of the backwards compatibility code which
>> > I would prefer to do as a separate patch.
>>
>> I agree support for older versions should be a separate patch.
>> However this patch doesn't do that (it removes current acceptance
>> of older versions of the index).
>
> That's correct. The older versions do not contain partial symbols
> for inlined functions. If GDB were to be run on a file with an
> older versioned index without rejecting it then the ability to set
> breakpoints on inlined functions would silently fail.
"silently fail" as in "work *worse* than it did in previous gdb versions"?
While it may seem like it's always a win to just discard the index to
get new functionality, I'm not sure all users would agree with that in
all situations. If gdb 7.4 startup takes 5 seconds and gdb 7.5
startup takes 45 seconds on the same binary, and our response to their
complaint is that they have to rebuild the index, I'm not sure I'd be
comfortable with that. Especially if, for example, they're, say,
debugging a core file and can't use the new functionality anyway.
***OTOH***, if there is a functional *regression* (as opposed to a
speed regression) then I'd be much more comfortable with discarding
the index.
[to repeat my question above, for clarity's sake: Is there a
functional regression if we don't discard the index?]
OTOOH, 1/2 :-), why must there be a functional regression? [as opposed
to the absence of a new feature or capability]
One could support the old version for a release or two, and print a
warning when older versions are encountered.
The user's build procedure may involve building the index in a way
that is not easily updated in a timely manner. Thus all the speed
improvements are (at least temporarily, but for a long enough time to
be troublesome) wiped out simply by using a *newer* version of gdb.
And that makes me uncomfortable.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-15 8:05 ` Doug Evans
@ 2012-02-15 12:17 ` Gary Benson
2012-02-15 20:14 ` Doug Evans
0 siblings, 1 reply; 14+ messages in thread
From: Gary Benson @ 2012-02-15 12:17 UTC (permalink / raw)
To: Doug Evans; +Cc: gdb-patches
Doug Evans wrote:
> On Tue, Feb 14, 2012 at 1:02 AM, Gary Benson <gbenson@redhat.com> wrote:
> > Doug Evans wrote:
> > > On Mon, Feb 13, 2012 at 10:47 AM, Gary Benson <gbenson@redhat.com> wrote:
> > > > This patch makes GDB able to set breakpoints on inlined
> > > > functions.
> > > >
> > > > This version of the patch has been updated to fix the issues
> > > > Jan pointed out with the last version.
> > > >
> > > > This patch bumps the version number of the .gdb-index to 6,
> > > > but it does not remove any of the backwards compatibility code
> > > > which I would prefer to do as a separate patch.
> > >
> > > I agree support for older versions should be a separate patch.
> > > However this patch doesn't do that (it removes current
> > > acceptance of older versions of the index).
> >
> > That's correct. Â The older versions do not contain partial symbols
> > for inlined functions. Â If GDB were to be run on a file with an
> > older versioned index without rejecting it then the ability to set
> > breakpoints on inlined functions would silently fail.
>
> "silently fail" as in "work *worse* than it did in previous gdb
> versions"?
It wouldn't work *worse* than previous gdb versions--it would be the
same--but it would work worse than itself. You would have the
situation where an optimization was causing functionality to be lost,
and that doesn't seem right to me.
> While it may seem like it's always a win to just discard the index
> to get new functionality, I'm not sure all users would agree with
> that in all situations. If gdb 7.4 startup takes 5 seconds and gdb
> 7.5 startup takes 45 seconds on the same binary, and our response to
> their complaint is that they have to rebuild the index, I'm not sure
> I'd be comfortable with that. Especially if, for example, they're,
> say, debugging a core file and can't use the new functionality
> anyway. ***OTOH***, if there is a functional *regression* (as
> opposed to a speed regression) then I'd be much more comfortable
> with discarding the index.
> [to repeat my question above, for clarity's sake: Is there a
> functional regression if we don't discard the index?]
> OTOOH, 1/2 :-), why must there be a functional regression? [as
> opposed to the absence of a new feature or capability]
I guess it depends on how you define a functional regression.
If you compare GDB as it is now, GDB with this patch, and GDB with
this patch minus the index version, the functionality would look
like this:
| GDB GDB GDB
| now ver bump no ver bump
-------------------------+-----------------------------------
|
Break on inline funcs | no yes yes
in files without index |
|
Break on inline funcs | no yes no
in files with old index | (ignored)
|
Break on inline funcs | no yes yes
in files with new index |
GDB's behaviour is inconsistent if you don't rejecting the old index
files. That seemed like a bad thing to be introducing.
> One could support the old version for a release or two, and print a
> warning when older versions are encountered.
I wondered about this myself, though it was pointed out to me that
printed warnings often get lost in the noise.
> The user's build procedure may involve building the index in a way
> that is not easily updated in a timely manner. Thus all the speed
> improvements are (at least temporarily, but for a long enough time to
> be troublesome) wiped out simply by using a *newer* version of gdb.
> And that makes me uncomfortable.
How would it be if there the default behaviour was be to reject old
indexes (as the patch does now) but with the addition of a flag
("maint set allow-old-gdb-indexes" perhaps?) that would allow users in
this particular situation to get around it? That way, our response to
complaints can be "rebuild the index *or* use this flag (which by the
way will lose you such and such a functionality)" Inconsistent
behaviour doesn't seem so bad if the user asked for it.
Cheers,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-15 12:17 ` Gary Benson
@ 2012-02-15 20:14 ` Doug Evans
2012-02-16 10:41 ` Gary Benson
0 siblings, 1 reply; 14+ messages in thread
From: Doug Evans @ 2012-02-15 20:14 UTC (permalink / raw)
To: gdb-patches, gbenson
On Wed, Feb 15, 2012 at 1:47 AM, Gary Benson <gbenson@redhat.com> wrote:
> GDB's behaviour is inconsistent if you don't rejecting the old index
> files. That seemed like a bad thing to be introducing.
Absent a notification to the user and ability to control it, sure.
But I think we can come up with something appropriate.
>> One could support the old version for a release or two, and print a
>> warning when older versions are encountered.
>
> I wondered about this myself, though it was pointed out to me that
> printed warnings often get lost in the noise.
One can debate this forever. :-)
>> The user's build procedure may involve building the index in a way
>> that is not easily updated in a timely manner. Thus all the speed
>> improvements are (at least temporarily, but for a long enough time to
>> be troublesome) wiped out simply by using a *newer* version of gdb.
>> And that makes me uncomfortable.
>
> How would it be if there the default behaviour was be to reject old
> indexes (as the patch does now) but with the addition of a flag
> ("maint set allow-old-gdb-indexes" perhaps?) that would allow users in
> this particular situation to get around it? That way, our response to
> complaints can be "rebuild the index *or* use this flag (which by the
> way will lose you such and such a functionality)" Inconsistent
> behaviour doesn't seem so bad if the user asked for it.
IWBN if one could do "gdb my-binary-with-older-index" (as opposed to,
e.g., "gdb ; maint set ... ; file my-binary-with-older-index", or the
equivalent with -x/-ex foo, and setting the flag in ./.gdbinit won't
work).
That pretty much means passing gdb an option ("gdb --use-old-index
my-binary" or some such).
At Google we've added --disable-gdb-index as an escape hatch against
broken indices.
I'm happy to replace it with something that will do the same thing.
As for what the default behaviour should be, I don't have a strong
enough opinion to want to defend it. I can easily enough change it
here if desired. [Not something unfamiliar to Redhat. :-)]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-15 20:14 ` Doug Evans
@ 2012-02-16 10:41 ` Gary Benson
2012-02-17 22:42 ` Doug Evans
0 siblings, 1 reply; 14+ messages in thread
From: Gary Benson @ 2012-02-16 10:41 UTC (permalink / raw)
To: Doug Evans; +Cc: gdb-patches
Doug Evans wrote:
> On Wed, Feb 15, 2012 at 1:47 AM, Gary Benson <gbenson@redhat.com> wrote:
> > GDB's behaviour is inconsistent if you don't rejecting the old
> > index files. Â That seemed like a bad thing to be introducing.
>
> Absent a notification to the user and ability to control it, sure.
> But I think we can come up with something appropriate.
Ok.
> > > One could support the old version for a release or two, and
> > > print a warning when older versions are encountered.
> >
> > I wondered about this myself, though it was pointed out to me that
> > printed warnings often get lost in the noise.
>
> One can debate this forever. :-)
Well, quite :)
> > > The user's build procedure may involve building the index in a
> > > way that is not easily updated in a timely manner. Â Thus all the
> > > speed improvements are (at least temporarily, but for a long
> > > enough time to be troublesome) wiped out simply by using a
> > > *newer* version of gdb. And that makes me uncomfortable.
> >
> > How would it be if there the default behaviour was be to reject
> > old indexes (as the patch does now) but with the addition of a
> > flag ("maint set allow-old-gdb-indexes" perhaps?) that would allow
> > users in this particular situation to get around it? Â That way,
> > our response to complaints can be "rebuild the index *or* use this
> > flag (which by the way will lose you such and such a
> > functionality)" Â Inconsistent behaviour doesn't seem so bad if the
> > user asked for it.
>
> IWBN if one could do "gdb my-binary-with-older-index" (as opposed
> to, e.g., "gdb ; maint set ... ; file my-binary-with-older-index",
> or the equivalent with -x/-ex foo, and setting the flag in
> ./.gdbinit won't work). That pretty much means passing gdb an
> option ("gdb --use-old-index my-binary" or some such). At Google
> we've added --disable-gdb-index as an escape hatch against broken
> indices. I'm happy to replace it with something that will do the
> same thing.
>
> As for what the default behaviour should be, I don't have a strong
> enough opinion to want to defend it. I can easily enough change it
> here if desired. [Not something unfamiliar to Redhat. :-)]
Ok, so my plan is to implement an --allow-incomplete-gdb-index option
that will turn on support for version 4 and 5 indexes. I am unsure
as to whether to add printed warnings, but I'm leaning towards not
having warnings in either configuration. With the default setting
GDB will work correctly, but may possibly be slow which would be the
(admittedly not very direct) trigger for the user to investigate.
With the option supplied I assume the user knows what they're doing,
so they don't need pestering! I like the *idea* of warning users
that their .gdb-index sections are being skipped, but I think of the
case where somebody uses a new GDB on an older version of Fedora (say)
being flooded with warning messages about every single shared library
their program is linked to.
Cheers,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-16 10:41 ` Gary Benson
@ 2012-02-17 22:42 ` Doug Evans
2012-02-21 16:32 ` Gary Benson
0 siblings, 1 reply; 14+ messages in thread
From: Doug Evans @ 2012-02-17 22:42 UTC (permalink / raw)
To: gdb-patches
On Thu, Feb 16, 2012 at 2:37 AM, Gary Benson <gbenson@redhat.com> wrote:
>> > > The user's build procedure may involve building the index in a
>> > > way that is not easily updated in a timely manner. Thus all the
>> > > speed improvements are (at least temporarily, but for a long
>> > > enough time to be troublesome) wiped out simply by using a
>> > > *newer* version of gdb. And that makes me uncomfortable.
>> >
>> > How would it be if there the default behaviour was be to reject
>> > old indexes (as the patch does now) but with the addition of a
>> > flag ("maint set allow-old-gdb-indexes" perhaps?) that would allow
>> > users in this particular situation to get around it? That way,
>> > our response to complaints can be "rebuild the index *or* use this
>> > flag (which by the way will lose you such and such a
>> > functionality)" Inconsistent behaviour doesn't seem so bad if the
>> > user asked for it.
>>
>> IWBN if one could do "gdb my-binary-with-older-index" (as opposed
>> to, e.g., "gdb ; maint set ... ; file my-binary-with-older-index",
>> or the equivalent with -x/-ex foo, and setting the flag in
>> ./.gdbinit won't work). That pretty much means passing gdb an
>> option ("gdb --use-old-index my-binary" or some such). At Google
>> we've added --disable-gdb-index as an escape hatch against broken
>> indices. I'm happy to replace it with something that will do the
>> same thing.
>>
>> As for what the default behaviour should be, I don't have a strong
>> enough opinion to want to defend it. I can easily enough change it
>> here if desired. [Not something unfamiliar to Redhat. :-)]
>
> Ok, so my plan is to implement an --allow-incomplete-gdb-index option
> that will turn on support for version 4 and 5 indexes.
[recognizing one tries not to bikeshed except when one thinks it's
important enough ...]
--allow-deprecated-gdb-index ?
> I am unsure
> as to whether to add printed warnings, but I'm leaning towards not
> having warnings in either configuration. With the default setting
> GDB will work correctly, but may possibly be slow which would be the
> (admittedly not very direct) trigger for the user to investigate.
> With the option supplied I assume the user knows what they're doing,
> so they don't need pestering!
"works for me"
> I like the *idea* of warning users
> that their .gdb-index sections are being skipped, but I think of the
> case where somebody uses a new GDB on an older version of Fedora (say)
> being flooded with warning messages about every single shared library
> their program is linked to.
One can solve that by printing the warning at most once and providing
a way to see the entire list. But I don't have a strong enough
opinion to push for implementing it.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA take 4] Allow setting breakpoints on inline functions (PR 10738)
2012-02-17 22:42 ` Doug Evans
@ 2012-02-21 16:32 ` Gary Benson
0 siblings, 0 replies; 14+ messages in thread
From: Gary Benson @ 2012-02-21 16:32 UTC (permalink / raw)
To: Doug Evans; +Cc: gdb-patches
Doug Evans wrote:
> On Thu, Feb 16, 2012 at 2:37 AM, Gary Benson <gbenson@redhat.com> wrote:
> > Ok, so my plan is to implement an --allow-incomplete-gdb-index
> > option that will turn on support for version 4 and 5 indexes.
>
> [recognizing one tries not to bikeshed except when one thinks it's
> important enough ...]
> --allow-deprecated-gdb-index ?
Sorry Doug, I didn't see this email before I sent the other one
yesterday. I didn't mean to ignore you!
Would you be ok if I went with Eli's suggestion of
--use-old-index-sections ?
Thanks,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2012-02-21 16:23 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-13 18:47 [RFA take 4] Allow setting breakpoints on inline functions (PR 10738) Gary Benson
2012-02-14 1:39 ` Doug Evans
2012-02-14 9:02 ` Gary Benson
2012-02-15 8:05 ` Doug Evans
2012-02-15 12:17 ` Gary Benson
2012-02-15 20:14 ` Doug Evans
2012-02-16 10:41 ` Gary Benson
2012-02-17 22:42 ` Doug Evans
2012-02-21 16:32 ` Gary Benson
2012-02-14 9:34 ` Mark Wielaard
2012-02-14 9:38 ` Jan Kratochvil
2012-02-14 9:48 ` Mark Wielaard
2012-02-14 10:51 ` Gary Benson
2012-02-14 18:04 ` Eli Zaretskii
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox