* findvar.c (find_var_value): Handle &function better.

* TODO:  Document work needed on &fn and &array.
        * printcmd.c (print_address_symbolic):  New arg is the prefix
        to print if a name is printed.
        (print_address_demangle):  Honor "set print address" now.
        Use new arg above to improve spacing of output.
        * valprint.c (val_print):  When printing function pointers,
        print symbolic form too.
        * breakpoint.c (breakpoint_1):  Use new print_address_symbolic.
This commit is contained in:
John Gilmore
1991-07-14 07:48:06 +00:00
parent 116a34785a
commit 36b9d39cf4
5 changed files with 79 additions and 36 deletions

View File

@ -1,3 +1,15 @@
Sun Jul 14 00:42:53 1991 John Gilmore (gnu at cygint.cygnus.com)
* findvar.c (find_var_value): Handle &function better.
* TODO: Document work needed on &fn and &array.
* printcmd.c (print_address_symbolic): New arg is the prefix
to print if a name is printed.
(print_address_demangle): Honor "set print address" now.
Use new arg above to improve spacing of output.
* valprint.c (val_print): When printing function pointers,
print symbolic form too.
* breakpoint.c (breakpoint_1): Use new print_address_symbolic.
Mon Jul 8 19:02:46 1991 John Gilmore (gnu at cygint.cygnus.com)
* core.c (memory_error): Reword error msg to mislead less.

View File

@ -316,9 +316,16 @@ struct with a field name that matches the superclass name. This can
happen when the struct was defined before the superclass (before the
name became a typedef).
For "float point[15];":
Handling of "&" address-of operator needs some serious overhaul
for ANSI C and consistency on arrays and functions.
For "float point[15];":
ptype &point[4] ==> Attempt to take address of non-lvalue.
p &point[4] ==> Dereferences point[4] rather than giving you point+4.
For "char *malloc();":
ptype malloc ==> "char *()"; should be same as
ptype &malloc ==> "char *(*)()"
call printf ("%x\n", malloc) ==> wierd value, should be same as
call printf ("%x\n", &malloc) ==> correct value
Fix symbol reading in the presence of interrupts. It currently leaves a
cleanup to blow away the entire symbol table when a QUIT occurs.

View File

@ -3,19 +3,19 @@
This file is part of GDB.
GDB is free software; you can redistribute it and/or modify
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 1, or (at your option)
any later version.
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
GDB is distributed in the hope that it will be useful,
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 GDB; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include "defs.h"
@ -390,10 +390,13 @@ read_var_value (var, frame)
return v;
case LOC_CONST_BYTES:
addr = SYMBOL_VALUE_ADDRESS (var);
bcopy (addr, VALUE_CONTENTS_RAW (v), len);
VALUE_LVAL (v) = not_lval;
return v;
{
char *bytes_addr;
bytes_addr = SYMBOL_VALUE_BYTES (var);
bcopy (bytes_addr, VALUE_CONTENTS_RAW (v), len);
VALUE_LVAL (v) = not_lval;
return v;
}
case LOC_STATIC:
case LOC_EXTERNAL:
@ -631,9 +634,10 @@ value_from_register (type, regnum, frame)
return v;
}
/* Given a struct symbol for a variable,
/* Given a struct symbol for a variable or function,
and a stack frame id,
return a (pointer to a) struct value containing the variable's address. */
return a (pointer to a) struct value containing the properly typed
address. */
value
locate_var_value (var, frame)
@ -652,7 +656,8 @@ locate_var_value (var, frame)
if (lazy_value == 0)
error ("Address of \"%s\" is unknown.", SYMBOL_NAME (var));
if (VALUE_LAZY (lazy_value))
if (VALUE_LAZY (lazy_value)
|| TYPE_CODE (type) == TYPE_CODE_FUNC)
{
addr = VALUE_ADDRESS (lazy_value);
@ -668,6 +673,7 @@ locate_var_value (var, frame)
}
/* Address of an array is of the type of address of it's elements. */
/* FIXME, this is probably wrong now for ANSI C. */
result_type =
lookup_pointer_type (TYPE_CODE (type) == TYPE_CODE_ARRAY ?
TYPE_TARGET_TYPE (type) : type);

View File

@ -3,19 +3,19 @@
This file is part of GDB.
GDB is free software; you can redistribute it and/or modify
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 1, or (at your option)
any later version.
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
GDB is distributed in the hope that it will be useful,
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 GDB; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <string.h>
@ -30,6 +30,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "target.h"
extern int asm_demangle; /* Whether to demangle syms in asm printouts */
extern int addressprint; /* Whether to print hex addresses in HLL " */
extern struct block *get_current_block ();
@ -446,16 +447,18 @@ set_next_address (addr)
value_from_long (builtin_type_int, (LONGEST) addr));
}
/* Optionally print address ADDR symbolically as <SYMBOL+OFFSET> on STREAM.
/* Optionally print address ADDR symbolically as <SYMBOL+OFFSET> on STREAM,
after LEADIN. Print nothing if no symbolic name is found nearby.
DO_DEMANGLE controls whether to print a symbol in its native "raw" form,
or to interpret it as a possible C++ name and convert it back to source
form. */
void
print_address_symbolic (addr, stream, do_demangle)
print_address_symbolic (addr, stream, do_demangle, leadin)
CORE_ADDR addr;
FILE *stream;
int do_demangle;
char *leadin;
{
int name_location;
register int i = find_pc_misc_function (addr);
@ -465,7 +468,8 @@ print_address_symbolic (addr, stream, do_demangle)
if (i < 0)
return;
fputs_filtered (" <", stream);
fputs_filtered (leadin, stream);
fputs_filtered ("<", stream);
if (do_demangle)
fputs_demangled (misc_function_vector[i].name, stream, 1);
else
@ -487,11 +491,13 @@ print_address (addr, stream)
FILE *stream;
{
fprintf_filtered (stream, "0x%x", addr);
print_address_symbolic (addr, stream, asm_demangle);
print_address_symbolic (addr, stream, asm_demangle, " ");
}
/* Print address ADDR symbolically on STREAM. Parameter DEMANGLE
controls whether to print the symbolic name "raw" or demangled. */
controls whether to print the symbolic name "raw" or demangled.
Global setting "addressprint" controls whether to print hex address
or not. */
void
print_address_demangle (addr, stream, do_demangle)
@ -499,10 +505,15 @@ print_address_demangle (addr, stream, do_demangle)
FILE *stream;
int do_demangle;
{
fprintf_filtered (stream, "0x%x", addr);
print_address_symbolic (addr, stream, do_demangle);
if (addr == 0) {
fprintf_filtered (stream, "0");
} else if (addressprint) {
fprintf_filtered (stream, "0x%x", addr);
print_address_symbolic (addr, stream, do_demangle, " ");
} else {
print_address_symbolic (addr, stream, do_demangle, "");
}
}
/* Examine data at address ADDR in format FMT.

View File

@ -3,19 +3,19 @@
This file is part of GDB.
GDB is free software; you can redistribute it and/or modify
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 1, or (at your option)
any later version.
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
GDB is distributed in the hope that it will be useful,
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 GDB; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <string.h>
@ -1087,11 +1087,13 @@ val_print (type, valaddr, address, stream, format,
print_scalar_formatted (valaddr, type, format, 0, stream);
break;
}
/* FIXME, we should consider, at least for ANSI C language, eliminating
the distinction made between FUNCs and POINTERs to FUNCs. */
fprintf_filtered (stream, "{");
type_print (type, "", stream, -1);
fprintf_filtered (stream, "} ");
if (addressprint)
fprintf_filtered (stream, "0x%x", address);
/* Try to print what function it points to, and its address. */
print_address_demangle (address, stream, demangle);
break;
case TYPE_CODE_INT:
@ -1884,9 +1886,14 @@ _initialize_valprint ()
add_prefix_cmd ("print", no_class, set_print,
"Generic command for setting how things print.",
&setprintlist, "set print ", 0, &setlist);
add_alias_cmd ("p", "print", no_class, 1, &setlist);
add_alias_cmd ("pr", "print", no_class, 1, &setlist); /* prefer set print
to set prompt */
add_prefix_cmd ("print", no_class, show_print,
"Generic command for showing print settings.",
&showprintlist, "show print ", 0, &showlist);
add_alias_cmd ("p", "print", no_class, 1, &showlist);
add_alias_cmd ("pr", "print", no_class, 1, &showlist);
add_show_from_set
(add_set_cmd ("elements", no_class, var_uinteger, (char *)&print_max,