Re: [FYI] Inlining support, rough patch [break-by-function-name]

Jan Kratochvil
2008-07-03T11:22:22Z

[-- Attachment #1: Type: text/plain, Size: 542 bytes --]

On Wed, 02 Jul 2008 21:14:38 +0200, Daniel Jacobowitz wrote:
...
> Let's wait on that until the rest of the patch is ready, though.
> I'm making good progress.

That would be great, while discussing the uncommitted patches here is one on
top of it to make `break inlined_function' work with the multi-PC breakpoints.
As you have to be aware of such solution it may have some drawbacks.

(It does not solve the multiple minimal symbols with the same name as was in:
http://sourceware.org/ml/gdb-patches/2008-05/msg00190.html
)

Regards,
Jan

[-- Attachment #2: gdb-inline-works3-byname.patch --]
[-- Type: text/plain, Size: 4345 bytes --]

diff -up -u -X /home/jkratoch/.diffi.list -rup sources-inline-works3-orig/gdb/ada-lang.c sources-inline-works3/gdb/ada-lang.c
--- sources-inline-works3-orig/gdb/ada-lang.c 2008-06-24 20:58:11.000000000 +0200
+++ sources-inline-works3/gdb/ada-lang.c 2008-06-26 15:29:33.000000000 +0200
@@ -4625,7 +4625,7 @@ remove_irrelevant_renamings (struct ada_
if (current_block == NULL)
return nsyms;

- current_function = block_linkage_function (current_block);
+ current_function = block_function (current_block);
if (current_function == NULL)
return nsyms;

@@ -6721,7 +6721,7 @@ ada_find_renaming_symbol (const char *na
static struct symbol *
find_old_style_renaming_symbol (const char *name, struct block *block)
{
- const struct symbol *function_sym = block_linkage_function (block);
+ const struct symbol *function_sym = block_function (block);
char *rename;

if (function_sym != NULL)
diff -up -u -X /home/jkratoch/.diffi.list -rup sources-inline-works3-orig/gdb/block.c sources-inline-works3/gdb/block.c
--- sources-inline-works3-orig/gdb/block.c 2008-06-24 20:58:11.000000000 +0200
+++ sources-inline-works3/gdb/block.c 2008-06-26 15:29:09.000000000 +0200
@@ -73,6 +73,19 @@ block_linkage_function (const struct blo
return BLOCK_FUNCTION (bl);
}

+/* Return the symbol for the function which contains a specified
+ lexical block, described by a struct block BL. Inlined functions
+ can be returned. */
+
+struct symbol *
+block_function (const struct block *bl)
+{
+ while (BLOCK_FUNCTION (bl) == NULL && BLOCK_SUPERBLOCK (bl) != NULL)
+ bl = BLOCK_SUPERBLOCK (bl);
+
+ return BLOCK_FUNCTION (bl);
+}
+
/* Return one if BLOCK represents an inlined function. */

int
diff -up -u -X /home/jkratoch/.diffi.list -rup sources-inline-works3-orig/gdb/block.h sources-inline-works3/gdb/block.h
--- sources-inline-works3-orig/gdb/block.h 2008-06-24 20:58:11.000000000 +0200
+++ sources-inline-works3/gdb/block.h 2008-06-26 15:29:20.000000000 +0200
@@ -137,6 +137,7 @@ struct blockvector
enum { GLOBAL_BLOCK = 0, STATIC_BLOCK = 1, FIRST_LOCAL_BLOCK = 2 };

extern struct symbol *block_linkage_function (const struct block *);
+extern struct symbol *block_function (const struct block *bl);

extern int block_inlined_p (const struct block *block);

diff -up -u -X /home/jkratoch/.diffi.list -rup sources-inline-works3-orig/gdb/blockframe.c sources-inline-works3/gdb/blockframe.c
--- sources-inline-works3-orig/gdb/blockframe.c 2008-06-24 20:58:25.000000000 +0200
+++ sources-inline-works3/gdb/blockframe.c 2008-06-26 15:34:44.000000000 +0200
@@ -157,7 +157,7 @@ find_pc_sect_function (CORE_ADDR pc, str
struct block *b = block_for_pc_sect (pc, section);
if (b == 0)
return 0;
- return block_linkage_function (b);
+ return block_function (b);
}

/* Return the function containing pc value PC.
diff -up -u -X /home/jkratoch/.diffi.list -rup sources-inline-works3-orig/gdb/breakpoint.c sources-inline-works3/gdb/breakpoint.c
--- sources-inline-works3-orig/gdb/breakpoint.c 2008-06-24 20:58:25.000000000 +0200
+++ sources-inline-works3/gdb/breakpoint.c 2008-06-26 15:28:35.000000000 +0200
@@ -5692,7 +5692,7 @@ resolve_sal_pc (struct symtab_and_line *
bv = blockvector_for_pc_sect (sal->pc, 0, &b, sal->symtab);
if (bv != NULL)
{
- sym = block_linkage_function (b);
+ sym = block_function (b);
if (sym != NULL)
{
fixup_symbol_section (sym, sal->symtab->objfile);
diff -up -u -X /home/jkratoch/.diffi.list -rup sources-inline-works3-orig/gdb/testsuite/gdb.opt/inline-cmds.exp sources-inline-works3/gdb/testsuite/gdb.opt/inline-cmds.exp
--- sources-inline-works3-orig/gdb/testsuite/gdb.opt/inline-cmds.exp 2008-06-24 20:58:25.000000000 +0200
+++ sources-inline-works3/gdb/testsuite/gdb.opt/inline-cmds.exp 2008-06-26 15:49:12.000000000 +0200
@@ -42,8 +42,10 @@ if { [skip_inline_frame_tests] } {

# First, check that the things we expected to be inlined really were,
# and those that shouldn't be weren't.
-set line1 [gdb_get_line_number "set breakpoint 1 here"]
-gdb_breakpoint $line1
+# We test also inlining by the function name, otherwise we would use:
+# set line1 [gdb_get_line_number "set breakpoint 1 here"]
+# gdb_breakpoint $line1
+gdb_breakpoint "bar"
set line2 [gdb_get_line_number "set breakpoint 2 here"]
gdb_breakpoint $line2