* [RFA take 2] Allow setting breakpoints on inline functions (PR 10738)
@ 2011-12-06 14:52 Gary Benson
2011-12-06 15:38 ` Jan Kratochvil
0 siblings, 1 reply; 2+ messages in thread
From: Gary Benson @ 2011-12-06 14:52 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey, Jan Kratochvil
[-- Attachment #1: Type: text/plain, Size: 297 bytes --]
Hi all,
This patch, which applies on top of Tom's ambiguous linespec work,
makes GDB able to set breakpoints on inlined functions.
This second version of the patch has been updated with fixes and
suggestions I received from Tom and Jan.
How does it look?
Thanks,
Gary
--
http://gbenson.net/
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 65204 bytes --]
2011-12-06 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 static
symbol table.
* symtab.c (lookup_block_symbol): Don't return symbols of
inlined subroutines.
* NEWS: Mention that GDB can now set breakpoints on inlined
functions.
2011-12-06 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.
2011-12-06 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.
diff --git a/gdb/NEWS b/gdb/NEWS
index 5cdb63e..f2d50d5 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,8 @@
*** Changes since GDB 7.3.1
+* GDB can now set breakpoints on inlined functions.
+
* GDB has two new commands: "set remote hardware-watchpoint-length-limit"
and "show remote hardware-watchpoint-length-limit". These allows to
set or show the maximum length limit (in bytes) of a remote
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 853692c..a9baf0b 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -9663,14 +9663,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
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 145c8d0..ee89286 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -578,6 +578,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. */
@@ -4285,6 +4286,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
@@ -9925,6 +9930,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;
}
@@ -11800,8 +11810,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 = &file_symbols;
break;
case DW_TAG_template_value_param:
suppress_add = 1;
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 68b80be..275c201 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -1781,8 +1781,9 @@ lookup_block_symbol (const struct block *block, const char *name,
sym != NULL;
sym = dict_iter_name_next (name, &iter))
{
- if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
- SYMBOL_DOMAIN (sym), domain))
+ if (!SYMBOL_INLINED (sym)
+ && symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+ SYMBOL_DOMAIN (sym), domain))
return sym;
}
return NULL;
diff --git a/gdb/testsuite/gdb.dwarf2/inline-break.S b/gdb/testsuite/gdb.dwarf2/inline-break.S
new file mode 100644
index 0000000..04566b9
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/inline-break.S
@@ -0,0 +1,1663 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011 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:36
+ .loc 1 36 0
+ .cfi_startproc
+.LVL0:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:37
+ .loc 1 37 0
+ movl %edi, %eax
+ sall $4, %eax
+ addl %edi, %eax
+ # ../gdb.opt/inline-break.c:38
+ .loc 1 38 0
+ ret
+ .cfi_endproc
+.LFE1:
+ .size func2, .-func2
+ .p2align 4,,15
+.globl func4a
+ .type func4a, @function
+func4a:
+.LFB5:
+ # ../gdb.opt/inline-break.c:66
+ .loc 1 66 0
+ .cfi_startproc
+.LVL1:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:67
+ .loc 1 67 0
+ movl %edi, %eax
+ sall $4, %eax
+ leal (%rax,%rdi), %edi
+.LVL2:
+.LBB46:
+.LBB47:
+ # ../gdb.opt/inline-break.c:61
+ .loc 1 61 0
+ xorl %eax, %eax
+ cmpl $12, %edi
+ setg %al
+ addl $1, %eax
+.LBE47:
+.LBE46:
+ # ../gdb.opt/inline-break.c:68
+ .loc 1 68 0
+ ret
+ .cfi_endproc
+.LFE5:
+ .size func4a, .-func4a
+ .p2align 4,,15
+.globl func5b
+ .type func5b, @function
+func5b:
+.LFB6:
+ # ../gdb.opt/inline-break.c:75
+ .loc 1 75 0
+ .cfi_startproc
+.LVL3:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:76
+ .loc 1 76 0
+ xorl %eax, %eax
+ cmpl $11, %edi
+ setg %al
+ addl $1, %eax
+ # ../gdb.opt/inline-break.c:77
+ .loc 1 77 0
+ ret
+ .cfi_endproc
+.LFE6:
+ .size func5b, .-func5b
+ .p2align 4,,15
+.globl func6b
+ .type func6b, @function
+func6b:
+.LFB8:
+ # ../gdb.opt/inline-break.c:90
+ .loc 1 90 0
+ .cfi_startproc
+.LVL4:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:91
+ .loc 1 91 0
+ xorl %eax, %eax
+ cmpl $13, %edi
+ setle %al
+ addl $2, %eax
+ # ../gdb.opt/inline-break.c:92
+ .loc 1 92 0
+ ret
+ .cfi_endproc
+.LFE8:
+ .size func6b, .-func6b
+ .p2align 4,,15
+.globl func6a
+ .type func6a, @function
+func6a:
+.LFB9:
+ # ../gdb.opt/inline-break.c:96
+ .loc 1 96 0
+ .cfi_startproc
+.LVL5:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:97
+ .loc 1 97 0
+ movl %edi, %eax
+ sall $4, %eax
+ leal (%rax,%rdi), %edi
+.LVL6:
+.LBB48:
+.LBB49:
+ # ../gdb.opt/inline-break.c:91
+ .loc 1 91 0
+ xorl %eax, %eax
+ cmpl $13, %edi
+ setle %al
+ addl $2, %eax
+.LBE49:
+.LBE48:
+ # ../gdb.opt/inline-break.c:98
+ .loc 1 98 0
+ ret
+ .cfi_endproc
+.LFE9:
+ .size func6a, .-func6a
+ .p2align 4,,15
+.globl func8b
+ .type func8b, @function
+func8b:
+.LFB12:
+ # ../gdb.opt/inline-break.c:118
+ .loc 1 118 0
+ .cfi_startproc
+.LVL7:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:119
+ .loc 1 119 0
+ xorl %eax, %eax
+ cmpl $6, %edi
+ setle %al
+ leal 9(%rax,%rax), %eax
+ # ../gdb.opt/inline-break.c:120
+ .loc 1 120 0
+ ret
+ .cfi_endproc
+.LFE12:
+ .size func8b, .-func8b
+ .p2align 4,,15
+.globl main
+ .type main, @function
+main:
+.LFB14:
+ # ../gdb.opt/inline-break.c:132
+ .loc 1 132 0
+ .cfi_startproc
+.LVL8:
+ # basic block 2
+ # ../gdb.opt/inline-break.c:137
+ .loc 1 137 0
+ movl %edi, -4(%rsp)
+.LVL9:
+ # ../gdb.opt/inline-break.c:139
+ .loc 1 139 0
+ movl -4(%rsp), %eax
+.LVL10:
+.LBB50:
+.LBB51:
+ # ../gdb.opt/inline-break.c:29
+ .loc 1 29 0
+ movl $23, %edi
+.LVL11:
+.LBE51:
+.LBE50:
+.LBB53:
+.LBB54:
+ # ../gdb.opt/inline-break.c:52
+ .loc 1 52 0
+ movl $23, %esi
+.LVL12:
+.LBE54:
+.LBE53:
+.LBB58:
+.LBB59:
+ # ../gdb.opt/inline-break.c:82
+ .loc 1 82 0
+ movl $23, %ecx
+.LBE59:
+.LBE58:
+.LBB63:
+.LBB52:
+ # ../gdb.opt/inline-break.c:29
+ .loc 1 29 0
+ imull %edi, %eax
+.LVL13:
+.LBE52:
+.LBE63:
+ # ../gdb.opt/inline-break.c:139
+ .loc 1 139 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:141
+ .loc 1 141 0
+ movl -4(%rsp), %eax
+.LVL14:
+.LBB64:
+.LBB65:
+ # ../gdb.opt/inline-break.c:37
+ .loc 1 37 0
+ movl %eax, %edx
+ sall $4, %edx
+ leal (%rdx,%rax), %eax
+.LVL15:
+.LBE65:
+.LBE64:
+ # ../gdb.opt/inline-break.c:141
+ .loc 1 141 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:143
+ .loc 1 143 0
+ movl -4(%rsp), %eax
+.LVL16:
+.LBB66:
+.LBB57:
+ # ../gdb.opt/inline-break.c:52
+ .loc 1 52 0
+ imull %esi, %eax
+.LVL17:
+.LBB55:
+.LBB56:
+ # ../gdb.opt/inline-break.c:46
+ .loc 1 46 0
+ cmpl $13, %eax
+ setg %al
+.LVL18:
+ movzbl %al, %eax
+ addl $1, %eax
+.LBE56:
+.LBE55:
+.LBE57:
+.LBE66:
+ # ../gdb.opt/inline-break.c:143
+ .loc 1 143 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:145
+ .loc 1 145 0
+ movl -4(%rsp), %eax
+.LVL19:
+.LBB67:
+.LBB68:
+ # ../gdb.opt/inline-break.c:67
+ .loc 1 67 0
+ movl %eax, %edx
+ sall $4, %edx
+ leal (%rdx,%rax), %eax
+.LVL20:
+.LBB69:
+.LBB70:
+ # ../gdb.opt/inline-break.c:61
+ .loc 1 61 0
+ cmpl $12, %eax
+ setg %al
+ movzbl %al, %eax
+ addl $1, %eax
+.LBE70:
+.LBE69:
+.LBE68:
+.LBE67:
+ # ../gdb.opt/inline-break.c:145
+ .loc 1 145 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:147
+ .loc 1 147 0
+ movl -4(%rsp), %eax
+.LVL21:
+.LBB71:
+.LBB62:
+ # ../gdb.opt/inline-break.c:82
+ .loc 1 82 0
+ imull %ecx, %eax
+.LVL22:
+.LBB60:
+.LBB61:
+ # ../gdb.opt/inline-break.c:76
+ .loc 1 76 0
+ cmpl $11, %eax
+ setg %al
+.LVL23:
+ movzbl %al, %eax
+ addl $1, %eax
+.LBE61:
+.LBE60:
+.LBE62:
+.LBE71:
+ # ../gdb.opt/inline-break.c:147
+ .loc 1 147 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:149
+ .loc 1 149 0
+ movl -4(%rsp), %eax
+.LVL24:
+.LBB72:
+.LBB73:
+ # ../gdb.opt/inline-break.c:97
+ .loc 1 97 0
+ movl %eax, %edx
+ sall $4, %edx
+ leal (%rdx,%rax), %eax
+.LVL25:
+.LBE73:
+.LBE72:
+.LBB77:
+.LBB80:
+ # ../gdb.opt/inline-break.c:111
+ .loc 1 111 0
+ movl $29, %edx
+.LBE80:
+.LBE77:
+.LBB89:
+.LBB76:
+.LBB74:
+.LBB75:
+ # ../gdb.opt/inline-break.c:91
+ .loc 1 91 0
+ cmpl $13, %eax
+ setle %al
+ movzbl %al, %eax
+ addl $2, %eax
+.LBE75:
+.LBE74:
+.LBE76:
+.LBE89:
+ # ../gdb.opt/inline-break.c:149
+ .loc 1 149 0
+ movl %eax, -4(%rsp)
+ # ../gdb.opt/inline-break.c:151
+ .loc 1 151 0
+ movl -4(%rsp), %eax
+.LVL26:
+.LBB90:
+.LBB79:
+ # ../gdb.opt/inline-break.c:111
+ .loc 1 111 0
+ imull %edx, %eax
+.LVL27:
+.LBE79:
+.LBE90:
+ # ../gdb.opt/inline-break.c:151
+ .loc 1 151 0
+ movl -4(%rsp), %edx
+.LVL28:
+.LBB91:
+.LBB87:
+.LBB82:
+.LBB84:
+ # ../gdb.opt/inline-break.c:105
+ .loc 1 105 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:151
+ .loc 1 151 0
+ leal (%rdx,%rax), %eax
+.LVL31:
+ movl %eax, -4(%rsp)
+.LVL32:
+ # ../gdb.opt/inline-break.c:153
+ .loc 1 153 0
+ movl -4(%rsp), %edx
+.LVL33:
+.LBB100:
+.LBB101:
+ # ../gdb.opt/inline-break.c:125
+ .loc 1 125 0
+ movl %edx, %eax
+.LVL34:
+ sall $5, %eax
+ subl %edx, %eax
+.LBB102:
+.LBB103:
+ # ../gdb.opt/inline-break.c:119
+ .loc 1 119 0
+ xorl %edx, %edx
+.LVL35:
+ cmpl $6, %eax
+.LBE103:
+.LBE102:
+.LBE101:
+.LBE100:
+ # ../gdb.opt/inline-break.c:153
+ .loc 1 153 0
+ movl -4(%rsp), %eax
+.LVL36:
+.LBB107:
+.LBB106:
+.LBB105:
+.LBB104:
+ # ../gdb.opt/inline-break.c:119
+ .loc 1 119 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:153
+ .loc 1 153 0
+ leal 9(%rax,%rdx,2), %eax
+.LVL38:
+ movl %eax, -4(%rsp)
+.LVL39:
+ # ../gdb.opt/inline-break.c:155
+ .loc 1 155 0
+ movl -4(%rsp), %eax
+.LVL40:
+ # ../gdb.opt/inline-break.c:156
+ .loc 1 156 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 0x2c # 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 0x2c # 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 0x67 # 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 0x67 # 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 0x3b # 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 0x3b # 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 0x4a # 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 0x4a # 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 0x59 # 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 0x59 # 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 0x75 # 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 0x75 # 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 0x1b # 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 0x1b # 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 0x23 # 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 0x23 # 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 0x32 # 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 0x32 # 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 0x41 # 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 0x41 # 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 0x50 # 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 0x50 # 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 0x5f # 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 0x5f # 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 0x6d # 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 0x6d # 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 0x7b # 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 0x7b # 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 0x43 # 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 0x61 # 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 0x83 # 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 0x83 # 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 0x83 # 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 0x89 # 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 0x8b # 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 0x8f # 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 0x34 # 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 0x93 # 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 0x52 # 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 0x8d # 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 0x91 # 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 0x43 # 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 0x95 # 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 0x61 # 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 0x97 # 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 0x6f # 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 0x97 # 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 0x99 # 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 0x7d # 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 0x99 # 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/inline-break.exp b/gdb/testsuite/gdb.dwarf2/inline-break.exp
new file mode 100644
index 0000000..8e74387
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/inline-break.exp
@@ -0,0 +1,102 @@
+# Copyright 2011 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/>.
+
+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 testfile "inline-break"
+
+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 .*$testfile\\.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 .*$testfile\\.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\\)"
diff --git a/gdb/testsuite/gdb.opt/inline-break.c b/gdb/testsuite/gdb.opt/inline-break.c
new file mode 100644
index 0000000..a97390f
--- /dev/null
+++ b/gdb/testsuite/gdb.opt/inline-break.c
@@ -0,0 +1,156 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright (C) 2011 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/>. */
+
+#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..dde4dea
--- /dev/null
+++ b/gdb/testsuite/gdb.opt/inline-break.exp
@@ -0,0 +1,91 @@
+# Copyright 2011 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/>.
+
+set testfile "inline-break"
+
+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 .*$testfile\\.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 .*$testfile\\.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\\)"
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [RFA take 2] Allow setting breakpoints on inline functions (PR 10738)
2011-12-06 14:52 [RFA take 2] Allow setting breakpoints on inline functions (PR 10738) Gary Benson
@ 2011-12-06 15:38 ` Jan Kratochvil
0 siblings, 0 replies; 2+ messages in thread
From: Jan Kratochvil @ 2011-12-06 15:38 UTC (permalink / raw)
To: Gary Benson; +Cc: gdb-patches, Tom Tromey
On Tue, 06 Dec 2011 15:31:25 +0100, Gary Benson wrote:
> * 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.
The basenames should be different as dejagnu identifies testcases for example
for --ignore just by their basenames.
I found such a little disadvantage - but that is a bug (not regression) of
Tom's linespec patch IMO:
1 int v;
2 extern void f (void);
3 void g (void) {
4 f ();
5 }
6 void f (void) {
7 v++;
8 }
(gdb) b f
Breakpoint 1 at 0x0: f. (2 locations)
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 y 0x0000000000000000 in g at 1.c:7
1.2 y 0x0000000000000010 in f at 1.c:7
The line numbers are based on .debug_line. But DWARF knows the real line
numbers:
<1><2d>: Abbrev Number: 2 (DW_TAG_subprogram)
<2e> DW_AT_name : f
<31> DW_AT_decl_line : 6
<1><33>: Abbrev Number: 3 (DW_TAG_subprogram)
<34> DW_AT_name : g
<2><4e>: Abbrev Number: 4 (DW_TAG_inlined_subroutine)
<64> DW_AT_call_line : 4
I consider this as an unrelated Bug/RFE.
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -578,6 +578,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. */
> @@ -4285,6 +4286,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
> @@ -9925,6 +9930,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;
> }
> @@ -11800,8 +11810,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 = &file_symbols;
> break;
> case DW_TAG_template_value_param:
> suppress_add = 1;
I do not find it completely great to mess inlined functions into the
STATIC_BLOCK symbols, I thought more about either searching all the block
vectors or to use some other index to find all the inlined instances.
But I am fine with STATIC_BLOCK as long as you catch all the exceptions.
For example search_symbols also needs an exception, the countercase:
(gdb) l
1 int v;
2 extern void f (void);
3 void g (void) {
4 f ();
5 }
6 void f (void) {
7 v++;
8 }
(gdb) info functions f
All functions matching regular expression "f":
File 1.c:
void f(void);
static void f(void);
Maybe also default_make_symbol_completion_list_break_on and
make_file_symbol_completion_list need an exception:
(gdb) l
1 int v;
2 static void f (void);
3 void g (void) {
4 f ();
5 }
6 static void f (void) {
7 v++;
8 }
(gdb) p <tab><tab>
2.c f g int v
(gdb) p f
No symbol "f" in current context.
And also rbreak_command needs an exception:
(gdb) l
1 int v;
2 extern void f (void);
3 void g (void) {
4 f ();
5 }
6 void f (void) {
7 v++;
8 }
(gdb) rbreak f
Breakpoint 1 at 0x0: 1.c:f. (2 locations)
void f(void);
Note: breakpoint 1 also set at pc 0x0.
Note: breakpoint 1 also set at pc 0x10.
Breakpoint 2 at 0x0: 1.c:f. (2 locations)
static void f(void);
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 y 0x0000000000000000 in g at 1.c:7
1.2 y 0x0000000000000010 in f at 1.c:7
2 breakpoint keep y <MULTIPLE>
2.1 y 0x0000000000000000 in g at 1.c:7
2.2 y 0x0000000000000010 in f at 1.c:7
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index 68b80be..275c201 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -1781,8 +1781,9 @@ lookup_block_symbol (const struct block *block, const char *name,
> sym != NULL;
> sym = dict_iter_name_next (name, &iter))
> {
> - if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
> - SYMBOL_DOMAIN (sym), domain))
> + if (!SYMBOL_INLINED (sym)
> + && symbol_matches_domain (SYMBOL_LANGUAGE (sym),
> + SYMBOL_DOMAIN (sym), domain))
> return sym;
> }
> return NULL;
It should be also in the second part of this function. When the current scope
is in function f which contains inlined function g then command `break g'
could again pick the inlined variant.
> --- /dev/null
> +++ b/gdb/testsuite/gdb.dwarf2/inline-break.S
> + .long .LASF19 # DW_AT_comp_dir: "/home/gary/work/archer/src/gdb/testsuite/gdb.dwarf2"
> + .string "/home/gary/work/archer/src/gdb/testsuite/gdb.dwarf2"
Maybe you want to delete those strings but maybe not.
Thanks,
Jan
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-12-06 15:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-06 14:52 [RFA take 2] Allow setting breakpoints on inline functions (PR 10738) Gary Benson
2011-12-06 15:38 ` Jan Kratochvil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox