From 481860b396d7a4106d63b1a900486accc97bb56a Mon Sep 17 00:00:00 2001 From: Gary Benson Date: Fri, 16 Mar 2012 16:47:34 +0000 Subject: [PATCH] gdb: PR breakpoints/10738 * dwarf2read.c (use_deprecated_index_sections): New global. (struct partial_die_info): New member may_be_inlined. (read_partial_die): Set may_be_inlined where appropriate. (add_partial_subprogram): Add partial symbols for partial DIEs that may be inlined. (new_symbol_full): Add inlined subroutines to the current scope. (write_psymtabs_to_index): Bump version number. (dwarf2_read_index): Read only version 6 indices unless use_deprecated_index_sections is set. * linespec.c (symbol_and_data_callback): New structure. (iterate_inline_only): New function. (iterate_over_all_matching_symtabs): New argument "include_inline". If nonzero, also call the callback for symbols representing inlined subroutines. (lookup_prefix_sym): Pass extra argument to the above. (find_function_symbols): Likewise. (add_matching_symbols_to_info): Likewise. * NEWS: Mention that GDB can now set breakpoints on inlined functions. gdb/doc: PR breakpoints/10738 * gdb.texinfo (Inline Functions): Remove the now-unnecessary @item stating that GDB cannot set breakpoints on inlined functions. (Mode Options): Document --use-deprecated-index-sections. (Index Section Format): Document new index section version format. gdb/testsuite: PR breakpoints/10738 * gdb.opt/inline-break.exp: New file. * gdb.opt/inline-break.c: Likewise. * gdb.dwarf2/inline-break.exp: Likewise. * gdb.dwarf2/inline-break.S: Likewise. * gdb.base/annota1.exp: Cope with old .gdb_index warnings. * gdb.base/async-shell.exp: Likewise. * lib/mi-support.exp (library_loaded_re): Likewise. --- gdb/ChangeLog | 24 + gdb/NEWS | 11 + gdb/doc/ChangeLog | 8 + gdb/doc/gdb.texinfo | 24 +- gdb/dwarf2read.c | 56 +- gdb/linespec.c | 56 +- gdb/main.c | 6 + gdb/symfile.h | 3 + gdb/testsuite/ChangeLog | 11 + gdb/testsuite/gdb.base/annota1.exp | 2 +- gdb/testsuite/gdb.base/async-shell.exp | 4 +- gdb/testsuite/gdb.dwarf2/dw2-inline-break.S | 1663 +++++++++++++++++ gdb/testsuite/gdb.dwarf2/dw2-inline-break.exp | 124 ++ gdb/testsuite/gdb.opt/inline-break.c | 159 ++ gdb/testsuite/gdb.opt/inline-break.exp | 114 ++ gdb/testsuite/lib/mi-support.exp | 3 +- 16 files changed, 2240 insertions(+), 28 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-inline-break.S create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-inline-break.exp create mode 100644 gdb/testsuite/gdb.opt/inline-break.c create mode 100644 gdb/testsuite/gdb.opt/inline-break.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3d0f83756d5..b813695c9c2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,27 @@ +2012-03-16 Gary Benson + + PR breakpoints/10738 + * dwarf2read.c (use_deprecated_index_sections): New global. + (struct partial_die_info): New member may_be_inlined. + (read_partial_die): Set may_be_inlined where appropriate. + (add_partial_subprogram): Add partial symbols for partial + DIEs that may be inlined. + (new_symbol_full): Add inlined subroutines to the current + scope. + (write_psymtabs_to_index): Bump version number. + (dwarf2_read_index): Read only version 6 indices unless + use_deprecated_index_sections is set. + * linespec.c (symbol_and_data_callback): New structure. + (iterate_inline_only): New function. + (iterate_over_all_matching_symtabs): New argument + "include_inline". If nonzero, also call the callback for + symbols representing inlined subroutines. + (lookup_prefix_sym): Pass extra argument to the above. + (find_function_symbols): Likewise. + (add_matching_symbols_to_info): Likewise. + * NEWS: Mention that GDB can now set breakpoints on inlined + functions. + 2012-03-16 Pierre Muller * p-typeprint.c (pascal_type_print_method_args): diff --git a/gdb/NEWS b/gdb/NEWS index 6444984daa4..e6bf59c1996 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -62,6 +62,17 @@ * The "info static-tracepoint-marker" command will now also work on native Linux targets with in-process agent. +* GDB can now set breakpoints on inlined functions. + +* The .gdb_index section has been updated to include symbols for + inlined functions. GDB will ignore older .gdb_index sections by + default, which could cause symbol files to be loaded more slowly + until their .gdb_index sections can be recreated. The new option + --use-deprecated-index-sections will cause GDB to use any older + .gdb_index sections it finds. This will restore performance, but + the ability to set breakpoints on inlined functions will be lost + in symbol files with older .gdb_index sections. + * New commands ** "catch load" and "catch unload" can be used to stop when a shared diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 8ea02d0edf3..cb6d0e987eb 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,11 @@ +2012-03-16 Gary Benson + + PR breakpoints/10738 + * gdb.texinfo (Inline Functions): Remove the now-unnecessary @item + stating that GDB cannot set breakpoints on inlined functions. + (Mode Options): Document --use-deprecated-index-sections. + (Index Section Format): Document new index section version format. + 2012-03-15 Tom Tromey * gdb.texinfo (Debugging C Plus Plus): Document "info vtbl". diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index d4c56568576..56bf5d54beb 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -1221,6 +1221,13 @@ memory usage after it completes each command and returns to the prompt. This option causes @value{GDBN} to print its version number and no-warranty blurb, and exit. +@item -use-deprecated-index-sections +@cindex @code{--use-deprecated-index-sections} +This option causes @value{GDBN} to read and use deprecated +@samp{.gdb_index} sections from symbol files. This can speed up +startup, but may result in some functionality being lost. +@xref{Index Section Format}. + @end table @node Startup @@ -9889,14 +9896,6 @@ There are some ways that @value{GDBN} does not pretend that inlined 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} @@ -38956,8 +38955,11 @@ unless otherwise noted: @enumerate @item -The version number, currently 5. Versions 1, 2 and 3 are obsolete. -Version 4 differs by its hashing function. +The version number, currently 6. Versions 1, 2 and 3 are obsolete. +Version 4 uses a different hashing function from versions 5 and 6. +Version 6 includes symbols for inlined functions, whereas versions +4 and 5 do not. @value{GDBN} will only read version 4 and 5 indices +if the @code{--use-deprecated-index-sections} option is used. @item The offset, from the start of the file, of the CU list. @@ -39032,7 +39034,7 @@ index version: @item Version 4 The formula is @code{r = r * 67 + c - 113}. -@item Version 5 +@item Versions 5 and 6 The formula is @code{r = r * 67 + tolower (c) - 113}. @end table diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 31e0012e214..7944e0f9a0d 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -85,6 +85,9 @@ static int dwarf2_die_debug = 0; /* When non-zero, cross-check physname against demangler. */ static int check_physname = 0; +/* When non-zero, do not reject deprecated .gdb_index sections. */ +int use_deprecated_index_sections = 0; + static int pagesize; /* When set, the file that we're processing is known to have debugging @@ -539,6 +542,7 @@ struct partial_die_info unsigned int has_type : 1; unsigned int has_specification : 1; unsigned int has_pc_info : 1; + unsigned int may_be_inlined : 1; /* Flag set if the SCOPE field of this structure has been computed. */ @@ -2118,13 +2122,41 @@ dwarf2_read_index (struct objfile *objfile) /* Versions earlier than 3 emitted every copy of a psymbol. This causes the index to behave very poorly for certain requests. Version 3 contained incomplete addrmap. So, it seems better to just ignore such - indices. Index version 4 uses a different hash function than index - version 5 and later. */ + indices. */ if (version < 4) - return 0; - /* Indices with higher version than the one supported by GDB may be no + { + static int warning_printed = 0; + if (!warning_printed) + { + warning (_("Skipping obsolete .gdb_index section in %s."), + objfile->name); + warning_printed = 1; + } + return 0; + } + /* Index version 4 uses a different hash function than index version + 5 and later. + + Versions earlier than 6 did not emit psymbols for inlined + functions. Using these files will cause GDB not to be able to + set breakpoints on inlined functions by name, so we ignore these + indices unless the --use-deprecated-index-sections command line + option was supplied. */ + if (version < 6 && !use_deprecated_index_sections) + { + static int warning_printed = 0; + if (!warning_printed) + { + warning (_("Skipping deprecated .gdb_index section in %s, pass " + "--use-deprecated-index-sections to use them anyway"), + objfile->name); + warning_printed = 1; + } + return 0; + } + /* Indexes with higher version than the one supported by GDB may be no longer backward compatible. */ - if (version > 5) + if (version > 6) return 0; map = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct mapped_index); @@ -4244,6 +4276,10 @@ add_partial_subprogram (struct partial_die_info *pdi, pdi->highpc - 1 + baseaddr, cu->per_cu->v.psymtab); } + } + + if (pdi->has_pc_info || (!pdi->is_external && pdi->may_be_inlined)) + { if (!pdi->is_declaration) /* Ignore subprogram DIEs that do not have a name, they are illegal. Do not emit a complaint at this point, we will @@ -9874,6 +9910,11 @@ read_partial_die (struct partial_die_info *part_die, language_of_main = language_fortran; } break; + case DW_AT_inline: + if (DW_UNSND (&attr) == DW_INL_inlined + || DW_UNSND (&attr) == DW_INL_declared_inlined) + part_die->may_be_inlined = 1; + break; default: break; } @@ -11718,8 +11759,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; @@ -17027,7 +17067,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 c2057cf708b..1e9770ef7c8 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -321,6 +321,33 @@ cplusplus_error (const char *name, const char *fmt, ...) throw_error (NOT_FOUND_ERROR, "%s", message); } +/* A callback function and the additional data to call it with. */ + +struct symbol_and_data_callback +{ + /* The callback to use. */ + symbol_found_callback_ftype *callback; + + /* Data to be passed to the callback. */ + void *data; +}; + +/* A helper for iterate_over_all_matching_symtabs that is used to + restrict calls to another callback to symbols representing inline + symbols only. */ + +static int +iterate_inline_only (struct symbol *sym, void *d) +{ + if (SYMBOL_INLINED (sym)) + { + struct symbol_and_data_callback *cad = d; + + return cad->callback (sym, cad->data); + } + return 1; /* Continue iterating. */ +} + /* Some data for the expand_symtabs_matching callback. */ struct symbol_matcher_data @@ -348,14 +375,16 @@ iterate_name_matcher (const char *name, void *d) /* A helper that walks over all matching symtabs in all objfiles and calls CALLBACK for each symbol matching NAME. If SEARCH_PSPACE is not NULL, then the search is restricted to just that program - space. */ + space. If INCLUDE_INLINE is nonzero then symbols representing + inlined instances of functions will be included in the result. */ static void iterate_over_all_matching_symtabs (const char *name, const domain_enum domain, symbol_found_callback_ftype *callback, void *data, - struct program_space *search_pspace) + struct program_space *search_pspace, + int include_inline) { struct objfile *objfile; struct program_space *pspace; @@ -394,6 +423,20 @@ iterate_over_all_matching_symtabs (const char *name, block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK); LA_ITERATE_OVER_SYMBOLS (block, name, domain, callback, data); + + if (include_inline) + { + struct symbol_and_data_callback cad = { callback, data }; + int i; + + for (i = FIRST_LOCAL_BLOCK; + i < BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (symtab)); i++) + { + block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), i); + LA_ITERATE_OVER_SYMBOLS (block, name, domain, + iterate_inline_only, &cad); + } + } } } } @@ -1885,10 +1928,10 @@ lookup_prefix_sym (char **argptr, char *p, VEC (symtab_p) *file_symtabs, { iterate_over_all_matching_symtabs (copy, STRUCT_DOMAIN, collect_one_symbol, &collector, - NULL); + NULL, 0); iterate_over_all_matching_symtabs (copy, VAR_DOMAIN, collect_one_symbol, &collector, - NULL); + NULL, 0); } else { @@ -2251,7 +2294,8 @@ find_function_symbols (char **argptr, char *p, int is_quote_enclosed, copy[p - *argptr] = 0; iterate_over_all_matching_symtabs (copy, VAR_DOMAIN, - collect_function_symbols, &result, NULL); + collect_function_symbols, &result, NULL, + 0); if (VEC_empty (symbolp, result)) VEC_free (symbolp, result); @@ -2952,7 +2996,7 @@ add_matching_symbols_to_info (const char *name, { iterate_over_all_matching_symtabs (name, VAR_DOMAIN, collect_symbols, info, - pspace); + pspace, 1); search_minsyms_for_name (info, name, pspace); } else if (pspace == NULL || pspace == SYMTAB_PSPACE (elt)) diff --git a/gdb/main.c b/gdb/main.c index e46f8233d92..a63a385979d 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -450,6 +450,8 @@ captured_main (void *data) {"args", no_argument, &set_args, 1}, {"l", required_argument, 0, 'l'}, {"return-child-result", no_argument, &return_child_result, 1}, + {"use-deprecated-index-sections", no_argument, + &use_deprecated_index_sections, 1}, {0, no_argument, 0, 0} }; @@ -1020,6 +1022,10 @@ Options:\n\n\ --tui Use a terminal user interface.\n\ "), stream); #endif + fputs_unfiltered (_("\ + --use-deprecated-index-sections\n\ + Do not reject deprecated .gdb_index sections.\n\ +"), stream); fputs_unfiltered (_("\ --version Print version information and then exit.\n\ -w Use a window interface.\n\ diff --git a/gdb/symfile.h b/gdb/symfile.h index d4f3fd90385..7024ace518c 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -617,6 +617,9 @@ extern void dwarf2_build_frame_info (struct objfile *); void dwarf2_free_objfile (struct objfile *); +/* Whether to use deprecated .gdb_index sections. */ +extern int use_deprecated_index_sections; + /* From mdebugread.c */ /* Hack to force structures to exist before use in parameter list. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5829950ec0f..ee59720698f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2012-03-16 Gary Benson + + PR breakpoints/10738 + * gdb.opt/inline-break.exp: New file. + * gdb.opt/inline-break.c: Likewise. + * gdb.dwarf2/inline-break.exp: Likewise. + * gdb.dwarf2/inline-break.S: Likewise. + * gdb.base/annota1.exp: Cope with old .gdb_index warnings. + * gdb.base/async-shell.exp: Likewise. + * lib/mi-support.exp (library_loaded_re): Likewise. + 2012-03-15 Tom Tromey * gdb.cp/virtfunc2.exp: Update expected output. diff --git a/gdb/testsuite/gdb.base/annota1.exp b/gdb/testsuite/gdb.base/annota1.exp index ae16667562a..c7371b4db90 100644 --- a/gdb/testsuite/gdb.base/annota1.exp +++ b/gdb/testsuite/gdb.base/annota1.exp @@ -133,7 +133,7 @@ gdb_test_multiple "info break" "breakpoint info" { #exp_internal 1 set binexp [string_to_regexp $binfile] gdb_test_multiple "run" "run until main breakpoint" { - -re "\r\n\032\032post-prompt\r\nStarting program: $binexp \(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)+\r\n\r\n\032\032starting\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)*\r\n\r\n\032\032breakpoint 1\r\n\r\nBreakpoint 1, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*annota1.c\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n$main_line\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*$srcfile:$main_line:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped.*$gdb_prompt$" { + -re "\r\n\032\032post-prompt\r\nStarting program: $binexp \(\r\nwarning: Skipping \[^\r\n\]+ .gdb_index section in \[^\r\n\]+\)?\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)+\r\n\r\n\032\032starting\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)*\r\n\r\n\032\032breakpoint 1\r\n\r\nBreakpoint 1, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*annota1.c\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n$main_line\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*$srcfile:$main_line:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped.*$gdb_prompt$" { pass "run until main breakpoint" } } diff --git a/gdb/testsuite/gdb.base/async-shell.exp b/gdb/testsuite/gdb.base/async-shell.exp index 4949cf92225..2e8085ae590 100644 --- a/gdb/testsuite/gdb.base/async-shell.exp +++ b/gdb/testsuite/gdb.base/async-shell.exp @@ -29,9 +29,11 @@ if { [prepare_for_testing ${testfile}.exp ${testfile}] } { return -1 } +set gdbindex_warning_re "warning: Skipping \[^\r\n\]+ \\.gdb_index section \[^\r\n\]*" + gdb_test_no_output "set target-async on " gdb_test_no_output "set non-stop on" -gdb_test "run &" "Starting program: \[^\r\n\]*" +gdb_test "run &" "Starting program: \[^\r\n\]*(\r\n$gdbindex_warning_re)?" # `sleep 5' here would workaround the bug, do not sleep here. # "shell" could eat waitpid event from the asynchronous inferior process. diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-break.S b/gdb/testsuite/gdb.dwarf2/dw2-inline-break.S new file mode 100644 index 00000000000..92da9654416 --- /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 . */ + +/* 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 00000000000..2ef7145765d --- /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 . + +# 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\\)} .* " diff --git a/gdb/testsuite/gdb.opt/inline-break.c b/gdb/testsuite/gdb.opt/inline-break.c new file mode 100644 index 00000000000..edf82d68b47 --- /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 . */ + +/* 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 00000000000..c3577235085 --- /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 . + +# 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\\)} .* " diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp index 206f7b38f63..7f8642f3ee0 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp @@ -31,7 +31,8 @@ global mi_inferior_tty_name set MIFLAGS "-i=mi" set thread_selected_re "=thread-selected,id=\"\[0-9\]+\"\r\n" -set library_loaded_re "=library-loaded\[^\n\]+\"\r\n" +set gdbindex_warning_re "&\"warning: Skipping \[^\r\n\]+ \.gdb_index section in \[^\"\]+\"\r\n" +set library_loaded_re "=library-loaded\[^\n\]+\"\r\n(?:$gdbindex_warning_re)?" set breakpoint_re "=(?:breakpoint-created|breakpoint-deleted)\[^\n\]+\"\r\n" # -- 2.30.2