* [rfa] linespec.c, part 1
@ 2002-11-07 13:28 David Carlton
2002-11-08 7:08 ` Elena Zannoni
0 siblings, 1 reply; 4+ messages in thread
From: David Carlton @ 2002-11-07 13:28 UTC (permalink / raw)
To: gdb-patches; +Cc: Elena Zannoni, Fernando Nasser, Jim Blandy
This patch gets rid of the goto's and move some code into separate
functions 'symbol_found' and 'minsym_found'. It's based on the
following observations (I'll do them for symbol_found, but it's the
same for both):
1) The code after the label symbol_found: looks like this
symbol_found:
if (sym != NULL)
{
/* initialize values appropriately, and then either return
values or signal an error.
}
So we can move the code inside the braces into a separate function
symbol_found that returns a struct symtab_and_lines, turning this
into:
symbol_found:
if (sym != NULL)
return symbol_found (args);
2) In all situations where there is a 'goto symbol_found', it is
immediately preceded by a check that sym is non-NULL. So the
behavior of the program isn't changed by if we leave the gotos
intact but further rewrite the above code as
if (sym != NULL)
symbol_found:
return symbol_found (args);
3) So, given that this is the case, we might as well replace each
'goto symbol_found' by 'return symbol_found (args);'.
The patch gets a little weird to read towards the end: it would seem
that the algorithms that patch -u uses don't always work the best if
you're moving chunks of code around. Sorry about that.
David Carlton
carlton@math.stanford.edu
2002-11-07 David Carlton <carlton@math.stanford.edu>
* linespec.c (symbol_found): New function.
(minsym_found): New function.
(decode_line_1): Separate out some code into separate functions.
Index: linespec.c
===================================================================
RCS file: /cvs/src/src/gdb/linespec.c,v
retrieving revision 1.25
diff -u -p -r1.25 linespec.c
--- linespec.c 24 Oct 2002 21:02:53 -0000 1.25
+++ linespec.c 7 Nov 2002 21:08:18 -0000
@@ -53,6 +53,18 @@ static char *find_toplevel_char (char *s
static struct symtabs_and_lines decode_line_2 (struct symbol *[],
int, int, char ***);
+static struct
+symtabs_and_lines symbol_found (int funfirstline,
+ char ***canonical,
+ char *copy,
+ struct symbol *sym,
+ struct symtab *s,
+ struct symtab *sym_symtab);
+
+static struct
+symtabs_and_lines minsym_found (int funfirstline,
+ struct minimal_symbol *msymbol);
+
/* Helper functions. */
/* Issue a helpful hint on using the command completion feature on
@@ -910,16 +922,9 @@ decode_line_1 (char **argptr, int funfir
/* Look up entire name */
sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
s = (struct symtab *) 0;
- /* Prepare to jump: restore the " if (condition)" so outer layers see it */
- /* Symbol was found --> jump to normal symbol processing.
- Code following "symbol_found" expects "copy" to have the
- symbol name, "sym" to have the symbol pointer, "s" to be
- a specified file's symtab, and sym_symtab to be the symbol's
- symtab. */
- /* By jumping there we avoid falling through the FILE:LINE and
- FILE:FUNC processing stuff below */
if (sym)
- goto symbol_found;
+ return symbol_found (funfirstline, canonical, copy, sym,
+ NULL, sym_symtab);
/* Couldn't find any interpretation as classes/namespaces, so give up */
/* The quotes are important if copy is empty. */
@@ -985,12 +990,9 @@ decode_line_1 (char **argptr, int funfir
sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
if (sym)
{
- /* Yes, we have a symbol; jump to symbol processing */
- /* Code after symbol_found expects S, SYM_SYMTAB, SYM,
- and COPY to be set correctly */
*argptr = (*p == '\'') ? p + 1 : p;
- s = (struct symtab *) 0;
- goto symbol_found;
+ return symbol_found (funfirstline, canonical, copy, sym,
+ NULL, sym_symtab);
}
/* Otherwise fall out from here and go to file/line spec
processing, etc. */
@@ -1151,19 +1153,16 @@ decode_line_1 (char **argptr, int funfir
sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
s = (struct symtab *) 0;
need_canonical = 1;
- /* Symbol was found --> jump to normal symbol processing.
- Code following "symbol_found" expects "copy" to have the
- symbol name, "sym" to have the symbol pointer, "s" to be
- a specified file's symtab, and sym_symtab to be the symbol's
- symtab. */
+ /* Symbol was found --> jump to normal symbol processing. */
if (sym)
- goto symbol_found;
+ return symbol_found (funfirstline, canonical, copy, sym,
+ NULL, sym_symtab);
/* If symbol was not found, look in minimal symbol tables */
msymbol = lookup_minimal_symbol (copy, NULL, NULL);
/* Min symbol was found --> jump to minsym processing. */
if (msymbol)
- goto minimal_symbol_found;
+ return minsym_found (funfirstline, msymbol);
/* Not a user variable or function -- must be convenience variable */
need_canonical = (s == 0) ? 1 : 0;
@@ -1196,84 +1195,92 @@ decode_line_1 (char **argptr, int funfir
: get_selected_block (0)),
VAR_NAMESPACE, 0, &sym_symtab);
-symbol_found: /* We also jump here from inside the C++ class/namespace
- code on finding a symbol of the form "A::B::C" */
-
if (sym != NULL)
- {
- if (SYMBOL_CLASS (sym) == LOC_BLOCK)
- {
- /* Arg is the name of a function */
- values.sals = (struct symtab_and_line *)
- xmalloc (sizeof (struct symtab_and_line));
- values.sals[0] = find_function_start_sal (sym, funfirstline);
- values.nelts = 1;
+ return symbol_found (funfirstline, canonical, copy, sym, s, sym_symtab);
- /* Don't use the SYMBOL_LINE; if used at all it points to
- the line containing the parameters or thereabouts, not
- the first line of code. */
+ msymbol = lookup_minimal_symbol (copy, NULL, NULL);
- /* We might need a canonical line spec if it is a static
- function. */
- if (s == 0)
- {
- struct blockvector *bv = BLOCKVECTOR (sym_symtab);
- struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
- if (lookup_block_symbol (b, copy, NULL, VAR_NAMESPACE) != NULL)
- build_canonical_line_spec (values.sals, copy, canonical);
- }
- return values;
- }
- else
- {
- if (funfirstline)
- error ("\"%s\" is not a function", copy);
- else if (SYMBOL_LINE (sym) != 0)
- {
- /* We know its line number. */
- values.sals = (struct symtab_and_line *)
- xmalloc (sizeof (struct symtab_and_line));
- values.nelts = 1;
- memset (&values.sals[0], 0, sizeof (values.sals[0]));
- values.sals[0].symtab = sym_symtab;
- values.sals[0].line = SYMBOL_LINE (sym);
- return values;
- }
- else
- /* This can happen if it is compiled with a compiler which doesn't
- put out line numbers for variables. */
- /* FIXME: Shouldn't we just set .line and .symtab to zero
- and return? For example, "info line foo" could print
- the address. */
- error ("Line number not known for symbol \"%s\"", copy);
- }
- }
+ if (msymbol != NULL)
+ return minsym_found (funfirstline, msymbol);
- msymbol = lookup_minimal_symbol (copy, NULL, NULL);
+ if (!have_full_symbols () &&
+ !have_partial_symbols () && !have_minimal_symbols ())
+ error ("No symbol table is loaded. Use the \"file\" command.");
-minimal_symbol_found: /* We also jump here from the case for variables
- that begin with '$' */
+ error ("Function \"%s\" not defined.", copy);
+ return values; /* for lint */
+}
- if (msymbol != NULL)
+static struct symtabs_and_lines
+symbol_found (int funfirstline, char ***canonical, char *copy,
+ struct symbol *sym, struct symtab *s,
+ struct symtab *sym_symtab)
+{
+ struct symtabs_and_lines values;
+
+ if (SYMBOL_CLASS (sym) == LOC_BLOCK)
{
+ /* Arg is the name of a function */
values.sals = (struct symtab_and_line *)
xmalloc (sizeof (struct symtab_and_line));
- values.sals[0] = find_pc_sect_line (SYMBOL_VALUE_ADDRESS (msymbol),
- (struct sec *) 0, 0);
- values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
- if (funfirstline)
+ values.sals[0] = find_function_start_sal (sym, funfirstline);
+ values.nelts = 1;
+
+ /* Don't use the SYMBOL_LINE; if used at all it points to
+ the line containing the parameters or thereabouts, not
+ the first line of code. */
+
+ /* We might need a canonical line spec if it is a static
+ function. */
+ if (s == 0)
{
- values.sals[0].pc += FUNCTION_START_OFFSET;
- values.sals[0].pc = SKIP_PROLOGUE (values.sals[0].pc);
+ struct blockvector *bv = BLOCKVECTOR (sym_symtab);
+ struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+ if (lookup_block_symbol (b, copy, NULL, VAR_NAMESPACE) != NULL)
+ build_canonical_line_spec (values.sals, copy, canonical);
}
- values.nelts = 1;
return values;
}
+ else
+ {
+ if (funfirstline)
+ error ("\"%s\" is not a function", copy);
+ else if (SYMBOL_LINE (sym) != 0)
+ {
+ /* We know its line number. */
+ values.sals = (struct symtab_and_line *)
+ xmalloc (sizeof (struct symtab_and_line));
+ values.nelts = 1;
+ memset (&values.sals[0], 0, sizeof (values.sals[0]));
+ values.sals[0].symtab = sym_symtab;
+ values.sals[0].line = SYMBOL_LINE (sym);
+ return values;
+ }
+ else
+ /* This can happen if it is compiled with a compiler which doesn't
+ put out line numbers for variables. */
+ /* FIXME: Shouldn't we just set .line and .symtab to zero
+ and return? For example, "info line foo" could print
+ the address. */
+ error ("Line number not known for symbol \"%s\"", copy);
+ }
+}
- if (!have_full_symbols () &&
- !have_partial_symbols () && !have_minimal_symbols ())
- error ("No symbol table is loaded. Use the \"file\" command.");
+static struct symtabs_and_lines
+minsym_found (int funfirstline, struct minimal_symbol *msymbol)
+{
+ struct symtabs_and_lines values;
- error ("Function \"%s\" not defined.", copy);
- return values; /* for lint */
+ values.sals = (struct symtab_and_line *)
+ xmalloc (sizeof (struct symtab_and_line));
+ values.sals[0] = find_pc_sect_line (SYMBOL_VALUE_ADDRESS (msymbol),
+ (struct sec *) 0, 0);
+ values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
+ if (funfirstline)
+ {
+ values.sals[0].pc += FUNCTION_START_OFFSET;
+ values.sals[0].pc = SKIP_PROLOGUE (values.sals[0].pc);
+ }
+ values.nelts = 1;
+ return values;
}
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [rfa] linespec.c, part 1
2002-11-07 13:28 [rfa] linespec.c, part 1 David Carlton
@ 2002-11-08 7:08 ` Elena Zannoni
2002-11-08 11:04 ` David Carlton
0 siblings, 1 reply; 4+ messages in thread
From: Elena Zannoni @ 2002-11-08 7:08 UTC (permalink / raw)
To: David Carlton; +Cc: gdb-patches, Elena Zannoni, Fernando Nasser, Jim Blandy
Looks good.
testsuite results are same, compiled with ,-Werror, right ?
Check it in.
Thanks
Elena
David Carlton writes:
> This patch gets rid of the goto's and move some code into separate
> functions 'symbol_found' and 'minsym_found'. It's based on the
> following observations (I'll do them for symbol_found, but it's the
> same for both):
>
> 1) The code after the label symbol_found: looks like this
>
> symbol_found:
> if (sym != NULL)
> {
> /* initialize values appropriately, and then either return
> values or signal an error.
> }
>
> So we can move the code inside the braces into a separate function
> symbol_found that returns a struct symtab_and_lines, turning this
> into:
>
> symbol_found:
> if (sym != NULL)
> return symbol_found (args);
>
> 2) In all situations where there is a 'goto symbol_found', it is
> immediately preceded by a check that sym is non-NULL. So the
> behavior of the program isn't changed by if we leave the gotos
> intact but further rewrite the above code as
>
> if (sym != NULL)
> symbol_found:
> return symbol_found (args);
>
> 3) So, given that this is the case, we might as well replace each
> 'goto symbol_found' by 'return symbol_found (args);'.
>
> The patch gets a little weird to read towards the end: it would seem
> that the algorithms that patch -u uses don't always work the best if
> you're moving chunks of code around. Sorry about that.
>
> David Carlton
> carlton@math.stanford.edu
>
> 2002-11-07 David Carlton <carlton@math.stanford.edu>
>
> * linespec.c (symbol_found): New function.
> (minsym_found): New function.
> (decode_line_1): Separate out some code into separate functions.
>
> Index: linespec.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/linespec.c,v
> retrieving revision 1.25
> diff -u -p -r1.25 linespec.c
> --- linespec.c 24 Oct 2002 21:02:53 -0000 1.25
> +++ linespec.c 7 Nov 2002 21:08:18 -0000
> @@ -53,6 +53,18 @@ static char *find_toplevel_char (char *s
> static struct symtabs_and_lines decode_line_2 (struct symbol *[],
> int, int, char ***);
>
> +static struct
> +symtabs_and_lines symbol_found (int funfirstline,
> + char ***canonical,
> + char *copy,
> + struct symbol *sym,
> + struct symtab *s,
> + struct symtab *sym_symtab);
> +
> +static struct
> +symtabs_and_lines minsym_found (int funfirstline,
> + struct minimal_symbol *msymbol);
> +
> /* Helper functions. */
>
> /* Issue a helpful hint on using the command completion feature on
> @@ -910,16 +922,9 @@ decode_line_1 (char **argptr, int funfir
> /* Look up entire name */
> sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
> s = (struct symtab *) 0;
> - /* Prepare to jump: restore the " if (condition)" so outer layers see it */
> - /* Symbol was found --> jump to normal symbol processing.
> - Code following "symbol_found" expects "copy" to have the
> - symbol name, "sym" to have the symbol pointer, "s" to be
> - a specified file's symtab, and sym_symtab to be the symbol's
> - symtab. */
> - /* By jumping there we avoid falling through the FILE:LINE and
> - FILE:FUNC processing stuff below */
> if (sym)
> - goto symbol_found;
> + return symbol_found (funfirstline, canonical, copy, sym,
> + NULL, sym_symtab);
>
> /* Couldn't find any interpretation as classes/namespaces, so give up */
> /* The quotes are important if copy is empty. */
> @@ -985,12 +990,9 @@ decode_line_1 (char **argptr, int funfir
> sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
> if (sym)
> {
> - /* Yes, we have a symbol; jump to symbol processing */
> - /* Code after symbol_found expects S, SYM_SYMTAB, SYM,
> - and COPY to be set correctly */
> *argptr = (*p == '\'') ? p + 1 : p;
> - s = (struct symtab *) 0;
> - goto symbol_found;
> + return symbol_found (funfirstline, canonical, copy, sym,
> + NULL, sym_symtab);
> }
> /* Otherwise fall out from here and go to file/line spec
> processing, etc. */
> @@ -1151,19 +1153,16 @@ decode_line_1 (char **argptr, int funfir
> sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
> s = (struct symtab *) 0;
> need_canonical = 1;
> - /* Symbol was found --> jump to normal symbol processing.
> - Code following "symbol_found" expects "copy" to have the
> - symbol name, "sym" to have the symbol pointer, "s" to be
> - a specified file's symtab, and sym_symtab to be the symbol's
> - symtab. */
> + /* Symbol was found --> jump to normal symbol processing. */
> if (sym)
> - goto symbol_found;
> + return symbol_found (funfirstline, canonical, copy, sym,
> + NULL, sym_symtab);
>
> /* If symbol was not found, look in minimal symbol tables */
> msymbol = lookup_minimal_symbol (copy, NULL, NULL);
> /* Min symbol was found --> jump to minsym processing. */
> if (msymbol)
> - goto minimal_symbol_found;
> + return minsym_found (funfirstline, msymbol);
>
> /* Not a user variable or function -- must be convenience variable */
> need_canonical = (s == 0) ? 1 : 0;
> @@ -1196,84 +1195,92 @@ decode_line_1 (char **argptr, int funfir
> : get_selected_block (0)),
> VAR_NAMESPACE, 0, &sym_symtab);
>
> -symbol_found: /* We also jump here from inside the C++ class/namespace
> - code on finding a symbol of the form "A::B::C" */
> -
> if (sym != NULL)
> - {
> - if (SYMBOL_CLASS (sym) == LOC_BLOCK)
> - {
> - /* Arg is the name of a function */
> - values.sals = (struct symtab_and_line *)
> - xmalloc (sizeof (struct symtab_and_line));
> - values.sals[0] = find_function_start_sal (sym, funfirstline);
> - values.nelts = 1;
> + return symbol_found (funfirstline, canonical, copy, sym, s, sym_symtab);
>
> - /* Don't use the SYMBOL_LINE; if used at all it points to
> - the line containing the parameters or thereabouts, not
> - the first line of code. */
> + msymbol = lookup_minimal_symbol (copy, NULL, NULL);
>
> - /* We might need a canonical line spec if it is a static
> - function. */
> - if (s == 0)
> - {
> - struct blockvector *bv = BLOCKVECTOR (sym_symtab);
> - struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
> - if (lookup_block_symbol (b, copy, NULL, VAR_NAMESPACE) != NULL)
> - build_canonical_line_spec (values.sals, copy, canonical);
> - }
> - return values;
> - }
> - else
> - {
> - if (funfirstline)
> - error ("\"%s\" is not a function", copy);
> - else if (SYMBOL_LINE (sym) != 0)
> - {
> - /* We know its line number. */
> - values.sals = (struct symtab_and_line *)
> - xmalloc (sizeof (struct symtab_and_line));
> - values.nelts = 1;
> - memset (&values.sals[0], 0, sizeof (values.sals[0]));
> - values.sals[0].symtab = sym_symtab;
> - values.sals[0].line = SYMBOL_LINE (sym);
> - return values;
> - }
> - else
> - /* This can happen if it is compiled with a compiler which doesn't
> - put out line numbers for variables. */
> - /* FIXME: Shouldn't we just set .line and .symtab to zero
> - and return? For example, "info line foo" could print
> - the address. */
> - error ("Line number not known for symbol \"%s\"", copy);
> - }
> - }
> + if (msymbol != NULL)
> + return minsym_found (funfirstline, msymbol);
>
> - msymbol = lookup_minimal_symbol (copy, NULL, NULL);
> + if (!have_full_symbols () &&
> + !have_partial_symbols () && !have_minimal_symbols ())
> + error ("No symbol table is loaded. Use the \"file\" command.");
>
> -minimal_symbol_found: /* We also jump here from the case for variables
> - that begin with '$' */
> + error ("Function \"%s\" not defined.", copy);
> + return values; /* for lint */
> +}
>
> - if (msymbol != NULL)
> +static struct symtabs_and_lines
> +symbol_found (int funfirstline, char ***canonical, char *copy,
> + struct symbol *sym, struct symtab *s,
> + struct symtab *sym_symtab)
> +{
> + struct symtabs_and_lines values;
> +
> + if (SYMBOL_CLASS (sym) == LOC_BLOCK)
> {
> + /* Arg is the name of a function */
> values.sals = (struct symtab_and_line *)
> xmalloc (sizeof (struct symtab_and_line));
> - values.sals[0] = find_pc_sect_line (SYMBOL_VALUE_ADDRESS (msymbol),
> - (struct sec *) 0, 0);
> - values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
> - if (funfirstline)
> + values.sals[0] = find_function_start_sal (sym, funfirstline);
> + values.nelts = 1;
> +
> + /* Don't use the SYMBOL_LINE; if used at all it points to
> + the line containing the parameters or thereabouts, not
> + the first line of code. */
> +
> + /* We might need a canonical line spec if it is a static
> + function. */
> + if (s == 0)
> {
> - values.sals[0].pc += FUNCTION_START_OFFSET;
> - values.sals[0].pc = SKIP_PROLOGUE (values.sals[0].pc);
> + struct blockvector *bv = BLOCKVECTOR (sym_symtab);
> + struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
> + if (lookup_block_symbol (b, copy, NULL, VAR_NAMESPACE) != NULL)
> + build_canonical_line_spec (values.sals, copy, canonical);
> }
> - values.nelts = 1;
> return values;
> }
> + else
> + {
> + if (funfirstline)
> + error ("\"%s\" is not a function", copy);
> + else if (SYMBOL_LINE (sym) != 0)
> + {
> + /* We know its line number. */
> + values.sals = (struct symtab_and_line *)
> + xmalloc (sizeof (struct symtab_and_line));
> + values.nelts = 1;
> + memset (&values.sals[0], 0, sizeof (values.sals[0]));
> + values.sals[0].symtab = sym_symtab;
> + values.sals[0].line = SYMBOL_LINE (sym);
> + return values;
> + }
> + else
> + /* This can happen if it is compiled with a compiler which doesn't
> + put out line numbers for variables. */
> + /* FIXME: Shouldn't we just set .line and .symtab to zero
> + and return? For example, "info line foo" could print
> + the address. */
> + error ("Line number not known for symbol \"%s\"", copy);
> + }
> +}
>
> - if (!have_full_symbols () &&
> - !have_partial_symbols () && !have_minimal_symbols ())
> - error ("No symbol table is loaded. Use the \"file\" command.");
> +static struct symtabs_and_lines
> +minsym_found (int funfirstline, struct minimal_symbol *msymbol)
> +{
> + struct symtabs_and_lines values;
>
> - error ("Function \"%s\" not defined.", copy);
> - return values; /* for lint */
> + values.sals = (struct symtab_and_line *)
> + xmalloc (sizeof (struct symtab_and_line));
> + values.sals[0] = find_pc_sect_line (SYMBOL_VALUE_ADDRESS (msymbol),
> + (struct sec *) 0, 0);
> + values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
> + if (funfirstline)
> + {
> + values.sals[0].pc += FUNCTION_START_OFFSET;
> + values.sals[0].pc = SKIP_PROLOGUE (values.sals[0].pc);
> + }
> + values.nelts = 1;
> + return values;
> }
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [rfa] linespec.c, part 1
2002-11-08 7:08 ` Elena Zannoni
@ 2002-11-08 11:04 ` David Carlton
2002-11-08 11:18 ` David Carlton
0 siblings, 1 reply; 4+ messages in thread
From: David Carlton @ 2002-11-08 11:04 UTC (permalink / raw)
To: Elena Zannoni; +Cc: gdb-patches, Fernando Nasser, Jim Blandy
On Fri, 8 Nov 2002 10:04:32 -0500, Elena Zannoni <ezannoni@redhat.com> said:
> testsuite results are same, compiled with ,-Werror, right ?
As always. (I wonder what percentage of my machine's CPU time over
the last two weeks has been taken up by running the testsuite after
linespec changes...)
> Check it in.
Great, will do. I also realized I didn't put comments in front of the
two new functions; I'll add that as an obvious alteration when I check
it in.
David Carlton
carlton@math.stanford.edu
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [rfa] linespec.c, part 1
2002-11-08 11:04 ` David Carlton
@ 2002-11-08 11:18 ` David Carlton
0 siblings, 0 replies; 4+ messages in thread
From: David Carlton @ 2002-11-08 11:18 UTC (permalink / raw)
To: Elena Zannoni; +Cc: gdb-patches, Fernando Nasser, Jim Blandy
On 08 Nov 2002 11:03:39 -0800, David Carlton <carlton@math.Stanford.EDU> said:
> On Fri, 8 Nov 2002 10:04:32 -0500, Elena Zannoni <ezannoni@redhat.com> said:
>> Check it in.
> Great, will do. I also realized I didn't put comments in front of the
> two new functions; I'll add that as an obvious alteration when I check
> it in.
Done; here's the actual patch, which is the same as what I sent
earlier except for the addition of a few comments.
David Carlton
carlton@math.stanford.edu
2002-11-07 David Carlton <carlton@math.stanford.edu>
* linespec.c (symbol_found): New function.
(minsym_found): New function.
(decode_line_1): Separate out some code into separate functions.
Index: linespec.c
===================================================================
RCS file: /cvs/src/src/gdb/linespec.c,v
retrieving revision 1.25
diff -u -p -r1.25 linespec.c
--- linespec.c 24 Oct 2002 21:02:53 -0000 1.25
+++ linespec.c 8 Nov 2002 19:15:55 -0000
@@ -53,6 +53,18 @@ static char *find_toplevel_char (char *s
static struct symtabs_and_lines decode_line_2 (struct symbol *[],
int, int, char ***);
+static struct
+symtabs_and_lines symbol_found (int funfirstline,
+ char ***canonical,
+ char *copy,
+ struct symbol *sym,
+ struct symtab *s,
+ struct symtab *sym_symtab);
+
+static struct
+symtabs_and_lines minsym_found (int funfirstline,
+ struct minimal_symbol *msymbol);
+
/* Helper functions. */
/* Issue a helpful hint on using the command completion feature on
@@ -910,16 +922,9 @@ decode_line_1 (char **argptr, int funfir
/* Look up entire name */
sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
s = (struct symtab *) 0;
- /* Prepare to jump: restore the " if (condition)" so outer layers see it */
- /* Symbol was found --> jump to normal symbol processing.
- Code following "symbol_found" expects "copy" to have the
- symbol name, "sym" to have the symbol pointer, "s" to be
- a specified file's symtab, and sym_symtab to be the symbol's
- symtab. */
- /* By jumping there we avoid falling through the FILE:LINE and
- FILE:FUNC processing stuff below */
if (sym)
- goto symbol_found;
+ return symbol_found (funfirstline, canonical, copy, sym,
+ NULL, sym_symtab);
/* Couldn't find any interpretation as classes/namespaces, so give up */
/* The quotes are important if copy is empty. */
@@ -985,12 +990,9 @@ decode_line_1 (char **argptr, int funfir
sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
if (sym)
{
- /* Yes, we have a symbol; jump to symbol processing */
- /* Code after symbol_found expects S, SYM_SYMTAB, SYM,
- and COPY to be set correctly */
*argptr = (*p == '\'') ? p + 1 : p;
- s = (struct symtab *) 0;
- goto symbol_found;
+ return symbol_found (funfirstline, canonical, copy, sym,
+ NULL, sym_symtab);
}
/* Otherwise fall out from here and go to file/line spec
processing, etc. */
@@ -1151,19 +1153,16 @@ decode_line_1 (char **argptr, int funfir
sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
s = (struct symtab *) 0;
need_canonical = 1;
- /* Symbol was found --> jump to normal symbol processing.
- Code following "symbol_found" expects "copy" to have the
- symbol name, "sym" to have the symbol pointer, "s" to be
- a specified file's symtab, and sym_symtab to be the symbol's
- symtab. */
+ /* Symbol was found --> jump to normal symbol processing. */
if (sym)
- goto symbol_found;
+ return symbol_found (funfirstline, canonical, copy, sym,
+ NULL, sym_symtab);
/* If symbol was not found, look in minimal symbol tables */
msymbol = lookup_minimal_symbol (copy, NULL, NULL);
/* Min symbol was found --> jump to minsym processing. */
if (msymbol)
- goto minimal_symbol_found;
+ return minsym_found (funfirstline, msymbol);
/* Not a user variable or function -- must be convenience variable */
need_canonical = (s == 0) ? 1 : 0;
@@ -1196,84 +1195,104 @@ decode_line_1 (char **argptr, int funfir
: get_selected_block (0)),
VAR_NAMESPACE, 0, &sym_symtab);
-symbol_found: /* We also jump here from inside the C++ class/namespace
- code on finding a symbol of the form "A::B::C" */
-
if (sym != NULL)
- {
- if (SYMBOL_CLASS (sym) == LOC_BLOCK)
- {
- /* Arg is the name of a function */
- values.sals = (struct symtab_and_line *)
- xmalloc (sizeof (struct symtab_and_line));
- values.sals[0] = find_function_start_sal (sym, funfirstline);
- values.nelts = 1;
+ return symbol_found (funfirstline, canonical, copy, sym, s, sym_symtab);
- /* Don't use the SYMBOL_LINE; if used at all it points to
- the line containing the parameters or thereabouts, not
- the first line of code. */
+ msymbol = lookup_minimal_symbol (copy, NULL, NULL);
- /* We might need a canonical line spec if it is a static
- function. */
- if (s == 0)
- {
- struct blockvector *bv = BLOCKVECTOR (sym_symtab);
- struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
- if (lookup_block_symbol (b, copy, NULL, VAR_NAMESPACE) != NULL)
- build_canonical_line_spec (values.sals, copy, canonical);
- }
- return values;
- }
- else
- {
- if (funfirstline)
- error ("\"%s\" is not a function", copy);
- else if (SYMBOL_LINE (sym) != 0)
- {
- /* We know its line number. */
- values.sals = (struct symtab_and_line *)
- xmalloc (sizeof (struct symtab_and_line));
- values.nelts = 1;
- memset (&values.sals[0], 0, sizeof (values.sals[0]));
- values.sals[0].symtab = sym_symtab;
- values.sals[0].line = SYMBOL_LINE (sym);
- return values;
- }
- else
- /* This can happen if it is compiled with a compiler which doesn't
- put out line numbers for variables. */
- /* FIXME: Shouldn't we just set .line and .symtab to zero
- and return? For example, "info line foo" could print
- the address. */
- error ("Line number not known for symbol \"%s\"", copy);
- }
- }
+ if (msymbol != NULL)
+ return minsym_found (funfirstline, msymbol);
- msymbol = lookup_minimal_symbol (copy, NULL, NULL);
+ if (!have_full_symbols () &&
+ !have_partial_symbols () && !have_minimal_symbols ())
+ error ("No symbol table is loaded. Use the \"file\" command.");
-minimal_symbol_found: /* We also jump here from the case for variables
- that begin with '$' */
+ error ("Function \"%s\" not defined.", copy);
+ return values; /* for lint */
+}
- if (msymbol != NULL)
+
+\f
+
+/* Now come some functions that are called from multiple places within
+ decode_line_1. */
+
+/* We've found a symbol SYM to associate with our linespec; build a
+ corresponding struct symtabs_and_lines. */
+
+static struct symtabs_and_lines
+symbol_found (int funfirstline, char ***canonical, char *copy,
+ struct symbol *sym, struct symtab *s,
+ struct symtab *sym_symtab)
+{
+ struct symtabs_and_lines values;
+
+ if (SYMBOL_CLASS (sym) == LOC_BLOCK)
{
+ /* Arg is the name of a function */
values.sals = (struct symtab_and_line *)
xmalloc (sizeof (struct symtab_and_line));
- values.sals[0] = find_pc_sect_line (SYMBOL_VALUE_ADDRESS (msymbol),
- (struct sec *) 0, 0);
- values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
- if (funfirstline)
+ values.sals[0] = find_function_start_sal (sym, funfirstline);
+ values.nelts = 1;
+
+ /* Don't use the SYMBOL_LINE; if used at all it points to
+ the line containing the parameters or thereabouts, not
+ the first line of code. */
+
+ /* We might need a canonical line spec if it is a static
+ function. */
+ if (s == 0)
{
- values.sals[0].pc += FUNCTION_START_OFFSET;
- values.sals[0].pc = SKIP_PROLOGUE (values.sals[0].pc);
+ struct blockvector *bv = BLOCKVECTOR (sym_symtab);
+ struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+ if (lookup_block_symbol (b, copy, NULL, VAR_NAMESPACE) != NULL)
+ build_canonical_line_spec (values.sals, copy, canonical);
}
- values.nelts = 1;
return values;
}
+ else
+ {
+ if (funfirstline)
+ error ("\"%s\" is not a function", copy);
+ else if (SYMBOL_LINE (sym) != 0)
+ {
+ /* We know its line number. */
+ values.sals = (struct symtab_and_line *)
+ xmalloc (sizeof (struct symtab_and_line));
+ values.nelts = 1;
+ memset (&values.sals[0], 0, sizeof (values.sals[0]));
+ values.sals[0].symtab = sym_symtab;
+ values.sals[0].line = SYMBOL_LINE (sym);
+ return values;
+ }
+ else
+ /* This can happen if it is compiled with a compiler which doesn't
+ put out line numbers for variables. */
+ /* FIXME: Shouldn't we just set .line and .symtab to zero
+ and return? For example, "info line foo" could print
+ the address. */
+ error ("Line number not known for symbol \"%s\"", copy);
+ }
+}
- if (!have_full_symbols () &&
- !have_partial_symbols () && !have_minimal_symbols ())
- error ("No symbol table is loaded. Use the \"file\" command.");
+/* We've found a minimal symbol MSYMBOL to associate with our
+ linespec; build a corresponding struct symtabs_and_lines. */
- error ("Function \"%s\" not defined.", copy);
- return values; /* for lint */
+static struct symtabs_and_lines
+minsym_found (int funfirstline, struct minimal_symbol *msymbol)
+{
+ struct symtabs_and_lines values;
+
+ values.sals = (struct symtab_and_line *)
+ xmalloc (sizeof (struct symtab_and_line));
+ values.sals[0] = find_pc_sect_line (SYMBOL_VALUE_ADDRESS (msymbol),
+ (struct sec *) 0, 0);
+ values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
+ if (funfirstline)
+ {
+ values.sals[0].pc += FUNCTION_START_OFFSET;
+ values.sals[0].pc = SKIP_PROLOGUE (values.sals[0].pc);
+ }
+ values.nelts = 1;
+ return values;
}
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2002-11-08 19:18 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-11-07 13:28 [rfa] linespec.c, part 1 David Carlton
2002-11-08 7:08 ` Elena Zannoni
2002-11-08 11:04 ` David Carlton
2002-11-08 11:18 ` David Carlton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox